From 64aa2686ea8900d5c7ebe3bd57780f71e86f4272 Mon Sep 17 00:00:00 2001 From: profitroll Date: Sun, 6 Aug 2023 19:11:16 +0200 Subject: [PATCH] Updated to 0.2.1 --- .gitea/workflows/tests.yml | 25 +++++++++++ pyproject.toml | 45 +++++++++++-------- requirements/_.txt | 1 + requirements/dev.txt | 10 +++++ requirements/pycord.txt | 1 + requirements/pyrogram.txt | 2 + requirements/speed.txt | 1 + {libbot => src/libbot}/__init__.py | 2 +- {libbot => src/libbot}/__main__.py | 0 {libbot => src/libbot}/i18n/__init__.py | 0 .../libbot}/i18n/classes/bot_locale.py | 0 {libbot => src/libbot}/i18n/sync/__init__.py | 0 .../libbot}/pyrogram/classes/__init__.py | 0 .../libbot}/pyrogram/classes/client.py | 12 ++--- .../libbot}/pyrogram/classes/command.py | 0 .../libbot}/pyrogram/classes/commandset.py | 0 {libbot => src/libbot}/sync/__init__.py | 0 tests/conftest.py | 20 +++++++++ tests/test_bot_locale.py | 16 ++++--- tests/test_config_async.py | 19 ++++---- tests/test_config_sync.py | 18 +++----- tests/test_i18n_async.py | 22 ++++++--- tests/test_i18n_sync.py | 28 +++++++----- tox.ini | 23 ++++++++++ 24 files changed, 176 insertions(+), 69 deletions(-) create mode 100644 .gitea/workflows/tests.yml create mode 100644 requirements/_.txt create mode 100644 requirements/dev.txt create mode 100644 requirements/pycord.txt create mode 100644 requirements/pyrogram.txt create mode 100644 requirements/speed.txt rename {libbot => src/libbot}/__init__.py (82%) rename {libbot => src/libbot}/__main__.py (100%) rename {libbot => src/libbot}/i18n/__init__.py (100%) rename {libbot => src/libbot}/i18n/classes/bot_locale.py (100%) rename {libbot => src/libbot}/i18n/sync/__init__.py (100%) rename {libbot => src/libbot}/pyrogram/classes/__init__.py (100%) rename {libbot => src/libbot}/pyrogram/classes/client.py (97%) rename {libbot => src/libbot}/pyrogram/classes/command.py (100%) rename {libbot => src/libbot}/pyrogram/classes/commandset.py (100%) rename {libbot => src/libbot}/sync/__init__.py (100%) create mode 100644 tests/conftest.py create mode 100644 tox.ini diff --git a/.gitea/workflows/tests.yml b/.gitea/workflows/tests.yml new file mode 100644 index 0000000..5101ee7 --- /dev/null +++ b/.gitea/workflows/tests.yml @@ -0,0 +1,25 @@ +name: Tests + +on: + - push + - pull_request + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox tox-gh-actions + - name: Test with tox + run: tox diff --git a/pyproject.toml b/pyproject.toml index f33f6f9..237b193 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,10 @@ [build-system] -requires = ["setuptools>=62.6,<66"] +requires = ["setuptools>=62.6", "wheel"] build-backend = "setuptools.build_meta" [project] name = "libbot" -version = "0.2.0" +dynamic = ["version", "dependencies", "optional-dependencies"] authors = [{ name = "Profitroll" }] description = "Universal bot library with functions needed for basic Discord/Telegram bot development." readme = "README.md" @@ -22,30 +22,24 @@ classifiers = [ "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities", ] -dependencies = ["aiofiles~=23.1.0"] -[project.optional-dependencies] -pycord = ["py-cord~=2.4.1"] -pyrogram = ["pyrogram~=2.0.106", "apscheduler~=3.10.1"] -speed = ["ujson~=5.8.0"] +[tool.setuptools.dynamic] +version = { attr = "libbot.__version__" } +dependencies = { file = "requirements/_.txt" } + +[tool.setuptools.dynamic.optional-dependencies] +dev = { file = "requirements/dev.txt" } +pycord = { file = "requirements/pycord.txt" } +pyrogram = { file = "requirements/pyrogram.txt" } +speed = { file = "requirements/speed.txt" } [project.urls] Source = "https://git.end-play.xyz/profitroll/LibBotUniversal" Documentation = "https://git.end-play.xyz/profitroll/LibBotUniversal/wiki" Tracker = "https://git.end-play.xyz/profitroll/LibBotUniversal/issues" -[tool.setuptools] -packages = [ - "libbot", - "libbot.sync", - "libbot.pyrogram", - "libbot.pyrogram.classes", - "libbot.i18n", - "libbot.i18n.sync", - "libbot.i18n.classes", -] - -[tool.setuptools_scm] +[tool.setuptools.packages.find] +where = ["src"] [tool.black] target-version = ['py38', 'py39', 'py310', 'py311'] @@ -58,3 +52,16 @@ minversion = "6.0" python_files = ["test_*.py"] pythonpath = "." testpaths = ["tests"] + +[tool.mypy] +namespace_packages = true +install_types = true +strict = true +show_error_codes = true + +[tool.pylint.main] +extension-pkg-whitelist = ["ujson"] +py-version = 3.8 + +[tool.coverage.run] +source = ["libbot"] diff --git a/requirements/_.txt b/requirements/_.txt new file mode 100644 index 0000000..685cdf2 --- /dev/null +++ b/requirements/_.txt @@ -0,0 +1 @@ +aiofiles~=23.1.0 \ No newline at end of file diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 0000000..8783d05 --- /dev/null +++ b/requirements/dev.txt @@ -0,0 +1,10 @@ +black==23.7.0 +isort==5.12.0 +mypy==1.4.1 +pylint==2.17.5 +pytest-asyncio==0.21.1 +pytest-cov==4.1.0 +pytest==7.4.0 +tox==4.6.4 +types-aiofiles==23.1.0.5 +types-ujson==5.8.0.1 \ No newline at end of file diff --git a/requirements/pycord.txt b/requirements/pycord.txt new file mode 100644 index 0000000..e38caa7 --- /dev/null +++ b/requirements/pycord.txt @@ -0,0 +1 @@ +py-cord~=2.4.1 \ No newline at end of file diff --git a/requirements/pyrogram.txt b/requirements/pyrogram.txt new file mode 100644 index 0000000..9d72624 --- /dev/null +++ b/requirements/pyrogram.txt @@ -0,0 +1,2 @@ +apscheduler~=3.10.1 +pyrogram~=2.0.106 \ No newline at end of file diff --git a/requirements/speed.txt b/requirements/speed.txt new file mode 100644 index 0000000..37c6a01 --- /dev/null +++ b/requirements/speed.txt @@ -0,0 +1 @@ +ujson~=5.8.0 \ No newline at end of file diff --git a/libbot/__init__.py b/src/libbot/__init__.py similarity index 82% rename from libbot/__init__.py rename to src/libbot/__init__.py index 33ab8c5..07df244 100644 --- a/libbot/__init__.py +++ b/src/libbot/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.2.0" +__version__ = "0.2.1" __license__ = "GPL3" __author__ = "Profitroll" diff --git a/libbot/__main__.py b/src/libbot/__main__.py similarity index 100% rename from libbot/__main__.py rename to src/libbot/__main__.py diff --git a/libbot/i18n/__init__.py b/src/libbot/i18n/__init__.py similarity index 100% rename from libbot/i18n/__init__.py rename to src/libbot/i18n/__init__.py diff --git a/libbot/i18n/classes/bot_locale.py b/src/libbot/i18n/classes/bot_locale.py similarity index 100% rename from libbot/i18n/classes/bot_locale.py rename to src/libbot/i18n/classes/bot_locale.py diff --git a/libbot/i18n/sync/__init__.py b/src/libbot/i18n/sync/__init__.py similarity index 100% rename from libbot/i18n/sync/__init__.py rename to src/libbot/i18n/sync/__init__.py diff --git a/libbot/pyrogram/classes/__init__.py b/src/libbot/pyrogram/classes/__init__.py similarity index 100% rename from libbot/pyrogram/classes/__init__.py rename to src/libbot/pyrogram/classes/__init__.py diff --git a/libbot/pyrogram/classes/client.py b/src/libbot/pyrogram/classes/client.py similarity index 97% rename from libbot/pyrogram/classes/client.py rename to src/libbot/pyrogram/classes/client.py index 7961253..6026fdf 100644 --- a/libbot/pyrogram/classes/client.py +++ b/src/libbot/pyrogram/classes/client.py @@ -115,7 +115,7 @@ class PyroClient(Client): self.scopes_placeholders: Dict[str, int] = {"owner": self.owner} - async def start(self, register_commands: bool = True): + async def start(self, register_commands: bool = True) -> None: await super().start() self.start_time = time() @@ -151,7 +151,7 @@ class PyroClient(Client): except BadRequest: logger.warning("Unable to send message to report chat.") - async def stop(self, exit_completely: bool = True): + async def stop(self, exit_completely: bool = True) -> None: try: await self.send_message( chat_id=self.owner @@ -269,7 +269,7 @@ class PyroClient(Client): def add_command( self, command: str, - ): + ) -> None: """Add command to the bot's internal commands list ### Args: @@ -288,7 +288,7 @@ class PyroClient(Client): async def register_commands( self, command_sets: Union[List[CommandSet], None] = None - ): + ) -> None: """Register commands stored in bot's 'commands' attribute""" if command_sets is None: @@ -317,7 +317,9 @@ class PyroClient(Client): language_code=command_set.language_code, ) - async def remove_commands(self, command_sets: Union[List[CommandSet], None] = None): + async def remove_commands( + self, command_sets: Union[List[CommandSet], None] = None + ) -> None: """Remove commands stored in bot's 'commands' attribute""" if command_sets is None: diff --git a/libbot/pyrogram/classes/command.py b/src/libbot/pyrogram/classes/command.py similarity index 100% rename from libbot/pyrogram/classes/command.py rename to src/libbot/pyrogram/classes/command.py diff --git a/libbot/pyrogram/classes/commandset.py b/src/libbot/pyrogram/classes/commandset.py similarity index 100% rename from libbot/pyrogram/classes/commandset.py rename to src/libbot/pyrogram/classes/commandset.py diff --git a/libbot/sync/__init__.py b/src/libbot/sync/__init__.py similarity index 100% rename from libbot/sync/__init__.py rename to src/libbot/sync/__init__.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..e7e66cf --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,20 @@ +from pathlib import Path + +import pytest + +from libbot.i18n import BotLocale + + +@pytest.fixture() +def location_config() -> Path: + return Path("tests/config.json") + + +@pytest.fixture() +def location_locale() -> Path: + return Path("tests/data/locale/") + + +@pytest.fixture() +def bot_locale(location_locale: Path) -> BotLocale: + return BotLocale(locales_root=location_locale) diff --git a/tests/test_bot_locale.py b/tests/test_bot_locale.py index 916669d..09160d3 100644 --- a/tests/test_bot_locale.py +++ b/tests/test_bot_locale.py @@ -5,8 +5,6 @@ import pytest from libbot.i18n import BotLocale -bot_locale = BotLocale(Path("tests/data/locale")) - @pytest.mark.parametrize( "key, args, locale, expected", @@ -20,7 +18,11 @@ bot_locale = BotLocale(Path("tests/data/locale")) ], ) def test_bot_locale_get( - key: str, args: List[str], locale: Union[str, None], expected: Any + key: str, + args: List[str], + locale: Union[str, None], + expected: Any, + bot_locale: BotLocale, ): assert ( bot_locale._(key, *args, locale=locale) @@ -37,7 +39,9 @@ def test_bot_locale_get( ("nested", ["callbacks", "default"], ["sure", "авжеж"]), ], ) -def test_i18n_in_all_locales(key: str, args: List[str], expected: Any): +def test_i18n_in_all_locales( + key: str, args: List[str], expected: Any, bot_locale: BotLocale +): assert (bot_locale.in_all_locales(key, *args)) == expected @@ -49,5 +53,7 @@ def test_i18n_in_all_locales(key: str, args: List[str], expected: Any): ("nested", ["callbacks", "default"], {"en": "sure", "uk": "авжеж"}), ], ) -def test_i18n_in_every_locale(key: str, args: List[str], expected: Any): +def test_i18n_in_every_locale( + key: str, args: List[str], expected: Any, bot_locale: BotLocale +): assert (bot_locale.in_every_locale(key, *args)) == expected diff --git a/tests/test_config_async.py b/tests/test_config_async.py index c907a79..0453c7c 100644 --- a/tests/test_config_async.py +++ b/tests/test_config_async.py @@ -14,11 +14,8 @@ from libbot import config_get, config_set (["bot_token", "bot"], "sample_token"), ], ) -async def test_config_get_valid(args: List[str], expected: str): - assert ( - await config_get(args[0], *args[1:], config_file=Path("tests/config.json")) - == expected - ) +async def test_config_get_valid(args: List[str], expected: str, location_config: Path): + assert await config_get(args[0], *args[1:], config_file=location_config) == expected @pytest.mark.asyncio @@ -28,10 +25,12 @@ async def test_config_get_valid(args: List[str], expected: str): (["bot_stonks", "bot"], pytest.raises(KeyError)), ], ) -async def test_config_get_invalid(args: List[str], expected: Any): +async def test_config_get_invalid( + args: List[str], expected: Any, location_config: Path +): with expected: assert ( - await config_get(args[0], *args[1:], config_file=Path("tests/config.json")) + await config_get(args[0], *args[1:], config_file=location_config) == expected ) @@ -44,6 +43,6 @@ async def test_config_get_invalid(args: List[str], expected: Any): ("bot_token", ["bot"], "sample_token"), ], ) -async def test_config_set(key: str, path: List[str], value: Any): - await config_set(key, value, *path, config_file=Path("tests/config.json")) - assert await config_get(key, *path, config_file=Path("tests/config.json")) == value +async def test_config_set(key: str, path: List[str], value: Any, location_config: Path): + await config_set(key, value, *path, config_file=location_config) + assert await config_get(key, *path, config_file=location_config) == value diff --git a/tests/test_config_sync.py b/tests/test_config_sync.py index b5184fd..1ed9e19 100644 --- a/tests/test_config_sync.py +++ b/tests/test_config_sync.py @@ -13,11 +13,8 @@ from libbot import sync (["bot_token", "bot"], "sample_token"), ], ) -def test_config_get_valid(args: List[str], expected: str): - assert ( - sync.config_get(args[0], *args[1:], config_file=Path("tests/config.json")) - == expected - ) +def test_config_get_valid(args: List[str], expected: str, location_config: Path): + assert sync.config_get(args[0], *args[1:], config_file=location_config) == expected @pytest.mark.parametrize( @@ -26,11 +23,10 @@ def test_config_get_valid(args: List[str], expected: str): (["bot_stonks", "bot"], pytest.raises(KeyError)), ], ) -def test_config_get_invalid(args: List[str], expected: Any): +def test_config_get_invalid(args: List[str], expected: Any, location_config: Path): with expected: assert ( - sync.config_get(args[0], *args[1:], config_file=Path("tests/config.json")) - == expected + sync.config_get(args[0], *args[1:], config_file=location_config) == expected ) @@ -41,6 +37,6 @@ def test_config_get_invalid(args: List[str], expected: Any): ("bot_token", ["bot"], "sample_token"), ], ) -def test_config_set(key: str, path: List[str], value: Any): - sync.config_set(key, value, *path, config_file=Path("tests/config.json")) - assert sync.config_get(key, *path, config_file=Path("tests/config.json")) == value +def test_config_set(key: str, path: List[str], value: Any, location_config: Path): + sync.config_set(key, value, *path, config_file=location_config) + assert sync.config_get(key, *path, config_file=location_config) == value diff --git a/tests/test_i18n_async.py b/tests/test_i18n_async.py index 1c48434..2f0d886 100644 --- a/tests/test_i18n_async.py +++ b/tests/test_i18n_async.py @@ -19,12 +19,16 @@ from libbot import i18n ], ) async def test_i18n_get( - key: str, args: List[str], locale: Union[str, None], expected: Any + key: str, + args: List[str], + locale: Union[str, None], + expected: Any, + location_locale: Path, ): assert ( - await i18n._(key, *args, locale=locale, locales_root=Path("tests/data/locale")) + await i18n._(key, *args, locale=locale, locales_root=location_locale) if locale is not None - else await i18n._(key, *args, locales_root=Path("tests/data/locale")) + else await i18n._(key, *args, locales_root=location_locale) ) == expected @@ -37,9 +41,11 @@ async def test_i18n_get( ("nested", ["callbacks", "default"], ["sure", "авжеж"]), ], ) -async def test_i18n_in_all_locales(key: str, args: List[str], expected: Any): +async def test_i18n_in_all_locales( + key: str, args: List[str], expected: Any, location_locale: Path +): assert ( - await i18n.in_all_locales(key, *args, locales_root=Path("tests/data/locale")) + await i18n.in_all_locales(key, *args, locales_root=location_locale) ) == expected @@ -52,7 +58,9 @@ async def test_i18n_in_all_locales(key: str, args: List[str], expected: Any): ("nested", ["callbacks", "default"], {"en": "sure", "uk": "авжеж"}), ], ) -async def test_i18n_in_every_locale(key: str, args: List[str], expected: Any): +async def test_i18n_in_every_locale( + key: str, args: List[str], expected: Any, location_locale: Path +): assert ( - await i18n.in_every_locale(key, *args, locales_root=Path("tests/data/locale")) + await i18n.in_every_locale(key, *args, locales_root=location_locale) ) == expected diff --git a/tests/test_i18n_sync.py b/tests/test_i18n_sync.py index bf634f6..b5a9559 100644 --- a/tests/test_i18n_sync.py +++ b/tests/test_i18n_sync.py @@ -17,11 +17,17 @@ from libbot.i18n import sync ("nested", ["callbacks", "default"], "uk", "авжеж"), ], ) -def test_i18n_get(key: str, args: List[str], locale: Union[str, None], expected: Any): +def test_i18n_get( + key: str, + args: List[str], + locale: Union[str, None], + expected: Any, + location_locale: Path, +): assert ( - sync._(key, *args, locale=locale, locales_root=Path("tests/data/locale")) + sync._(key, *args, locale=locale, locales_root=location_locale) if locale is not None - else sync._(key, *args, locales_root=Path("tests/data/locale")) + else sync._(key, *args, locales_root=location_locale) ) == expected @@ -33,10 +39,10 @@ def test_i18n_get(key: str, args: List[str], locale: Union[str, None], expected: ("nested", ["callbacks", "default"], ["sure", "авжеж"]), ], ) -def test_i18n_in_all_locales(key: str, args: List[str], expected: Any): - assert ( - sync.in_all_locales(key, *args, locales_root=Path("tests/data/locale")) - ) == expected +def test_i18n_in_all_locales( + key: str, args: List[str], expected: Any, location_locale: Path +): + assert (sync.in_all_locales(key, *args, locales_root=location_locale)) == expected @pytest.mark.parametrize( @@ -47,7 +53,7 @@ def test_i18n_in_all_locales(key: str, args: List[str], expected: Any): ("nested", ["callbacks", "default"], {"en": "sure", "uk": "авжеж"}), ], ) -def test_i18n_in_every_locale(key: str, args: List[str], expected: Any): - assert ( - sync.in_every_locale(key, *args, locales_root=Path("tests/data/locale")) - ) == expected +def test_i18n_in_every_locale( + key: str, args: List[str], expected: Any, location_locale: Path +): + assert (sync.in_every_locale(key, *args, locales_root=location_locale)) == expected diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..6425098 --- /dev/null +++ b/tox.ini @@ -0,0 +1,23 @@ +[tox] +minversion = 3.8.0 +envlist = py38, py39, py310, py311 +isolated_build = true + +[gh-actions] +python = + 3.8: py38 + 3.9: py39 + 3.10: py310 + 3.11: py311 + +[testenv] +setenv = + PYTHONPATH = {toxinidir} +deps = + -r{toxinidir}/requirements/_.txt + -r{toxinidir}/requirements/dev.txt + -r{toxinidir}/requirements/pycord.txt + -r{toxinidir}/requirements/pyrogram.txt + -r{toxinidir}/requirements/speed.txt +commands = + pytest --basetemp={envtmpdir} \ No newline at end of file