diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 3b71da3..0000000 --- a/.flake8 +++ /dev/null @@ -1,18 +0,0 @@ -[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 \ No newline at end of file diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index b083e02..ebcf246 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -78,7 +78,7 @@ jobs: - name: Install dependencies run: pip3 install -r requirements.txt -r requirements-dev.txt - name: Linting - run: flake8 + run: pylint didier database typing: needs: [dependencies] runs-on: ubuntu-latest diff --git a/database/crud/currency.py b/database/crud/currency.py index f72b653..8e7f2e6 100644 --- a/database/crud/currency.py +++ b/database/crud/currency.py @@ -6,23 +6,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from database.crud import users from database.exceptions import currency as exceptions from database.models import Bank, NightlyData -from database.utils.math.currency import ( - capacity_upgrade_price, - interest_upgrade_price, - rob_upgrade_price, -) +from database.utils.math.currency import rob_upgrade_price, interest_upgrade_price, capacity_upgrade_price -__all__ = [ - "add_dinks", - "claim_nightly", - "get_bank", - "get_nightly_data", - "invest", - "upgrade_capacity", - "upgrade_interest", - "upgrade_rob", - "NIGHTLY_AMOUNT", -] NIGHTLY_AMOUNT = 420 diff --git a/database/crud/custom_commands.py b/database/crud/custom_commands.py index c6377c6..4f5dd2f 100644 --- a/database/crud/custom_commands.py +++ b/database/crud/custom_commands.py @@ -7,16 +7,6 @@ from database.exceptions.constraints import DuplicateInsertException from database.exceptions.not_found import NoResultFoundException 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: """Convert a name to lowercase & remove spaces to allow easier matching""" diff --git a/database/crud/ufora_announcements.py b/database/crud/ufora_announcements.py index 5f82390..c4d67f6 100644 --- a/database/crud/ufora_announcements.py +++ b/database/crud/ufora_announcements.py @@ -1,11 +1,9 @@ import datetime -from sqlalchemy import delete, select +from sqlalchemy import select, delete from sqlalchemy.ext.asyncio import AsyncSession -from database.models import UforaAnnouncement, UforaCourse - -__all__ = ["create_new_announcement", "get_courses_with_announcements", "remove_old_announcements"] +from database.models import UforaCourse, UforaAnnouncement async def get_courses_with_announcements(session: AsyncSession) -> list[UforaCourse]: diff --git a/database/crud/users.py b/database/crud/users.py index cc5a899..794d951 100644 --- a/database/crud/users.py +++ b/database/crud/users.py @@ -3,11 +3,7 @@ from typing import Optional from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from database.models import Bank, NightlyData, User - -__all__ = [ - "get_or_add", -] +from database.models import User, Bank, NightlyData async def get_or_add(session: AsyncSession, user_id: int) -> User: diff --git a/database/engine.py b/database/engine.py index 44b5e92..6636bcc 100644 --- a/database/engine.py +++ b/database/engine.py @@ -1,7 +1,7 @@ from urllib.parse import quote_plus from sqlalchemy.engine import URL -from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker import settings diff --git a/database/exceptions/constraints.py b/database/exceptions/constraints.py index 1087d6e..1e78089 100644 --- a/database/exceptions/constraints.py +++ b/database/exceptions/constraints.py @@ -1,5 +1,2 @@ -__all__ = ["DuplicateInsertException"] - - class DuplicateInsertException(Exception): """Exception raised when a value already exists""" diff --git a/database/exceptions/currency.py b/database/exceptions/currency.py index c06c76f..5710c62 100644 --- a/database/exceptions/currency.py +++ b/database/exceptions/currency.py @@ -1,6 +1,3 @@ -__all__ = ["DoubleNightly", "NotEnoughDinks"] - - class DoubleNightly(Exception): """Exception raised when claiming nightlies multiple times per day""" diff --git a/database/exceptions/not_found.py b/database/exceptions/not_found.py index 8a47fad..eccfaa5 100644 --- a/database/exceptions/not_found.py +++ b/database/exceptions/not_found.py @@ -1,5 +1,2 @@ -__all__ = ["NoResultFoundException"] - - class NoResultFoundException(Exception): """Exception raised when nothing was found""" diff --git a/database/migrations.py b/database/migrations.py index 1effdff..464c811 100644 --- a/database/migrations.py +++ b/database/migrations.py @@ -2,9 +2,8 @@ import logging from alembic import config, script from alembic.runtime import migration -from database.engine import engine -__all__ = ["ensure_latest_migration"] +from database.engine import engine async def ensure_latest_migration(): diff --git a/database/models.py b/database/models.py index 71d4f3c..ef2e439 100644 --- a/database/models.py +++ b/database/models.py @@ -3,25 +3,12 @@ from __future__ import annotations from datetime import datetime from typing import Optional -from sqlalchemy import BigInteger, Boolean, Column, DateTime, ForeignKey, Integer, Text +from sqlalchemy import BigInteger, Column, Integer, Text, ForeignKey, Boolean, DateTime from sqlalchemy.orm import declarative_base, relationship Base = declarative_base() -__all__ = [ - "Base", - "Bank", - "CustomCommand", - "CustomCommandAlias", - "NightlyData", - "UforaAnnouncement", - "UforaCourse", - "UforaCourseAlias", - "User", -] - - class Bank(Base): """A user's currency information""" diff --git a/database/utils/math/currency.py b/database/utils/math/currency.py index b06c558..c6d36d0 100644 --- a/database/utils/math/currency.py +++ b/database/utils/math/currency.py @@ -1,7 +1,5 @@ import math -__all__ = ["capacity_upgrade_price", "interest_upgrade_price", "rob_upgrade_price"] - def interest_upgrade_price(level: int) -> int: """Calculate the price to upgrade your interest level""" diff --git a/didier/__init__.py b/didier/__init__.py index 42c3fc4..62f3e85 100644 --- a/didier/__init__.py +++ b/didier/__init__.py @@ -1,3 +1 @@ from .didier import Didier - -__all__ = ["Didier"] diff --git a/didier/cogs/currency.py b/didier/cogs/currency.py index 4c76e58..b30c283 100644 --- a/didier/cogs/currency.py +++ b/didier/cogs/currency.py @@ -5,11 +5,7 @@ from discord.ext import commands from database.crud import currency as crud 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.utils.discord.checks import is_owner from didier.utils.discord.converters import abbreviated_number diff --git a/didier/cogs/help.py b/didier/cogs/help.py index 33250a8..9da24ca 100644 --- a/didier/cogs/help.py +++ b/didier/cogs/help.py @@ -1,4 +1,4 @@ -from typing import List, Mapping, Optional +from typing import Mapping, Optional, List import discord from discord.ext import commands diff --git a/didier/cogs/owner.py b/didier/cogs/owner.py index 401067c..0bde065 100644 --- a/didier/cogs/owner.py +++ b/didier/cogs/owner.py @@ -8,8 +8,8 @@ from database.crud import custom_commands from database.exceptions.constraints import DuplicateInsertException from database.exceptions.not_found import NoResultFoundException from didier import Didier -from didier.data.flags.owner import EditCustomFlags from didier.data.modals.custom_commands import CreateCustomCommand, EditCustomCommand +from didier.data.flags.owner import EditCustomFlags class Owner(commands.Cog): diff --git a/didier/data/embeds/ufora/announcements.py b/didier/data/embeds/ufora/announcements.py index 984674e..138837e 100644 --- a/didier/data/embeds/ufora/announcements.py +++ b/didier/data/embeds/ufora/announcements.py @@ -17,12 +17,6 @@ from database.models import UforaCourse from didier.utils.types.datetime import int_to_weekday from didier.utils.types.string import leading -__all__ = [ - "fetch_ufora_announcements", - "parse_ids", - "UforaNotification", -] - @dataclass class UforaNotification: diff --git a/didier/data/flags/__init__.py b/didier/data/flags/__init__.py index 93c1df6..1ef3b46 100644 --- a/didier/data/flags/__init__.py +++ b/didier/data/flags/__init__.py @@ -1,3 +1 @@ from .posix import PosixFlags - -__all__ = ["PosixFlags"] diff --git a/didier/data/flags/owner.py b/didier/data/flags/owner.py index 5ff75a9..e3e9789 100644 --- a/didier/data/flags/owner.py +++ b/didier/data/flags/owner.py @@ -2,8 +2,6 @@ from typing import Optional from didier.data.flags import PosixFlags -__all__ = ["EditCustomFlags"] - class EditCustomFlags(PosixFlags): """Flags for the edit custom command""" diff --git a/didier/data/flags/posix.py b/didier/data/flags/posix.py index 4a0ba85..8747165 100644 --- a/didier/data/flags/posix.py +++ b/didier/data/flags/posix.py @@ -1,7 +1,5 @@ from discord.ext import commands -__all__ = ["PosixFlags"] - class PosixFlags(commands.FlagConverter, delimiter=" ", prefix="--"): # type: ignore """Base class to add POSIX-like flags to commands diff --git a/didier/data/modals/custom_commands.py b/didier/data/modals/custom_commands.py index 65c259f..a54f690 100644 --- a/didier/data/modals/custom_commands.py +++ b/didier/data/modals/custom_commands.py @@ -6,8 +6,6 @@ import discord from database.crud.custom_commands import create_command, edit_command from didier import Didier -__all__ = ["CreateCustomCommand", "EditCustomCommand"] - class CreateCustomCommand(discord.ui.Modal, title="Create Custom Command"): """Modal to create new custom commands""" diff --git a/didier/didier.py b/didier/didier.py index 14a9943..ff26e7a 100644 --- a/didier/didier.py +++ b/didier/didier.py @@ -10,8 +10,6 @@ from database.crud import custom_commands from database.engine import DBSession from didier.utils.discord.prefix import get_prefix -__all__ = ["Didier"] - class Didier(commands.Bot): """DIDIER <3""" diff --git a/didier/utils/discord/checks/__init__.py b/didier/utils/discord/checks/__init__.py index cbccbc5..7332b42 100644 --- a/didier/utils/discord/checks/__init__.py +++ b/didier/utils/discord/checks/__init__.py @@ -1,3 +1 @@ from .message_commands import is_owner - -__all__ = ["is_owner"] diff --git a/didier/utils/discord/checks/message_commands.py b/didier/utils/discord/checks/message_commands.py index bb65270..a57b315 100644 --- a/didier/utils/discord/checks/message_commands.py +++ b/didier/utils/discord/checks/message_commands.py @@ -1,7 +1,5 @@ from discord.ext import commands -__all__ = ["is_owner"] - async def is_owner(ctx: commands.Context) -> bool: """Check that a command is being invoked by the owner of the bot""" diff --git a/didier/utils/discord/converters/__init__.py b/didier/utils/discord/converters/__init__.py index 9ce48ad..3f47753 100644 --- a/didier/utils/discord/converters/__init__.py +++ b/didier/utils/discord/converters/__init__.py @@ -1,3 +1 @@ -from .numbers import abbreviated_number - -__all__ = ["abbreviated_number"] +from .numbers import * diff --git a/didier/utils/discord/converters/numbers.py b/didier/utils/discord/converters/numbers.py index 573652f..443f3e7 100644 --- a/didier/utils/discord/converters/numbers.py +++ b/didier/utils/discord/converters/numbers.py @@ -31,11 +31,11 @@ def abbreviated_number(argument: str) -> Union[str, int]: value = units.get(unit) argument = argument[:-1] - # [int][unit] # noqa: E800 + # [int][unit] if "." not in argument and value is not None: return int(argument) * (10**value) - # [float][unit] # noqa: E800 + # [float][unit] if "." in argument: # Floats themselves are not supported if value is None: diff --git a/didier/utils/discord/prefix.py b/didier/utils/discord/prefix.py index f57e06d..a096920 100644 --- a/didier/utils/discord/prefix.py +++ b/didier/utils/discord/prefix.py @@ -5,8 +5,6 @@ from discord.ext import commands from didier.data import constants -__all__ = ["get_prefix"] - def get_prefix(client: commands.Bot, message: Message) -> str: """Match a prefix against a message diff --git a/didier/utils/types/datetime.py b/didier/utils/types/datetime.py index 3701b4f..73d9072 100644 --- a/didier/utils/types/datetime.py +++ b/didier/utils/types/datetime.py @@ -1,6 +1,3 @@ -__all__ = ["int_to_weekday"] - - 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""" return ["Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"][number] diff --git a/didier/utils/types/string.py b/didier/utils/types/string.py index ab4f415..0255877 100644 --- a/didier/utils/types/string.py +++ b/didier/utils/types/string.py @@ -1,8 +1,6 @@ import math from typing import Optional -__all__ = ["leading", "pluralize"] - def leading(character: str, string: str, target_length: Optional[int] = 2) -> str: """Add a leading [character] to [string] to make it length [target_length] diff --git a/main.py b/main.py index fdbc027..34a2cf3 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,9 @@ -import asyncio import logging import sys from logging.handlers import RotatingFileHandler +import asyncio + import settings from database.migrations import ensure_latest_migration from didier import Didier diff --git a/pyproject.toml b/pyproject.toml index ba0c283..a81c771 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,9 +17,6 @@ omit = [ "./didier/data/*" ] -[tool.isort] -profile = "black" - [tool.mypy] plugins = [ "sqlalchemy.ext.mypy.plugin" @@ -28,6 +25,19 @@ plugins = [ module = ["discord.*", "feedparser.*", "markdownify.*"] 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] asyncio_mode = "auto" env = [ diff --git a/requirements-dev.txt b/requirements-dev.txt index 6c6e38e..646f5e6 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,19 +1,9 @@ black==22.3.0 coverage[toml]==6.4.1 mypy==0.961 -pre-commit==2.20.0 +pylint==2.14.1 pytest==7.1.2 pytest-asyncio==0.18.3 pytest-env==0.6.2 sqlalchemy2-stubs==0.0.2a23 -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 +types-pytz==2021.3.8 \ No newline at end of file