diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 2a562d1..0000000 --- a/.coveragerc +++ /dev/null @@ -1,11 +0,0 @@ -[paths] -source = src - -[run] -branch = true -source = src -omit = src/HcoopMeetbot/test.py - -[report] -show_missing = false -precision = 1 diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index a8371d7..9f3661c 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -16,7 +16,7 @@ concurrency: jobs: linux-build-and-test: name: "Linux" - uses: pronovic/gha-shared-workflows/.github/workflows/poetry-build-and-test.yml@v7 + uses: pronovic/gha-shared-workflows/.github/workflows/poetry-build-and-test.yml@v8 secrets: inherit with: matrix-os-version: "[ 'ubuntu-latest' ]" @@ -25,7 +25,7 @@ jobs: persist-python-version: "3.10" # persist artifacts for the oldest supported Python version macos-build-and-test: name: "MacOS" - uses: pronovic/gha-shared-workflows/.github/workflows/poetry-build-and-test.yml@v7 + uses: pronovic/gha-shared-workflows/.github/workflows/poetry-build-and-test.yml@v8 secrets: inherit with: matrix-os-version: "[ 'macos-latest' ]" @@ -33,7 +33,7 @@ jobs: release: name: "Release" if: github.ref_type == 'tag' - uses: pronovic/gha-shared-workflows/.github/workflows/poetry-release.yml@v7 + uses: pronovic/gha-shared-workflows/.github/workflows/poetry-release.yml@v8 needs: [ linux-build-and-test, macos-build-and-test ] secrets: inherit with: diff --git a/.mypy.ini b/.mypy.ini deleted file mode 100644 index d5dc8ca..0000000 --- a/.mypy.ini +++ /dev/null @@ -1,55 +0,0 @@ -[mypy] -pretty = True -show_absolute_path = True -show_column_numbers = True -show_error_codes = True -files = src/HcoopMeetbot, tests - -# This is mostly equivalent to strict=true as of v0.770 -check_untyped_defs = True -disallow_any_generics = True -disallow_incomplete_defs = True -disallow_subclassing_any = True -disallow_untyped_calls = True -disallow_untyped_decorators = False -disallow_untyped_defs = True -no_implicit_optional = True -no_implicit_reexport = True -strict_equality = True -warn_redundant_casts = True -warn_return_any = True -warn_unused_configs = True -warn_unused_ignores = True - -# Limnoria is not typed, so it's hard to make anything that directly uses it compliant -[mypy-HcoopMeetbot.plugin.*] -ignore_errors = True -[mypy-HcoopMeetbot.config.*] -ignore_errors = True -[mypy-HcoopMeetbot.test.*] -ignore_errors = True - -# There is no type hinting for genshi -[mypy-genshi.*] -ignore_missing_imports = True - -# It's hard to make tests compliant using unittest.mock -[mypy-tests.*] -check_untyped_defs = False -allow_untyped_defs = True - -# There is no type hinting for pytest -[mypy-pytest] -ignore_missing_imports = True - -# There is no type hinting for supybot -[mypy-supybot] -ignore_missing_imports = True -[mypy-supybot.commands] -ignore_missing_imports = True -[mypy-supybot.ircmsgs] -ignore_missing_imports = True -[mypy-supybot.i18n] -ignore_missing_imports = True -[mypy-supybot.test] -ignore_missing_imports = True diff --git a/.pytest.ini b/.pytest.ini deleted file mode 100644 index eea2c18..0000000 --- a/.pytest.ini +++ /dev/null @@ -1 +0,0 @@ -[pytest] diff --git a/.run/commands/bumpchangelog.sh b/.run/commands/bumpchangelog.sh index 00a318b..ab6965e 100644 --- a/.run/commands/bumpchangelog.sh +++ b/.run/commands/bumpchangelog.sh @@ -1,10 +1,10 @@ # vim: set ft=bash ts=3 sw=3 expandtab: # Bump the version in the changelog, preparing for a new development cycle -# If pyproject.toml is configured to use the poetry-dynamic-versioning plugin, -# then you need to have it installed locally, or you will get unexpected results -# from this command. The new version in the Changelog will always be "0.0.1", -# because all Poetry is aware of is the hardcoded version "0.0.0". +# This relies on the poetry-dynamic-versioning plugin, which is assumed to be +# installed as a project plugin. If it's not installed, the new version in the +# Changelog will always be "0.0.1", because all Poetry is aware of is the +# hardcoded version "0.0.0". command_bumpchangelog() { mv Changelog Changelog.$$ diff --git a/.run/commands/outdated.sh b/.run/commands/outdated.sh index df19540..66441df 100644 --- a/.run/commands/outdated.sh +++ b/.run/commands/outdated.sh @@ -6,7 +6,7 @@ command_outdated() { echo "Updating dependencies with current constraints..." echo "" - poetry update + poetry update --sync --with=dev if [ $? != 0 ]; then echo "*** Failed to update dependencies" exit 1 @@ -16,13 +16,13 @@ command_outdated() { echo "Checking for outdated constraints..." echo "" - PATTERNS=$(poetry show --tree | grep '^\w' | cut -d' ' -f1 | sed 's/.*/^&\\s/') + PATTERNS=$(poetry show --with=dev --tree | grep '^\w' | cut -d' ' -f1 | sed 's/.*/^&\\s/') if [ $? != 0 ]; then echo "*** Failed to run 'poetry show --tree'" exit 1 fi - OUTDATED=$(poetry show --outdated) + OUTDATED=$(poetry show --with=dev --outdated) if [ $? != 0 ]; then echo "*** Failed to run 'poetry show --outdated'" exit 1 diff --git a/.run/commands/poetryplugin.sh b/.run/commands/poetryplugin.sh deleted file mode 100644 index f5a7f8c..0000000 --- a/.run/commands/poetryplugin.sh +++ /dev/null @@ -1,12 +0,0 @@ -# vim: set ft=bash ts=3 sw=3 expandtab: -# Install a Poetry plugin - -command_poetryplugin() { - poetry self add --quiet "$@" - if [ $? != 0 ]; then - echo "" - echo "*** Failed to install Poetry plugin: $*" - exit 1 - fi -} - diff --git a/.run/commands/virtualenv.sh b/.run/commands/virtualenv.sh index d5f8dff..781f663 100644 --- a/.run/commands/virtualenv.sh +++ b/.run/commands/virtualenv.sh @@ -2,7 +2,7 @@ # Create and update the virtualenv, synchronizing it to versions in poetry.lock command_virtualenv() { - poetry install --sync --all-extras + poetry sync --all-extras --all-groups if [ $? != 0 ]; then echo "*** Failed to install the virtualenv" exit 1 diff --git a/.run/tasks/docs.sh b/.run/tasks/docs.sh index 4c33b92..17ed399 100644 --- a/.run/tasks/docs.sh +++ b/.run/tasks/docs.sh @@ -6,6 +6,7 @@ help_docs() { } task_docs() { + run_command virtualenv # work around the fact that Poetry sometimes uninstalls extras run_command sphinx "$@" } diff --git a/Changelog b/Changelog index 633c566..859e3d5 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,11 @@ +Version 0.6.14 unreleased + + * Migrate to Poetry v2 and project-managed Poetry plugins. + * Move configuration into pyproject.toml for pytest, mypy & coverage. + * Upgrade to gha-shared-workflows@v8 for Poetry v2 support. + * Address some Genshi warnings exposed by Pytest warnings->errors config. + * Update all dependencies and outdated constraints. + Version 0.6.13 02 Jan 2025 * Add GitHub security policy in SECURITY.md. diff --git a/DEVELOPER.md b/DEVELOPER.md index a8b9317..3ee7d32 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -25,7 +25,7 @@ suites and combines the coverage results together into a single report. ## Packaging and Dependencies -This project uses [Poetry](https://python-poetry.org/) to manage Python packaging and dependencies. Most day-to-day tasks (such as running unit tests from the command line) are orchestrated through Poetry. +This project uses [Poetry v2](https://python-poetry.org/) to manage Python packaging and dependencies. Most day-to-day tasks (such as running unit tests from the command line) are orchestrated through Poetry. A coding standard is enforced using [Black](https://pypi.org/project/black/), [isort](https://pypi.org/project/isort/) and [Pylint](https://pypi.org/project/pylint/). Python 3 type hinting is validated using [MyPy](https://pypi.org/project/mypy/). To reduce boilerplate, classes are defined using [Attrs](https://www.attrs.org/) (see this [rationale](https://glyph.twistedmatrix.com/2016/08/attrs.html)). @@ -53,7 +53,7 @@ sure that you have a working Python 3 enviroment and install Poetry itself. ### Poetry Version -The project is designed to work with Poetry >= 1.8.0. If you already have an older +The project is designed to work with Poetry >= 2.0.0. If you already have an older version of Poetry installed on your system, upgrade it first. ### MacOS @@ -72,14 +72,12 @@ Finally, install Poetry itself and then verify your installation: ``` pipx install poetry -pipx inject poetry poetry-dynamic-versioning -pipx list --include-injected ``` To upgrade this installation later, use: ``` -pipx upgrade --include-injected poetry +pipx upgrade poetry ``` ### Debian @@ -97,14 +95,12 @@ Finally, install Poetry itself and then verify your installation: ``` pipx install poetry -pipx inject poetry poetry-dynamic-versioning -pipx list --include-injected ``` To upgrade this installation later, use: ``` -pipx upgrade --include-injected poetry +pipx upgrade poetry ``` ## Developer Tasks @@ -250,7 +246,7 @@ Go to the PyCharm settings and find the `hcoop-meetbot` project. Under the **Exclude Files** box, enter the following: ``` -LICENSE;NOTICE;PyPI.md;.coverage;.coveragerc;.github;.gitignore;.gitattributes;.htmlcov;.idea;.isort.cfg;.mypy.ini;.mypy_cache;.pre-commit-config.yaml;.pylintrc;.pytest_cache;.pytest.ini;.readthedocs.yml;.tabignore;build;dist;docs/_build;out;poetry.lock;poetry.toml;run;.run;.venv;localbot;test-conf;test-data;tmp;web;backup +LICENSE;NOTICE;PyPI.md;build;dist;docs/_build;out;poetry.lock;poetry.toml;run;.coverage;.coverage.lcov;.coveragerc;.gitattributes;.github;.gitignore;.htmlcov;.idea;.mypy_cache;.poetry;.pre-commit-config.yaml;.pylintrc;.pytest_cache;.readthedocs.yml;.run;.tabignore;.venv;localbot;test-conf;test-data;tmp;web;backup;meetings;test-logs ``` When you're done, click **Ok**. Then, go to the gear icon in the project panel diff --git a/poetry.lock b/poetry.lock index 50d23f7..b473c71 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand. [[package]] name = "alabaster" @@ -6,6 +6,8 @@ version = "1.0.0" description = "A light, configurable Sphinx theme" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, @@ -17,10 +19,12 @@ version = "3.3.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.9.0" +groups = ["main", "dev"] files = [ {file = "astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c"}, {file = "astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b"}, ] +markers = {main = "extra == \"docs\""} [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} @@ -31,6 +35,7 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, @@ -50,6 +55,8 @@ version = "2.16.0" description = "Internationalization utilities" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -64,6 +71,7 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -110,6 +118,7 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -136,6 +145,8 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -147,6 +158,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -158,6 +170,8 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -259,6 +273,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -273,6 +288,7 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -284,6 +300,7 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -358,6 +375,7 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -373,6 +391,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -384,6 +403,8 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -395,6 +416,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -409,6 +432,7 @@ version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, @@ -425,6 +449,7 @@ version = "0.7.9" description = "A toolkit for generation of output for the web" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Genshi-0.7.9-py3-none-any.whl", hash = "sha256:0f888d0ec944d7812eb92893380d6fdaea025e9e54c3e5a61f3dc666b2afb178"}, {file = "Genshi-0.7.9.tar.gz", hash = "sha256:c76170a8b2dc18944e0915103c284cb889dfcee34e0e140ba3363c80f7541ad2"}, @@ -439,13 +464,14 @@ plugin = ["setuptools (>=0.6a2)"] [[package]] name = "identify" -version = "2.6.4" +version = "2.6.5" description = "File identification library for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "identify-2.6.4-py2.py3-none-any.whl", hash = "sha256:993b0f01b97e0568c179bb9196391ff391bfb88a99099dbf5ce392b68f42d0af"}, - {file = "identify-2.6.4.tar.gz", hash = "sha256:285a7d27e397652e8cafe537a6cc97dd470a970f48fb2e9d979aa38eae5513ac"}, + {file = "identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566"}, + {file = "identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc"}, ] [package.extras] @@ -457,6 +483,8 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -471,6 +499,8 @@ version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, @@ -482,6 +512,8 @@ version = "8.5.0" description = "Read metadata from Python packages" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, @@ -505,6 +537,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -516,6 +549,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -530,6 +564,8 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -547,6 +583,7 @@ version = "2024.12.20" description = "A multipurpose Python IRC bot, designed for flexibility and robustness , while being easy to install, set up, and maintain." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "limnoria-2024.12.20.tar.gz", hash = "sha256:7bc62f076f6d820b2c5fc68c452a0bbe9aec48159e29529f843ad265e036ac24"}, ] @@ -557,6 +594,8 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -627,6 +666,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -638,6 +678,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -697,6 +738,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -708,6 +750,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -719,10 +762,12 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "pathspec" @@ -730,6 +775,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -741,6 +787,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -757,6 +804,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -772,6 +820,7 @@ version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, @@ -786,13 +835,15 @@ virtualenv = ">=20.10.0" [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, ] [package.extras] @@ -804,6 +855,7 @@ version = "3.3.3" description = "python code static checker" optional = false python-versions = ">=3.9.0" +groups = ["dev"] files = [ {file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"}, {file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"}, @@ -833,6 +885,7 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -855,6 +908,7 @@ version = "3.1.0" description = "A testdox format reporter for pytest" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-testdox-3.1.0.tar.gz", hash = "sha256:f48c49c517f0fb926560b383062db4961112078ec6ca555f91692c661bb5c765"}, {file = "pytest_testdox-3.1.0-py2.py3-none-any.whl", hash = "sha256:f3a8f0789d668ccfb60f15aab81fb927b75066cfd19209176166bd7cecae73e6"}, @@ -869,6 +923,7 @@ version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -880,6 +935,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -935,6 +991,7 @@ files = [ {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "requests" @@ -942,6 +999,8 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -963,6 +1022,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -974,6 +1034,8 @@ version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, @@ -985,6 +1047,8 @@ version = "8.1.3" description = "Python documentation generator" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, @@ -1020,6 +1084,8 @@ version = "3.4.0" description = "Sphinx API documentation generator" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx_autoapi-3.4.0-py3-none-any.whl", hash = "sha256:4027fef2875a22c5f2a57107c71641d82f6166bf55beb407a47aaf3ef14e7b92"}, {file = "sphinx_autoapi-3.4.0.tar.gz", hash = "sha256:e6d5371f9411bbb9fca358c00a9e57aef3ac94cbfc5df4bab285946462f69e0c"}, @@ -1040,6 +1106,8 @@ version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, @@ -1056,6 +1124,8 @@ version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, @@ -1072,6 +1142,8 @@ version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, @@ -1088,6 +1160,8 @@ version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = true python-versions = ">=3.5" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, @@ -1102,6 +1176,8 @@ version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, @@ -1118,6 +1194,8 @@ version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, @@ -1134,6 +1212,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -1168,6 +1247,7 @@ files = [ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] +markers = {main = "extra == \"docs\" and python_version < \"3.11\"", dev = "python_version < \"3.11\""} [[package]] name = "tomlkit" @@ -1175,6 +1255,7 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -1186,6 +1267,7 @@ version = "2024.2.0.20241221" description = "Typing stubs for pytz" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5"}, {file = "types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9"}, @@ -1197,10 +1279,12 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +markers = {main = "python_version < \"3.11\""} [[package]] name = "urllib3" @@ -1208,6 +1292,8 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, @@ -1221,13 +1307,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.28.0" +version = "20.28.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, - {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, + {file = "virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb"}, + {file = "virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329"}, ] [package.dependencies] @@ -1245,6 +1332,8 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -1262,6 +1351,6 @@ type = ["pytest-mypy"] docs = ["importlib-metadata", "sphinx", "sphinx-autoapi"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.10,<4" -content-hash = "4e8089ca0076b7b073a335a1e1542f5a281573e8f5bbcf55e8842c083bb24ddd" +content-hash = "848973ba7efd8cb3502f9f3715dccca35430c8c28d65464a5e0b65a8e92c59d3" diff --git a/pyproject.toml b/pyproject.toml index ae6341e..77a60fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,26 +1,21 @@ +[build-system] +requires = ["poetry-core (>=2.0.0)", "poetry-dynamic-versioning (>=1.5.0,<2.0.0)"] +build-backend = "poetry_dynamic_versioning.backend" + [tool.poetry] -name = "hcoop-meetbot" -version = "0.0.0" # published version is managed using Git tags (see below) -description = "Plugin for Limnoria to help run IRC meetings" -authors = ["Kenneth J. Pronovici "] -license = "Apache-2.0" -readme = "PyPI.md" -homepage = "https://pypi.org/project/hcoop-meetbot/" +requires-poetry = ">=2.0.0" +packages = [ { include="HcoopMeetbot", from="src" }, { include="hcoopmeetbotlogic", from="src" } ] include = [ - { path = 'Changelog', format = 'sdist' }, - { path = 'NOTICE', format = 'sdist' }, - { path = 'LICENSE', format = 'sdist' }, - { path = 'CREDITS', format = 'sdist' }, - { path = 'README.md', format = 'sdist' }, - { path = 'docs', format = 'sdist' }, - { path = 'tests', format = 'sdist' }, + { path='Changelog', format='sdist' }, + { path='NOTICE', format='sdist' }, + { path='LICENSE', format='sdist' }, + { path='CREDITS', format='sdist' }, + { path='README.md', format='sdist' }, + { path='docs', format='sdist' }, + { path='tests', format='sdist' }, ] exclude = [ "HcoopMeetbot/test.py" ] # annoyingly, bot tests must live in the source tree -packages = [ { include = "HcoopMeetbot", from = "src" }, - { include = "hcoopmeetbotlogic", from = "src" } ] -classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: Apache Software License", +classifiers = [ "Operating System :: OS Independent", "Environment :: Console", "Intended Audience :: System Administrators", @@ -28,52 +23,68 @@ classifiers=[ "Topic :: Utilities", "Topic :: Communications :: Chat :: Internet Relay Chat" ] +version = "0.0.0" + +[tool.poetry.requires-plugins] +poetry-dynamic-versioning = { version=">=1.5.0,<2.0.0", extras=["plugin"] } # Published version is managed using Git tags # We get either the tag (like "0.24.1") or a snapshot-type version (like "0.24.1+3.e8319c4") -# If the plugin is not installed, then the version is always "0.0.0", taken from above [tool.poetry-dynamic-versioning] enable = true pattern = '^[vV](?P\d+\.\d+\.\d+)' # this extracts the version from our vX.Y.Z tag format format-jinja = "{% if distance == 0 and not dirty %}{{ base }}{% else %}{{ base }}+{{ distance }}.{{ commit }}{% endif %}" -[tool.poetry.scripts] -meetbot = "hcoopmeetbotlogic.cli:meetbot" +[project] +name = "hcoop-meetbot" +requires-python = ">=3.10,<4" +description = "Plugin for Limnoria to help run IRC meetings" +authors = [ { name="Kenneth J. Pronovici", email="pronovic@ieee.org" } ] +license = "Apache-2.0" +readme = "PyPI.md" +dynamic = [ "classifiers", "version" ] +dependencies = [ + "limnoria (>=2023.09.24)", + "attrs (>=24.2.0,<25.0.0)", + "cattrs (>=24.1.2,<25.0.0)", + "pytz (>=2023.3.post1)", + "genshi (>=0.7.7,<0.8.0)", + "click (>=8.1.7,<9.0.0)", +] + +[project.urls] +homepage = "https://pypi.org/project/hcoop-meetbot/" +repository = "https://github.com/pronovic/hcoop-meetbot" + +[project.optional-dependencies] +docs = [ + "importlib-metadata (>=8.5.0,<9.0.0)", + "sphinx (>=8.1.3,<9.0.0)", + "sphinx-autoapi (>=3.3.3,<4.0.0)", +] [tool.poetry.plugins."limnoria.plugins"] "HcoopMeetbot" = "HcoopMeetbot:plugin" -[tool.poetry.dependencies] -python = ">=3.10,<4" -limnoria = ">=2023.09.24" -attrs = "^24.2.0" -cattrs = "^24.1.2" -pytz = ">=2023.3.post1" -genshi = "^0.7.7" -click = "^8.1.7" -importlib-metadata = { version="^8.5.0", optional=true } -sphinx = { version="^8.1.3", optional=true } -sphinx-autoapi = { version="^3.0.0", optional=true } - -[tool.poetry.extras] -docs = [ "importlib-metadata", "sphinx", "sphinx-autoapi" ] - [tool.poetry.group.dev.dependencies] -pytest = "^8.0.2" -pytest-testdox = "^3.1.0" -coverage = "^7.4.4" -pylint = "^3.0.1" -pre-commit = "^4.0.1" -black = "^24.2.0" -mypy = "^1.6.0" -isort = "^5.12.0" +pytest = ">=8.0.2,<9.0.0" +pytest-testdox = ">=3.1.0,<4.0.0" +coverage = ">=7.4.4,<8.0.0" +pylint = ">=3.0.1,<4.0.0" +pre-commit = ">=4.0.1,<5.0.0" +black = ">=24.2.0,<25.0.0" +mypy = ">=1.6.0,<2.0.0" +isort = ">=5.12.0,<6.0.0" +colorama = ">=0.4.6,<1.0.0" types-pytz = ">=2023.3.1.1" -colorama = "~0, >=0.4.6" + +[tool.poetry.scripts] +meetbot = "hcoopmeetbotlogic.cli:meetbot" [tool.black] line-length = 132 target-version = [ 'py310', 'py311', 'py312', 'py313' ] -include = '(src\/scripts\/.*$|\.pyi?$)' +include = '\.pyi?$' exclude = ''' /( \.git @@ -91,13 +102,73 @@ exclude = ''' [tool.isort] profile = "black" line_length = 132 -skip_glob = [ "docs", "notes" ] +skip_glob = [ "docs", "notes", ".poetry" ] + +[tool.coverage.paths] +source = [ "src" ] + +[tool.coverage.run] +branch = true +source = [ "src" ] +omit = [ "src/HcoopMeetbot/test.py" ] + +[tool.coverage.report] +show_missing = false +precision = 1 [tool.pytest.ini_options] filterwarnings = [ - 'ignore:.*Flags not at the start of the expression.' # Genshi does some deprecated things that don't matter to us + 'error', # turn all Python warnings into test failures, so they're hard to miss + 'ignore:.*Flags not at the start of the expression::genshi', # warning in Genshi code we do not control + 'ignore:.*_init__ missing 1 required positional argument::genshi', # warning in Genshi code we do not control ] -[build-system] -requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"] -build-backend = "poetry_dynamic_versioning.backend" +[tool.mypy] +# Settings are mostly equivalent to strict=true as of v1.14.1 +pretty = true +show_absolute_path = true +show_column_numbers = true +show_error_codes = true +files = [ "src/HcoopMeetbot", "tests" ] +check_untyped_defs = true +disallow_any_generics = true +disallow_incomplete_defs = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_decorators = false +disallow_untyped_defs = true +no_implicit_optional = true +no_implicit_reexport = true +strict_equality = true +strict_optional = true +warn_redundant_casts = true +warn_return_any = true +warn_no_return = true +warn_unused_configs = true +warn_unused_ignores = true + +# It's hard to make tests compliant using unittest.mock +[[tool.mypy.overrides]] +module = "tests.*" +check_untyped_defs = false +allow_untyped_defs = true + +# There is no type hinting for pytest +[[tool.mypy.overrides]] +module = "pytest" +ignore_missing_imports = true + +# There is no type hinting for genshi +[[tool.mypy.overrides]] +module = "genshi.*" +ignore_missing_imports = true + +# Limnoria is not typed, so it's hard to make anything that directly uses it compliant +[[tool.mypy.overrides]] +module = [ "HcoopMeetbot.plugin.*", "HcoopMeetbot.config.*", "HcoopMeetbot.test.*" ] +ignore_errors = true + +# There is no type hinting for supybot +[[tool.mypy.overrides]] +module = [ "supybot", "supybot.*" ] +ignore_missing_imports = true