mirror of https://github.com/stijndcl/didier
Switch to flake8
parent
61128dda92
commit
dd66087193
|
@ -0,0 +1,18 @@
|
||||||
|
[flake8]
|
||||||
|
exclude =
|
||||||
|
.git,
|
||||||
|
.github,
|
||||||
|
.mypy_cache,
|
||||||
|
.pytest_cache,
|
||||||
|
__pycache__,
|
||||||
|
alembic,
|
||||||
|
htmlcov,
|
||||||
|
tests,
|
||||||
|
venv
|
||||||
|
ignore=E203
|
||||||
|
max-line-length = 120
|
||||||
|
per-file-ignores =
|
||||||
|
# Missing __all__, main isn't supposed to be imported
|
||||||
|
main.py: DALL000,
|
||||||
|
# Missing __all__, Cogs aren't modules
|
||||||
|
./didier/cogs/*: DALL000
|
|
@ -78,7 +78,7 @@ jobs:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pip3 install -r requirements.txt -r requirements-dev.txt
|
run: pip3 install -r requirements.txt -r requirements-dev.txt
|
||||||
- name: Linting
|
- name: Linting
|
||||||
run: pylint didier database
|
run: flake8
|
||||||
typing:
|
typing:
|
||||||
needs: [dependencies]
|
needs: [dependencies]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
|
@ -6,8 +6,23 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from database.crud import users
|
from database.crud import users
|
||||||
from database.exceptions import currency as exceptions
|
from database.exceptions import currency as exceptions
|
||||||
from database.models import Bank, NightlyData
|
from database.models import Bank, NightlyData
|
||||||
from database.utils.math.currency import rob_upgrade_price, interest_upgrade_price, capacity_upgrade_price
|
from database.utils.math.currency import (
|
||||||
|
capacity_upgrade_price,
|
||||||
|
interest_upgrade_price,
|
||||||
|
rob_upgrade_price,
|
||||||
|
)
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"add_dinks",
|
||||||
|
"claim_nightly",
|
||||||
|
"get_bank",
|
||||||
|
"get_nightly_data",
|
||||||
|
"invest",
|
||||||
|
"upgrade_capacity",
|
||||||
|
"upgrade_interest",
|
||||||
|
"upgrade_rob",
|
||||||
|
"NIGHTLY_AMOUNT",
|
||||||
|
]
|
||||||
|
|
||||||
NIGHTLY_AMOUNT = 420
|
NIGHTLY_AMOUNT = 420
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,16 @@ from database.exceptions.constraints import DuplicateInsertException
|
||||||
from database.exceptions.not_found import NoResultFoundException
|
from database.exceptions.not_found import NoResultFoundException
|
||||||
from database.models import CustomCommand, CustomCommandAlias
|
from database.models import CustomCommand, CustomCommandAlias
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"clean_name",
|
||||||
|
"create_alias",
|
||||||
|
"create_command",
|
||||||
|
"edit_command",
|
||||||
|
"get_command",
|
||||||
|
"get_command_by_alias",
|
||||||
|
"get_command_by_name",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def clean_name(name: str) -> str:
|
def clean_name(name: str) -> str:
|
||||||
"""Convert a name to lowercase & remove spaces to allow easier matching"""
|
"""Convert a name to lowercase & remove spaces to allow easier matching"""
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from sqlalchemy import select, delete
|
from sqlalchemy import delete, select
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
from database.models import UforaCourse, UforaAnnouncement
|
from database.models import UforaAnnouncement, UforaCourse
|
||||||
|
|
||||||
|
__all__ = ["create_new_announcement", "get_courses_with_announcements", "remove_old_announcements"]
|
||||||
|
|
||||||
|
|
||||||
async def get_courses_with_announcements(session: AsyncSession) -> list[UforaCourse]:
|
async def get_courses_with_announcements(session: AsyncSession) -> list[UforaCourse]:
|
||||||
|
|
|
@ -3,7 +3,11 @@ from typing import Optional
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
from database.models import User, Bank, NightlyData
|
from database.models import Bank, NightlyData, User
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"get_or_add",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
async def get_or_add(session: AsyncSession, user_id: int) -> User:
|
async def get_or_add(session: AsyncSession, user_id: int) -> User:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from urllib.parse import quote_plus
|
from urllib.parse import quote_plus
|
||||||
|
|
||||||
from sqlalchemy.engine import URL
|
from sqlalchemy.engine import URL
|
||||||
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
|
||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
|
||||||
import settings
|
import settings
|
||||||
|
|
|
@ -1,2 +1,5 @@
|
||||||
|
__all__ = ["DuplicateInsertException"]
|
||||||
|
|
||||||
|
|
||||||
class DuplicateInsertException(Exception):
|
class DuplicateInsertException(Exception):
|
||||||
"""Exception raised when a value already exists"""
|
"""Exception raised when a value already exists"""
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
__all__ = ["DoubleNightly", "NotEnoughDinks"]
|
||||||
|
|
||||||
|
|
||||||
class DoubleNightly(Exception):
|
class DoubleNightly(Exception):
|
||||||
"""Exception raised when claiming nightlies multiple times per day"""
|
"""Exception raised when claiming nightlies multiple times per day"""
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,5 @@
|
||||||
|
__all__ = ["NoResultFoundException"]
|
||||||
|
|
||||||
|
|
||||||
class NoResultFoundException(Exception):
|
class NoResultFoundException(Exception):
|
||||||
"""Exception raised when nothing was found"""
|
"""Exception raised when nothing was found"""
|
||||||
|
|
|
@ -2,9 +2,10 @@ import logging
|
||||||
|
|
||||||
from alembic import config, script
|
from alembic import config, script
|
||||||
from alembic.runtime import migration
|
from alembic.runtime import migration
|
||||||
|
|
||||||
from database.engine import engine
|
from database.engine import engine
|
||||||
|
|
||||||
|
__all__ = ["ensure_latest_migration"]
|
||||||
|
|
||||||
|
|
||||||
async def ensure_latest_migration():
|
async def ensure_latest_migration():
|
||||||
"""Make sure we are currently on the latest revision, otherwise raise an exception"""
|
"""Make sure we are currently on the latest revision, otherwise raise an exception"""
|
||||||
|
|
|
@ -3,12 +3,25 @@ from __future__ import annotations
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from sqlalchemy import BigInteger, Column, Integer, Text, ForeignKey, Boolean, DateTime
|
from sqlalchemy import BigInteger, Boolean, Column, DateTime, ForeignKey, Integer, Text
|
||||||
from sqlalchemy.orm import declarative_base, relationship
|
from sqlalchemy.orm import declarative_base, relationship
|
||||||
|
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"Base",
|
||||||
|
"Bank",
|
||||||
|
"CustomCommand",
|
||||||
|
"CustomCommandAlias",
|
||||||
|
"NightlyData",
|
||||||
|
"UforaAnnouncement",
|
||||||
|
"UforaCourse",
|
||||||
|
"UforaCourseAlias",
|
||||||
|
"User",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class Bank(Base):
|
class Bank(Base):
|
||||||
"""A user's currency information"""
|
"""A user's currency information"""
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import math
|
import math
|
||||||
|
|
||||||
|
__all__ = ["capacity_upgrade_price", "interest_upgrade_price", "rob_upgrade_price"]
|
||||||
|
|
||||||
|
|
||||||
def interest_upgrade_price(level: int) -> int:
|
def interest_upgrade_price(level: int) -> int:
|
||||||
"""Calculate the price to upgrade your interest level"""
|
"""Calculate the price to upgrade your interest level"""
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
from .didier import Didier
|
from .didier import Didier
|
||||||
|
|
||||||
|
__all__ = ["Didier"]
|
||||||
|
|
|
@ -5,7 +5,11 @@ from discord.ext import commands
|
||||||
|
|
||||||
from database.crud import currency as crud
|
from database.crud import currency as crud
|
||||||
from database.exceptions.currency import DoubleNightly, NotEnoughDinks
|
from database.exceptions.currency import DoubleNightly, NotEnoughDinks
|
||||||
from database.utils.math.currency import capacity_upgrade_price, interest_upgrade_price, rob_upgrade_price
|
from database.utils.math.currency import (
|
||||||
|
capacity_upgrade_price,
|
||||||
|
interest_upgrade_price,
|
||||||
|
rob_upgrade_price,
|
||||||
|
)
|
||||||
from didier import Didier
|
from didier import Didier
|
||||||
from didier.utils.discord.checks import is_owner
|
from didier.utils.discord.checks import is_owner
|
||||||
from didier.utils.discord.converters import abbreviated_number
|
from didier.utils.discord.converters import abbreviated_number
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from typing import Mapping, Optional, List
|
from typing import List, Mapping, Optional
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
|
|
@ -8,8 +8,8 @@ from database.crud import custom_commands
|
||||||
from database.exceptions.constraints import DuplicateInsertException
|
from database.exceptions.constraints import DuplicateInsertException
|
||||||
from database.exceptions.not_found import NoResultFoundException
|
from database.exceptions.not_found import NoResultFoundException
|
||||||
from didier import Didier
|
from didier import Didier
|
||||||
from didier.data.modals.custom_commands import CreateCustomCommand, EditCustomCommand
|
|
||||||
from didier.data.flags.owner import EditCustomFlags
|
from didier.data.flags.owner import EditCustomFlags
|
||||||
|
from didier.data.modals.custom_commands import CreateCustomCommand, EditCustomCommand
|
||||||
|
|
||||||
|
|
||||||
class Owner(commands.Cog):
|
class Owner(commands.Cog):
|
||||||
|
|
|
@ -17,6 +17,12 @@ from database.models import UforaCourse
|
||||||
from didier.utils.types.datetime import int_to_weekday
|
from didier.utils.types.datetime import int_to_weekday
|
||||||
from didier.utils.types.string import leading
|
from didier.utils.types.string import leading
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"fetch_ufora_announcements",
|
||||||
|
"parse_ids",
|
||||||
|
"UforaNotification",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class UforaNotification:
|
class UforaNotification:
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
from .posix import PosixFlags
|
from .posix import PosixFlags
|
||||||
|
|
||||||
|
__all__ = ["PosixFlags"]
|
||||||
|
|
|
@ -2,6 +2,8 @@ from typing import Optional
|
||||||
|
|
||||||
from didier.data.flags import PosixFlags
|
from didier.data.flags import PosixFlags
|
||||||
|
|
||||||
|
__all__ = ["EditCustomFlags"]
|
||||||
|
|
||||||
|
|
||||||
class EditCustomFlags(PosixFlags):
|
class EditCustomFlags(PosixFlags):
|
||||||
"""Flags for the edit custom command"""
|
"""Flags for the edit custom command"""
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
|
||||||
|
__all__ = ["PosixFlags"]
|
||||||
|
|
||||||
|
|
||||||
class PosixFlags(commands.FlagConverter, delimiter=" ", prefix="--"): # type: ignore
|
class PosixFlags(commands.FlagConverter, delimiter=" ", prefix="--"): # type: ignore
|
||||||
"""Base class to add POSIX-like flags to commands
|
"""Base class to add POSIX-like flags to commands
|
||||||
|
|
|
@ -6,6 +6,8 @@ import discord
|
||||||
from database.crud.custom_commands import create_command, edit_command
|
from database.crud.custom_commands import create_command, edit_command
|
||||||
from didier import Didier
|
from didier import Didier
|
||||||
|
|
||||||
|
__all__ = ["CreateCustomCommand", "EditCustomCommand"]
|
||||||
|
|
||||||
|
|
||||||
class CreateCustomCommand(discord.ui.Modal, title="Create Custom Command"):
|
class CreateCustomCommand(discord.ui.Modal, title="Create Custom Command"):
|
||||||
"""Modal to create new custom commands"""
|
"""Modal to create new custom commands"""
|
||||||
|
|
|
@ -10,6 +10,8 @@ from database.crud import custom_commands
|
||||||
from database.engine import DBSession
|
from database.engine import DBSession
|
||||||
from didier.utils.discord.prefix import get_prefix
|
from didier.utils.discord.prefix import get_prefix
|
||||||
|
|
||||||
|
__all__ = ["Didier"]
|
||||||
|
|
||||||
|
|
||||||
class Didier(commands.Bot):
|
class Didier(commands.Bot):
|
||||||
"""DIDIER <3"""
|
"""DIDIER <3"""
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
from .message_commands import is_owner
|
from .message_commands import is_owner
|
||||||
|
|
||||||
|
__all__ = ["is_owner"]
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
|
||||||
|
__all__ = ["is_owner"]
|
||||||
|
|
||||||
|
|
||||||
async def is_owner(ctx: commands.Context) -> bool:
|
async def is_owner(ctx: commands.Context) -> bool:
|
||||||
"""Check that a command is being invoked by the owner of the bot"""
|
"""Check that a command is being invoked by the owner of the bot"""
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
from .numbers import *
|
from .numbers import abbreviated_number
|
||||||
|
|
||||||
|
__all__ = ["abbreviated_number"]
|
||||||
|
|
|
@ -31,11 +31,11 @@ def abbreviated_number(argument: str) -> Union[str, int]:
|
||||||
value = units.get(unit)
|
value = units.get(unit)
|
||||||
argument = argument[:-1]
|
argument = argument[:-1]
|
||||||
|
|
||||||
# [int][unit]
|
# [int][unit] # noqa: E800
|
||||||
if "." not in argument and value is not None:
|
if "." not in argument and value is not None:
|
||||||
return int(argument) * (10**value)
|
return int(argument) * (10**value)
|
||||||
|
|
||||||
# [float][unit]
|
# [float][unit] # noqa: E800
|
||||||
if "." in argument:
|
if "." in argument:
|
||||||
# Floats themselves are not supported
|
# Floats themselves are not supported
|
||||||
if value is None:
|
if value is None:
|
||||||
|
|
|
@ -5,6 +5,8 @@ from discord.ext import commands
|
||||||
|
|
||||||
from didier.data import constants
|
from didier.data import constants
|
||||||
|
|
||||||
|
__all__ = ["get_prefix"]
|
||||||
|
|
||||||
|
|
||||||
def get_prefix(client: commands.Bot, message: Message) -> str:
|
def get_prefix(client: commands.Bot, message: Message) -> str:
|
||||||
"""Match a prefix against a message
|
"""Match a prefix against a message
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
__all__ = ["int_to_weekday"]
|
||||||
|
|
||||||
|
|
||||||
def int_to_weekday(number: int) -> str: # pragma: no cover # it's useless to write a test for this
|
def int_to_weekday(number: int) -> str: # pragma: no cover # it's useless to write a test for this
|
||||||
"""Get the Dutch name of a weekday from the number"""
|
"""Get the Dutch name of a weekday from the number"""
|
||||||
return ["Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"][number]
|
return ["Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"][number]
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import math
|
import math
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
__all__ = ["leading", "pluralize"]
|
||||||
|
|
||||||
|
|
||||||
def leading(character: str, string: str, target_length: Optional[int] = 2) -> str:
|
def leading(character: str, string: str, target_length: Optional[int] = 2) -> str:
|
||||||
"""Add a leading [character] to [string] to make it length [target_length]
|
"""Add a leading [character] to [string] to make it length [target_length]
|
||||||
|
|
3
main.py
3
main.py
|
@ -1,9 +1,8 @@
|
||||||
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from logging.handlers import RotatingFileHandler
|
from logging.handlers import RotatingFileHandler
|
||||||
|
|
||||||
import asyncio
|
|
||||||
|
|
||||||
import settings
|
import settings
|
||||||
from database.migrations import ensure_latest_migration
|
from database.migrations import ensure_latest_migration
|
||||||
from didier import Didier
|
from didier import Didier
|
||||||
|
|
|
@ -17,6 +17,9 @@ omit = [
|
||||||
"./didier/data/*"
|
"./didier/data/*"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[tool.isort]
|
||||||
|
profile = "black"
|
||||||
|
|
||||||
[tool.mypy]
|
[tool.mypy]
|
||||||
plugins = [
|
plugins = [
|
||||||
"sqlalchemy.ext.mypy.plugin"
|
"sqlalchemy.ext.mypy.plugin"
|
||||||
|
@ -25,19 +28,6 @@ plugins = [
|
||||||
module = ["discord.*", "feedparser.*", "markdownify.*"]
|
module = ["discord.*", "feedparser.*", "markdownify.*"]
|
||||||
ignore_missing_imports = true
|
ignore_missing_imports = true
|
||||||
|
|
||||||
[tool.pylint.master]
|
|
||||||
disable = [
|
|
||||||
"missing-module-docstring",
|
|
||||||
"too-few-public-methods",
|
|
||||||
"too-many-arguments",
|
|
||||||
"too-many-instance-attributes",
|
|
||||||
"too-many-locals"
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.pylint.format]
|
|
||||||
max-line-length = 120
|
|
||||||
good-names = ["i", "dt"]
|
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
asyncio_mode = "auto"
|
asyncio_mode = "auto"
|
||||||
env = [
|
env = [
|
||||||
|
|
|
@ -1,9 +1,18 @@
|
||||||
black==22.3.0
|
black==22.3.0
|
||||||
coverage[toml]==6.4.1
|
coverage[toml]==6.4.1
|
||||||
mypy==0.961
|
mypy==0.961
|
||||||
pylint==2.14.1
|
|
||||||
pytest==7.1.2
|
pytest==7.1.2
|
||||||
pytest-asyncio==0.18.3
|
pytest-asyncio==0.18.3
|
||||||
pytest-env==0.6.2
|
pytest-env==0.6.2
|
||||||
sqlalchemy2-stubs==0.0.2a23
|
sqlalchemy2-stubs==0.0.2a23
|
||||||
types-pytz==2021.3.8
|
types-pytz==2021.3.8
|
||||||
|
|
||||||
|
# Flake8 + plugins
|
||||||
|
flake8==4.0.1
|
||||||
|
flake8-bandit==3.0.0
|
||||||
|
flake8-black==0.3.3
|
||||||
|
flake8-bugbear==22.7.1
|
||||||
|
flake8-dunder-all==0.2.1
|
||||||
|
flake8-eradicate==1.2.1
|
||||||
|
flake8-isort==4.1.1
|
||||||
|
flake8-simplify==0.19.2
|
||||||
|
|
Loading…
Reference in New Issue