From 6c1e67ee9fb8db2f1fbc3eaf63d7accc2a195236 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 22:59:17 +0000 Subject: [PATCH 01/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.1.0 → v4.2.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.1.0...v4.2.0) - [github.com/psf/black: 22.1.0 → 22.3.0](https://github.com/psf/black/compare/22.1.0...22.3.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 235b3b79..6a7dcd76 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # https://pre-commit.com/ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.1.0 + rev: v4.2.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -15,7 +15,7 @@ repos: - id: flake8 args: [ --max-line-length=120 ] - repo: https://github.com/psf/black - rev: 22.1.0 + rev: 22.3.0 hooks: - id: black args: [--safe, --line-length=120] From 6f46a55838ab17211525b2b0b47f2be99abfc144 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Thu, 22 Sep 2022 11:23:46 +0200 Subject: [PATCH 02/75] Fixing a typo causes GitHub Actions to fail --- pylint_django/compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylint_django/compat.py b/pylint_django/compat.py index 4a50aed3..fa06cc1d 100644 --- a/pylint_django/compat.py +++ b/pylint_django/compat.py @@ -1,6 +1,6 @@ # flake8: noqa # pylint: skip-file -# no sane linter can figure out the hackiness in this compatability layer... +# no sane linter can figure out the hackiness in this compatibility layer... try: from astroid.nodes import AssignName, Attribute, ClassDef, FunctionDef, ImportFrom From c9fd33b480d6f4707bd63b70d2719c8d9d197bb7 Mon Sep 17 00:00:00 2001 From: panay Date: Wed, 21 Sep 2022 12:05:00 +0200 Subject: [PATCH 03/75] Add "pk" to the good_names list --- pylint_django/plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pylint_django/plugin.py b/pylint_django/plugin.py index d3f45a27..c7cc1313 100644 --- a/pylint_django/plugin.py +++ b/pylint_django/plugin.py @@ -15,6 +15,7 @@ def load_configuration(linter): """ name_checker = get_checker(linter, NameChecker) name_checker.config.good_names += ( + "pk", "qs", "urlpatterns", "register", From be126ee402022327d8b87eef00eb9e0a82e057de Mon Sep 17 00:00:00 2001 From: Simon Panay Date: Thu, 22 Sep 2022 11:39:32 +0200 Subject: [PATCH 04/75] ignore unnecessary-lambda-assignment in func_noerror_model_unicode_lambda test --- pylint_django/tests/input/func_noerror_model_unicode_lambda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylint_django/tests/input/func_noerror_model_unicode_lambda.py b/pylint_django/tests/input/func_noerror_model_unicode_lambda.py index da7bf9cb..a1db11b4 100644 --- a/pylint_django/tests/input/func_noerror_model_unicode_lambda.py +++ b/pylint_django/tests/input/func_noerror_model_unicode_lambda.py @@ -1,7 +1,7 @@ """ Ensures that django models without a __unicode__ method are flagged """ -# pylint: disable=missing-docstring,wrong-import-position +# pylint: disable=missing-docstring,wrong-import-position,unnecessary-lambda-assignment from django.db import models From b8217c17dab428e9d58fa6b1e0a1e816940a43ee Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 31 Jan 2023 06:02:37 +0000 Subject: [PATCH 05/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.2.0 → v4.4.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.2.0...v4.4.0) - [github.com/PyCQA/flake8: 4.0.1 → 6.0.0](https://github.com/PyCQA/flake8/compare/4.0.1...6.0.0) - [github.com/psf/black: 22.3.0 → 22.12.0](https://github.com/psf/black/compare/22.3.0...22.12.0) - [github.com/PyCQA/isort: 5.10.1 → 5.12.0](https://github.com/PyCQA/isort/compare/5.10.1...5.12.0) --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6a7dcd76..9456da11 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # https://pre-commit.com/ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.2.0 + rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -10,17 +10,17 @@ repos: - id: debug-statements # code formatting - repo: https://github.com/PyCQA/flake8 - rev: 4.0.1 + rev: 6.0.0 hooks: - id: flake8 args: [ --max-line-length=120 ] - repo: https://github.com/psf/black - rev: 22.3.0 + rev: 22.12.0 hooks: - id: black args: [--safe, --line-length=120] - repo: https://github.com/PyCQA/isort - rev: 5.10.1 + rev: 5.12.0 hooks: - id: isort args: ['--profile', 'black'] From c22f31be4957151ac331940793bd637b7fa43542 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sun, 14 May 2023 18:04:01 +0700 Subject: [PATCH 06/75] Starting to use poetry instead of legacy setup.py method for building and deploying packages --- CHANGELOG.rst | 6 + poetry.lock | 723 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 81 ++++++ 3 files changed, 810 insertions(+) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6d023cb0..26fe14e8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,12 @@ Changelog ========= +Version 2.6.0 (14 May 2023) +--------------------------- + + + + Version 2.5.3 (25 Mär 2022) --------------------------- diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..b5384aa7 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,723 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.6.0" +description = "ASGI specs, helper code, and adapters" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "asgiref-3.6.0-py3-none-any.whl", hash = "sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac"}, + {file = "asgiref-3.6.0.tar.gz", hash = "sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "astroid" +version = "2.11.7" +description = "An abstract syntax tree for Python with inference support." +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, + {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +setuptools = ">=20.0" +typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} +typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} +wrapt = ">=1.11,<2" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.2.5" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c"}, + {file = "coverage-7.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c"}, + {file = "coverage-7.2.5-cp310-cp310-win32.whl", hash = "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5"}, + {file = "coverage-7.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c"}, + {file = "coverage-7.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce"}, + {file = "coverage-7.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6"}, + {file = "coverage-7.2.5-cp311-cp311-win32.whl", hash = "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b"}, + {file = "coverage-7.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068"}, + {file = "coverage-7.2.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969"}, + {file = "coverage-7.2.5-cp37-cp37m-win32.whl", hash = "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718"}, + {file = "coverage-7.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0"}, + {file = "coverage-7.2.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84"}, + {file = "coverage-7.2.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1"}, + {file = "coverage-7.2.5-cp38-cp38-win32.whl", hash = "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813"}, + {file = "coverage-7.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212"}, + {file = "coverage-7.2.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b"}, + {file = "coverage-7.2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1"}, + {file = "coverage-7.2.5-cp39-cp39-win32.whl", hash = "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31"}, + {file = "coverage-7.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252"}, + {file = "coverage-7.2.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3"}, + {file = "coverage-7.2.5.tar.gz", hash = "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "dill" +version = "0.3.6" +description = "serialize all of python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "django" +version = "3.2.19" +description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Django-3.2.19-py3-none-any.whl", hash = "sha256:21cc991466245d659ab79cb01204f9515690f8dae00e5eabde307f14d24d4d7d"}, + {file = "Django-3.2.19.tar.gz", hash = "sha256:031365bae96814da19c10706218c44dff3b654cc4de20a98bd2d29b9bde469f0"}, +] + +[package.dependencies] +asgiref = ">=3.3.2,<4" +pytz = "*" +sqlparse = ">=0.2.2" + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-tables2" +version = "2.5.3" +description = "Table/data-grid framework for Django" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "django-tables2-2.5.3.tar.gz", hash = "sha256:f6c1623aac188d29aae9cf6b4de3211c96c525e49890654bec3359c181600eb9"}, + {file = "django_tables2-2.5.3-py2.py3-none-any.whl", hash = "sha256:e336fdf8899a8fab110550a40cad956064bd4054818e0b972c1893b3e2542168"}, +] + +[package.dependencies] +Django = ">=3.2" + +[package.extras] +tablib = ["tablib"] + +[[package]] +name = "django-tastypie" +version = "0.14.5" +description = "A flexible & capable API layer for Django." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "django-tastypie-0.14.5.tar.gz", hash = "sha256:0f17da085a1583c434dc0fb0ded8dd66c09a512689d0ce705f61629337d5e740"}, +] + +[package.dependencies] +python-dateutil = ">=1.5,<2.0 || >2.0" +python-mimeparse = ">=0.1.4,<1.5 || >1.5" + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "factory-boy" +version = "3.2.1" +description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "factory_boy-3.2.1-py2.py3-none-any.whl", hash = "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795"}, + {file = "factory_boy-3.2.1.tar.gz", hash = "sha256:a98d277b0c047c75eb6e4ab8508a7f81fb03d2cb21986f627913546ef7a2a55e"}, +] + +[package.dependencies] +Faker = ">=0.7.0" + +[package.extras] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] + +[[package]] +name = "faker" +version = "18.7.0" +description = "Faker is a Python package that generates fake data for you." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Faker-18.7.0-py3-none-any.whl", hash = "sha256:38dbc3b80e655d7301e190426ab30f04b6b7f6ca4764c5dd02772ffde0fa6dcd"}, + {file = "Faker-18.7.0.tar.gz", hash = "sha256:f02c6d3fdb5bc781f80b440cf2bdec336ed47ecfb8d620b20c3d4188ed051831"}, +] + +[package.dependencies] +python-dateutil = ">=2.4" +typing-extensions = {version = ">=3.10.0.1", markers = "python_version < \"3.8\""} + +[[package]] +name = "importlib-metadata" +version = "6.6.0" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, +] + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.11.5" +description = "A Python utility / library to sort Python imports." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, + {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "platformdirs" +version = "3.5.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pylint" +version = "2.13.9" +description = "python code static checker" +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, + {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, +] + +[package.dependencies] +astroid = ">=2.11.5,<=2.12.0-dev0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +dill = ">=0.2" +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +testutil = ["gitpython (>3)"] + +[[package]] +name = "pylint-plugin-utils" +version = "0.7" +description = "Utilities and helpers for writing Pylint plugins" +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "pylint-plugin-utils-0.7.tar.gz", hash = "sha256:ce48bc0516ae9415dd5c752c940dfe601b18fe0f48aa249f2386adfa95a004dd"}, + {file = "pylint_plugin_utils-0.7-py3-none-any.whl", hash = "sha256:b3d43e85ab74c4f48bb46ae4ce771e39c3a20f8b3d56982ab17aa73b4f98d535"}, +] + +[package.dependencies] +pylint = ">=1.7" + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-mimeparse" +version = "1.6.0" +description = "A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "python-mimeparse-1.6.0.tar.gz", hash = "sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78"}, + {file = "python_mimeparse-1.6.0-py2.py3-none-any.whl", hash = "sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282"}, +] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[package]] +name = "setuptools" +version = "67.7.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlparse" +version = "0.4.4" +description = "A non-validating SQL parser." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, + {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, +] + +[package.extras] +dev = ["build", "flake8"] +doc = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typed-ast" +version = "1.5.4" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "wheel" +version = "0.40.0" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, + {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[extras] +with-django = [] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.7,<4.0" +content-hash = "635581ab00bcc9d233925dd7b6b04cd41ce0a55c0abbfeac221e0d592a3f817a" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..259cea6e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,81 @@ +[tool.poetry] +name = "pylint-django" +version = "2.5.3" +readme = "README.rst" +description = "A Pylint plugin to help Pylint understand the Django web framework" +repository = "https://github.com/PyCQA/pylint-django" +authors = ["Carl Crowder "] +license="GPLv2" +classifiers=[ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Intended Audience :: Developers", + "Operating System :: Unix", + "Topic :: Software Development :: Quality Assurance", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Framework :: Django :: 1.11", + "Framework :: Django :: 2.0", + "Framework :: Django :: 2.1", + "Framework :: Django :: 2.2", + "Framework :: Django :: 3", + "Framework :: Django :: 3.0", + "Framework :: Django :: 3.1", + "Framework :: Django :: 3.2", + "Framework :: Django :: 4", + "Framework :: Django :: 4.0", + "Framework :: Django :: 4.1", + "Framework :: Django :: 4.2", + "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", +] +keywords=["pylint", "django", "plugin"] +packages = [ + { include = "pylint_django/"} +] +include = [ + "LICENSE", + "*.rst", + "*.md" +] +exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] + +[tool.poetry.dependencies] +python = ">=3.7,<4.0" +pylint-plugin-utils = ">=0.7" +pylint = ">=2.0,<3" + +[tool.poetry.group.dev.dependencies] +pylint = ">=2.13" +django-tables2 = "^2.5.3" +factory-boy = "^3.2.1" +coverage = "^7.2.5" +pytest = "^7.3.1" +wheel = "^0.40.0" +django-tastypie = "^0.14.5" + +[tool.poetry.extras] +with_django = ["Django"] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[tool.black] +line-length = 120 +exclude = ''' +/( + tests/ +)/ +''' + +[tool.isort] +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +use_parentheses = true +line_length = 120 From 1bf1481dd79e07b2d34246932c277d07404c55f8 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 15 May 2023 09:27:33 +0700 Subject: [PATCH 07/75] Converting to poetry-based packaging, and dropping python 3.6 support --- .github/workflows/build.yml | 8 +- .pre-commit-config.yaml | 2 +- CHANGELOG.rst | 7 + MANIFEST.in | 6 - poetry.lock | 758 +++++++++++++++++- .../func_noerror_model_unicode_lambda.py | 2 +- pyproject.toml | 26 +- scripts/build.sh | 6 +- setup.py | 59 -- tox.ini | 18 +- 10 files changed, 775 insertions(+), 117 deletions(-) delete mode 100644 MANIFEST.in delete mode 100644 setup.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 41b884b4..c5477da7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.8, 3.9] + python-version: [3.8, 3.9, "3.10", "3.11"] django-version: [-main, "4.0"] steps: @@ -72,8 +72,8 @@ jobs: strategy: # TODO: use a YAML anchor - not supported in GitHub actions "yet" fail-fast: false matrix: - python-version: [3.6, 3.7, 3.8, 3.9] - django-version: [3.2, 3.1, "3.0", "2.0", 1.11] + python-version: [3.7, 3.8, 3.9] + django-version: [3.2, 3.1, "3.0", "2.0", "2.2", "1.11"] steps: - uses: actions/checkout@v2 @@ -104,7 +104,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.6] + python-version: [3.7] steps: - uses: actions/checkout@v2 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9456da11..6327d372 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: - id: flake8 args: [ --max-line-length=120 ] - repo: https://github.com/psf/black - rev: 22.12.0 + rev: 23.3.0 hooks: - id: black args: [--safe, --line-length=120] diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 26fe14e8..d893fef7 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,13 @@ Changelog Version 2.6.0 (14 May 2023) --------------------------- +NOTICE +~~~~~~ + +This version drops support for Python 3.6 + +Bugfixes +~~~~~~~~ diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 539e6bc5..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1,6 +0,0 @@ -include *.md -include *.rst -include LICENSE -include pylint_django/transforms/transforms/*.py -include pylint_django/tests/test_django_not_installed.sh -recursive-include pylint_django/tests/ *.py *.rc *.txt diff --git a/poetry.lock b/poetry.lock index b5384aa7..c3a2d8df 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5,7 +5,7 @@ name = "asgiref" version = "3.6.0" description = "ASGI specs, helper code, and adapters" category = "dev" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "asgiref-3.6.0-py3-none-any.whl", hash = "sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac"}, @@ -37,6 +37,223 @@ typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpyth typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} wrapt = ">=1.11,<2" +[[package]] +name = "bleach" +version = "6.0.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] + +[[package]] +name = "cachetools" +version = "5.3.0" +description = "Extensible memoizing collections and decorators" +category = "dev" +optional = false +python-versions = "~=3.7" +files = [ + {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, + {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, +] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "5.1.0" +description = "Universal encoding detector for Python 3" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, + {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + [[package]] name = "colorama" version = "0.4.6" @@ -113,6 +330,48 @@ files = [ [package.extras] toml = ["tomli"] +[[package]] +name = "cryptography" +version = "40.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] + [[package]] name = "dill" version = "0.3.6" @@ -128,12 +387,24 @@ files = [ [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + [[package]] name = "django" version = "3.2.19" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." category = "dev" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "Django-3.2.19-py3-none-any.whl", hash = "sha256:21cc991466245d659ab79cb01204f9515690f8dae00e5eabde307f14d24d4d7d"}, @@ -154,7 +425,7 @@ name = "django-tables2" version = "2.5.3" description = "Table/data-grid framework for Django" category = "dev" -optional = false +optional = true python-versions = "*" files = [ {file = "django-tables2-2.5.3.tar.gz", hash = "sha256:f6c1623aac188d29aae9cf6b4de3211c96c525e49890654bec3359c181600eb9"}, @@ -172,7 +443,7 @@ name = "django-tastypie" version = "0.14.5" description = "A flexible & capable API layer for Django." category = "dev" -optional = false +optional = true python-versions = "*" files = [ {file = "django-tastypie-0.14.5.tar.gz", hash = "sha256:0f17da085a1583c434dc0fb0ded8dd66c09a512689d0ce705f61629337d5e740"}, @@ -182,6 +453,18 @@ files = [ python-dateutil = ">=1.5,<2.0 || >2.0" python-mimeparse = ">=0.1.4,<1.5 || >1.5" +[[package]] +name = "docutils" +version = "0.20" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20-py3-none-any.whl", hash = "sha256:a428f10de4de4774389734c986a01b4af2d802d26717108b0f1b9356862937c5"}, + {file = "docutils-0.20.tar.gz", hash = "sha256:f75a5a52fbcacd81b47e42888ad2b380748aaccfb3f13af0fe69deb759f01eb6"}, +] + [[package]] name = "exceptiongroup" version = "1.1.1" @@ -202,7 +485,7 @@ name = "factory-boy" version = "3.2.1" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." category = "dev" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "factory_boy-3.2.1-py2.py3-none-any.whl", hash = "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795"}, @@ -221,7 +504,7 @@ name = "faker" version = "18.7.0" description = "Faker is a Python package that generates fake data for you." category = "dev" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "Faker-18.7.0-py3-none-any.whl", hash = "sha256:38dbc3b80e655d7301e190426ab30f04b6b7f6ca4764c5dd02772ffde0fa6dcd"}, @@ -232,6 +515,34 @@ files = [ python-dateutil = ">=2.4" typing-extensions = {version = ">=3.10.0.1", markers = "python_version < \"3.8\""} +[[package]] +name = "filelock" +version = "3.12.0" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + [[package]] name = "importlib-metadata" version = "6.6.0" @@ -253,6 +564,25 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -283,6 +613,66 @@ pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib" plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] +[[package]] +name = "jaraco-classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] + +[[package]] +name = "keyring" +version = "23.13.1" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "lazy-object-proxy" version = "1.9.0" @@ -329,6 +719,32 @@ files = [ {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, ] +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" +typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "mccabe" version = "0.7.0" @@ -341,6 +757,30 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + [[package]] name = "packaging" version = "23.1" @@ -353,6 +793,21 @@ files = [ {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] +[[package]] +name = "pkginfo" +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov"] + [[package]] name = "platformdirs" version = "3.5.1" @@ -391,6 +846,33 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pylint" version = "2.13.9" @@ -418,19 +900,39 @@ testutil = ["gitpython (>3)"] [[package]] name = "pylint-plugin-utils" -version = "0.7" +version = "0.8" description = "Utilities and helpers for writing Pylint plugins" category = "main" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7,<4.0" files = [ - {file = "pylint-plugin-utils-0.7.tar.gz", hash = "sha256:ce48bc0516ae9415dd5c752c940dfe601b18fe0f48aa249f2386adfa95a004dd"}, - {file = "pylint_plugin_utils-0.7-py3-none-any.whl", hash = "sha256:b3d43e85ab74c4f48bb46ae4ce771e39c3a20f8b3d56982ab17aa73b4f98d535"}, + {file = "pylint_plugin_utils-0.8-py3-none-any.whl", hash = "sha256:4ec485df560d94109668e1c7d1a84a3a12b205909d641010d2ee0ee369a0bf3e"}, + {file = "pylint_plugin_utils-0.8.tar.gz", hash = "sha256:7066b732ee9479dfff26bb6dc1a7e82e3fc9455aab3f4bac92527b9e2894032e"}, ] [package.dependencies] pylint = ">=1.7" +[[package]] +name = "pyproject-api" +version = "1.5.1" +description = "API to interact with the python pyproject.toml based projects" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_api-1.5.1-py3-none-any.whl", hash = "sha256:4698a3777c2e0f6b624f8a4599131e2a25376d90fe8d146d7ac74c67c6f97c43"}, + {file = "pyproject_api-1.5.1.tar.gz", hash = "sha256:435f46547a9ff22cf4208ee274fca3e2869aeb062a4834adfc99a4dd64af3cf9"}, +] + +[package.dependencies] +packaging = ">=23" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.2.2)", "importlib-metadata (>=6)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.17.1)", "wheel (>=0.38.4)"] + [[package]] name = "pytest" version = "7.3.1" @@ -460,7 +962,7 @@ name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" category = "dev" -optional = false +optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, @@ -475,7 +977,7 @@ name = "python-mimeparse" version = "1.6.0" description = "A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges." category = "dev" -optional = false +optional = true python-versions = "*" files = [ {file = "python-mimeparse-1.6.0.tar.gz", hash = "sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78"}, @@ -487,13 +989,133 @@ name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" category = "dev" -optional = false +optional = true python-versions = "*" files = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] + +[[package]] +name = "readme-renderer" +version = "37.3" +description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, + {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, +] + +[package.dependencies] +bleach = ">=2.1.0" +docutils = ">=0.13.1" +Pygments = ">=2.5.1" + +[package.extras] +md = ["cmarkgfm (>=0.8.0)"] + +[[package]] +name = "requests" +version = "2.30.0" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rfc3986" +version = "2.0.0" +description = "Validating URI References per RFC 3986" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rich" +version = "13.3.5" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + [[package]] name = "setuptools" version = "67.7.2" @@ -528,7 +1150,7 @@ name = "sqlparse" version = "0.4.4" description = "A non-validating SQL parser." category = "dev" -optional = false +optional = true python-versions = ">=3.5" files = [ {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, @@ -552,6 +1174,59 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tox" +version = "4.5.1" +description = "tox is a generic virtualenv management and test command line tool" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tox-4.5.1-py3-none-any.whl", hash = "sha256:d25a2e6cb261adc489604fafd76cd689efeadfa79709965e965668d6d3f63046"}, + {file = "tox-4.5.1.tar.gz", hash = "sha256:5a2eac5fb816779dfdf5cb00fecbc27eb0524e4626626bb1de84747b24cacc56"}, +] + +[package.dependencies] +cachetools = ">=5.3" +chardet = ">=5.1" +colorama = ">=0.4.6" +filelock = ">=3.11" +importlib-metadata = {version = ">=6.4.1", markers = "python_version < \"3.8\""} +packaging = ">=23.1" +platformdirs = ">=3.2" +pluggy = ">=1" +pyproject-api = ">=1.5.1" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} +virtualenv = ">=20.21" + +[package.extras] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-argparse-cli (>=1.11)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2022.1.2b11)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.3)", "devpi-process (>=0.3)", "diff-cover (>=7.5)", "distlib (>=0.3.6)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.14)", "psutil (>=5.9.4)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-xdist (>=3.2.1)", "re-assert (>=1.1)", "time-machine (>=2.9)", "wheel (>=0.40)"] + +[[package]] +name = "twine" +version = "4.0.2" +description = "Collection of utilities for publishing packages on PyPI" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "twine-4.0.2-py3-none-any.whl", hash = "sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8"}, + {file = "twine-4.0.2.tar.gz", hash = "sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8"}, +] + +[package.dependencies] +importlib-metadata = ">=3.6" +keyring = ">=15.1" +pkginfo = ">=1.8.1" +readme-renderer = ">=35.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +rich = ">=12.0.0" +urllib3 = ">=1.26.0" + [[package]] name = "typed-ast" version = "1.5.4" @@ -598,6 +1273,58 @@ files = [ {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] +[[package]] +name = "urllib3" +version = "2.0.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.23.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, + {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.11,<4" +importlib-metadata = {version = ">=6.4.1", markers = "python_version < \"3.8\""} +platformdirs = ">=3.2,<4" + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + [[package]] name = "wheel" version = "0.40.0" @@ -715,9 +1442,10 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] +for-tests = [] with-django = [] [metadata] lock-version = "2.0" python-versions = ">=3.7,<4.0" -content-hash = "635581ab00bcc9d233925dd7b6b04cd41ce0a55c0abbfeac221e0d592a3f817a" +content-hash = "7ed06aa41a24cdd1c6ea6d44ebe982cb3a5d11c95c39de9d1b5aeab0da0f872c" diff --git a/pylint_django/tests/input/func_noerror_model_unicode_lambda.py b/pylint_django/tests/input/func_noerror_model_unicode_lambda.py index a1db11b4..da7bf9cb 100644 --- a/pylint_django/tests/input/func_noerror_model_unicode_lambda.py +++ b/pylint_django/tests/input/func_noerror_model_unicode_lambda.py @@ -1,7 +1,7 @@ """ Ensures that django models without a __unicode__ method are flagged """ -# pylint: disable=missing-docstring,wrong-import-position,unnecessary-lambda-assignment +# pylint: disable=missing-docstring,wrong-import-position from django.db import models diff --git a/pyproject.toml b/pyproject.toml index 259cea6e..5af39520 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,10 @@ [tool.poetry] name = "pylint-django" -version = "2.5.3" +version = "2.6.0a0" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/PyCQA/pylint-django" authors = ["Carl Crowder "] -license="GPLv2" classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: Console", @@ -13,15 +12,11 @@ classifiers=[ "Operating System :: Unix", "Topic :: Software Development :: Quality Assurance", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", - "Framework :: Django :: 1.11", - "Framework :: Django :: 2.0", - "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Framework :: Django :: 3", "Framework :: Django :: 3.0", @@ -46,20 +41,24 @@ exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] [tool.poetry.dependencies] python = ">=3.7,<4.0" -pylint-plugin-utils = ">=0.7" +pylint-plugin-utils = ">=0.8" pylint = ">=2.0,<3" +Django = {version=">=2.2", optional = true} [tool.poetry.group.dev.dependencies] +tox = "^4.5.1" +pytest = "^7.3.1" pylint = ">=2.13" -django-tables2 = "^2.5.3" -factory-boy = "^3.2.1" coverage = "^7.2.5" -pytest = "^7.3.1" +twine = "^4.0.2" wheel = "^0.40.0" -django-tastypie = "^0.14.5" +django-tables2 = {version="^2.5.3", optional = true} +factory-boy = {version="^3.2.1", optional = true} +django-tastypie = {version="^0.14.5", optional = true} [tool.poetry.extras] with_django = ["Django"] +for_tests = ['django-tastypie', 'django-tables2', 'factory-boy'] [build-system] requires = ["poetry-core>=1.0.0"] @@ -67,11 +66,6 @@ build-backend = "poetry.core.masonry.api" [tool.black] line-length = 120 -exclude = ''' -/( - tests/ -)/ -''' [tool.isort] multi_line_output = 3 diff --git a/scripts/build.sh b/scripts/build.sh index 00ba5b91..14eb47b0 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -19,8 +19,7 @@ tox -e readme # then build the packages echo "..... Building PyPI packages" set -e -python setup.py sdist >/dev/null -python setup.py bdist_wheel >/dev/null +poetry build --quiet set +e # then run some sanity tests @@ -40,7 +39,7 @@ echo "..... Trying to verify that all source files are present" # remove pylint_django/*.egg-info/ generated during build find . -type d -name '*.egg-info' | xargs rm -rf -source_files=`find ./pylint_django/ -type f | sed 's|./||'` +source_files=`find ./pylint_django/ -type f ! -path '**/tests/**' | sed 's|./||'` # verify for .tar.gz package package_files=`tar -tvf dist/*.tar.gz` @@ -77,7 +76,6 @@ rm -rf .venv/ echo "..... Trying to install the new wheel inside a virtualenv" virtualenv .venv/test-wheel source .venv/test-wheel/bin/activate -pip install pylint-plugin-utils # because it does not provide a wheel package pip install --only-binary :all: -f dist/ pylint_django deactivate rm -rf .venv/ diff --git a/setup.py b/setup.py deleted file mode 100644 index 4434ffd2..00000000 --- a/setup.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: UTF-8 -*- -""" -Setup module for Pylint plugin for Django. -""" -from setuptools import find_packages, setup - -with open("README.rst", encoding="utf-8") as readme, open("CHANGELOG.rst", encoding="utf-8") as changelog: - LONG_DESCRIPTION = readme.read() + "\n" + changelog.read() - -setup( - name="pylint-django", - url="https://github.com/PyCQA/pylint-django", - author="landscape.io", - author_email="code@landscape.io", - description="A Pylint plugin to help Pylint understand the Django web framework", - long_description=LONG_DESCRIPTION, - version="2.5.3", - packages=find_packages(), - include_package_data=True, - install_requires=[ - "pylint-plugin-utils>=0.7", - "pylint>=2.0,<3", - ], - extras_require={ - "with_django": ["Django"], - "for_tests": [ - "django_tables2", - "factory-boy", - "coverage", - "pytest", - "wheel", - "django-tastypie", - "pylint>=2.13", - ], - }, - license="GPLv2", - classifiers=[ - "Environment :: Console", - "Intended Audience :: Developers", - "Operating System :: Unix", - "Topic :: Software Development :: Quality Assurance", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Framework :: Django :: 1.11", - "Framework :: Django :: 2.0", - "Framework :: Django :: 2.2", - "Framework :: Django :: 3.0", - "Framework :: Django :: 3.1", - "Framework :: Django :: 3.2", - ], - keywords=["pylint", "django", "plugin"], - zip_safe=False, - project_urls={ - "Changelog": "https://github.com/PyCQA/pylint-django/blob/master/CHANGELOG.rst", - }, -) diff --git a/tox.ini b/tox.ini index 8debc021..ab605607 100644 --- a/tox.ini +++ b/tox.ini @@ -8,9 +8,8 @@ envlist = flake8 pylint readme - py{36}-django{111,20,-master} - py{36,37,38,39}-django{22,30,31,32} - py{38,39}-django40 + py{37,38,39}-django{22,30,31,32} + py{38,39,310,311}-django{40,41,42} requires = pip >=21.0.1 @@ -22,9 +21,8 @@ commands = django_is_installed: pylint --rcfile=tox.ini --load-plugins=pylint_django --disable=E5110 setup.py flake8: flake8 pylint: pylint --rcfile=tox.ini -d missing-docstring,too-many-branches,too-many-return-statements,too-many-ancestors,fixme --ignore=tests pylint_django setup - readme: bash -c "python setup.py -q sdist && twine check dist/*" - py{36}-django{111,20,-main}: coverage run pylint_django/tests/test_func.py -v - py{36,37,38,39}-django{22,30,31,32}: coverage run pylint_django/tests/test_func.py -v + readme: bash -c "poetry build && twine check dist/*" + py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: coverage run pylint_django/tests/test_func.py -v clean: find . -type f -name '*.pyc' -delete clean: find . -type d -name __pycache__ -delete clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ @@ -35,14 +33,13 @@ deps = pylint: Django readme: twine readme: wheel - django111: Django>=1.11,<2.0 - django20: Django>=2.0,<2.1 - django21: Django>=2.1,<2.2 django22: Django>=2.2,<3.0 django30: Django>=3.0,<3.1 django31: Django>=3.1,<3.2 django32: Django>=3.2,<4.0 django40: Django>=4.0,<4.1 + django41: Django>=4.1,<4.2 + django42: Django>=4.2,<4.3 django-main: Django django-main: git+https://github.com/pycqa/astroid@main django-main: git+https://github.com/pycqa/pylint@main @@ -52,8 +49,7 @@ setenv = allowlist_externals = django_not_installed: bash readme: bash - py{36}-django{111,20,-main}: coverage - py{36,37,38,39}-django{22,30,31,32,40}: coverage + py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: coverage clean: find clean: rm From 82f64c679e61b1c1fdfe6a4456da77cd2abeb1cb Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 15 May 2023 09:33:53 +0700 Subject: [PATCH 08/75] Fixing linting errors --- pylint_django/__init__.py | 2 +- pylint_django/augmentations/__init__.py | 19 +++-------------- pylint_django/checkers/foreign_key_strings.py | 21 +++++-------------- .../tests/input/func_noerror_form_fields.py | 1 - .../tests/input/func_noerror_forms_py33.py | 1 - .../tests/input/func_noerror_model_fields.py | 1 - .../tests/input/migrations/0002_new_column.py | 1 - .../migrations/0003_without_backwards.py | 1 - .../migrations/0004_noerror_with_backwards.py | 1 - pylint_django/transforms/fields.py | 1 - pylint_django/transforms/foreignkey.py | 4 +--- tox.ini | 7 +++++-- 12 files changed, 15 insertions(+), 45 deletions(-) diff --git a/pylint_django/__init__.py b/pylint_django/__init__.py index b0920575..034bc4e9 100644 --- a/pylint_django/__init__.py +++ b/pylint_django/__init__.py @@ -6,7 +6,7 @@ from pylint_django import plugin if sys.version_info < (3,): - raise DeprecationWarning("Version 0.11.1 was the last to support Python 2. " "Please migrate to Python 3!") + raise DeprecationWarning("Version 0.11.1 was the last to support Python 2. Please migrate to Python 3!") register = plugin.register # pylint: disable=invalid-name load_configuration = plugin.load_configuration # pylint: disable=invalid-name diff --git a/pylint_django/augmentations/__init__.py b/pylint_django/augmentations/__init__.py index e067709d..ca8c850b 100644 --- a/pylint_django/augmentations/__init__.py +++ b/pylint_django/augmentations/__init__.py @@ -11,23 +11,10 @@ from django import VERSION as django_version from django.utils import termcolors from django.views.generic.base import ContextMixin, RedirectView, View -from django.views.generic.dates import ( - DateMixin, - DayMixin, - MonthMixin, - WeekMixin, - YearMixin, -) -from django.views.generic.detail import ( - SingleObjectMixin, - SingleObjectTemplateResponseMixin, - TemplateResponseMixin, -) +from django.views.generic.dates import DateMixin, DayMixin, MonthMixin, WeekMixin, YearMixin +from django.views.generic.detail import SingleObjectMixin, SingleObjectTemplateResponseMixin, TemplateResponseMixin from django.views.generic.edit import DeletionMixin, FormMixin, ModelFormMixin -from django.views.generic.list import ( - MultipleObjectMixin, - MultipleObjectTemplateResponseMixin, -) +from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin from pylint.checkers.base import DocStringChecker, NameChecker from pylint.checkers.classes import ClassChecker from pylint.checkers.design_analysis import MisdesignChecker diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index c145301e..fac33148 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -80,9 +80,7 @@ def open(self): # state is stashed in this property. try: - from django.core.exceptions import ( # pylint: disable=import-outside-toplevel - ImproperlyConfigured, - ) + from django.core.exceptions import ImproperlyConfigured # pylint: disable=import-outside-toplevel except ModuleNotFoundError: return @@ -90,9 +88,7 @@ def open(self): import django # pylint: disable=import-outside-toplevel django.setup() - from django.apps import ( # noqa pylint: disable=import-outside-toplevel,unused-import - apps, - ) + from django.apps import apps # noqa pylint: disable=import-outside-toplevel,unused-import # flake8: noqa=F401, F403 except ImproperlyConfigured: @@ -103,19 +99,14 @@ def open(self): # we will warn the user that they haven't actually configured Django themselves self._raise_warning = True # but use django defaults then... - from django.conf import ( # pylint: disable=import-outside-toplevel - settings, - ) + from django.conf import settings # pylint: disable=import-outside-toplevel settings.configure() django.setup() else: # see if we can load the provided settings module try: - from django.conf import ( # pylint: disable=import-outside-toplevel - Settings, - settings, - ) + from django.conf import Settings, settings # pylint: disable=import-outside-toplevel settings.configure(Settings(self.config.django_settings_module)) django.setup() @@ -127,9 +118,7 @@ def open(self): args=self.config.django_settings_module, ) # however we'll trundle on with basic settings - from django.conf import ( # pylint: disable=import-outside-toplevel - settings, - ) + from django.conf import settings # pylint: disable=import-outside-toplevel settings.configure() django.setup() diff --git a/pylint_django/tests/input/func_noerror_form_fields.py b/pylint_django/tests/input/func_noerror_form_fields.py index d6ffbfef..dada077b 100644 --- a/pylint_django/tests/input/func_noerror_form_fields.py +++ b/pylint_django/tests/input/func_noerror_form_fields.py @@ -12,7 +12,6 @@ class ManyFieldsForm(forms.Form): - booleanfield = forms.BooleanField() charfield = forms.CharField(max_length=40, null=True) datetimefield = forms.DateTimeField(auto_now_add=True) diff --git a/pylint_django/tests/input/func_noerror_forms_py33.py b/pylint_django/tests/input/func_noerror_forms_py33.py index 7a8c2aee..831f161d 100644 --- a/pylint_django/tests/input/func_noerror_forms_py33.py +++ b/pylint_django/tests/input/func_noerror_forms_py33.py @@ -34,7 +34,6 @@ class Meta: class TestFormWidgetAssignment(forms.Form): - multi_field = forms.MultipleChoiceField(choices=[("1", "First"), ("2", "Second")]) class Meta: diff --git a/pylint_django/tests/input/func_noerror_model_fields.py b/pylint_django/tests/input/func_noerror_model_fields.py index 3e5ffeb9..c0389ff7 100644 --- a/pylint_django/tests/input/func_noerror_model_fields.py +++ b/pylint_django/tests/input/func_noerror_model_fields.py @@ -12,7 +12,6 @@ class LotsOfFieldsModel(models.Model): - bigintegerfield = models.BigIntegerField() booleanfield = models.BooleanField(default=True) charfield = models.CharField(max_length=40, null=True) diff --git a/pylint_django/tests/input/migrations/0002_new_column.py b/pylint_django/tests/input/migrations/0002_new_column.py index 0aee5447..07ebc2d6 100644 --- a/pylint_django/tests/input/migrations/0002_new_column.py +++ b/pylint_django/tests/input/migrations/0002_new_column.py @@ -19,7 +19,6 @@ class Migration(migrations.Migration): - dependencies = [ ("input", "0001_noerror_initial"), ] diff --git a/pylint_django/tests/input/migrations/0003_without_backwards.py b/pylint_django/tests/input/migrations/0003_without_backwards.py index a61e5511..5ec670e3 100644 --- a/pylint_django/tests/input/migrations/0003_without_backwards.py +++ b/pylint_django/tests/input/migrations/0003_without_backwards.py @@ -7,7 +7,6 @@ def forwards_test(apps, schema_editor): class Migration(migrations.Migration): - operations = [ migrations.RunPython(), # [missing-backwards-migration-callable] migrations.RunPython(forwards_test), # [missing-backwards-migration-callable] diff --git a/pylint_django/tests/input/migrations/0004_noerror_with_backwards.py b/pylint_django/tests/input/migrations/0004_noerror_with_backwards.py index e385e02e..9460ac55 100644 --- a/pylint_django/tests/input/migrations/0004_noerror_with_backwards.py +++ b/pylint_django/tests/input/migrations/0004_noerror_with_backwards.py @@ -11,7 +11,6 @@ def backwards_test(apps, schema_editor): class Migration(migrations.Migration): - operations = [ migrations.RunPython(forwards_test, backwards_test), migrations.RunPython(forwards_test, reverse_code=backwards_test), diff --git a/pylint_django/transforms/fields.py b/pylint_django/transforms/fields.py index 17fac843..b9746c5f 100644 --- a/pylint_django/transforms/fields.py +++ b/pylint_django/transforms/fields.py @@ -47,7 +47,6 @@ def is_model_or_form_field(cls): def apply_type_shim(cls, _context=None): # noqa - if cls.name in _STR_FIELDS: base_nodes = scoped_nodes.builtin_lookup("str") elif cls.name in _INT_FIELDS: diff --git a/pylint_django/transforms/foreignkey.py b/pylint_django/transforms/foreignkey.py index fc5b1c6e..f22701f5 100644 --- a/pylint_django/transforms/foreignkey.py +++ b/pylint_django/transforms/foreignkey.py @@ -51,9 +51,7 @@ def _module_name_from_django_model_resolution(model_name, module_name): def infer_key_classes(node, context=None): - from django.core.exceptions import ( # pylint: disable=import-outside-toplevel - ImproperlyConfigured, - ) + from django.core.exceptions import ImproperlyConfigured # pylint: disable=import-outside-toplevel keyword_args = [] if node.keywords: diff --git a/tox.ini b/tox.ini index ab605607..b5787fe8 100644 --- a/tox.ini +++ b/tox.ini @@ -19,8 +19,8 @@ requires = commands = django_not_installed: bash pylint_django/tests/test_django_not_installed.sh django_is_installed: pylint --rcfile=tox.ini --load-plugins=pylint_django --disable=E5110 setup.py - flake8: flake8 - pylint: pylint --rcfile=tox.ini -d missing-docstring,too-many-branches,too-many-return-statements,too-many-ancestors,fixme --ignore=tests pylint_django setup + flake8: flake8 pylint_django/ + pylint: pylint --rcfile=tox.ini -d missing-docstring,too-many-branches,too-many-return-statements,too-many-ancestors,fixme --ignore=tests pylint_django readme: bash -c "poetry build && twine check dist/*" py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: coverage run pylint_django/tests/test_func.py -v clean: find . -type f -name '*.pyc' -delete @@ -56,5 +56,8 @@ allowlist_externals = [flake8] max-line-length = 120 +[pylint] +max-line-length = 120 + [FORMAT] max-line-length=120 From 054b49a956ae645f07b268c96940740491662814 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 15 May 2023 10:37:33 +0700 Subject: [PATCH 09/75] Fixing up last pieces of tox config and testing --- .github/workflows/build.yml | 36 +- .gitignore | 2 + README.rst | 2 +- SECURITY.md | 4 - poetry.lock | 1451 ----------------- .../input/migrations/0002_new_column.txt | 2 +- .../migrations/0003_without_backwards.txt | 8 +- .../tests/test_django_not_installed.sh | 2 +- scripts/build.sh | 2 +- tox.ini | 4 +- 10 files changed, 29 insertions(+), 1484 deletions(-) delete mode 100644 poetry.lock diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5477da7..4a2cdf20 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,20 +12,20 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.6] - toxenv: [django_not_installed, django_is_installed, flake8, pylint, readme] + python-version: [3.7] + toxenv: [django_not_installed, flake8, pylint, readme] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Execute tests run: | - pip install tox - pip install -e .[for_tests] + pip install -U pip poetry tox + poetry install -E for_tests export TOXENV=${{ matrix.toxenv }} export PYTHON=${{ matrix.python-version }} @@ -42,16 +42,16 @@ jobs: django-version: [-main, "4.0"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Execute tests run: | - pip install tox - pip install -e .[for_tests] + pip install -U pip poetry tox + poetry install -E for_tests export DJANGO=${{ matrix.django-version }} export PYTHON=${{ matrix.python-version }} @@ -76,16 +76,16 @@ jobs: django-version: [3.2, 3.1, "3.0", "2.0", "2.2", "1.11"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Execute tests run: | - pip install tox - pip install -e .[for_tests] + pip install -U pip poetry tox + poetry install -E for_tests export DJANGO=${{ matrix.django-version }} export PYTHON=${{ matrix.python-version }} @@ -107,15 +107,15 @@ jobs: python-version: [3.7] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Build run: | - pip install tox - pip install -e .[for_tests] + pip install -U pip poetry tox + poetry install -E for_tests ./scripts/build.sh diff --git a/.gitignore b/.gitignore index e365f2e6..ae188391 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ nosetests.xml .idea env.txt .venv + +poetry.lock diff --git a/README.rst b/README.rst index fdd06bb0..f26d376e 100644 --- a/README.rst +++ b/README.rst @@ -32,7 +32,7 @@ this causes more trouble than good, `see discussion `__. If you wish to automatically install the latest version of ``Django`` then:: - pip install pylint-django[with_django] + pip install pylint-django[with-django] otherwise sort out your testing environment and please **DO NOT** report issues about missing Django! diff --git a/SECURITY.md b/SECURITY.md index f2b86058..41f6aa46 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -12,7 +12,3 @@ In case you have found a security problem with pylint-django *DO NOT* report it into GitHub Issues. Instead go to [https://tidelift.com/security](https://tidelift.com/security) and follow the instructions there. - -At least one of the package maintainers ([@atodorov](http://github.com/atodorov)) -is a lifter at Tidelift and will be notified when you report the security -problem with them! diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index c3a2d8df..00000000 --- a/poetry.lock +++ /dev/null @@ -1,1451 +0,0 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. - -[[package]] -name = "asgiref" -version = "3.6.0" -description = "ASGI specs, helper code, and adapters" -category = "dev" -optional = true -python-versions = ">=3.7" -files = [ - {file = "asgiref-3.6.0-py3-none-any.whl", hash = "sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac"}, - {file = "asgiref-3.6.0.tar.gz", hash = "sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506"}, -] - -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - -[[package]] -name = "astroid" -version = "2.11.7" -description = "An abstract syntax tree for Python with inference support." -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, - {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, -] - -[package.dependencies] -lazy-object-proxy = ">=1.4.0" -setuptools = ">=20.0" -typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<2" - -[[package]] -name = "bleach" -version = "6.0.0" -description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, -] - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] - -[[package]] -name = "cachetools" -version = "5.3.0" -description = "Extensible memoizing collections and decorators" -category = "dev" -optional = false -python-versions = "~=3.7" -files = [ - {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, - {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, -] - -[[package]] -name = "certifi" -version = "2023.5.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "chardet" -version = "5.1.0" -description = "Universal encoding detector for Python 3" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, - {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.1.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "coverage" -version = "7.2.5" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "coverage-7.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c"}, - {file = "coverage-7.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a"}, - {file = "coverage-7.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f"}, - {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a"}, - {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a"}, - {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11"}, - {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5"}, - {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c"}, - {file = "coverage-7.2.5-cp310-cp310-win32.whl", hash = "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5"}, - {file = "coverage-7.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c"}, - {file = "coverage-7.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce"}, - {file = "coverage-7.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88"}, - {file = "coverage-7.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e"}, - {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2"}, - {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139"}, - {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8"}, - {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed"}, - {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6"}, - {file = "coverage-7.2.5-cp311-cp311-win32.whl", hash = "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b"}, - {file = "coverage-7.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068"}, - {file = "coverage-7.2.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1"}, - {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33"}, - {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade"}, - {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5"}, - {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47"}, - {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd"}, - {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969"}, - {file = "coverage-7.2.5-cp37-cp37m-win32.whl", hash = "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718"}, - {file = "coverage-7.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0"}, - {file = "coverage-7.2.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84"}, - {file = "coverage-7.2.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790"}, - {file = "coverage-7.2.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771"}, - {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045"}, - {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614"}, - {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3"}, - {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd"}, - {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1"}, - {file = "coverage-7.2.5-cp38-cp38-win32.whl", hash = "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813"}, - {file = "coverage-7.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212"}, - {file = "coverage-7.2.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b"}, - {file = "coverage-7.2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200"}, - {file = "coverage-7.2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5"}, - {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e"}, - {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303"}, - {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3"}, - {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a"}, - {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1"}, - {file = "coverage-7.2.5-cp39-cp39-win32.whl", hash = "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31"}, - {file = "coverage-7.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252"}, - {file = "coverage-7.2.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3"}, - {file = "coverage-7.2.5.tar.gz", hash = "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47"}, -] - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "cryptography" -version = "40.0.2" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, - {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, - {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, - {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, -] - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] -tox = ["tox"] - -[[package]] -name = "dill" -version = "0.3.6" -description = "serialize all of python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - -[[package]] -name = "distlib" -version = "0.3.6" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] - -[[package]] -name = "django" -version = "3.2.19" -description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." -category = "dev" -optional = true -python-versions = ">=3.6" -files = [ - {file = "Django-3.2.19-py3-none-any.whl", hash = "sha256:21cc991466245d659ab79cb01204f9515690f8dae00e5eabde307f14d24d4d7d"}, - {file = "Django-3.2.19.tar.gz", hash = "sha256:031365bae96814da19c10706218c44dff3b654cc4de20a98bd2d29b9bde469f0"}, -] - -[package.dependencies] -asgiref = ">=3.3.2,<4" -pytz = "*" -sqlparse = ">=0.2.2" - -[package.extras] -argon2 = ["argon2-cffi (>=19.1.0)"] -bcrypt = ["bcrypt"] - -[[package]] -name = "django-tables2" -version = "2.5.3" -description = "Table/data-grid framework for Django" -category = "dev" -optional = true -python-versions = "*" -files = [ - {file = "django-tables2-2.5.3.tar.gz", hash = "sha256:f6c1623aac188d29aae9cf6b4de3211c96c525e49890654bec3359c181600eb9"}, - {file = "django_tables2-2.5.3-py2.py3-none-any.whl", hash = "sha256:e336fdf8899a8fab110550a40cad956064bd4054818e0b972c1893b3e2542168"}, -] - -[package.dependencies] -Django = ">=3.2" - -[package.extras] -tablib = ["tablib"] - -[[package]] -name = "django-tastypie" -version = "0.14.5" -description = "A flexible & capable API layer for Django." -category = "dev" -optional = true -python-versions = "*" -files = [ - {file = "django-tastypie-0.14.5.tar.gz", hash = "sha256:0f17da085a1583c434dc0fb0ded8dd66c09a512689d0ce705f61629337d5e740"}, -] - -[package.dependencies] -python-dateutil = ">=1.5,<2.0 || >2.0" -python-mimeparse = ">=0.1.4,<1.5 || >1.5" - -[[package]] -name = "docutils" -version = "0.20" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "docutils-0.20-py3-none-any.whl", hash = "sha256:a428f10de4de4774389734c986a01b4af2d802d26717108b0f1b9356862937c5"}, - {file = "docutils-0.20.tar.gz", hash = "sha256:f75a5a52fbcacd81b47e42888ad2b380748aaccfb3f13af0fe69deb759f01eb6"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.1" -description = "Backport of PEP 654 (exception groups)" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "factory-boy" -version = "3.2.1" -description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." -category = "dev" -optional = true -python-versions = ">=3.6" -files = [ - {file = "factory_boy-3.2.1-py2.py3-none-any.whl", hash = "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795"}, - {file = "factory_boy-3.2.1.tar.gz", hash = "sha256:a98d277b0c047c75eb6e4ab8508a7f81fb03d2cb21986f627913546ef7a2a55e"}, -] - -[package.dependencies] -Faker = ">=0.7.0" - -[package.extras] -dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] -doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] - -[[package]] -name = "faker" -version = "18.7.0" -description = "Faker is a Python package that generates fake data for you." -category = "dev" -optional = true -python-versions = ">=3.7" -files = [ - {file = "Faker-18.7.0-py3-none-any.whl", hash = "sha256:38dbc3b80e655d7301e190426ab30f04b6b7f6ca4764c5dd02772ffde0fa6dcd"}, - {file = "Faker-18.7.0.tar.gz", hash = "sha256:f02c6d3fdb5bc781f80b440cf2bdec336ed47ecfb8d620b20c3d4188ed051831"}, -] - -[package.dependencies] -python-dateutil = ">=2.4" -typing-extensions = {version = ">=3.10.0.1", markers = "python_version < \"3.8\""} - -[[package]] -name = "filelock" -version = "3.12.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, -] - -[package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "importlib-metadata" -version = "6.6.0" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, -] - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "importlib-resources" -version = "5.12.0" -description = "Read resources from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "isort" -version = "5.11.5" -description = "A Python utility / library to sort Python imports." -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, - {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, -] - -[package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - -[[package]] -name = "jaraco-classes" -version = "3.2.3" -description = "Utility functions for Python class constructs" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, - {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] - -[[package]] -name = "keyring" -version = "23.13.1" -description = "Store and access your passwords safely." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, - {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} -"jaraco.classes" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -completion = ["shtab"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - -[[package]] -name = "markdown-it-py" -version = "2.2.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" -typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "more-itertools" -version = "9.1.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, - {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pkginfo" -version = "1.9.6" -description = "Query metadata from sdists / bdists / installed packages." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, - {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, -] - -[package.extras] -testing = ["pytest", "pytest-cov"] - -[[package]] -name = "platformdirs" -version = "3.5.1" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, - {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pylint" -version = "2.13.9" -description = "python code static checker" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, - {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, -] - -[package.dependencies] -astroid = ">=2.11.5,<=2.12.0-dev0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -dill = ">=0.2" -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.8" -platformdirs = ">=2.2.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -testutil = ["gitpython (>3)"] - -[[package]] -name = "pylint-plugin-utils" -version = "0.8" -description = "Utilities and helpers for writing Pylint plugins" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "pylint_plugin_utils-0.8-py3-none-any.whl", hash = "sha256:4ec485df560d94109668e1c7d1a84a3a12b205909d641010d2ee0ee369a0bf3e"}, - {file = "pylint_plugin_utils-0.8.tar.gz", hash = "sha256:7066b732ee9479dfff26bb6dc1a7e82e3fc9455aab3f4bac92527b9e2894032e"}, -] - -[package.dependencies] -pylint = ">=1.7" - -[[package]] -name = "pyproject-api" -version = "1.5.1" -description = "API to interact with the python pyproject.toml based projects" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyproject_api-1.5.1-py3-none-any.whl", hash = "sha256:4698a3777c2e0f6b624f8a4599131e2a25376d90fe8d146d7ac74c67c6f97c43"}, - {file = "pyproject_api-1.5.1.tar.gz", hash = "sha256:435f46547a9ff22cf4208ee274fca3e2869aeb062a4834adfc99a4dd64af3cf9"}, -] - -[package.dependencies] -packaging = ">=23" -tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.2.2)", "importlib-metadata (>=6)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.17.1)", "wheel (>=0.38.4)"] - -[[package]] -name = "pytest" -version = "7.3.1" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, - {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "dev" -optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-mimeparse" -version = "1.6.0" -description = "A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges." -category = "dev" -optional = true -python-versions = "*" -files = [ - {file = "python-mimeparse-1.6.0.tar.gz", hash = "sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78"}, - {file = "python_mimeparse-1.6.0-py2.py3-none-any.whl", hash = "sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282"}, -] - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = true -python-versions = "*" -files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] - -[[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] - -[[package]] -name = "readme-renderer" -version = "37.3" -description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, - {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, -] - -[package.dependencies] -bleach = ">=2.1.0" -docutils = ">=0.13.1" -Pygments = ">=2.5.1" - -[package.extras] -md = ["cmarkgfm (>=0.8.0)"] - -[[package]] -name = "requests" -version = "2.30.0" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, - {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rfc3986" -version = "2.0.0" -description = "Validating URI References per RFC 3986" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] - -[package.extras] -idna2008 = ["idna"] - -[[package]] -name = "rich" -version = "13.3.5" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, - {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0,<3.0.0" -pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "setuptools" -version = "67.7.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, - {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sqlparse" -version = "0.4.4" -description = "A non-validating SQL parser." -category = "dev" -optional = true -python-versions = ">=3.5" -files = [ - {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, - {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, -] - -[package.extras] -dev = ["build", "flake8"] -doc = ["sphinx"] -test = ["pytest", "pytest-cov"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tox" -version = "4.5.1" -description = "tox is a generic virtualenv management and test command line tool" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tox-4.5.1-py3-none-any.whl", hash = "sha256:d25a2e6cb261adc489604fafd76cd689efeadfa79709965e965668d6d3f63046"}, - {file = "tox-4.5.1.tar.gz", hash = "sha256:5a2eac5fb816779dfdf5cb00fecbc27eb0524e4626626bb1de84747b24cacc56"}, -] - -[package.dependencies] -cachetools = ">=5.3" -chardet = ">=5.1" -colorama = ">=0.4.6" -filelock = ">=3.11" -importlib-metadata = {version = ">=6.4.1", markers = "python_version < \"3.8\""} -packaging = ">=23.1" -platformdirs = ">=3.2" -pluggy = ">=1" -pyproject-api = ">=1.5.1" -tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} -virtualenv = ">=20.21" - -[package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-argparse-cli (>=1.11)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2022.1.2b11)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.3)", "devpi-process (>=0.3)", "diff-cover (>=7.5)", "distlib (>=0.3.6)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.14)", "psutil (>=5.9.4)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-xdist (>=3.2.1)", "re-assert (>=1.1)", "time-machine (>=2.9)", "wheel (>=0.40)"] - -[[package]] -name = "twine" -version = "4.0.2" -description = "Collection of utilities for publishing packages on PyPI" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "twine-4.0.2-py3-none-any.whl", hash = "sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8"}, - {file = "twine-4.0.2.tar.gz", hash = "sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8"}, -] - -[package.dependencies] -importlib-metadata = ">=3.6" -keyring = ">=15.1" -pkginfo = ">=1.8.1" -readme-renderer = ">=35.0" -requests = ">=2.20" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -rfc3986 = ">=1.4.0" -rich = ">=12.0.0" -urllib3 = ">=1.26.0" - -[[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, -] - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, -] - -[[package]] -name = "urllib3" -version = "2.0.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, - {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "virtualenv" -version = "20.23.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, - {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, -] - -[package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.11,<4" -importlib-metadata = {version = ">=6.4.1", markers = "python_version < \"3.8\""} -platformdirs = ">=3.2,<4" - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "wheel" -version = "0.40.0" -description = "A built-package format for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)"] - -[[package]] -name = "wrapt" -version = "1.15.0" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, -] - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[extras] -for-tests = [] -with-django = [] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.7,<4.0" -content-hash = "7ed06aa41a24cdd1c6ea6d44ebe982cb3a5d11c95c39de9d1b5aeab0da0f872c" diff --git a/pylint_django/tests/input/migrations/0002_new_column.txt b/pylint_django/tests/input/migrations/0002_new_column.txt index 794ac3e8..79d90bd3 100644 --- a/pylint_django/tests/input/migrations/0002_new_column.txt +++ b/pylint_django/tests/input/migrations/0002_new_column.txt @@ -1 +1 @@ -new-db-field-with-default:29:8:33:9:Migration:pylint_django.tests.input.migrations.0002_new_column AddField with default value:UNDEFINED +new-db-field-with-default:28:8:32:9:Migration:pylint_django.tests.input.migrations.0002_new_column AddField with default value:UNDEFINED diff --git a/pylint_django/tests/input/migrations/0003_without_backwards.txt b/pylint_django/tests/input/migrations/0003_without_backwards.txt index 8b83fc1f..b404ce29 100644 --- a/pylint_django/tests/input/migrations/0003_without_backwards.txt +++ b/pylint_django/tests/input/migrations/0003_without_backwards.txt @@ -1,4 +1,4 @@ -missing-backwards-migration-callable:12:8:12:30:Migration:Always include backwards migration callable:UNDEFINED -missing-backwards-migration-callable:13:8:13:43:Migration:Always include backwards migration callable:UNDEFINED -missing-backwards-migration-callable:14:8:14:48:Migration:Always include backwards migration callable:UNDEFINED -missing-backwards-migration-callable:15:8:15:62:Migration:Always include backwards migration callable:UNDEFINED +missing-backwards-migration-callable:11:8:11:30:Migration:Always include backwards migration callable:UNDEFINED +missing-backwards-migration-callable:12:8:12:43:Migration:Always include backwards migration callable:UNDEFINED +missing-backwards-migration-callable:13:8:13:48:Migration:Always include backwards migration callable:UNDEFINED +missing-backwards-migration-callable:14:8:14:62:Migration:Always include backwards migration callable:UNDEFINED diff --git a/pylint_django/tests/test_django_not_installed.sh b/pylint_django/tests/test_django_not_installed.sh index 1b0d7fa8..57d7061f 100644 --- a/pylint_django/tests/test_django_not_installed.sh +++ b/pylint_django/tests/test_django_not_installed.sh @@ -1,2 +1,2 @@ #!/bin/bash -pylint --rcfile=tox.ini --load-plugins=pylint_django setup.py | grep django-not-configured +pylint --rcfile=tox.ini --load-plugins=pylint_django pylint_django/ | grep django-not-available diff --git a/scripts/build.sh b/scripts/build.sh index 14eb47b0..e711ec5e 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -68,7 +68,7 @@ echo "..... Trying to install the new tarball inside a virtualenv" # note: installs with the optional dependency to verify this is still working virtualenv .venv/test-tarball source .venv/test-tarball/bin/activate -pip install -f dist/ pylint_django[with_django] +pip install -f dist/ pylint_django[with-django] pip freeze | grep Django deactivate rm -rf .venv/ diff --git a/tox.ini b/tox.ini index b5787fe8..764b9a2e 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,6 @@ [tox] envlist = django_not_installed - django_is_installed flake8 pylint readme @@ -13,12 +12,12 @@ envlist = requires = pip >=21.0.1 + poetry tox [testenv] commands = django_not_installed: bash pylint_django/tests/test_django_not_installed.sh - django_is_installed: pylint --rcfile=tox.ini --load-plugins=pylint_django --disable=E5110 setup.py flake8: flake8 pylint_django/ pylint: pylint --rcfile=tox.ini -d missing-docstring,too-many-branches,too-many-return-statements,too-many-ancestors,fixme --ignore=tests pylint_django readme: bash -c "poetry build && twine check dist/*" @@ -27,7 +26,6 @@ commands = clean: find . -type d -name __pycache__ -delete clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ deps = - django_is_installed: Django flake8: flake8 pylint: pylint pylint: Django From 36ea72b37c0c3688a916e86fa3d1db44b413ffb5 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 15 May 2023 11:10:28 +0700 Subject: [PATCH 10/75] More CI faff, I hate debugging GitHub actions --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5af39520..3f989249 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,9 @@ python = ">=3.7,<4.0" pylint-plugin-utils = ">=0.8" pylint = ">=2.0,<3" Django = {version=">=2.2", optional = true} +django-tables2 = {version="^2.5.3", optional = true} +factory-boy = {version="^3.2.1", optional = true} +django-tastypie = {version="^0.14.5", optional = true} [tool.poetry.group.dev.dependencies] tox = "^4.5.1" @@ -52,9 +55,6 @@ pylint = ">=2.13" coverage = "^7.2.5" twine = "^4.0.2" wheel = "^0.40.0" -django-tables2 = {version="^2.5.3", optional = true} -factory-boy = {version="^3.2.1", optional = true} -django-tastypie = {version="^0.14.5", optional = true} [tool.poetry.extras] with_django = ["Django"] From 347ad709f11e8f55047f36d3e0683d6e92de0739 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 10:56:23 +0000 Subject: [PATCH 11/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/PyCQA/flake8: 6.0.0 → 6.1.0](https://github.com/PyCQA/flake8/compare/6.0.0...6.1.0) - [github.com/psf/black: 23.3.0 → 23.9.1](https://github.com/psf/black/compare/23.3.0...23.9.1) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6327d372..52e32672 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,12 +10,12 @@ repos: - id: debug-statements # code formatting - repo: https://github.com/PyCQA/flake8 - rev: 6.0.0 + rev: 6.1.0 hooks: - id: flake8 args: [ --max-line-length=120 ] - repo: https://github.com/psf/black - rev: 23.3.0 + rev: 23.9.1 hooks: - id: black args: [--safe, --line-length=120] From 57a15ac9e1d927aa48440d44846a562e3584e1d2 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Thu, 5 Oct 2023 15:30:07 +0900 Subject: [PATCH 12/75] Beginning cleanup of build, versions and similar to fix CI (#376), remove deprecated versions of python/django (#400) and start upgrading to be compatible with python 3.0+ (#405) --- pyproject.toml | 9 ++++----- tox.ini | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3f989249..95f29234 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,21 +44,20 @@ python = ">=3.7,<4.0" pylint-plugin-utils = ">=0.8" pylint = ">=2.0,<3" Django = {version=">=2.2", optional = true} -django-tables2 = {version="^2.5.3", optional = true} -factory-boy = {version="^3.2.1", optional = true} -django-tastypie = {version="^0.14.5", optional = true} [tool.poetry.group.dev.dependencies] tox = "^4.5.1" pytest = "^7.3.1" pylint = ">=2.13" -coverage = "^7.2.5" twine = "^4.0.2" wheel = "^0.40.0" +pytest-cov = "^4.0.0" +django-tables2 = "^2.6.0" +factory-boy = "^3.3.0" +django-tastypie = "^0.14.6" [tool.poetry.extras] with_django = ["Django"] -for_tests = ['django-tastypie', 'django-tables2', 'factory-boy'] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tox.ini b/tox.ini index 764b9a2e..e32a00bd 100644 --- a/tox.ini +++ b/tox.ini @@ -21,7 +21,7 @@ commands = flake8: flake8 pylint_django/ pylint: pylint --rcfile=tox.ini -d missing-docstring,too-many-branches,too-many-return-statements,too-many-ancestors,fixme --ignore=tests pylint_django readme: bash -c "poetry build && twine check dist/*" - py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: coverage run pylint_django/tests/test_func.py -v + py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash scripts/test.sh --cov=pylint_django clean: find . -type f -name '*.pyc' -delete clean: find . -type d -name __pycache__ -delete clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ @@ -47,7 +47,7 @@ setenv = allowlist_externals = django_not_installed: bash readme: bash - py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: coverage + py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash clean: find clean: rm From 86bf37539d315c802206051e53f29b559b8b731b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 21:20:58 +0000 Subject: [PATCH 13/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.5.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.5.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 52e32672..f96c52c0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # https://pre-commit.com/ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer From 3b760edfb42233174478df097598486db84132aa Mon Sep 17 00:00:00 2001 From: Matej Spiller Muys Date: Fri, 6 Oct 2023 10:50:41 +0200 Subject: [PATCH 14/75] Support for pylint 3.x --- pylint_django/checkers/auth_user.py | 10 ++++------ pylint_django/checkers/django_installed.py | 2 +- pylint_django/checkers/foreign_key_strings.py | 14 ++++++++------ pylint_django/checkers/forms.py | 5 +---- pylint_django/checkers/json_response.py | 8 +++----- pylint_django/checkers/migrations.py | 6 +++--- pylint_django/checkers/models.py | 5 +---- pylint_django/compat.py | 5 +++++ pylint_django/plugin.py | 6 +----- pyproject.toml | 2 +- 10 files changed, 28 insertions(+), 35 deletions(-) diff --git a/pylint_django/checkers/auth_user.py b/pylint_django/checkers/auth_user.py index af6a6600..a54d5c35 100644 --- a/pylint_django/checkers/auth_user.py +++ b/pylint_django/checkers/auth_user.py @@ -1,12 +1,10 @@ -from pylint import checkers, interfaces -from pylint.checkers import utils +from pylint import checkers from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages class AuthUserChecker(checkers.BaseChecker): - __implements__ = (interfaces.IAstroidChecker,) - name = "auth-user-checker" msgs = { @@ -22,14 +20,14 @@ class AuthUserChecker(checkers.BaseChecker): ), } - @utils.check_messages("hard-coded-auth-user") + @check_messages("hard-coded-auth-user") def visit_const(self, node): # for now we don't check if the parent is a ForeignKey field # because the user model should not be hard-coded anywhere if node.value == "auth.User": self.add_message("hard-coded-auth-user", node=node) - @utils.check_messages("imported-auth-user") + @check_messages("imported-auth-user") def visit_importfrom(self, node): if node.modname == "django.contrib.auth.models": for imported_names in node.names: diff --git a/pylint_django/checkers/django_installed.py b/pylint_django/checkers/django_installed.py index 5a0becfd..0caf275b 100644 --- a/pylint_django/checkers/django_installed.py +++ b/pylint_django/checkers/django_installed.py @@ -1,9 +1,9 @@ from __future__ import absolute_import from pylint.checkers import BaseChecker -from pylint.checkers.utils import check_messages from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages class DjangoInstalledChecker(BaseChecker): diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index fac33148..7282b79e 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -2,10 +2,9 @@ import astroid from pylint.checkers import BaseChecker -from pylint.checkers.utils import check_messages -from pylint.interfaces import IAstroidChecker from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages from pylint_django.transforms import foreignkey @@ -27,8 +26,6 @@ class ForeignKeyStringsChecker(BaseChecker): Some basic default settings were used, however this will lead to less accurate linting. Consider passing in an explicit Django configuration file to match your project to improve accuracy.""" - __implements__ = (IAstroidChecker,) - name = "Django foreign keys referenced by strings" options = ( @@ -95,7 +92,12 @@ def open(self): # this means that Django wasn't able to configure itself using some defaults # provided (likely in a DJANGO_SETTINGS_MODULE environment variable) # so see if the user has specified a pylint option - if self.config.django_settings_module is None: + if hasattr(self, "linter"): + django_settings_module = self.linter.config.django_settings_module + else: + django_settings_module = self.config.django_settings_module + + if django_settings_module is None: # we will warn the user that they haven't actually configured Django themselves self._raise_warning = True # but use django defaults then... @@ -108,7 +110,7 @@ def open(self): try: from django.conf import Settings, settings # pylint: disable=import-outside-toplevel - settings.configure(Settings(self.config.django_settings_module)) + settings.configure(Settings(django_settings_module)) django.setup() except ImportError: # we could not find the provided settings module... diff --git a/pylint_django/checkers/forms.py b/pylint_django/checkers/forms.py index 8614b739..f668684c 100644 --- a/pylint_django/checkers/forms.py +++ b/pylint_django/checkers/forms.py @@ -1,10 +1,9 @@ """Models.""" from astroid.nodes import Assign, AssignName, ClassDef from pylint.checkers import BaseChecker -from pylint.checkers.utils import check_messages -from pylint.interfaces import IAstroidChecker from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages from pylint_django.utils import node_is_subclass @@ -18,8 +17,6 @@ def _get_child_meta(node): class FormChecker(BaseChecker): """Django model checker.""" - __implements__ = IAstroidChecker - name = "django-form-checker" msgs = { f"W{BASE_ID}04": ( diff --git a/pylint_django/checkers/json_response.py b/pylint_django/checkers/json_response.py index 392e6092..4d15f547 100644 --- a/pylint_django/checkers/json_response.py +++ b/pylint_django/checkers/json_response.py @@ -7,10 +7,10 @@ """ import astroid -from pylint import checkers, interfaces -from pylint.checkers import utils +from pylint import checkers from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages class JsonResponseChecker(checkers.BaseChecker): @@ -19,8 +19,6 @@ class JsonResponseChecker(checkers.BaseChecker): JSON data! """ - __implements__ = (interfaces.IAstroidChecker,) - # configuration section name name = "json-response-checker" msgs = { @@ -43,7 +41,7 @@ class JsonResponseChecker(checkers.BaseChecker): ), } - @utils.check_messages( + @check_messages( "http-response-with-json-dumps", "http-response-with-content-type-json", "redundant-content-type-for-json-response", diff --git a/pylint_django/checkers/migrations.py b/pylint_django/checkers/migrations.py index c8b9d075..2b3bad71 100644 --- a/pylint_django/checkers/migrations.py +++ b/pylint_django/checkers/migrations.py @@ -10,11 +10,11 @@ import astroid from pylint import checkers, interfaces -from pylint.checkers import utils from pylint_plugin_utils import suppress_message from pylint_django import compat from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages from pylint_django.utils import is_migrations_module @@ -86,7 +86,7 @@ def visit_call(self, node): if node not in self._possible_offences[module]: self._possible_offences[module].append(node) - @utils.check_messages("new-db-field-with-default") + @check_messages("new-db-field-with-default") def close(self): def _path(node): return node.path @@ -125,7 +125,7 @@ class MissingBackwardsMigrationChecker(checkers.BaseChecker): ) } - @utils.check_messages("missing-backwards-migration-callable") + @check_messages("missing-backwards-migration-callable") def visit_call(self, node): try: module = node.frame().parent diff --git a/pylint_django/checkers/models.py b/pylint_django/checkers/models.py index 032b6f48..5bc25c67 100644 --- a/pylint_django/checkers/models.py +++ b/pylint_django/checkers/models.py @@ -2,10 +2,9 @@ from astroid import Const from astroid.nodes import Assign, AssignName, ClassDef, FunctionDef from pylint.checkers import BaseChecker -from pylint.checkers.utils import check_messages -from pylint.interfaces import IAstroidChecker from pylint_django.__pkginfo__ import BASE_ID +from pylint_django.compat import check_messages from pylint_django.utils import PY3, node_is_subclass MESSAGES = { @@ -75,8 +74,6 @@ def _is_unicode_or_str_in_python_2_compatibility(method): class ModelChecker(BaseChecker): """Django model checker.""" - __implements__ = IAstroidChecker - name = "django-model-checker" msgs = MESSAGES diff --git a/pylint_django/compat.py b/pylint_django/compat.py index fa06cc1d..9b496bc4 100644 --- a/pylint_django/compat.py +++ b/pylint_django/compat.py @@ -20,6 +20,11 @@ except ImportError: from astroid.util import Uninferable +try: + from pylint.checkers.utils import check_messages +except (ImportError, ModuleNotFoundError): + from pylint.checkers.utils import only_required_for_messages as check_messages + import pylint # pylint before version 2.3 does not support load_configuration() hook. diff --git a/pylint_django/plugin.py b/pylint_django/plugin.py index c7cc1313..1db620a5 100644 --- a/pylint_django/plugin.py +++ b/pylint_django/plugin.py @@ -1,7 +1,4 @@ """Common Django module.""" -from pylint.checkers.base import NameChecker -from pylint_plugin_utils import get_checker - # we want to import the transforms to make sure they get added to the astroid manager, # however we don't actually access them directly, so we'll disable the warning from pylint_django import transforms # noqa, pylint: disable=unused-import @@ -13,8 +10,7 @@ def load_configuration(linter): """ Amend existing checker config. """ - name_checker = get_checker(linter, NameChecker) - name_checker.config.good_names += ( + linter.config.good_names += ( "pk", "qs", "urlpatterns", diff --git a/pyproject.toml b/pyproject.toml index 95f29234..da939054 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] [tool.poetry.dependencies] python = ">=3.7,<4.0" pylint-plugin-utils = ">=0.8" -pylint = ">=2.0,<3" +pylint = ">=2.0,<4" Django = {version=">=2.2", optional = true} [tool.poetry.group.dev.dependencies] From ac02a069dccd37430521eb52256dbfc4881ebb0e Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sun, 22 Oct 2023 10:14:22 +0700 Subject: [PATCH 15/75] Bumping version for bugfix release to get pylint 3 support [#407 #405] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index da939054..f61a9ae5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pylint-django" -version = "2.6.0a0" +version = "2.5.4" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/PyCQA/pylint-django" From 04df42a0795007af5e8bcad5910f6caf7d661aba Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sun, 22 Oct 2023 10:18:19 +0700 Subject: [PATCH 16/75] Bumping black pre-commit hook version --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f96c52c0..2ff0b4d8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: - id: flake8 args: [ --max-line-length=120 ] - repo: https://github.com/psf/black - rev: 23.9.1 + rev: 23.10.0 hooks: - id: black args: [--safe, --line-length=120] From a833242c1394228ab1444acfb6cff7ee6dfd9634 Mon Sep 17 00:00:00 2001 From: Matej Spiller Muys Date: Mon, 23 Oct 2023 15:04:40 +0200 Subject: [PATCH 17/75] Remove all IAstroidChecker --- pylint_django/checkers/migrations.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pylint_django/checkers/migrations.py b/pylint_django/checkers/migrations.py index 2b3bad71..a7d1ec8d 100644 --- a/pylint_django/checkers/migrations.py +++ b/pylint_django/checkers/migrations.py @@ -9,7 +9,7 @@ """ import astroid -from pylint import checkers, interfaces +from pylint import checkers from pylint_plugin_utils import suppress_message from pylint_django import compat @@ -51,8 +51,6 @@ class NewDbFieldWithDefaultChecker(checkers.BaseChecker): desired default values. """ - __implements__ = (interfaces.IAstroidChecker,) - # configuration section name name = "new-db-field-with-default" msgs = { @@ -113,8 +111,6 @@ def _path(node): class MissingBackwardsMigrationChecker(checkers.BaseChecker): - __implements__ = (interfaces.IAstroidChecker,) - name = "missing-backwards-migration-callable" msgs = { From e541e9f0339c452112ecc83ab92b38d093bb61ce Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 23 Oct 2023 20:09:02 +0700 Subject: [PATCH 18/75] Bumping version quickly to fix #405 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f61a9ae5..c5613e2f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pylint-django" -version = "2.5.4" +version = "2.5.5" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/PyCQA/pylint-django" From b40598360762ab99c8cac696ec7a59d9ba39c1be Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 30 Oct 2023 00:37:46 +0700 Subject: [PATCH 19/75] * Suppressed additional message raised by newer pylint versions for unicode lambda test * Updated pre-commit config to latest versions of checkers * Re-ordered the compat layer for 'check_messages' to remove deprecation warnings during tests * Skipped pickling test for now, because it seems newer argparse from python stdlib is not picklalbe --- .pre-commit-config.yaml | 2 +- pylint_django/compat.py | 4 ++-- .../tests/input/func_noerror_model_unicode_lambda.py | 2 +- pylint_django/tests/test_func.py | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2ff0b4d8..fd5cf656 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: - id: flake8 args: [ --max-line-length=120 ] - repo: https://github.com/psf/black - rev: 23.10.0 + rev: 23.10.1 hooks: - id: black args: [--safe, --line-length=120] diff --git a/pylint_django/compat.py b/pylint_django/compat.py index 9b496bc4..d4dfdeef 100644 --- a/pylint_django/compat.py +++ b/pylint_django/compat.py @@ -21,9 +21,9 @@ from astroid.util import Uninferable try: - from pylint.checkers.utils import check_messages -except (ImportError, ModuleNotFoundError): from pylint.checkers.utils import only_required_for_messages as check_messages +except (ImportError, ModuleNotFoundError): + from pylint.checkers.utils import check_messages import pylint diff --git a/pylint_django/tests/input/func_noerror_model_unicode_lambda.py b/pylint_django/tests/input/func_noerror_model_unicode_lambda.py index da7bf9cb..a1db11b4 100644 --- a/pylint_django/tests/input/func_noerror_model_unicode_lambda.py +++ b/pylint_django/tests/input/func_noerror_model_unicode_lambda.py @@ -1,7 +1,7 @@ """ Ensures that django models without a __unicode__ method are flagged """ -# pylint: disable=missing-docstring,wrong-import-position +# pylint: disable=missing-docstring,wrong-import-position,unnecessary-lambda-assignment from django.db import models diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index b446d5c7..90adac3d 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -115,6 +115,7 @@ def test_migrations_plugin(test_file): @pytest.mark.parametrize("test_file", MIGRATIONS_TESTS[:1], ids=MIGRATIONS_TESTS_NAMES[:1]) +@pytest.mark.skip # currently skipped because ArgParser which pylint uses is not picklable so ... def test_linter_should_be_pickleable_with_pylint_django_plugin_installed(test_file): LintTest = PylintDjangoMigrationsTest(test_file) LintTest.setUp() From af9dc4fed174569efc6de0a57ee03809083a66c6 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 30 Oct 2023 00:54:02 +0700 Subject: [PATCH 20/75] [#376] Attempting to fix CI by side-stepping tox behaviour to refuse to install test dependencies... --- scripts/test.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/test.sh b/scripts/test.sh index ca5be46c..fe278465 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -1,2 +1,13 @@ #!/bin/bash +# TODO: The following code duplicates requirements from pyproject.toml for test dependencies. This is because during +# the CI run, tox builds a package using the pyproject.toml and installs it; this means that it does not install +# dev-dependencies including the ones needed for tests to pass. Frustratingly, the "install extras" feature of +# tox does not appear to work to solve this by putting the test deps into an optional grouping. For now, this +# hardcoded list will have to do in order to fix the CI... see #376 +pip install pytest pytest-cov \ + "django-tables2>=2.6.0" \ + "factory-boy>=3.3.0" \ + "django-tastypie>=0.14.6" \ + "djangorestframework>=3.13.1" + python pylint_django/tests/test_func.py -v "$@" From 11a0bf91e1b2d31959c9c8839a84de77840c68d8 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 30 Oct 2023 02:08:20 +0700 Subject: [PATCH 21/75] Removing last pieces of failing tests and tox environments --- pylint_django/checkers/foreign_key_strings.py | 3 +++ pylint_django/tests/input/external_drf_noerror_serializer.py | 2 +- tox.ini | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index 7282b79e..6000c580 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -95,6 +95,9 @@ def open(self): if hasattr(self, "linter"): django_settings_module = self.linter.config.django_settings_module else: + # TODO: remove this no-member ignore : this is to avoid the missing `config` for pylint 3+, + # and can be removed once pylint 2 + # pylint: disable=no-member django_settings_module = self.config.django_settings_module if django_settings_module is None: diff --git a/pylint_django/tests/input/external_drf_noerror_serializer.py b/pylint_django/tests/input/external_drf_noerror_serializer.py index 814678da..9620541e 100644 --- a/pylint_django/tests/input/external_drf_noerror_serializer.py +++ b/pylint_django/tests/input/external_drf_noerror_serializer.py @@ -1,7 +1,7 @@ """ Checks that Pylint does not complain about DRF serializers """ -# pylint: disable=C0111,W5101 +# pylint: disable=C0111,W5101,use-symbolic-message-instead from rest_framework import serializers diff --git a/tox.ini b/tox.ini index e32a00bd..c83c9b8d 100644 --- a/tox.ini +++ b/tox.ini @@ -27,7 +27,7 @@ commands = clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ deps = flake8: flake8 - pylint: pylint + pylint: pylint<3 pylint: Django readme: twine readme: wheel From e58d4b9594adc1568b47dce77ea563739377a6d7 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 30 Oct 2023 02:10:40 +0700 Subject: [PATCH 22/75] Removing for_tests optional CI config since it does not work anyway --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4a2cdf20..ca0a2733 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: - name: Execute tests run: | pip install -U pip poetry tox - poetry install -E for_tests + poetry install export TOXENV=${{ matrix.toxenv }} export PYTHON=${{ matrix.python-version }} @@ -51,7 +51,7 @@ jobs: - name: Execute tests run: | pip install -U pip poetry tox - poetry install -E for_tests + poetry install export DJANGO=${{ matrix.django-version }} export PYTHON=${{ matrix.python-version }} @@ -85,7 +85,7 @@ jobs: - name: Execute tests run: | pip install -U pip poetry tox - poetry install -E for_tests + poetry install export DJANGO=${{ matrix.django-version }} export PYTHON=${{ matrix.python-version }} @@ -116,6 +116,6 @@ jobs: - name: Build run: | pip install -U pip poetry tox - poetry install -E for_tests + poetry install ./scripts/build.sh From ce829eb77f4feb8846b70c32b82f987c005a5e17 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Mon, 30 Oct 2023 02:24:04 +0700 Subject: [PATCH 23/75] Dropping very old non-LTS versions of Django from CI [#376] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca0a2733..c69e6feb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,7 +73,7 @@ jobs: fail-fast: false matrix: python-version: [3.7, 3.8, 3.9] - django-version: [3.2, 3.1, "3.0", "2.0", "2.2", "1.11"] + django-version: [3.2, 3.1, "3.0", "2.2"] steps: - uses: actions/checkout@v3 From 1ad69bcc5ac7b129371b684de4c41475d14012c7 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 08:56:05 +0100 Subject: [PATCH 24/75] Add python 3.12 in the CI --- .github/workflows/build.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c69e6feb..840aa95b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.7] + python-version: ["3.11"] toxenv: [django_not_installed, flake8, pylint, readme] steps: @@ -38,7 +38,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.8, 3.9, "3.10", "3.11"] + python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] django-version: [-main, "4.0"] steps: @@ -104,7 +104,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7] + python-version: ["3.11"] steps: - uses: actions/checkout@v3 @@ -117,5 +117,4 @@ jobs: run: | pip install -U pip poetry tox poetry install - ./scripts/build.sh From 7237242616bb3c0df3f87bbc7a138e6c507b8c18 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:13:20 +0100 Subject: [PATCH 25/75] Move pylint config out of tox (#412) --- pyproject.toml | 5 +++++ tox.ini | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c5613e2f..653e25a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,3 +72,8 @@ include_trailing_comma = true force_grid_wrap = 0 use_parentheses = true line_length = 120 + +[tool.pylint.main] +disable = ["missing-docstring","too-many-branches","too-many-return-statements","too-many-ancestors","fixme"] +ignore="tests" +max-line-length = 120 diff --git a/tox.ini b/tox.ini index c83c9b8d..3c191b12 100644 --- a/tox.ini +++ b/tox.ini @@ -19,7 +19,7 @@ requires = commands = django_not_installed: bash pylint_django/tests/test_django_not_installed.sh flake8: flake8 pylint_django/ - pylint: pylint --rcfile=tox.ini -d missing-docstring,too-many-branches,too-many-return-statements,too-many-ancestors,fixme --ignore=tests pylint_django + pylint: pylint pylint_django readme: bash -c "poetry build && twine check dist/*" py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash scripts/test.sh --cov=pylint_django clean: find . -type f -name '*.pyc' -delete @@ -54,8 +54,7 @@ allowlist_externals = [flake8] max-line-length = 120 -[pylint] -max-line-length = 120 + [FORMAT] max-line-length=120 From df570bb91f80a4e5a03d823ab39857e2e83b5777 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:13:49 +0100 Subject: [PATCH 26/75] [cleanup] Remove a check that can never be reached (#413) The package metadata makes sure that the python version is at least 3.7. This package won't be installed for other python interpreters. --- pylint_django/__init__.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pylint_django/__init__.py b/pylint_django/__init__.py index 034bc4e9..c3028de4 100644 --- a/pylint_django/__init__.py +++ b/pylint_django/__init__.py @@ -1,12 +1,7 @@ """pylint_django module.""" -from __future__ import absolute_import -import sys from pylint_django import plugin -if sys.version_info < (3,): - raise DeprecationWarning("Version 0.11.1 was the last to support Python 2. Please migrate to Python 3!") - register = plugin.register # pylint: disable=invalid-name load_configuration = plugin.load_configuration # pylint: disable=invalid-name From 17999678a28b91e0a484400e5272f4edd14d0225 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:48:53 +0100 Subject: [PATCH 27/75] [style] Fix snake_case in class name 'TestDialect' --- pylint_django/tests/test_func.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index 90adac3d..c72f5369 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -17,11 +17,11 @@ if "test" not in csv.list_dialects(): - class test_dialect(csv.excel): + class TestDialect(csv.excel): delimiter = ":" lineterminator = "\n" - csv.register_dialect("test", test_dialect) + csv.register_dialect("test", TestDialect) lint_module_test.PYLINTRC = HERE / "testing_pylint.rc" except (ImportError, AttributeError): From 38f2cf2e7f0909f17b6a0d67a37b89c2ffc678b0 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:49:37 +0100 Subject: [PATCH 28/75] [style] Fix PascaleCase in variable name 'lint_test' --- pylint_django/tests/test_func.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index c72f5369..568a9e61 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -97,9 +97,9 @@ def _file_name(test): @pytest.mark.parametrize("test_file", TESTS, ids=TESTS_NAMES) def test_everything(test_file): # copied from pylint.tests.test_functional.test_functional - LintTest = PylintDjangoLintModuleTest(test_file) - LintTest.setUp() - LintTest._runTest() + lint_test = PylintDjangoLintModuleTest(test_file) + lint_test.setUp() + lint_test._runTest() # NOTE: define tests for the migrations checker! @@ -109,21 +109,17 @@ def test_everything(test_file): @pytest.mark.parametrize("test_file", MIGRATIONS_TESTS, ids=MIGRATIONS_TESTS_NAMES) def test_migrations_plugin(test_file): - LintTest = PylintDjangoMigrationsTest(test_file) - LintTest.setUp() - LintTest._runTest() + lint_test = PylintDjangoMigrationsTest(test_file) + lint_test.setUp() + lint_test.runTest() @pytest.mark.parametrize("test_file", MIGRATIONS_TESTS[:1], ids=MIGRATIONS_TESTS_NAMES[:1]) @pytest.mark.skip # currently skipped because ArgParser which pylint uses is not picklable so ... def test_linter_should_be_pickleable_with_pylint_django_plugin_installed(test_file): - LintTest = PylintDjangoMigrationsTest(test_file) - LintTest.setUp() + lint_test = PylintDjangoMigrationsTest(test_file) + lint_test.setUp() # LintModuleTest sets reporter to instance of FunctionalTestReporter that is not picklable - LintTest._linter.reporter = None - pickle.dumps(LintTest._linter) - - -if __name__ == "__main__": - sys.exit(pytest.main(sys.argv)) + lint_test._linter.reporter = None + pickle.dumps(lint_test._linter) From be6c5b6133de0d975f529f83b8f30a9aa65e4808 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:50:55 +0100 Subject: [PATCH 29/75] [protected-access] Use the public function to launch test in PylintDjangoLintModuleTest --- pylint_django/tests/test_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index 568a9e61..52b3a492 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -99,7 +99,7 @@ def test_everything(test_file): # copied from pylint.tests.test_functional.test_functional lint_test = PylintDjangoLintModuleTest(test_file) lint_test.setUp() - lint_test._runTest() + lint_test.runTest() # NOTE: define tests for the migrations checker! From c1c588cce8b592f6e8dc4beb4da0c93b5db632f4 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:54:12 +0100 Subject: [PATCH 30/75] [style] Disable Consider using Python 3 style super() --- pylint_django/tests/test_func.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index 52b3a492..ca9b14a1 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -52,6 +52,8 @@ class PylintDjangoLintModuleTest(LintModuleTest): def __init__(self, test_file): # if hasattr(test_file, 'option_file') and test_file.option_file is None: + # pylint: disable=super-with-arguments + # TODO Fix this and the CI (?) super(PylintDjangoLintModuleTest, self).__init__(test_file) self._linter.load_plugin_modules(["pylint_django"]) self._linter.load_plugin_configuration() From 33743c3c3702408f8a314acd9abb46452fcd6208 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:54:40 +0100 Subject: [PATCH 31/75] [style] Disable protected-access in skipped test --- pylint_django/tests/test_func.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index ca9b14a1..635fca42 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -117,11 +117,11 @@ def test_migrations_plugin(test_file): @pytest.mark.parametrize("test_file", MIGRATIONS_TESTS[:1], ids=MIGRATIONS_TESTS_NAMES[:1]) -@pytest.mark.skip # currently skipped because ArgParser which pylint uses is not picklable so ... +@pytest.mark.skip # TODO currently skipped because ArgParser which pylint uses is not pickable. def test_linter_should_be_pickleable_with_pylint_django_plugin_installed(test_file): lint_test = PylintDjangoMigrationsTest(test_file) lint_test.setUp() - + # pylint: disable=protected-access # LintModuleTest sets reporter to instance of FunctionalTestReporter that is not picklable lint_test._linter.reporter = None pickle.dumps(lint_test._linter) From 0670d0978333f4664d56d4c3908be793aed69f66 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:55:08 +0100 Subject: [PATCH 32/75] [pylint] Disable too-few-public-methods globally --- pyproject.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 653e25a8..bb5a9007 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,6 +74,11 @@ use_parentheses = true line_length = 120 [tool.pylint.main] -disable = ["missing-docstring","too-many-branches","too-many-return-statements","too-many-ancestors","fixme"] +disable = [ + "missing-docstring", + "too-many-branches", "too-many-return-statements", "too-many-ancestors", + "too-few-public-methods", + "fixme", +] ignore="tests" max-line-length = 120 From 130dd8ef537db95a92813aae5ed8beda0ccc264c Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Mon, 30 Oct 2023 09:55:20 +0100 Subject: [PATCH 33/75] Add pylint in the pre-commit configuration --- .pre-commit-config.yaml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fd5cf656..cf941205 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,6 @@ -# https://pre-commit.com/ +ci: + skip: [pylint] + repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 @@ -24,3 +26,12 @@ repos: hooks: - id: isort args: ['--profile', 'black'] + - repo: local + hooks: + - id: pylint + name: pylint + entry: pylint + language: system + types: [python] + args: ["-rn", "-sn", "--fail-on=I"] + exclude: "tests/input/" From d21ccd3f9dc8f8f94df2d144c950c3fdaf4e3298 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Sat, 4 Nov 2023 23:38:18 +0100 Subject: [PATCH 34/75] [pre-commit] Add and apply prettier (#416) --- .github/ISSUE_TEMPLATE.md | 7 ++--- .github/workflows/build.yml | 61 +++++++++++++++++++------------------ .pre-commit-config.yaml | 10 ++++-- CONTRIBUTORS.md | 44 +++++++++++++------------- SECURITY.md | 12 ++++---- 5 files changed, 70 insertions(+), 64 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 13309cca..94b4a4cb 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,8 +1,7 @@ -**WARNING:** Please do not report issues about missing Django, see +**WARNING:** Please do not report issues about missing Django, see [README](https://github.com/PyCQA/pylint-django#installation)! **TODO:** make sure to post the output of `pip freeze` -**NOTES:** make sure you have the latest version of 3rd party packages -like `rest_framework`, `factory`, `model_utils`, etc. before reporting -issues! +**NOTES:** make sure you have the latest version of 3rd party packages like +`rest_framework`, `factory`, `model_utils`, etc. before reporting issues! diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 840aa95b..c86de4f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,16 +24,17 @@ jobs: - name: Execute tests run: | - pip install -U pip poetry tox - poetry install - - export TOXENV=${{ matrix.toxenv }} - export PYTHON=${{ matrix.python-version }} - tox + pip install -U pip poetry tox + poetry install + export TOXENV=${{ matrix.toxenv }} + export PYTHON=${{ matrix.python-version }} + tox test: - name: test latest / Django@${{ matrix.django-version }} / Python@${{ matrix.python-version }} + name: + test latest / Django@${{ matrix.django-version }} / Python@${{ + matrix.python-version }} runs-on: ubuntu-latest strategy: fail-fast: false @@ -50,26 +51,28 @@ jobs: - name: Execute tests run: | - pip install -U pip poetry tox - poetry install + pip install -U pip poetry tox + poetry install - export DJANGO=${{ matrix.django-version }} - export PYTHON=${{ matrix.python-version }} - export TOXENV=$(echo py${{ matrix.python-version }}-django${{ matrix.django-version }} | tr -d .) - tox + export DJANGO=${{ matrix.django-version }} + export PYTHON=${{ matrix.python-version }} + export TOXENV=$(echo py${{ matrix.python-version }}-django${{ matrix.django-version }} | tr -d .) + tox - name: Coveralls env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - pip install coveralls - coveralls --service=github + pip install coveralls + coveralls --service=github - test_deprecated: # testing older versions of python+django - name: test old stuff / Django@${{ matrix.django-version }} / Python@${{ matrix.python-version }} + test_deprecated: # testing older versions of python+django + name: + test old stuff / Django@${{ matrix.django-version }} / Python@${{ + matrix.python-version }} runs-on: ubuntu-latest - strategy: # TODO: use a YAML anchor - not supported in GitHub actions "yet" + strategy: # TODO: use a YAML anchor - not supported in GitHub actions "yet" fail-fast: false matrix: python-version: [3.7, 3.8, 3.9] @@ -84,21 +87,21 @@ jobs: - name: Execute tests run: | - pip install -U pip poetry tox - poetry install + pip install -U pip poetry tox + poetry install - export DJANGO=${{ matrix.django-version }} - export PYTHON=${{ matrix.python-version }} - export TOXENV=$(echo py${{ matrix.python-version }}-django${{ matrix.django-version }} | tr -d .) - tox + export DJANGO=${{ matrix.django-version }} + export PYTHON=${{ matrix.python-version }} + export TOXENV=$(echo py${{ matrix.python-version }}-django${{ matrix.django-version }} | tr -d .) + tox - name: Coveralls env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - pip install coveralls - coveralls --service=github + pip install coveralls + coveralls --service=github build_and_package_sanity: runs-on: ubuntu-latest @@ -115,6 +118,6 @@ jobs: - name: Build run: | - pip install -U pip poetry tox - poetry install - ./scripts/build.sh + pip install -U pip poetry tox + poetry install + ./scripts/build.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cf941205..9ad308e7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,12 +10,11 @@ repos: - id: mixed-line-ending args: [--fix=lf] - id: debug-statements - # code formatting - repo: https://github.com/PyCQA/flake8 rev: 6.1.0 hooks: - id: flake8 - args: [ --max-line-length=120 ] + args: [--max-line-length=120] - repo: https://github.com/psf/black rev: 23.10.1 hooks: @@ -25,7 +24,12 @@ repos: rev: 5.12.0 hooks: - id: isort - args: ['--profile', 'black'] + args: ["--profile", "black"] + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.0.3 + hooks: + - id: prettier + args: [--prose-wrap=always, --print-width=88] - repo: local hooks: - id: pylint diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 07160217..a35d2755 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,22 +1,22 @@ -* [carlio](https://github.com/carlio) -* [mbarrien](https://github.com/mbarrien) -* [frost-nzcr4](https://github.com/frost-nzcr4) -* [ustun](https://github.com/ustun) -* [jproffitt](https://github.com/jproffitt) -* [lhupfeldt](https://github.com/lhupfeldt) -* [smirolo](https://github.com/smirolo) -* [mbertolacci](https://github.com/mbertolacci) -* [atodorov](https://github.com/atodorov) -* [bittner](https://github.com/bittner) -* [federicobond](https://github.com/federicobond) -* [matusvalo](https://github.com/matusvalo) -* [fadedDexofan](https://github.com/fadeddexofan) -* [imomaliev](https://github.com/imomaliev) -* [psrb](https://github.com/psrb) -* [WayneLambert](https://github.com/WayneLambert) -* [alejandro-angulo](https://github.com/alejandro-angulo) -* [brymut](https://github.com/brymut) -* [michael-k](https://github.com/michael-k) -* [naquiroz](https://github.com/naquiroz) -* [john-sandall](https://github.com/john-sandall) -* [dineshtrivedi](https://github.com/dineshtrivedi) +- [carlio](https://github.com/carlio) +- [mbarrien](https://github.com/mbarrien) +- [frost-nzcr4](https://github.com/frost-nzcr4) +- [ustun](https://github.com/ustun) +- [jproffitt](https://github.com/jproffitt) +- [lhupfeldt](https://github.com/lhupfeldt) +- [smirolo](https://github.com/smirolo) +- [mbertolacci](https://github.com/mbertolacci) +- [atodorov](https://github.com/atodorov) +- [bittner](https://github.com/bittner) +- [federicobond](https://github.com/federicobond) +- [matusvalo](https://github.com/matusvalo) +- [fadedDexofan](https://github.com/fadeddexofan) +- [imomaliev](https://github.com/imomaliev) +- [psrb](https://github.com/psrb) +- [WayneLambert](https://github.com/WayneLambert) +- [alejandro-angulo](https://github.com/alejandro-angulo) +- [brymut](https://github.com/brymut) +- [michael-k](https://github.com/michael-k) +- [naquiroz](https://github.com/naquiroz) +- [john-sandall](https://github.com/john-sandall) +- [dineshtrivedi](https://github.com/dineshtrivedi) diff --git a/SECURITY.md b/SECURITY.md index 41f6aa46..c2a303fe 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,13 +2,13 @@ ## Supported Versions -| Version | Supported | -| ------- | ------------------ | +| Version | Supported | +| ------------------------------------------------- | ------------------ | | [latest](https://pypi.org/project/pylint-django/) | :heavy_check_mark: | ## Reporting a Vulnerability -In case you have found a security problem with pylint-django *DO NOT* report -it into GitHub Issues. Instead go to -[https://tidelift.com/security](https://tidelift.com/security) -and follow the instructions there. +In case you have found a security problem with pylint-django _DO NOT_ report it into +GitHub Issues. Instead go to +[https://tidelift.com/security](https://tidelift.com/security) and follow the +instructions there. From 955f779f4e45144f4092ab25d1ff4fc8f5e3c46b Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Sat, 4 Nov 2023 23:55:07 +0100 Subject: [PATCH 35/75] [ruff] Migrate from flake8 and isort, autofix existing issues (#414) --- .github/workflows/build.yml | 2 +- .pre-commit-config.yaml | 14 +++++--------- pylint_django/augmentations/__init__.py | 3 ++- pylint_django/checkers/django_installed.py | 2 -- pylint_django/checkers/foreign_key_strings.py | 3 --- pylint_django/plugin.py | 1 - pylint_django/tests/test_func.py | 2 +- pylint_django/transforms/fields.py | 4 ++-- pyproject.toml | 16 ++++++++++++++++ tox.ini | 10 +--------- 10 files changed, 28 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c86de4f9..b9b559db 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: python-version: ["3.11"] - toxenv: [django_not_installed, flake8, pylint, readme] + toxenv: [django_not_installed, ruff, pylint, readme] steps: - uses: actions/checkout@v3 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9ad308e7..9e5de120 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,21 +10,17 @@ repos: - id: mixed-line-ending args: [--fix=lf] - id: debug-statements - - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.1.4" hooks: - - id: flake8 - args: [--max-line-length=120] + - id: ruff + args: ["--fix"] + exclude: "tests/input/" - repo: https://github.com/psf/black rev: 23.10.1 hooks: - id: black args: [--safe, --line-length=120] - - repo: https://github.com/PyCQA/isort - rev: 5.12.0 - hooks: - - id: isort - args: ["--profile", "black"] - repo: https://github.com/pre-commit/mirrors-prettier rev: v3.0.3 hooks: diff --git a/pylint_django/augmentations/__init__.py b/pylint_django/augmentations/__init__.py index ca8c850b..89f454f4 100644 --- a/pylint_django/augmentations/__init__.py +++ b/pylint_django/augmentations/__init__.py @@ -790,7 +790,8 @@ def pylint_newstyle_classdef_compat(linter, warning_name, augment): return suppress_message( linter, - getattr(NewStyleConflictChecker, "visit_classdef"), + # pylint: disable-next=no-member + NewStyleConflictChecker.visit_classdef, warning_name, augment, ) diff --git a/pylint_django/checkers/django_installed.py b/pylint_django/checkers/django_installed.py index 0caf275b..07723b9e 100644 --- a/pylint_django/checkers/django_installed.py +++ b/pylint_django/checkers/django_installed.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - from pylint.checkers import BaseChecker from pylint_django.__pkginfo__ import BASE_ID diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index 6000c580..345c7eef 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - import astroid from pylint.checkers import BaseChecker @@ -87,7 +85,6 @@ def open(self): django.setup() from django.apps import apps # noqa pylint: disable=import-outside-toplevel,unused-import - # flake8: noqa=F401, F403 except ImproperlyConfigured: # this means that Django wasn't able to configure itself using some defaults # provided (likely in a DJANGO_SETTINGS_MODULE environment variable) diff --git a/pylint_django/plugin.py b/pylint_django/plugin.py index 1db620a5..254bd0c9 100644 --- a/pylint_django/plugin.py +++ b/pylint_django/plugin.py @@ -1,7 +1,6 @@ """Common Django module.""" # we want to import the transforms to make sure they get added to the astroid manager, # however we don't actually access them directly, so we'll disable the warning -from pylint_django import transforms # noqa, pylint: disable=unused-import from pylint_django import compat from pylint_django.checkers import register_checkers diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index 635fca42..2c444e8f 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -54,7 +54,7 @@ def __init__(self, test_file): # if hasattr(test_file, 'option_file') and test_file.option_file is None: # pylint: disable=super-with-arguments # TODO Fix this and the CI (?) - super(PylintDjangoLintModuleTest, self).__init__(test_file) + super(PylintDjangoLintModuleTest, self).__init__(test_file) # noqa self._linter.load_plugin_modules(["pylint_django"]) self._linter.load_plugin_configuration() diff --git a/pylint_django/transforms/fields.py b/pylint_django/transforms/fields.py index b9746c5f..b820b12b 100644 --- a/pylint_django/transforms/fields.py +++ b/pylint_django/transforms/fields.py @@ -46,7 +46,7 @@ def is_model_or_form_field(cls): return is_model_field(cls) or is_form_field(cls) -def apply_type_shim(cls, _context=None): # noqa +def apply_type_shim(cls, _context=None): if cls.name in _STR_FIELDS: base_nodes = scoped_nodes.builtin_lookup("str") elif cls.name in _INT_FIELDS: @@ -93,7 +93,7 @@ def apply_type_shim(cls, _context=None): # noqa else: base_nodes = list(base_nodes[1]) - return iter([cls] + base_nodes) + return iter([cls, *base_nodes]) def _valid_base_node(node, context): diff --git a/pyproject.toml b/pyproject.toml index bb5a9007..41362e51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ Django = {version=">=2.2", optional = true} tox = "^4.5.1" pytest = "^7.3.1" pylint = ">=2.13" +ruff = ">=0.1.1" twine = "^4.0.2" wheel = "^0.40.0" pytest-cov = "^4.0.0" @@ -82,3 +83,18 @@ disable = [ ] ignore="tests" max-line-length = 120 + +[tool.ruff] +line-length = 120 +select = [ + "E", # pycodestyle + "F", # pyflakes + "W", # pycodestyle + "B", # bugbear + "I", # isort + "RUF", # ruff + "UP", # pyupgrade +] +ignore = [ + "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` +] diff --git a/tox.ini b/tox.ini index 3c191b12..17594857 100644 --- a/tox.ini +++ b/tox.ini @@ -26,7 +26,7 @@ commands = clean: find . -type d -name __pycache__ -delete clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ deps = - flake8: flake8 + ruff: ruff pylint: pylint<3 pylint: Django readme: twine @@ -50,11 +50,3 @@ allowlist_externals = py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash clean: find clean: rm - -[flake8] -max-line-length = 120 - - - -[FORMAT] -max-line-length=120 From a2b4459a4fa97ac6619776cb513d8120214a167c Mon Sep 17 00:00:00 2001 From: Matej Spiller Muys Date: Mon, 26 Feb 2024 21:34:04 +0100 Subject: [PATCH 36/75] Support for python 3.12 datetime (#427) Co-authored-by: Matej Spiller Muys --- CHANGELOG.rst | 1 + CONTRIBUTORS.md | 1 + pylint_django/compat.py | 4 ++++ pylint_django/transforms/fields.py | 24 ++++++++++++++++++------ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d893fef7..c4ee8a61 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,6 +12,7 @@ This version drops support for Python 3.6 Bugfixes ~~~~~~~~ +- Fixed compatibility issue with datetime classes and python `3.12` (`#425 `_) Version 2.5.3 (25 Mär 2022) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a35d2755..7bd39c12 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -20,3 +20,4 @@ - [naquiroz](https://github.com/naquiroz) - [john-sandall](https://github.com/john-sandall) - [dineshtrivedi](https://github.com/dineshtrivedi) +- [matejsp](https://github.com/matejsp) diff --git a/pylint_django/compat.py b/pylint_django/compat.py index d4dfdeef..9eeb128c 100644 --- a/pylint_django/compat.py +++ b/pylint_django/compat.py @@ -1,6 +1,7 @@ # flake8: noqa # pylint: skip-file # no sane linter can figure out the hackiness in this compatibility layer... +import sys try: from astroid.nodes import AssignName, Attribute, ClassDef, FunctionDef, ImportFrom @@ -33,3 +34,6 @@ LOAD_CONFIGURATION_SUPPORTED = tuple(pylint.__version__.split(".")) >= ("2", "3") except AttributeError: LOAD_CONFIGURATION_SUPPORTED = pylint.__pkginfo__.numversion >= (2, 3) + +# datetime module is compiled and moved to _pydatetime +COMPILED_DATETIME_CLASSES = sys.version_info >= (3, 12) diff --git a/pylint_django/transforms/fields.py b/pylint_django/transforms/fields.py index b820b12b..70b96f12 100644 --- a/pylint_django/transforms/fields.py +++ b/pylint_django/transforms/fields.py @@ -1,7 +1,7 @@ from astroid import MANAGER, AstroidImportError, inference_tip, nodes from astroid.nodes import scoped_nodes -from pylint_django import utils +from pylint_django import compat, utils _STR_FIELDS = ( "CharField", @@ -46,7 +46,7 @@ def is_model_or_form_field(cls): return is_model_field(cls) or is_form_field(cls) -def apply_type_shim(cls, _context=None): +def apply_type_shim(cls, _context=None): # pylint: disable=too-many-statements if cls.name in _STR_FIELDS: base_nodes = scoped_nodes.builtin_lookup("str") elif cls.name in _INT_FIELDS: @@ -61,13 +61,25 @@ def apply_type_shim(cls, _context=None): except AstroidImportError: base_nodes = MANAGER.ast_from_module_name("_pydecimal").lookup("Decimal") elif cls.name in ("SplitDateTimeField", "DateTimeField"): - base_nodes = MANAGER.ast_from_module_name("datetime").lookup("datetime") + if compat.COMPILED_DATETIME_CLASSES: + base_nodes = MANAGER.ast_from_module_name("_pydatetime").lookup("datetime") + else: + base_nodes = MANAGER.ast_from_module_name("datetime").lookup("datetime") elif cls.name == "TimeField": - base_nodes = MANAGER.ast_from_module_name("datetime").lookup("time") + if compat.COMPILED_DATETIME_CLASSES: + base_nodes = MANAGER.ast_from_module_name("_pydatetime").lookup("time") + else: + base_nodes = MANAGER.ast_from_module_name("datetime").lookup("time") elif cls.name == "DateField": - base_nodes = MANAGER.ast_from_module_name("datetime").lookup("date") + if compat.COMPILED_DATETIME_CLASSES: + base_nodes = MANAGER.ast_from_module_name("_pydatetime").lookup("date") + else: + base_nodes = MANAGER.ast_from_module_name("datetime").lookup("date") elif cls.name == "DurationField": - base_nodes = MANAGER.ast_from_module_name("datetime").lookup("timedelta") + if compat.COMPILED_DATETIME_CLASSES: + base_nodes = MANAGER.ast_from_module_name("_pydatetime").lookup("timedelta") + else: + base_nodes = MANAGER.ast_from_module_name("datetime").lookup("timedelta") elif cls.name == "UUIDField": base_nodes = MANAGER.ast_from_module_name("uuid").lookup("UUID") elif cls.name == "ManyToManyField": From 5377d62d03add3fc9fcefef2da3b24e082c6e9c0 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Fri, 19 Jul 2024 12:21:39 +0300 Subject: [PATCH 37/75] Fixing up CI (attempting to) in order to get local env working ; flake8 needs to be disabled for now as it will not install while pylint-django supports 3.7 wihch it will until PRs are closed and things are cleaned up --- Makefile | 8 ++++++++ pyproject.toml | 1 - tox.ini | 1 - 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..c5238d5c --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ + +install: + pip install poetry + poetry install + + +make test: + tox \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 41362e51..f11a310f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,6 @@ tox = "^4.5.1" pytest = "^7.3.1" pylint = ">=2.13" ruff = ">=0.1.1" -twine = "^4.0.2" wheel = "^0.40.0" pytest-cov = "^4.0.0" django-tables2 = "^2.6.0" diff --git a/tox.ini b/tox.ini index 17594857..0e3d813e 100644 --- a/tox.ini +++ b/tox.ini @@ -18,7 +18,6 @@ requires = [testenv] commands = django_not_installed: bash pylint_django/tests/test_django_not_installed.sh - flake8: flake8 pylint_django/ pylint: pylint pylint_django readme: bash -c "poetry build && twine check dist/*" py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash scripts/test.sh --cov=pylint_django From d835a21d2896fa792790cf901f6726f0d1937dbe Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Fri, 19 Jul 2024 12:40:12 +0300 Subject: [PATCH 38/75] Added newer versions of Python and Django to test matrix --- tox.ini | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tox.ini b/tox.ini index 0e3d813e..b2c1ef3c 100644 --- a/tox.ini +++ b/tox.ini @@ -8,7 +8,8 @@ envlist = pylint readme py{37,38,39}-django{22,30,31,32} - py{38,39,310,311}-django{40,41,42} + py{38,39,310,311,312}-django{40,41,42} + py{310,311,312}-django{50} requires = pip >=21.0.1 @@ -20,7 +21,7 @@ commands = django_not_installed: bash pylint_django/tests/test_django_not_installed.sh pylint: pylint pylint_django readme: bash -c "poetry build && twine check dist/*" - py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash scripts/test.sh --cov=pylint_django + py{37,38,39,310,311,312}-django{22,30,31,32,40,41,42,50}: bash scripts/test.sh --cov=pylint_django clean: find . -type f -name '*.pyc' -delete clean: find . -type d -name __pycache__ -delete clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ @@ -37,6 +38,7 @@ deps = django40: Django>=4.0,<4.1 django41: Django>=4.1,<4.2 django42: Django>=4.2,<4.3 + django50: Django>=5.0,<5.1 django-main: Django django-main: git+https://github.com/pycqa/astroid@main django-main: git+https://github.com/pycqa/pylint@main @@ -46,6 +48,6 @@ setenv = allowlist_externals = django_not_installed: bash readme: bash - py{37,38,39,310,311}-django{22,30,31,32,40,41,42}: bash + py{37,38,39,310,311,312}-django{22,30,31,32,40,41,42,50}: bash clean: find clean: rm From 9940b8a290d5c60f0ae0b41bd3942e344fb2ecff Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 10:25:03 +0300 Subject: [PATCH 39/75] Dropping Python3.7 support, as it is very EoL and CI tasks were taking 6 hours --- CHANGELOG.rst | 9 +++++++++ pyproject.toml | 2 +- tox.ini | 6 +++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c4ee8a61..2ed8a863 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog ========= +Version 2.7.0 +------------- + +NOTICE +~~~~~~ + +This version drops support for Python 3.7 - latest Pylint no longer supports 3.7, and CI tasks were taking hours under 3.7 + + Version 2.6.0 (14 May 2023) --------------------------- diff --git a/pyproject.toml b/pyproject.toml index f11a310f..1f684ff0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pylint-django" -version = "2.5.5" +version = "2.7.0" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/PyCQA/pylint-django" diff --git a/tox.ini b/tox.ini index b2c1ef3c..ca10ad05 100644 --- a/tox.ini +++ b/tox.ini @@ -7,9 +7,9 @@ envlist = flake8 pylint readme - py{37,38,39}-django{22,30,31,32} + py{38,39}-django{22,30,31,32} py{38,39,310,311,312}-django{40,41,42} - py{310,311,312}-django{50} + py{310,311,312}-django{50,-main} requires = pip >=21.0.1 @@ -48,6 +48,6 @@ setenv = allowlist_externals = django_not_installed: bash readme: bash - py{37,38,39,310,311,312}-django{22,30,31,32,40,41,42,50}: bash + django{22,30,31,32,40,41,42,50,-main}: bash clean: find clean: rm From 87100eaab66bca08fc5404c07d74ac453986d1a5 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 10:27:41 +0300 Subject: [PATCH 40/75] Dropping Python3.7 support, as it is very EoL and CI tasks were taking 6 hours --- .github/workflows/build.yml | 46 ++++++++++++++++++++++++++----------- scripts/test.sh | 2 +- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9b559db..fdbeb3cd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: export PYTHON=${{ matrix.python-version }} tox - test: + test_latest: name: test latest / Django@${{ matrix.django-version }} / Python@${{ matrix.python-version }} @@ -39,8 +39,8 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] - django-version: [-main, "4.0"] + python-version: ["3.10", "3.11", "3.12"] + django-version: ["5.0", "-main"] steps: - uses: actions/checkout@v3 @@ -67,6 +67,34 @@ jobs: pip install coveralls coveralls --service=github + test: + name: + test latest / Django@${{ matrix.django-version }} / Python@${{ + matrix.python-version }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + django-version: ["4.0", "4.1", "4.2"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Execute tests + run: | + pip install -U pip poetry tox + poetry install + + export DJANGO=${{ matrix.django-version }} + export PYTHON=${{ matrix.python-version }} + export TOXENV=$(echo py${{ matrix.python-version }}-django${{ matrix.django-version }} | tr -d .) + tox + test_deprecated: # testing older versions of python+django name: test old stuff / Django@${{ matrix.django-version }} / Python@${{ @@ -75,7 +103,7 @@ jobs: strategy: # TODO: use a YAML anchor - not supported in GitHub actions "yet" fail-fast: false matrix: - python-version: [3.7, 3.8, 3.9] + python-version: [3.8, 3.9] django-version: [3.2, 3.1, "3.0", "2.2"] steps: @@ -95,19 +123,11 @@ jobs: export TOXENV=$(echo py${{ matrix.python-version }}-django${{ matrix.django-version }} | tr -d .) tox - - name: Coveralls - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - pip install coveralls - coveralls --service=github - build_and_package_sanity: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.11"] + python-version: ["3.12"] steps: - uses: actions/checkout@v3 diff --git a/scripts/test.sh b/scripts/test.sh index fe278465..6061b9dc 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -10,4 +10,4 @@ pip install pytest pytest-cov \ "django-tastypie>=0.14.6" \ "djangorestframework>=3.13.1" -python pylint_django/tests/test_func.py -v "$@" +python -m pytest pylint_django/tests/test_func.py -v "$@" From 5f24b5f16c3ed86b51b09f4ace7134abd866dfa9 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 10:32:23 +0300 Subject: [PATCH 41/75] Using latest GitHub action versions --- .github/workflows/build.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fdbeb3cd..333a3346 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,9 +16,9 @@ jobs: toxenv: [django_not_installed, ruff, pylint, readme] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} @@ -43,9 +43,9 @@ jobs: django-version: ["5.0", "-main"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} @@ -67,9 +67,9 @@ jobs: pip install coveralls coveralls --service=github - test: + test_maintained: name: - test latest / Django@${{ matrix.django-version }} / Python@${{ + test maintained / Django@${{ matrix.django-version }} / Python@${{ matrix.python-version }} runs-on: ubuntu-latest strategy: @@ -79,9 +79,9 @@ jobs: django-version: ["4.0", "4.1", "4.2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} @@ -107,9 +107,9 @@ jobs: django-version: [3.2, 3.1, "3.0", "2.2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} @@ -130,9 +130,9 @@ jobs: python-version: ["3.12"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} From 1bd739a69e5f0c934fb5fb9a4d9744da39df8156 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 10:53:48 +0300 Subject: [PATCH 42/75] Added tests for psycopg3 support (releated to #421) --- CHANGELOG.rst | 2 +- .../external_psycopg3_noerror_postgres_fields.py | 16 ++++++++++++++++ .../external_psycopg3_noerror_postgres_fields.rc | 2 ++ pylint_django/tests/settings.py | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.py create mode 100644 pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.rc diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2ed8a863..bb486bfe 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,7 +7,7 @@ Version 2.7.0 NOTICE ~~~~~~ -This version drops support for Python 3.7 - latest Pylint no longer supports 3.7, and CI tasks were taking hours under 3.7 +This version drops support for Python 3.7 - latest Pylint no longer supports 3.7, and CI tasks were taking hours under 3.7. `Python 3.7 `_ received its last security update more than a year ago (from the date of this release). Version 2.6.0 (14 May 2023) diff --git a/pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.py b/pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.py new file mode 100644 index 00000000..5febb28e --- /dev/null +++ b/pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.py @@ -0,0 +1,16 @@ +""" +Checks that Pylint does not complain Postgres model fields. +""" +# pylint: disable=C0111,W5101 +from __future__ import print_function + +from django.contrib.postgres import fields +from django.db import models + + +class PostgresFieldsModel(models.Model): + period = fields.DateRangeField(null=False, blank=False) + + def rangefield_tests(self): + print(self.period.lower) + print(self.period.upper) diff --git a/pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.rc b/pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.rc new file mode 100644 index 00000000..148979b4 --- /dev/null +++ b/pylint_django/tests/input/external_psycopg3_noerror_postgres_fields.rc @@ -0,0 +1,2 @@ +[testoptions] +requires = psycopg3 diff --git a/pylint_django/tests/settings.py b/pylint_django/tests/settings.py index 075f4207..394c910b 100644 --- a/pylint_django/tests/settings.py +++ b/pylint_django/tests/settings.py @@ -1,4 +1,5 @@ SECRET_KEY = "fake-key" +USE_TZ = False INSTALLED_APPS = [ "django.contrib.auth", From 613bcc2008846c6c15e716f7d1ddecfb3fe63ee0 Mon Sep 17 00:00:00 2001 From: Jeremy Satterfield Date: Wed, 29 Nov 2023 15:23:11 -0600 Subject: [PATCH 43/75] use django aliases for ranges to support psycopg 2 and 3 --- pylint_django/transforms/fields.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pylint_django/transforms/fields.py b/pylint_django/transforms/fields.py index 70b96f12..f46e4131 100644 --- a/pylint_django/transforms/fields.py +++ b/pylint_django/transforms/fields.py @@ -91,7 +91,10 @@ def apply_type_shim(cls, _context=None): # pylint: disable=too-many-statements elif cls.name in ("HStoreField", "JSONField"): base_nodes = scoped_nodes.builtin_lookup("dict") elif cls.name in _RANGE_FIELDS: - base_nodes = MANAGER.ast_from_module_name("psycopg2._range").lookup("Range") + try: + base_nodes = MANAGER.ast_from_module_name("django.db.backends.postgresql.psycopg_any").lookup("Range") + except AstroidImportError: + base_nodes = MANAGER.ast_from_module_name("psycopg2._range").lookup("Range") else: return iter([cls]) From 04f1da91bfc019496e623bcd4bdab4de3ff7a281 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 11:13:16 +0300 Subject: [PATCH 44/75] Updating changelog to include more fixes for next version and tidy up previous mistake ; correcting trove classifiers to reflect currently supported versions ; bumping version definitions and using latest for some dev dependencies --- CHANGELOG.rst | 10 ++++++++-- pyproject.toml | 18 +++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bb486bfe..7509f920 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,7 +1,7 @@ Changelog ========= -Version 2.7.0 +Version 2.6.0 ------------- NOTICE @@ -9,8 +9,14 @@ NOTICE This version drops support for Python 3.7 - latest Pylint no longer supports 3.7, and CI tasks were taking hours under 3.7. `Python 3.7 `_ received its last security update more than a year ago (from the date of this release). +Bugfixes +~~~~~~~~ + +- Added Django aliases for ranges to support psycopg 2 and 3 (`#421 `_) +- Support for PYthon 3.12 datetime (`#427 `_) + -Version 2.6.0 (14 May 2023) +Version 2.5.5 (14 May 2023) --------------------------- NOTICE diff --git a/pyproject.toml b/pyproject.toml index 1f684ff0..586e1ccd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,11 +12,11 @@ classifiers=[ "Operating System :: Unix", "Topic :: Software Development :: Quality Assurance", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Framework :: Django :: 2.2", "Framework :: Django :: 3", "Framework :: Django :: 3.0", @@ -26,6 +26,7 @@ classifiers=[ "Framework :: Django :: 4.0", "Framework :: Django :: 4.1", "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", ] keywords=["pylint", "django", "plugin"] @@ -40,21 +41,20 @@ include = [ exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] [tool.poetry.dependencies] -python = ">=3.7,<4.0" +python = ">=3.8,<4.0" pylint-plugin-utils = ">=0.8" pylint = ">=2.0,<4" Django = {version=">=2.2", optional = true} [tool.poetry.group.dev.dependencies] -tox = "^4.5.1" +tox = "^4" pytest = "^7.3.1" -pylint = ">=2.13" ruff = ">=0.1.1" -wheel = "^0.40.0" -pytest-cov = "^4.0.0" -django-tables2 = "^2.6.0" -factory-boy = "^3.3.0" -django-tastypie = "^0.14.6" +wheel = "^0.40" +pytest-cov = "^4" +django-tables2 = "^2.6" +factory-boy = "^3.3" +django-tastypie = "^0.14" [tool.poetry.extras] with_django = ["Django"] From b0b6e2feab5c3e926e6e25f626aa400105c7e161 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 11:31:17 +0300 Subject: [PATCH 45/75] [#431] Fixing so that the LICENSE and other files are copied into the correct places ; LICENSE is required to be installed as it is GPLv2, this change will put it inside the package directory inside site-packages instead, while the other files will just be left out of the installation --- LICENSE | 340 +----------------------------------------- pylint_django/LICENSE | 339 +++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 26 ++-- 3 files changed, 351 insertions(+), 354 deletions(-) mode change 100644 => 120000 LICENSE create mode 100644 pylint_django/LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9c19d076..00000000 --- a/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - Pylint plugin for improving code analysis for when using Django - Copyright (C) 2013 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/LICENSE b/LICENSE new file mode 120000 index 00000000..adc0c0d0 --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +pylint_django/LICENSE \ No newline at end of file diff --git a/pylint_django/LICENSE b/pylint_django/LICENSE new file mode 100644 index 00000000..9c19d076 --- /dev/null +++ b/pylint_django/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + Pylint plugin for improving code analysis for when using Django + Copyright (C) 2013 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/pyproject.toml b/pyproject.toml index 586e1ccd..50cdd268 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/PyCQA/pylint-django" authors = ["Carl Crowder "] -classifiers=[ +classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", @@ -29,22 +29,18 @@ classifiers=[ "Framework :: Django :: 5.0", "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", ] -keywords=["pylint", "django", "plugin"] +keywords = ["pylint", "django", "plugin"] packages = [ - { include = "pylint_django/"} -] -include = [ - "LICENSE", - "*.rst", - "*.md" + { include = "pylint_django/" } ] +include = ["pylint_django/LICENSE"] exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] [tool.poetry.dependencies] python = ">=3.8,<4.0" pylint-plugin-utils = ">=0.8" pylint = ">=2.0,<4" -Django = {version=">=2.2", optional = true} +Django = { version = ">=2.2", optional = true } [tool.poetry.group.dev.dependencies] tox = "^4" @@ -80,17 +76,17 @@ disable = [ "too-few-public-methods", "fixme", ] -ignore="tests" +ignore = "tests" max-line-length = 120 [tool.ruff] line-length = 120 select = [ - "E", # pycodestyle - "F", # pyflakes - "W", # pycodestyle - "B", # bugbear - "I", # isort + "E", # pycodestyle + "F", # pyflakes + "W", # pycodestyle + "B", # bugbear + "I", # isort "RUF", # ruff "UP", # pyupgrade ] From 3527105fd7a5353b9108228f1dac06cf5cd6441c Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 11:43:48 +0300 Subject: [PATCH 46/75] Updating pre-commit versions --- .pre-commit-config.yaml | 11 +++-------- CHANGELOG.rst | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e5de120..180bcc96 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -11,21 +11,16 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.1.4" + rev: "v0.5.3" hooks: - id: ruff args: ["--fix"] exclude: "tests/input/" - repo: https://github.com/psf/black - rev: 23.10.1 + rev: 24.4.2 hooks: - id: black args: [--safe, --line-length=120] - - repo: https://github.com/pre-commit/mirrors-prettier - rev: v3.0.3 - hooks: - - id: prettier - args: [--prose-wrap=always, --print-width=88] - repo: local hooks: - id: pylint diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 7509f920..e7b29b84 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,7 +14,7 @@ Bugfixes - Added Django aliases for ranges to support psycopg 2 and 3 (`#421 `_) - Support for PYthon 3.12 datetime (`#427 `_) - +- Fixed location of installed LICENSE file (`#431 `_) Version 2.5.5 (14 May 2023) --------------------------- From 5fdfa2f41f16f090a56a28c94f2f507c5252cad4 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 11:45:59 +0300 Subject: [PATCH 47/75] [#430] Fixing reference to linter config object (which moved between pylint versions I believe) --- pylint_django/checkers/foreign_key_strings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index 345c7eef..f232f5d9 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -95,7 +95,7 @@ def open(self): # TODO: remove this no-member ignore : this is to avoid the missing `config` for pylint 3+, # and can be removed once pylint 2 # pylint: disable=no-member - django_settings_module = self.config.django_settings_module + django_settings_module = self.linter.config.django_settings_module if django_settings_module is None: # we will warn the user that they haven't actually configured Django themselves @@ -117,7 +117,7 @@ def open(self): # at least here it is a fatal error so we can just raise this immediately self.add_message( "django-settings-module-not-found", - args=self.config.django_settings_module, + args=self.linter.config.django_settings_module, ) # however we'll trundle on with basic settings from django.conf import settings # pylint: disable=import-outside-toplevel From e982c060aca7d021fb5c53beb79568ab918c2ec8 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 11:47:27 +0300 Subject: [PATCH 48/75] Latest pre-commit formatting (ruff instead of black) has different opinions about newlines after comments --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e7b29b84..05be59a9 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,7 @@ Bugfixes - Added Django aliases for ranges to support psycopg 2 and 3 (`#421 `_) - Support for PYthon 3.12 datetime (`#427 `_) - Fixed location of installed LICENSE file (`#431 `_) +- Fixed ForeignKeyStringChecker referencing linter config incorrectly (`#430 `_) Version 2.5.5 (14 May 2023) --------------------------- From 59e413dd39cc21757632bc90b5174a433380bf74 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 12:03:31 +0300 Subject: [PATCH 49/75] Making some friendlier project URLs for the PyPI page Ignoring test files from black formatting, because the python file line numbers and RC file line numbers must match - if black messes with the python file, it breaks the tests because the RC file no longer matches --- .pre-commit-config.yaml | 2 +- pyproject.toml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 180bcc96..ee11c752 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: rev: 24.4.2 hooks: - id: black - args: [--safe, --line-length=120] + args: [--safe, --line-length=120, "--exclude=pylint_django/tests/input/"] - repo: local hooks: - id: pylint diff --git a/pyproject.toml b/pyproject.toml index 50cdd268..b6ffff3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,14 @@ packages = [ include = ["pylint_django/LICENSE"] exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] + +[project.urls] +"Repository" = "https://github.com/pylint-dev/pylint-djangp" +"Bug Tracker" = "https://github.com/pylint-dev/pylint-djangp/issues" +"Changelog" = "https://github.com/pylint-dev/pylint-django/blob/master/CHANGELOG.rst" +"Contributors" = "https://github.com/pylint-dev/pylint-django/blob/master/CONTRIBUTORS.md" + + [tool.poetry.dependencies] python = ">=3.8,<4.0" pylint-plugin-utils = ">=0.8" From df3522237982402c515262760440191361872554 Mon Sep 17 00:00:00 2001 From: Carl Crowder Date: Sat, 20 Jul 2024 12:22:46 +0300 Subject: [PATCH 50/75] Running latest black formatter on all code, however it must not be run on the test input files - the .rc files reference line numbers in the .py files, if the .py files change then the tests all break.. --- .pre-commit-config.yaml | 4 +++- Makefile | 2 +- pylint_django/__init__.py | 1 - pylint_django/__pkginfo__.py | 1 + pylint_django/augmentations/__init__.py | 1 + pylint_django/checkers/__init__.py | 1 + pylint_django/checkers/forms.py | 1 + pylint_django/checkers/models.py | 1 + pylint_django/plugin.py | 1 + pylint_django/transforms/__init__.py | 1 + pylint_django/utils.py | 1 + pyproject.toml | 7 ------- 12 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ee11c752..05053c9e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,9 @@ repos: rev: 24.4.2 hooks: - id: black - args: [--safe, --line-length=120, "--exclude=pylint_django/tests/input/"] + # see https://stackoverflow.com/a/61046953 + exclude: ^pylint_django/tests/input.*$ + args: [--safe, --line-length=120] - repo: local hooks: - id: pylint diff --git a/Makefile b/Makefile index c5238d5c..fab465f6 100644 --- a/Makefile +++ b/Makefile @@ -5,4 +5,4 @@ install: make test: - tox \ No newline at end of file + tox diff --git a/pylint_django/__init__.py b/pylint_django/__init__.py index c3028de4..27575371 100644 --- a/pylint_django/__init__.py +++ b/pylint_django/__init__.py @@ -1,6 +1,5 @@ """pylint_django module.""" - from pylint_django import plugin register = plugin.register # pylint: disable=invalid-name diff --git a/pylint_django/__pkginfo__.py b/pylint_django/__pkginfo__.py index a6d71329..ebcf236c 100644 --- a/pylint_django/__pkginfo__.py +++ b/pylint_django/__pkginfo__.py @@ -1,2 +1,3 @@ """pkginfo.""" + BASE_ID = 51 diff --git a/pylint_django/augmentations/__init__.py b/pylint_django/augmentations/__init__.py index 89f454f4..fcb19b35 100644 --- a/pylint_django/augmentations/__init__.py +++ b/pylint_django/augmentations/__init__.py @@ -1,4 +1,5 @@ """Augmentations.""" + # pylint: disable=invalid-name import functools import itertools diff --git a/pylint_django/checkers/__init__.py b/pylint_django/checkers/__init__.py index 1a14b746..c1e12fa9 100644 --- a/pylint_django/checkers/__init__.py +++ b/pylint_django/checkers/__init__.py @@ -1,4 +1,5 @@ """Checkers.""" + from pylint_django.checkers.auth_user import AuthUserChecker from pylint_django.checkers.django_installed import DjangoInstalledChecker from pylint_django.checkers.foreign_key_strings import ForeignKeyStringsChecker diff --git a/pylint_django/checkers/forms.py b/pylint_django/checkers/forms.py index f668684c..dd490de0 100644 --- a/pylint_django/checkers/forms.py +++ b/pylint_django/checkers/forms.py @@ -1,4 +1,5 @@ """Models.""" + from astroid.nodes import Assign, AssignName, ClassDef from pylint.checkers import BaseChecker diff --git a/pylint_django/checkers/models.py b/pylint_django/checkers/models.py index 5bc25c67..ce953506 100644 --- a/pylint_django/checkers/models.py +++ b/pylint_django/checkers/models.py @@ -1,4 +1,5 @@ """Models.""" + from astroid import Const from astroid.nodes import Assign, AssignName, ClassDef, FunctionDef from pylint.checkers import BaseChecker diff --git a/pylint_django/plugin.py b/pylint_django/plugin.py index 254bd0c9..dd4b68e2 100644 --- a/pylint_django/plugin.py +++ b/pylint_django/plugin.py @@ -1,4 +1,5 @@ """Common Django module.""" + # we want to import the transforms to make sure they get added to the astroid manager, # however we don't actually access them directly, so we'll disable the warning from pylint_django import compat diff --git a/pylint_django/transforms/__init__.py b/pylint_django/transforms/__init__.py index 11c56715..e99a6fe2 100644 --- a/pylint_django/transforms/__init__.py +++ b/pylint_django/transforms/__init__.py @@ -8,6 +8,7 @@ For example, the ForeignKeyStringsChecker loads the foreignkey.py transforms itself as it may be disabled independently of the rest of pylint-django """ + import os import re diff --git a/pylint_django/utils.py b/pylint_django/utils.py index 205e3b3f..169e0879 100644 --- a/pylint_django/utils.py +++ b/pylint_django/utils.py @@ -1,4 +1,5 @@ """Utils.""" + import sys import astroid diff --git a/pyproject.toml b/pyproject.toml index b6ffff3d..c3f2c16e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,13 +37,6 @@ include = ["pylint_django/LICENSE"] exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] -[project.urls] -"Repository" = "https://github.com/pylint-dev/pylint-djangp" -"Bug Tracker" = "https://github.com/pylint-dev/pylint-djangp/issues" -"Changelog" = "https://github.com/pylint-dev/pylint-django/blob/master/CHANGELOG.rst" -"Contributors" = "https://github.com/pylint-dev/pylint-django/blob/master/CONTRIBUTORS.md" - - [tool.poetry.dependencies] python = ">=3.8,<4.0" pylint-plugin-utils = ">=0.8" From c091febb866560150b96fea93a81f644da1ed361 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 10:51:14 +0200 Subject: [PATCH 51/75] [pre-commit.ci] pre-commit autoupdate (#419) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.6.0 → v5.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.6.0...v5.0.0) - [github.com/astral-sh/ruff-pre-commit: v0.5.3 → v0.6.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.3...v0.6.9) - [github.com/psf/black: 24.4.2 → 24.10.0](https://github.com/psf/black/compare/24.4.2...24.10.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 05053c9e..5db5ca40 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -11,13 +11,13 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.5.3" + rev: "v0.6.9" hooks: - id: ruff args: ["--fix"] exclude: "tests/input/" - repo: https://github.com/psf/black - rev: 24.4.2 + rev: 24.10.0 hooks: - id: black # see https://stackoverflow.com/a/61046953 From 23722cdb2535a3e1c859fe236b11a69f38e34b46 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 8 Oct 2024 23:02:53 +0200 Subject: [PATCH 52/75] Add a formatter for the pyproject.toml (#435) --- .pre-commit-config.yaml | 6 +++ pyproject.toml | 108 ++++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 53 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5db5ca40..3b6c601c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,6 +23,12 @@ repos: # see https://stackoverflow.com/a/61046953 exclude: ^pylint_django/tests/input.*$ args: [--safe, --line-length=120] + - repo: https://github.com/tox-dev/pyproject-fmt + rev: "2.2.4" + hooks: + - id: pyproject-fmt + # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version + additional_dependencies: ["tox>=4.9"] - repo: local hooks: - id: pylint diff --git a/pyproject.toml b/pyproject.toml index c3f2c16e..84171841 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,41 +1,45 @@ +[build-system] +build-backend = "poetry.core.masonry.api" + +requires = [ "poetry-core>=1" ] + [tool.poetry] name = "pylint-django" version = "2.7.0" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/PyCQA/pylint-django" -authors = ["Carl Crowder "] +authors = [ "Carl Crowder " ] classifiers = [ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", - "Intended Audience :: Developers", - "Operating System :: Unix", - "Topic :: Software Development :: Quality Assurance", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Framework :: Django :: 2.2", - "Framework :: Django :: 3", - "Framework :: Django :: 3.0", - "Framework :: Django :: 3.1", - "Framework :: Django :: 3.2", - "Framework :: Django :: 4", - "Framework :: Django :: 4.0", - "Framework :: Django :: 4.1", - "Framework :: Django :: 4.2", - "Framework :: Django :: 5.0", - "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Intended Audience :: Developers", + "Operating System :: Unix", + "Topic :: Software Development :: Quality Assurance", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Framework :: Django :: 2.2", + "Framework :: Django :: 3", + "Framework :: Django :: 3.0", + "Framework :: Django :: 3.1", + "Framework :: Django :: 3.2", + "Framework :: Django :: 4", + "Framework :: Django :: 4.0", + "Framework :: Django :: 4.1", + "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", + "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", ] -keywords = ["pylint", "django", "plugin"] +keywords = [ "pylint", "django", "plugin" ] packages = [ - { include = "pylint_django/" } + { include = "pylint_django/" }, ] -include = ["pylint_django/LICENSE"] -exclude = ["**/tests/**", "**/testutils.py", "**/tests.py"] - +include = [ "pylint_django/LICENSE" ] +exclude = [ "**/tests/**", "**/testutils.py", "**/tests.py" ] [tool.poetry.dependencies] python = ">=3.8,<4.0" @@ -44,7 +48,7 @@ pylint = ">=2.0,<4" Django = { version = ">=2.2", optional = true } [tool.poetry.group.dev.dependencies] -tox = "^4" +tox = ">=4.9" pytest = "^7.3.1" ruff = ">=0.1.1" wheel = "^0.40" @@ -54,15 +58,26 @@ factory-boy = "^3.3" django-tastypie = "^0.14" [tool.poetry.extras] -with_django = ["Django"] - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +with_django = [ "Django" ] [tool.black] line-length = 120 +[tool.ruff] +line-length = 120 +select = [ + "E", # pycodestyle + "F", # pyflakes + "W", # pycodestyle + "B", # bugbear + "I", # isort + "RUF", # ruff + "UP", # pyupgrade +] +ignore = [ + "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` +] + [tool.isort] multi_line_output = 3 include_trailing_comma = true @@ -72,25 +87,12 @@ line_length = 120 [tool.pylint.main] disable = [ - "missing-docstring", - "too-many-branches", "too-many-return-statements", "too-many-ancestors", - "too-few-public-methods", - "fixme", + "missing-docstring", + "too-many-branches", + "too-many-return-statements", + "too-many-ancestors", + "too-few-public-methods", + "fixme", ] ignore = "tests" max-line-length = 120 - -[tool.ruff] -line-length = 120 -select = [ - "E", # pycodestyle - "F", # pyflakes - "W", # pycodestyle - "B", # bugbear - "I", # isort - "RUF", # ruff - "UP", # pyupgrade -] -ignore = [ - "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` -] From ce86aaa0f48495f04b69dd687fc7ab8eef21c78e Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 8 Oct 2024 23:12:18 +0200 Subject: [PATCH 53/75] [doc] Avoid a redirection in the links (PyCQA => pylint-dev) (#436) --- .github/ISSUE_TEMPLATE.md | 2 +- CHANGELOG.rst | 160 +++++++++--------- README.rst | 10 +- ...ernal_django_tables2_noerror_meta_class.py | 2 +- ...al_model_utils_noerror_override_manager.py | 2 +- ...c_noerror_duplicate_except_doesnotexist.py | 2 +- .../tests/input/func_noerror_foreignkeys.py | 2 +- .../input/func_noerror_generic_foreign_key.py | 2 +- .../tests/input/func_noerror_model_objects.py | 2 +- .../func_noerror_protected_meta_access.py | 2 +- .../input/func_noerror_test_wsgi_request.py | 2 +- .../func_noerror_unicode_py2_compatible.py | 2 +- .../tests/input/func_noerror_wsgi.py | 2 +- pyproject.toml | 2 +- 14 files changed, 97 insertions(+), 97 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 94b4a4cb..212eb2c2 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,5 +1,5 @@ **WARNING:** Please do not report issues about missing Django, see -[README](https://github.com/PyCQA/pylint-django#installation)! +[README](https://github.com/pylint-dev/pylint-django#installation)! **TODO:** make sure to post the output of `pip freeze` diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 05be59a9..2516b570 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -37,7 +37,7 @@ Version 2.5.3 (25 Mär 2022) Bugfixes ~~~~~~~~ -- Fixed compatibility issue between pylint `2.12` and `2.13` to construct `ScopeConsumer` tuples correctly depending on version (`#358 `_) +- Fixed compatibility issue between pylint `2.12` and `2.13` to construct `ScopeConsumer` tuples correctly depending on version (`#358 `_) Other ~~~~~ @@ -50,7 +50,7 @@ Version 2.5.2 (18 Feb 2022) Bugfixes ~~~~~~~~ -- Fixed crash with assigning a class to a variable, and referencing the variable when subclassing (`#349 `_) +- Fixed crash with assigning a class to a variable, and referencing the variable when subclassing (`#349 `_) Other ~~~~~ @@ -64,7 +64,7 @@ Version 2.5.1 (16 Feb 2022) Bugfixes ~~~~~~~~ -- Fixed pickling for `augment_visit` (`#276 `_) +- Fixed pickling for `augment_visit` (`#276 `_) Version 2.5.0 (02 Jan 2022) --------------------------- @@ -72,23 +72,23 @@ Version 2.5.0 (02 Jan 2022) Bugfixes ~~~~~~~~ -- Fixed compatibility with astroid 2.9.1 (`#343 `_) +- Fixed compatibility with astroid 2.9.1 (`#343 `_) New ~~~ -- Removed false positive error of missing member in TextChoices tuples `#298 `_ (see pulls `#330 `_ and `#345 `_) -- Moved from Travis CI to GitHub Actions (`#366 `_ and `#340 `_) +- Removed false positive error of missing member in TextChoices tuples `#298 `_ (see pulls `#330 `_ and `#345 `_) +- Moved from Travis CI to GitHub Actions (`#366 `_ and `#340 `_) - Added pre-commit configuration and began enforcing black/isort code formatting -- Multiple test fixes (including `#338 `_) - newer versions of pylint expect a different format for the expected messages txt files. -- Bumped dependency for pylint-django-utils to get `multi-threaded pylint support `_ +- Multiple test fixes (including `#338 `_) - newer versions of pylint expect a different format for the expected messages txt files. +- Bumped dependency for pylint-django-utils to get `multi-threaded pylint support `_ Version 2.4.4 (26 Apr 2021) --------------------------- - Fix compatibility issues with pylint >= 2.8. Fixes - `#322 `_ and - `#323 `_ + `#322 `_ and + `#323 `_ Version 2.4.3 (09 Apr 2021) @@ -98,14 +98,14 @@ Version 2.4.3 (09 Apr 2021) - Teach pylint-django about all HTTP methods from the View class, not only ``get`` and ``post`` (Nicolás Quiroz) - Typo fixes for - `#314 `_ (John Sandall) + `#314 `_ (John Sandall) - Ignore ``unused-argument`` for ``*args``, ``**kwards`` in view method signatures Version 2.4.2 (08 Jan 2021) --------------------------- -- Moved `Faker` dependencies to test-only `#304 `_ +- Moved `Faker` dependencies to test-only `#304 `_ Version 2.4.1 (07 Jan 2021) @@ -118,14 +118,14 @@ Version 2.4.0 (06 Jan 2021) --------------------------- - Allowed configuration of the Django settings module to be used via a - commandline argument `#286 `_ + commandline argument `#286 `_ - If Django settings are not specified via a commandline argument or environment variable, an error is issued but defaults are loaded from Django, removing the - fatal error behaviour. `#277 `_ - and `#243 `_ + fatal error behaviour. `#277 `_ + and `#243 `_ - Fixed tests to work with pylint>2.6 - Fixed ``AttributeError: 'Subscript' object has no attribute 'name'`` error. - Closes `#284 `_ (@uy-rrodriguez) + Closes `#284 `_ (@uy-rrodriguez) - Pin Faker version to Prevent Asteroid Crash (James Pulec) - Remove Python 3.5 Support (EOL since Sept 2020 and Faker requires 3.6 anyway) (James Pulec) @@ -139,18 +139,18 @@ Version 2.3.0 (05 Aug 2020) (Bryan Mutai) - Start testing with Django 3.1 on Python 3.8 - Better error message when Django is not configured. Closes - `#277 `_ + `#277 `_ Version 2.2.0 (22 Jul 2020) --------------------------- - Rely on Django to resolve string references in ForeignKey fields. Refs - `#243 `_ (Alejandro Angulo) + `#243 `_ (Alejandro Angulo) - Suppress ``unused-argument`` for functions in migration modules. Fix - `#267 `_ + `#267 `_ - New checker for hard-coded ``auth.User``. Fix - `#244 `_ + `#244 `_ Version 2.1.0 (12 Jul 2020) @@ -161,7 +161,7 @@ Version 2.1.0 (12 Jul 2020) ``pylint_django.checkers.migrations`` - Add URL to project Changelog for PyPI (Ville Skyttä) - Fix failing test suite b/c of missing CSV dialect. Fix - `#268 `_ + `#268 `_ (Alejandro Angulo) @@ -176,7 +176,7 @@ Version 2.0.14 (25 Feb 2020) - Add support for Django 3.0 and Python 3.8 (Wayne Lambert) - Support ASGI. Fix - `#258 `_ (Sander Maijers) + `#258 `_ (Sander Maijers) Version 2.0.13 (23 Nov 2019), HackBulgaria edition @@ -184,7 +184,7 @@ Version 2.0.13 (23 Nov 2019), HackBulgaria edition - Suppress ``too-many-ancestors`` for class-based generic views - Add ``handler400``, ``handler403``, ``handler404`` to good_names. Fix - `#248 `_ + `#248 `_ Version 2.0.12 (04 Nov 2019) @@ -193,11 +193,11 @@ Version 2.0.12 (04 Nov 2019) - Fix too broad suppression of ``unused-argument`` warnings for functions and methods where the first argument is named ``request``. Now issues warnings for the rest of the arguments if they are unused. Fix - `#249 `_ (Pascal Urban) + `#249 `_ (Pascal Urban) - Pass arguments of ``scripts/test.sh`` to ``test_func/pytest`` to ease development (Pascal Urban) - Document behavior when ForeignKey fields are referenced as strings. Fix - `#241 `_ + `#241 `_ Version 2.0.11 (10 July 2019) @@ -210,11 +210,11 @@ Version 2.0.10 (07 July 2019), Novi Sad edition ----------------------------------------------- - Suppress ``no-member`` for ``ManyToManyField``. Fix - `#192 `_ and - `#237 `_ (Pierre Chiquet) + `#192 `_ and + `#237 `_ (Pierre Chiquet) - Fix ``UnboundLocalError`` with ``ForeignKey(to=)``. Fix - `#232 `_ (Sardorbek Imomaliev) + `#232 `_ (Sardorbek Imomaliev) Version 2.0.9 (26 April 2019) @@ -225,37 +225,37 @@ Version 2.0.9 (26 April 2019) that is used in this pattern ``app.Model`` and also there is some other ``bool`` const like ``null=True`` right after ``to``. (Sardorbek Imomaliev) - Don't crash if ForeignKey field doesn't have keyword arguments Fix - `#230 `_ + `#230 `_ Version 2.0.8 (18 April 2019) ----------------------------- - Support recursive (self) ForeignKey relations. Fix - `#208 `_ (Daniil Kharkov) + `#208 `_ (Daniil Kharkov) Version 2.0.7 (16 April 2019) ----------------------------- - Fixed ``AstroidImportError`` for ``DecimalField``. Fix - `#221 `_ (Daniil Kharkov) + `#221 `_ (Daniil Kharkov) - Add ``load_configuration()`` in ``pylint_django/__init__.py``. Fix #222 - `#222 `_ + `#222 `_ - Support ForeignKey relations with ``to`` keyword. Fix - `#223 `_ (Daniil Kharkov) + `#223 `_ (Daniil Kharkov) Version 2.0.6 (27 Feb 2019) --------------------------- - Updating dependency version of pylint-plugin-utils as pylint 2.3 release - was not compatible `#220 `_ + was not compatible `#220 `_ - Improvements to tox.ini: - `#217 `_ - and `#216 `_ (@aerostitch) + `#217 `_ + and `#216 `_ (@aerostitch) - Add support for new load_configuration hook of pylint - `#214 `_ (@matusvalo) + `#214 `_ (@matusvalo) - 'urlpatterns' no longer reported as an invalid constant name @@ -272,11 +272,11 @@ Version 2.0.4 (do not use) -------------------------- - Avoid traceback with concurrent execution. Fix - `#197 `_ + `#197 `_ - Suppress ``no-member`` errors for ``LazyFunction`` in factories - Suppress ``no-member`` errors for ``RelatedManager`` fields - Clean up compatibility code: - `PR #207 `_ + `PR #207 `_ Version 2.0.3 (do not use) @@ -284,14 +284,14 @@ Version 2.0.3 (do not use) - Fixing compatability between ranges of astroid (2.0.4 -> 2.1) and pylint (2.1.1 -> 2.2). - `#201 `_ and - `#202 `_ + `#201 `_ and + `#202 `_ Version 2.0.2 (26 Aug 2018) --------------------------- - Suppress false-positive no-self-argument in factory.post_generation. Fix - `#190 `_ (Federico Bond) + `#190 `_ (Federico Bond) Version 2.0.1 (20 Aug 2018) @@ -299,14 +299,14 @@ Version 2.0.1 (20 Aug 2018) - Enable testing with Django 2.1 - Add test for Model.objects.get_or_create(). Close - `#156 `__ + `#156 `__ - Add test for objects.exclude(). Close - `#177 `__ + `#177 `__ - Fix Instance of 'Model' has no 'id' member (no-member), fix Class 'UserCreationForm' has no 'declared_fields' member. Close - `#184 `__ + `#184 `__ - Fix for Instance of 'ManyToManyField' has no 'add' member. Close - `#163 `__ + `#163 `__ - Add test & fix for unused arguments on class based views @@ -324,10 +324,10 @@ Version 0.11.1 (25 May 2018), the DjangoCon Heidelberg edition - Enable test case for ``urlpatterns`` variable which was previously disabled - Disable ``unused-argument`` message for the ``request`` argument passed to view functions. Fix - `#155 `__ + `#155 `__ - Add transformations for ``model_utils`` managers instead of special-casing them. Fix - `#160 `__ + `#160 `__ Version 0.11 (18 April 2018), the TestCon Moscow edition @@ -348,29 +348,29 @@ Version 0.10.0 (10 April 2018) - Remove the compatibility layer for older astroid versions - Make flake8 happy. Fix - `#102 `__ + `#102 `__ - Fix: compatibility with Python < 3.6 caused by ``ModuleNotFoundError`` not available on older versions of Python (Juan Rial) - Show README and CHANGELOG on PyPI. Fix - `#122 `__ + `#122 `__ - Fix explicit unicode check with ``python_2_unicode_compatible`` base models (Federico Bond) - Suppress ``not-an-iterable`` message for 'objects'. Fix - `#117 `__ + `#117 `__ - Teach pylint_django that ``objects.all()`` is subscriptable. Fix - `#144 `__ + `#144 `__ - Suppress ``invalid-name`` for ``wsgi.application``. Fix - `#77 `__ + `#77 `__ - Add test for ``WSGIRequest.context``. Closes - `#78 `__ + `#78 `__ - Register transforms for ``FileField``. Fix - `#60 `__ + `#60 `__ - New checker ``pylint_django.checkers.db_performance``. Enables checking of migrations and reports when there's an ``AddField`` operation with a default value which may slow down applying migrations on large tables. This may also lead to production tables being locked while migrations are being applied. Fix - `#118 `__ + `#118 `__ - Suppress ``no-member`` for ``factory.SubFactory`` objects. Useful when model factories use ``factory.SubFactory()`` for foreign key relations. @@ -382,30 +382,30 @@ Version 0.9.4 (12 March 2018) - Add an optional dependency on Django - Fix the ``DjangoInstalledChecker`` so it can actually warn when Django isn't available -- Fix `#136 `__ by +- Fix `#136 `__ by adding automated build and sanity test scripts Version 0.9.3 (removed from PyPI) --------------------------------- -- Fix `#133 `__ and - `#134 `__ by +- Fix `#133 `__ and + `#134 `__ by including package data when building wheel and tar.gz packages for PyPI (Joseph Herlant) Version 0.9.2 (broken) ---------------------- -- Fix `#129 `__ - +- Fix `#129 `__ - Move tests under ``site-packages/pylint_django`` (Mr. Senko) -- Fix `#96 `__ - List +- Fix `#96 `__ - List Django as a dependency (Mr. Senko) Version 0.9.1 (26 Feb 2018) --------------------------- -- Fix `#123 `__ - - Update links after the move to PyCQA (Mr. Senko) +- Fix `#123 `__ - + Update links after the move to pylint-dev (Mr. Senko) - Add test for Meta class from django\_tables2 (Mr. Senko) - Fix flake8 complaints (Peter Bittner) - Add missing .txt and .rc test files to MANIFEST.in (Joseph Herlant) @@ -413,11 +413,11 @@ Version 0.9.1 (26 Feb 2018) Version 0.9 (25 Jan 2018) ------------------------- -- Fix `#120 `__ - +- Fix `#120 `__ - TypeError: 'NamesConsumer' object does not support indexing (Simone Basso) -- Fix `#110 `__ and - `#35 `__ - resolve +- Fix `#110 `__ and + `#35 `__ - resolve ForeignKey models specified as strings instead of class names (Mr. Senko) @@ -426,43 +426,43 @@ Version 0.8.0 (20 Jan 2018) - This is the last version to support Python 2. Issues a deprecation warning! -- `#109 `__, adding +- `#109 `__, adding 'urlpatterns', 'register', 'app\_name' to good names. Obsoletes - `#111 `__, fixes - `#108 `__ (Vinay + `#111 `__, fixes + `#108 `__ (Vinay Pai) - Add 'handler500' to good names (Mr. Senko) -- `#103 `__: Support +- `#103 `__: Support factory\_boy's DjangoModelFactory Meta class (Konstantinos Koukopoulos) -- `#100 `__: Fix +- `#100 `__: Fix E1101:Instance of '**proxy**\ ' has no 'format' member' when using .format() on a ugettext\_lazy translation. Fixes - `#80 `__ + `#80 `__ (canarduck) -- `#99 `__: Add tests +- `#99 `__: Add tests and transforms for DurationField, fixes - `#95 `__ (James M. + `#95 `__ (James M. Allen) -- `#92 `__: Add json +- `#92 `__: Add json field to WSGIRequest proxy (sjk4sc) -- `#84 `__: Add support +- `#84 `__: Add support for django.contrib.postgres.fields and UUIDField (Villiers Strauss) - Stop testing with older Django versions. Currently testing with Django 1.11.x and 2.0 - Stop testing on Python 2, no functional changes in the source code though - Update tests and require latest version of pylint (>=1.8), fixes - `#53 `__, - `#97 `__ -- `#81 `__ Fix + `#53 `__, + `#97 `__ +- `#81 `__ Fix 'duplicate-except' false negative for except blocks which catch the ``DoesNotExist`` exception. Version 0.7.4 ------------- -- `#88 `__ Fixed builds +- `#88 `__ Fixed builds with Django 1.10 (thanks to `federicobond `__) - `#91 `__ Fixed race diff --git a/README.rst b/README.rst index f26d376e..eb1ef8fc 100644 --- a/README.rst +++ b/README.rst @@ -1,11 +1,11 @@ pylint-django ============= -.. image:: https://github.com/PyCQA/pylint-django/actions/workflows/build.yml/badge.svg - :target: https://github.com/PyCQA/pylint-django/actions/workflows/build.yml +.. image:: https://github.com/pylint-dev/pylint-django/actions/workflows/build.yml/badge.svg + :target: https://github.com/pylint-dev/pylint-django/actions/workflows/build.yml -.. image:: https://coveralls.io/repos/github/PyCQA/pylint-django/badge.svg?branch=master - :target: https://coveralls.io/github/PyCQA/pylint-django?branch=master +.. image:: https://coveralls.io/repos/github/pylint-dev/pylint-django/badge.svg?branch=master + :target: https://coveralls.io/github/pylint-dev/pylint-django?branch=master .. image:: https://img.shields.io/pypi/v/pylint-django.svg :target: https://pypi.python.org/pypi/pylint-django @@ -29,7 +29,7 @@ To install:: **WARNING:** ``pylint-django`` will not install ``Django`` by default because this causes more trouble than good, -`see discussion `__. If you wish +`see discussion `__. If you wish to automatically install the latest version of ``Django`` then:: pip install pylint-django[with-django] diff --git a/pylint_django/tests/input/external_django_tables2_noerror_meta_class.py b/pylint_django/tests/input/external_django_tables2_noerror_meta_class.py index d1711726..b476a33b 100644 --- a/pylint_django/tests/input/external_django_tables2_noerror_meta_class.py +++ b/pylint_django/tests/input/external_django_tables2_noerror_meta_class.py @@ -1,6 +1,6 @@ # Check that Meta class definitions for django_tables2 classes # don't produce old-style-class warnings, see -# https://github.com/PyCQA/pylint-django/issues/56 +# https://github.com/pylint-dev/pylint-django/issues/56 # pylint: disable=missing-docstring,too-few-public-methods diff --git a/pylint_django/tests/input/external_model_utils_noerror_override_manager.py b/pylint_django/tests/input/external_model_utils_noerror_override_manager.py index 84d6038f..e1482ffb 100644 --- a/pylint_django/tests/input/external_model_utils_noerror_override_manager.py +++ b/pylint_django/tests/input/external_model_utils_noerror_override_manager.py @@ -1,7 +1,7 @@ # Check that when overriding the 'objects' attribite of a model class # with a manager from the django-model-utils package pylint-django # does not report not-an-iterator error, see -# https://github.com/PyCQA/pylint-django/issues/117 +# https://github.com/pylint-dev/pylint-django/issues/117 # pylint: disable=missing-docstring, invalid-name from django.db import models diff --git a/pylint_django/tests/input/func_noerror_duplicate_except_doesnotexist.py b/pylint_django/tests/input/func_noerror_duplicate_except_doesnotexist.py index 8f020014..ed41385a 100644 --- a/pylint_django/tests/input/func_noerror_duplicate_except_doesnotexist.py +++ b/pylint_django/tests/input/func_noerror_duplicate_except_doesnotexist.py @@ -1,7 +1,7 @@ """ Checks that Pylint does not complain about duplicate except blocks catching DoesNotExist exceptions: -https://github.com/PyCQA/pylint-django/issues/81 +https://github.com/pylint-dev/pylint-django/issues/81 """ # pylint: disable=missing-docstring from django.db import models diff --git a/pylint_django/tests/input/func_noerror_foreignkeys.py b/pylint_django/tests/input/func_noerror_foreignkeys.py index e9cb5e81..69448a6b 100644 --- a/pylint_django/tests/input/func_noerror_foreignkeys.py +++ b/pylint_django/tests/input/func_noerror_foreignkeys.py @@ -70,7 +70,7 @@ class UserPreferences(models.Model): """ Used for testing FK which refers to another model by string, not model class, see - https://github.com/PyCQA/pylint-django/issues/35 + https://github.com/pylint-dev/pylint-django/issues/35 """ user = ForeignKey("User", on_delete=models.CASCADE) diff --git a/pylint_django/tests/input/func_noerror_generic_foreign_key.py b/pylint_django/tests/input/func_noerror_generic_foreign_key.py index 8cfe73b3..febcde0e 100644 --- a/pylint_django/tests/input/func_noerror_generic_foreign_key.py +++ b/pylint_django/tests/input/func_noerror_generic_foreign_key.py @@ -1,6 +1,6 @@ """ Checks that Pylint does not complain about GenericForeignKey fields: -https://github.com/PyCQA/pylint-django/issues/230 +https://github.com/pylint-dev/pylint-django/issues/230 """ # pylint: disable=missing-docstring diff --git a/pylint_django/tests/input/func_noerror_model_objects.py b/pylint_django/tests/input/func_noerror_model_objects.py index 5cf27245..bb0c72aa 100644 --- a/pylint_django/tests/input/func_noerror_model_objects.py +++ b/pylint_django/tests/input/func_noerror_model_objects.py @@ -1,6 +1,6 @@ # Test that defining `objects` as a regular model manager # doesn't raise issues, see -# https://github.com/PyCQA/pylint-django/issues/144 +# https://github.com/pylint-dev/pylint-django/issues/144 # # pylint: disable=missing-docstring diff --git a/pylint_django/tests/input/func_noerror_protected_meta_access.py b/pylint_django/tests/input/func_noerror_protected_meta_access.py index 96e09adc..9c5938ed 100644 --- a/pylint_django/tests/input/func_noerror_protected_meta_access.py +++ b/pylint_django/tests/input/func_noerror_protected_meta_access.py @@ -2,7 +2,7 @@ Tests to make sure that access to _meta on a model does not raise a protected-access warning, as it is part of the public API since Django 1.8 -(see https://github.com/PyCQA/pylint-django/issues/66, +(see https://github.com/pylint-dev/pylint-django/issues/66, and https://docs.djangoproject.com/en/1.9/ref/models/meta/) """ # pylint: disable=missing-docstring diff --git a/pylint_django/tests/input/func_noerror_test_wsgi_request.py b/pylint_django/tests/input/func_noerror_test_wsgi_request.py index 9c9a3337..a5c761d3 100644 --- a/pylint_django/tests/input/func_noerror_test_wsgi_request.py +++ b/pylint_django/tests/input/func_noerror_test_wsgi_request.py @@ -1,6 +1,6 @@ """ Checks that Pylint does not complain about a standard test. See: -https://github.com/PyCQA/pylint-django/issues/78 +https://github.com/pylint-dev/pylint-django/issues/78 """ from django.db import models diff --git a/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py b/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py index dace2270..42f2af49 100644 --- a/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py +++ b/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py @@ -2,7 +2,7 @@ Ensures that no '__unicode__ missing' warning is emitted if the Django python3/2 compatability decorator is used -See https://github.com/PyCQA/pylint-django/issues/10 +See https://github.com/pylint-dev/pylint-django/issues/10 """ from django.db import models diff --git a/pylint_django/tests/input/func_noerror_wsgi.py b/pylint_django/tests/input/func_noerror_wsgi.py index a9c38adf..f2c18d5c 100644 --- a/pylint_django/tests/input/func_noerror_wsgi.py +++ b/pylint_django/tests/input/func_noerror_wsgi.py @@ -3,7 +3,7 @@ Used to verify pylint_django doesn't produce invalid-name for the application variable. See: -https://github.com/PyCQA/pylint-django/issues/77 +https://github.com/pylint-dev/pylint-django/issues/77 """ import os diff --git a/pyproject.toml b/pyproject.toml index 84171841..ebe47b7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ name = "pylint-django" version = "2.7.0" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" -repository = "https://github.com/PyCQA/pylint-django" +repository = "https://github.com/pylint-dev/pylint-django" authors = [ "Carl Crowder " ] classifiers = [ "Development Status :: 5 - Production/Stable", From db23bcc7bf1f8a763536be2e6bc2aae905c28733 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 8 Oct 2024 23:43:43 +0200 Subject: [PATCH 54/75] Add codespell in pre-commit, fix existing typo, create a custom dict (#438) --- .pre-commit-config.yaml | 7 +++++++ CHANGELOG.rst | 6 +++--- custom_dict.txt | 1 + pylint_django/augmentations/__init__.py | 4 ++-- pylint_django/checkers/migrations.py | 2 +- .../tests/input/external_tastypie_noerror_foreign_key.py | 4 ++-- .../tests/input/func_noerror_unicode_py2_compatible.py | 2 +- pylint_django/transforms/__init__.py | 2 +- pyproject.toml | 3 +++ 9 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 custom_dict.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3b6c601c..591a18c9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,6 +29,13 @@ repos: - id: pyproject-fmt # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version additional_dependencies: ["tox>=4.9"] + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + args: ["--toml=pyproject.toml"] + additional_dependencies: + - tomli - repo: local hooks: - id: pylint diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2516b570..22dea9cc 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -282,7 +282,7 @@ Version 2.0.4 (do not use) Version 2.0.3 (do not use) -------------------------- -- Fixing compatability between ranges of astroid (2.0.4 -> 2.1) and +- Fixing compatibility between ranges of astroid (2.0.4 -> 2.1) and pylint (2.1.1 -> 2.2). `#201 `_ and `#202 `_ @@ -550,7 +550,7 @@ Version 0.5.5 Version 0.5.4 ------------- -- Improved resiliance to inference failure when Django types cannot be +- Improved resilience to inference failure when Django types cannot be inferred (which can happen if Django is not on the system path Version 0.5.3 @@ -578,7 +578,7 @@ Version 0.5 Improved handling of Django model fields - `Issue #10 `__ No warning about missing **unicode** if the Django python3/2 - compatability tools are used + compatibility tools are used - `Issue #11 `__ Improved handling of Django form fields - `Issue #12 `__ diff --git a/custom_dict.txt b/custom_dict.txt new file mode 100644 index 00000000..450d4fe9 --- /dev/null +++ b/custom_dict.txt @@ -0,0 +1 @@ +astroid diff --git a/pylint_django/augmentations/__init__.py b/pylint_django/augmentations/__init__.py index fcb19b35..db259647 100644 --- a/pylint_django/augmentations/__init__.py +++ b/pylint_django/augmentations/__init__.py @@ -30,7 +30,7 @@ # get its attributes that way - and this used to be the method - but unfortunately # there's no guarantee that Django is properly configured at that stage, and importing # anything from the django.db package causes an ImproperlyConfigured exception. -# Therefore we'll fall back on a hard-coded list of attributes which won't be as accurate, +# Therefore, we'll fall back on a hard-coded list of attributes which won't be as accurate, # but this is not 100% accurate anyway. MANAGER_ATTRS = { "none", @@ -837,7 +837,7 @@ def apply_augmentations(linter): is_urls_module_valid_constant, ) - # supress errors when accessing magical class attributes + # suppress errors when accessing magical class attributes suppress_message(linter, TypeChecker.visit_attribute, "no-member", is_manager_attribute) suppress_message(linter, TypeChecker.visit_attribute, "no-member", is_admin_attribute) suppress_message(linter, TypeChecker.visit_attribute, "no-member", is_model_attribute) diff --git a/pylint_django/checkers/migrations.py b/pylint_django/checkers/migrations.py index a7d1ec8d..f4addfb2 100644 --- a/pylint_django/checkers/migrations.py +++ b/pylint_django/checkers/migrations.py @@ -117,7 +117,7 @@ class MissingBackwardsMigrationChecker(checkers.BaseChecker): f"W{BASE_ID}97": ( "Always include backwards migration callable", "missing-backwards-migration-callable", - "Always include a backwards/reverse callable counterpart so that the migration is not irreversable.", + "Always include a backwards/reverse callable counterpart so that the migration is not irreversible.", ) } diff --git a/pylint_django/tests/input/external_tastypie_noerror_foreign_key.py b/pylint_django/tests/input/external_tastypie_noerror_foreign_key.py index 68413e9a..f83d66f2 100644 --- a/pylint_django/tests/input/external_tastypie_noerror_foreign_key.py +++ b/pylint_django/tests/input/external_tastypie_noerror_foreign_key.py @@ -2,11 +2,11 @@ Checks that Pylint doesn't raise an error when a 'ForeignKey' appears in a non-django class -The real case is described as follow: +The real case is described as follows: The project use tastypie and django. tastypie has a `ForeignKey` field which has the same name as django's `ForeignKey`. -The issue is the lint trys resolving the `ForeignKey` for the +The issue is the lint tries resolving the `ForeignKey` for the tastypie `ForeignKey` which cause import error. """ from tastypie import fields diff --git a/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py b/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py index 42f2af49..2cd04d27 100644 --- a/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py +++ b/pylint_django/tests/input/func_noerror_unicode_py2_compatible.py @@ -1,6 +1,6 @@ """ Ensures that no '__unicode__ missing' warning is emitted if the -Django python3/2 compatability decorator is used +Django python3/2 compatibility decorator is used See https://github.com/pylint-dev/pylint-django/issues/10 """ diff --git a/pylint_django/transforms/__init__.py b/pylint_django/transforms/__init__.py index e99a6fe2..2ce561d4 100644 --- a/pylint_django/transforms/__init__.py +++ b/pylint_django/transforms/__init__.py @@ -2,7 +2,7 @@ These transforms replace the Django types with adapted versions to provide additional typing and method inference to pylint. All of these transforms are considered "global" to pylint-django, in that all checks and improvements -requre them to be loaded. Additional transforms specific to checkers are loaded +require them to be loaded. Additional transforms specific to checkers are loaded by the checker rather than here. For example, the ForeignKeyStringsChecker loads the foreignkey.py transforms diff --git a/pyproject.toml b/pyproject.toml index ebe47b7a..5238b32a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,3 +96,6 @@ disable = [ ] ignore = "tests" max-line-length = 120 + +[tool.codespell] +ignore-words = [ "custom_dict.txt" ] From f6b17a06c0f78a36406f636a3add445f8d9afd29 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 20:35:34 +0200 Subject: [PATCH 55/75] [doc] Avoid more redirections in the links (PyCQA => pylint-dev) (#439) --- CHANGELOG.rst | 62 +++++++++---------- pylint_django/augmentations/__init__.py | 2 +- pylint_django/checkers/foreign_key_strings.py | 2 +- pylint_django/checkers/json_response.py | 2 +- pylint_django/checkers/migrations.py | 2 +- pylint_django/checkers/models.py | 2 +- .../input/func_noerror_string_foreignkey.py | 2 +- .../tests/input/migrations/0002_new_column.py | 2 +- ...ign_key_key_cls_unbound_in_same_package.py | 4 +- pylint_django/transforms/__init__.py | 2 +- tox.ini | 4 +- 11 files changed, 43 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 22dea9cc..de9360f3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -465,58 +465,58 @@ Version 0.7.4 - `#88 `__ Fixed builds with Django 1.10 (thanks to `federicobond `__) -- `#91 `__ Fixed race +- `#91 `__ Fixed race condition when running with pylint parallel execution mode (thanks to `jeremycarroll `__) -- `#64 `__ "Meta is +- `#64 `__ "Meta is old style class" now suppressed on BaseSerializer too (thanks to `unklphil `__) -- `#70 `__ Updating to +- `#70 `__ Updating to handle newer pylint/astroid versions (thanks to `iXce `__) Version 0.7.2 ------------- -- `#76 `__ Better +- `#76 `__ Better handling of mongoengine querysetmanager -- `#73 `__ - `#72 `__ Make package +- `#73 `__ + `#72 `__ Make package zip safe to help fix some path problems -- `#68 `__ Suppressed +- `#68 `__ Suppressed invalid constant warning for "app\_name" in urls.py -- `#67 `__ Fix +- `#67 `__ Fix view.args and view.kwargs -- `#66 `__ accessing +- `#66 `__ accessing \_meta no longer causes a protected-access warning as this is a public API as of Django 1.8 -- `#65 `__ Add support +- `#65 `__ Add support of mongoengine module. -- `#59 `__ Silence +- `#59 `__ Silence old-style-class for widget Meta Version 0.7.1 ------------- -- `#52 `__ - Fixed +- `#52 `__ - Fixed stupid mistake when using versioninfo Version 0.7 ----------- -- `#51 `__ - Fixed +- `#51 `__ - Fixed compatibility with pylint 1.5 / astroid 1.4.1 Version 0.6.1 ------------- -- `#43 `__ - Foreign +- `#43 `__ - Foreign key ID access (``somefk_id``) does not raise an 'attribute not found' warning -- `#31 `__ - Support +- `#31 `__ - Support for custom model managers (thanks `smirolo `__) -- `#48 `__ - Added +- `#48 `__ - Added support for django-restframework (thanks `mbertolacci `__) @@ -526,25 +526,25 @@ Version 0.6 - Pylint 1.4 dropped support for Python 2.6, therefore a constraint is added that pylint-django will only work with Python2.6 if pylint<=1.3 is installed -- `#40 `__ - pylint +- `#40 `__ - pylint 1.4 warned about View and Model classes not having enough public methods; this is suppressed -- `#37 `__ - fixed an +- `#37 `__ - fixed an infinite loop when using astroid 1.3.3+ -- `#36 `__ - no +- `#36 `__ - no longer warning about lack of ``__unicode__`` method on abstract model classes -- `PR #34 `__ - prevent +- `PR #34 `__ - prevent warning about use of ``super()`` on ModelManager classes Version 0.5.5 ------------- -- `PR #27 `__ - better +- `PR #27 `__ - better ``ForeignKey`` transforms, which now work when of the form ``othermodule.ModelClass``. This also fixes a problem where an inferred type would be ``_Yes`` and pylint would fail -- `PR #28 `__ - better +- `PR #28 `__ - better knowledge of ``ManyToManyField`` classes Version 0.5.4 @@ -556,7 +556,7 @@ Version 0.5.4 Version 0.5.3 ------------- -- `Issue #25 `__ +- `Issue #25 `__ Fixing cases where a module defines ``get`` as a method Version 0.5.2 @@ -574,20 +574,20 @@ Version 0.5.1 Version 0.5 ----------- -- `Issue #7 `__ +- `Issue #7 `__ Improved handling of Django model fields -- `Issue #10 `__ No +- `Issue #10 `__ No warning about missing **unicode** if the Django python3/2 compatibility tools are used -- `Issue #11 `__ +- `Issue #11 `__ Improved handling of Django form fields -- `Issue #12 `__ +- `Issue #12 `__ Improved handling of Django ImageField and FileField objects -- `Issue #14 `__ +- `Issue #14 `__ Models which do not define **unicode** but whose parents do now have a new error (W5103) instead of incorrectly warning about no **unicode** being present. -- `Issue #21 `__ +- `Issue #21 `__ ``ForeignKey`` and ``OneToOneField`` fields on models are replaced with instance of the type they refer to in the AST, which allows pylint to generate correct warnings about attributes they may or may @@ -605,9 +605,9 @@ Version 0.2 - Pylint now recognises ``BaseForm`` as an ancestor of ``Form`` and subclasses - Improved ``Form`` support -- `Issue #2 `__ - a +- `Issue #2 `__ - a subclass of a ``Model`` or ``Form`` also has warnings about a ``Meta`` class suppressed. -- `Issue #3 `__ - +- `Issue #3 `__ - ``Form`` and ``ModelForm`` subclasses no longer warn about ``Meta`` classes. diff --git a/pylint_django/augmentations/__init__.py b/pylint_django/augmentations/__init__.py index db259647..1ff4c419 100644 --- a/pylint_django/augmentations/__init__.py +++ b/pylint_django/augmentations/__init__.py @@ -325,7 +325,7 @@ def ignore_import_warnings_for_related_fields(orig_method, self, node): new_things[name] = stmts # ScopeConsumer changed between pylint 2.12 and 2.13 - # see https://github.com/PyCQA/pylint/issues/5970#issuecomment-1078778393 + # see https://github.com/pylint-dev/pylint/issues/5970#issuecomment-1078778393 if hasattr(consumer, "consumed_uncertain"): # this is pylint >= 2.13, and the ScopeConsumer tuple has an additional field sc_args = (new_things, consumer.consumed, consumer.consumed_uncertain, consumer.scope_type) diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index f232f5d9..bb61b728 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -62,7 +62,7 @@ def open(self): # Django is configured explicitly, and will use some basic defaults in that # case. However, as this is a WARNING not a FATAL, the error must be raised # with an AST node - only F and R messages are scope exempt (see - # https://github.com/PyCQA/pylint/blob/master/pylint/constants.py#L24) + # https://github.com/pylint-dev/pylint/blob/master/pylint/constants.py#L24) # However, testing to see if Django is configured happens in `open()` # before any modules are inspected, as Django needs to be configured with diff --git a/pylint_django/checkers/json_response.py b/pylint_django/checkers/json_response.py index 4d15f547..904fd71a 100644 --- a/pylint_django/checkers/json_response.py +++ b/pylint_django/checkers/json_response.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Alexander Todorov # Licensed under the GPL 2.0: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html -# For details: https://github.com/PyCQA/pylint-django/blob/master/LICENSE +# For details: https://github.com/pylint-dev/pylint-django/blob/master/LICENSE """ Various suggestions about JSON http responses """ diff --git a/pylint_django/checkers/migrations.py b/pylint_django/checkers/migrations.py index f4addfb2..c811a6aa 100644 --- a/pylint_django/checkers/migrations.py +++ b/pylint_django/checkers/migrations.py @@ -2,7 +2,7 @@ # Copyright (c) 2020 Bryan Mutai # Licensed under the GPL 2.0: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html -# For details: https://github.com/PyCQA/pylint-django/blob/master/LICENSE +# For details: https://github.com/pylint-dev/pylint-django/blob/master/LICENSE """ Various suggestions around migrations. Disabled by default! Enable with pylint --load-plugins=pylint_django.checkers.migrations diff --git a/pylint_django/checkers/models.py b/pylint_django/checkers/models.py index ce953506..76a6b9ff 100644 --- a/pylint_django/checkers/models.py +++ b/pylint_django/checkers/models.py @@ -124,7 +124,7 @@ def visit_classdef(self, node): return # if the Django compatibility decorator is used then we don't emit a warning - # see https://github.com/PyCQA/pylint-django/issues/10 + # see https://github.com/pylint-dev/pylint-django/issues/10 if _has_python_2_unicode_compatible_decorator(node): return diff --git a/pylint_django/tests/input/func_noerror_string_foreignkey.py b/pylint_django/tests/input/func_noerror_string_foreignkey.py index 8f9a730e..6f09158f 100644 --- a/pylint_django/tests/input/func_noerror_string_foreignkey.py +++ b/pylint_django/tests/input/func_noerror_string_foreignkey.py @@ -1,6 +1,6 @@ """ Checks that PyLint correctly handles string foreign keys -https://github.com/PyCQA/pylint-django/issues/243 +https://github.com/pylint-dev/pylint-django/issues/243 """ # pylint: disable=missing-docstring, hard-coded-auth-user from django.db import models diff --git a/pylint_django/tests/input/migrations/0002_new_column.py b/pylint_django/tests/input/migrations/0002_new_column.py index 07ebc2d6..6955c0c4 100644 --- a/pylint_django/tests/input/migrations/0002_new_column.py +++ b/pylint_django/tests/input/migrations/0002_new_column.py @@ -4,7 +4,7 @@ default value on a large table leads to DB performance issues. See: -https://github.com/PyCQA/pylint-django/issues/118 and +https://github.com/pylint-dev/pylint-django/issues/118 and https://docs.djangoproject.com/en/2.0/topics/migrations/#postgresql > ... adding columns with default values will cause a full rewrite of diff --git a/pylint_django/tests/input/models/func_noerror_foreign_key_key_cls_unbound_in_same_package.py b/pylint_django/tests/input/models/func_noerror_foreign_key_key_cls_unbound_in_same_package.py index d25da4ad..7a7a55c8 100644 --- a/pylint_django/tests/input/models/func_noerror_foreign_key_key_cls_unbound_in_same_package.py +++ b/pylint_django/tests/input/models/func_noerror_foreign_key_key_cls_unbound_in_same_package.py @@ -1,14 +1,14 @@ """ Checks that Pylint does not crash with ForeignKey string reference pointing to model in module of models package. See -https://github.com/PyCQA/pylint-django/issues/232 +https://github.com/pylint-dev/pylint-django/issues/232 Note: the no-member disable is here b/c pylint-django doesn't know how to load models.author.Author. When pylint-django tries to load models referenced by a single string it assumes they are found in the same module it is inspecting. Hence it can't find the Author class here so it tells us it doesn't have an 'id' attribute. Also see: -https://github.com/PyCQA/pylint-django/issues/232#issuecomment-495242695 +https://github.com/pylint-dev/pylint-django/issues/232#issuecomment-495242695 """ # pylint: disable=missing-docstring, no-member from django.db import models diff --git a/pylint_django/transforms/__init__.py b/pylint_django/transforms/__init__.py index 2ce561d4..ac51e241 100644 --- a/pylint_django/transforms/__init__.py +++ b/pylint_django/transforms/__init__.py @@ -25,7 +25,7 @@ def fake_module_builder(): Build a fake module to use within transformations. @package_name is a parameter from the outer scope b/c according to the docs this can't receive any parameters. - http://pylint.pycqa.org/projects/astroid/en/latest/extending.html?highlight=MANAGER#module-extender-transforms + https://pylint.readthedocs.io/projects/astroid/en/latest/extending.html#module-extender-transforms """ transforms_dir = os.path.join(os.path.dirname(__file__), "transforms") transformed_name = re.sub(r"\.", "_", package_name) diff --git a/tox.ini b/tox.ini index ca10ad05..c95fec5a 100644 --- a/tox.ini +++ b/tox.ini @@ -40,8 +40,8 @@ deps = django42: Django>=4.2,<4.3 django50: Django>=5.0,<5.1 django-main: Django - django-main: git+https://github.com/pycqa/astroid@main - django-main: git+https://github.com/pycqa/pylint@main + django-main: git+https://github.com/pylint-dev/astroid@main + django-main: git+https://github.com/pylint-dev/pylint@main setenv = PIP_DISABLE_PIP_VERSION_CHECK = 1 PYTHONPATH = . From 24cb2684b26da2726a4e788f67f0fa4b0b53da51 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 8 Oct 2024 23:20:42 +0200 Subject: [PATCH 56/75] Use the proper version for next release --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5238b32a..7a0ee1f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ requires = [ "poetry-core>=1" ] [tool.poetry] name = "pylint-django" -version = "2.7.0" +version = "2.6.0" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/pylint-dev/pylint-django" From 745f8031bf8c49b667d3b212260dce7bc006ee5f Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 8 Oct 2024 22:28:46 +0200 Subject: [PATCH 57/75] Support for django 5.1, use pylint 3.0+, drop python 3.8 following EOL 2024-10-07 --- .github/workflows/build.yml | 8 ++++---- pyproject.toml | 9 +++++---- tox.ini | 13 +++++++------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 333a3346..f2b3e760 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11"] + python-version: ["3.12"] toxenv: [django_not_installed, ruff, pylint, readme] steps: @@ -40,7 +40,7 @@ jobs: fail-fast: false matrix: python-version: ["3.10", "3.11", "3.12"] - django-version: ["5.0", "-main"] + django-version: ["5.0", "5.1", "-main"] steps: - uses: actions/checkout@v4 @@ -75,7 +75,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.9", "3.10", "3.11", "3.12"] django-version: ["4.0", "4.1", "4.2"] steps: @@ -103,7 +103,7 @@ jobs: strategy: # TODO: use a YAML anchor - not supported in GitHub actions "yet" fail-fast: false matrix: - python-version: [3.8, 3.9] + python-version: [3.9] django-version: [3.2, 3.1, "3.0", "2.2"] steps: diff --git a/pyproject.toml b/pyproject.toml index 7a0ee1f8..82b8fc70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,6 @@ classifiers = [ "Operating System :: Unix", "Topic :: Software Development :: Quality Assurance", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", @@ -32,6 +31,7 @@ classifiers = [ "Framework :: Django :: 4.1", "Framework :: Django :: 4.2", "Framework :: Django :: 5.0", + "Framework :: Django :: 5.1", "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", ] keywords = [ "pylint", "django", "plugin" ] @@ -42,20 +42,21 @@ include = [ "pylint_django/LICENSE" ] exclude = [ "**/tests/**", "**/testutils.py", "**/tests.py" ] [tool.poetry.dependencies] -python = ">=3.8,<4.0" +python = ">=3.9,<4.0" pylint-plugin-utils = ">=0.8" -pylint = ">=2.0,<4" +pylint = ">=3.0,<4" Django = { version = ">=2.2", optional = true } [tool.poetry.group.dev.dependencies] tox = ">=4.9" pytest = "^7.3.1" -ruff = ">=0.1.1" +ruff = ">=0.6.9" wheel = "^0.40" pytest-cov = "^4" django-tables2 = "^2.6" factory-boy = "^3.3" django-tastypie = "^0.14" +pre-commit = ">=1" [tool.poetry.extras] with_django = [ "Django" ] diff --git a/tox.ini b/tox.ini index c95fec5a..c27b6b77 100644 --- a/tox.ini +++ b/tox.ini @@ -7,9 +7,9 @@ envlist = flake8 pylint readme - py{38,39}-django{22,30,31,32} - py{38,39,310,311,312}-django{40,41,42} - py{310,311,312}-django{50,-main} + py{39}-django{22,30,31,32} + py{39,310,311,312}-django{40,41,42} + py{310,311,312}-django{50,51,-main} requires = pip >=21.0.1 @@ -21,13 +21,13 @@ commands = django_not_installed: bash pylint_django/tests/test_django_not_installed.sh pylint: pylint pylint_django readme: bash -c "poetry build && twine check dist/*" - py{37,38,39,310,311,312}-django{22,30,31,32,40,41,42,50}: bash scripts/test.sh --cov=pylint_django + py{38,39,310,311,312}-django{22,30,31,32,40,41,42,50}: bash scripts/test.sh --cov=pylint_django clean: find . -type f -name '*.pyc' -delete clean: find . -type d -name __pycache__ -delete clean: rm -rf build/ .cache/ dist/ .eggs/ pylint_django.egg-info/ .tox/ deps = ruff: ruff - pylint: pylint<3 + pylint: pylint>3 pylint: Django readme: twine readme: wheel @@ -39,6 +39,7 @@ deps = django41: Django>=4.1,<4.2 django42: Django>=4.2,<4.3 django50: Django>=5.0,<5.1 + django51: Django>=5.1,<5.2 django-main: Django django-main: git+https://github.com/pylint-dev/astroid@main django-main: git+https://github.com/pylint-dev/pylint@main @@ -48,6 +49,6 @@ setenv = allowlist_externals = django_not_installed: bash readme: bash - django{22,30,31,32,40,41,42,50,-main}: bash + django{22,30,31,32,40,41,42,50,51,-main}: bash clean: find clean: rm From d847a06f8067cfcfbe573a0a35074b38ab028712 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 21:09:04 +0200 Subject: [PATCH 58/75] Update changelog prior to 2.6.0 release (#441) --- CHANGELOG.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index de9360f3..25b68a47 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,16 +7,21 @@ Version 2.6.0 NOTICE ~~~~~~ -This version drops support for Python 3.7 - latest Pylint no longer supports 3.7, and CI tasks were taking hours under 3.7. `Python 3.7 `_ received its last security update more than a year ago (from the date of this release). +We dropped support for Python 3.7, 3.8, and for pylint below 3.0. Bugfixes ~~~~~~~~ - Added Django aliases for ranges to support psycopg 2 and 3 (`#421 `_) -- Support for PYthon 3.12 datetime (`#427 `_) +- Support for Python 3.12 datetime (`#427 `_) - Fixed location of installed LICENSE file (`#431 `_) - Fixed ForeignKeyStringChecker referencing linter config incorrectly (`#430 `_) +Other +~~~~~ + +- CI now tests against Django 5.1 + Version 2.5.5 (14 May 2023) --------------------------- From b409cb60643156b5e80da7b2d9d76f20c63fc640 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 21:19:09 +0200 Subject: [PATCH 59/75] [ruff] Fix the section of select in the pyproject.toml --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 82b8fc70..5586a575 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,16 +66,16 @@ line-length = 120 [tool.ruff] line-length = 120 -select = [ +lint.select = [ + "B", # bugbear "E", # pycodestyle "F", # pyflakes - "W", # pycodestyle - "B", # bugbear "I", # isort "RUF", # ruff "UP", # pyupgrade + "W", # pycodestyle ] -ignore = [ +lint.ignore = [ "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` ] From 559d9b054d3b53db1a9897ca4571b9c5452f1e5d Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 21:21:23 +0200 Subject: [PATCH 60/75] [ruff] Add consider-merging-multiple-comparison It's long so it's formatting the pyproject.toml to avoid conflict --- pyproject.toml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5586a575..f840ad01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,13 +67,14 @@ line-length = 120 [tool.ruff] line-length = 120 lint.select = [ - "B", # bugbear - "E", # pycodestyle - "F", # pyflakes - "I", # isort - "RUF", # ruff - "UP", # pyupgrade - "W", # pycodestyle + "B", # bugbear + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "PLR1714", # Consider merging multiple comparisons + "RUF", # ruff + "UP", # pyupgrade + "W", # pycodestyle ] lint.ignore = [ "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` From 05ccb0a0b931bd9a5198445b58445d48822e7bb8 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 21:29:21 +0200 Subject: [PATCH 61/75] [ruff] Add flake8-pie, flake8-pyi, pygrep-hooks, future annotations --- pylint_django/checkers/foreign_key_strings.py | 3 ++- pylint_django/tests/test_func.py | 2 +- pyproject.toml | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index bb61b728..20b102eb 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -83,7 +83,8 @@ def open(self): import django # pylint: disable=import-outside-toplevel django.setup() - from django.apps import apps # noqa pylint: disable=import-outside-toplevel,unused-import + # pylint: disable-next=import-outside-toplevel,unused-import + from django.apps import apps # noqa: F401 except ImproperlyConfigured: # this means that Django wasn't able to configure itself using some defaults diff --git a/pylint_django/tests/test_func.py b/pylint_django/tests/test_func.py index 2c444e8f..51cfc6fc 100644 --- a/pylint_django/tests/test_func.py +++ b/pylint_django/tests/test_func.py @@ -54,7 +54,7 @@ def __init__(self, test_file): # if hasattr(test_file, 'option_file') and test_file.option_file is None: # pylint: disable=super-with-arguments # TODO Fix this and the CI (?) - super(PylintDjangoLintModuleTest, self).__init__(test_file) # noqa + super(PylintDjangoLintModuleTest, self).__init__(test_file) # noqa: UP008 self._linter.load_plugin_modules(["pylint_django"]) self._linter.load_plugin_configuration() diff --git a/pyproject.toml b/pyproject.toml index f840ad01..ca879b43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,9 +70,14 @@ lint.select = [ "B", # bugbear "E", # pycodestyle "F", # pyflakes + "FA100", # add future annotations "I", # isort + "PGH004", # pygrep-hooks - Use specific rule codes when using noqa + "PIE", # flake8-pie "PLR1714", # Consider merging multiple comparisons + "PYI", # flake8-pyi "RUF", # ruff + "T100", # flake8-debugger "UP", # pyupgrade "W", # pycodestyle ] From 12f309f2dc7d22359404e7041e4f044441652c54 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 21:35:05 +0200 Subject: [PATCH 62/75] [ruff] Activate ruff's pylint messages --- pylint_django/augmentations/__init__.py | 13 ++++++------- pylint_django/checkers/models.py | 2 +- pyproject.toml | 9 ++++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/pylint_django/augmentations/__init__.py b/pylint_django/augmentations/__init__.py index 1ff4c419..a5eef379 100644 --- a/pylint_django/augmentations/__init__.py +++ b/pylint_django/augmentations/__init__.py @@ -366,12 +366,11 @@ class ModelB(models.Model): # if this is a X_set method, that's a pretty strong signal that this is the default # Django name, rather than one set by related_name quack = True - else: - # we will - if isinstance(node.parent, Attribute): - func_name = getattr(node.parent, "attrname", None) - if func_name in MANAGER_ATTRS: - quack = True + # we will + elif isinstance(node.parent, Attribute): + func_name = getattr(node.parent, "attrname", None) + if func_name in MANAGER_ATTRS: + quack = True if quack: children = list(node.get_children()) @@ -522,7 +521,7 @@ def _attribute_is_magic(node, attrs, parents): try: for cls in node.last_child().inferred(): if isinstance(cls, Super): - cls = cls._self_class # pylint: disable=protected-access + cls = cls._self_class # pylint: disable=protected-access # noqa:PLW2901 if node_is_subclass(cls, *parents) or cls.qname() in parents: return True except InferenceError: diff --git a/pylint_django/checkers/models.py b/pylint_django/checkers/models.py index 76a6b9ff..7ff130ad 100644 --- a/pylint_django/checkers/models.py +++ b/pylint_django/checkers/models.py @@ -79,7 +79,7 @@ class ModelChecker(BaseChecker): msgs = MESSAGES @check_messages("model-missing-unicode") - def visit_classdef(self, node): + def visit_classdef(self, node): # noqa: PLR0911 """Class visitor.""" if not node_is_subclass(node, "django.db.models.base.Model", ".Model"): # we only care about models diff --git a/pyproject.toml b/pyproject.toml index ca879b43..0f254046 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,11 @@ lint.select = [ "I", # isort "PGH004", # pygrep-hooks - Use specific rule codes when using noqa "PIE", # flake8-pie + "PLC", # pylint convention + "PLE", # pylint error + "PLR", # pylint refactor "PLR1714", # Consider merging multiple comparisons + "PLW", # pylint warning "PYI", # flake8-pyi "RUF", # ruff "T100", # flake8-debugger @@ -82,7 +86,10 @@ lint.select = [ "W", # pycodestyle ] lint.ignore = [ - "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` + "PLR0912", # Too many branches, worse than C901 + "PLR0915", # Too many statements, worse than C901 + "PLR2004", # Magic value used in comparison, opinionated + "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` ] [tool.isort] From f4b1e28e460bea99418c50457812e20ee92f38a0 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Wed, 9 Oct 2024 21:59:41 +0200 Subject: [PATCH 63/75] Migrate to 'ruff' from 'black' (#443) --- .pre-commit-config.yaml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 591a18c9..f8cf0ea3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,13 +16,9 @@ repos: - id: ruff args: ["--fix"] exclude: "tests/input/" - - repo: https://github.com/psf/black - rev: 24.10.0 - hooks: - - id: black - # see https://stackoverflow.com/a/61046953 + - id: ruff-format exclude: ^pylint_django/tests/input.*$ - args: [--safe, --line-length=120] + args: [--line-length=120] - repo: https://github.com/tox-dev/pyproject-fmt rev: "2.2.4" hooks: From 93c63882bd21fedd60131cd5ab8bc80f4a62986d Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Thu, 10 Oct 2024 16:43:43 +0200 Subject: [PATCH 64/75] Add a release pipeline (#444) Also fix the changelog --- .github/workflows/release.yml | 37 +++++++++++++++++++++++++++++++++++ CHANGELOG.rst | 7 ++++++- pyproject.toml | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..806a0f35 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,37 @@ +name: Release + +on: + release: + types: + - published + +env: + DEFAULT_PYTHON: 3.12 + +jobs: + release-pypi: + name: Upload release to PyPI + runs-on: ubuntu-latest + steps: + - name: Check out code from Github + uses: actions/checkout@v2.3.4 + - name: Set up Python ${{ env.DEFAULT_PYTHON }} + id: python + uses: actions/setup-python@v2.2.2 + with: + python-version: ${{ env.DEFAULT_PYTHON }} + - name: Install requirements + run: | + python -m pip install --disable-pip-version-check -U pip twine poetry "poetry-core<1.3.0" + - name: Build distributions + run: | + poetry build -f wheel + poetry build -f sdist + - name: Upload to PyPI + if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags') + env: + TWINE_REPOSITORY: pypi + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: | + twine upload --verbose dist/* diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 25b68a47..09b7e8a1 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,7 +1,7 @@ Changelog ========= -Version 2.6.0 +Version 2.6.1 ------------- NOTICE @@ -22,6 +22,11 @@ Other - CI now tests against Django 5.1 +Version 2.6.0 (09 Oct. 2024) +---------------------------- + +Not released for lack of a release pipeline at the time the tag was created. + Version 2.5.5 (14 May 2023) --------------------------- diff --git a/pyproject.toml b/pyproject.toml index 0f254046..a98e8029 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ requires = [ "poetry-core>=1" ] [tool.poetry] name = "pylint-django" -version = "2.6.0" +version = "2.6.1" readme = "README.rst" description = "A Pylint plugin to help Pylint understand the Django web framework" repository = "https://github.com/pylint-dev/pylint-django" From 07990d6905fba9cec6d0f5fde48b197abcd34b43 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 23:27:31 +0000 Subject: [PATCH 65/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/tox-dev/pyproject-fmt: 2.2.4 → 2.3.1](https://github.com/tox-dev/pyproject-fmt/compare/2.2.4...2.3.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f8cf0ea3..53532e1a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: exclude: ^pylint_django/tests/input.*$ args: [--line-length=120] - repo: https://github.com/tox-dev/pyproject-fmt - rev: "2.2.4" + rev: "2.3.1" hooks: - id: pyproject-fmt # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version From dafaed2114d3b9fc0cac65f488b5f48519ce9127 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 23:53:11 +0000 Subject: [PATCH 66/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.9 → v0.7.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.9...v0.7.1) - [github.com/tox-dev/pyproject-fmt: 2.3.1 → v2.4.3](https://github.com/tox-dev/pyproject-fmt/compare/2.3.1...v2.4.3) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 53532e1a..986b69e9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.9" + rev: "v0.7.1" hooks: - id: ruff args: ["--fix"] @@ -20,7 +20,7 @@ repos: exclude: ^pylint_django/tests/input.*$ args: [--line-length=120] - repo: https://github.com/tox-dev/pyproject-fmt - rev: "2.3.1" + rev: "v2.4.3" hooks: - id: pyproject-fmt # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version From 85a3936127a7deaa1fed2f38574571f0fec31bb2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 23:46:46 +0000 Subject: [PATCH 67/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.1 → v0.7.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.1...v0.7.2) - [github.com/tox-dev/pyproject-fmt: v2.4.3 → v2.5.0](https://github.com/tox-dev/pyproject-fmt/compare/v2.4.3...v2.5.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 986b69e9..5f686897 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.1" + rev: "v0.7.2" hooks: - id: ruff args: ["--fix"] @@ -20,7 +20,7 @@ repos: exclude: ^pylint_django/tests/input.*$ args: [--line-length=120] - repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.4.3" + rev: "v2.5.0" hooks: - id: pyproject-fmt # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version From 6089946a75cefc55bc7cf88c42dfdaae6a9840e2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 23:22:19 +0000 Subject: [PATCH 68/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.2 → v0.8.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.2...v0.8.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5f686897..4e3a36e4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.2" + rev: "v0.8.0" hooks: - id: ruff args: ["--fix"] From 83a43dda1963b20277d335da04860d1cc4c11730 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 23:23:32 +0000 Subject: [PATCH 69/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.0 → v0.8.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.0...v0.8.3) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4e3a36e4..adf5eea8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.0" + rev: "v0.8.3" hooks: - id: ruff args: ["--fix"] From 91a977ad4db947edf3add3a018cbb10319601b46 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 23:44:32 +0000 Subject: [PATCH 70/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.3 → v0.8.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.3...v0.8.4) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index adf5eea8..7f879649 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.3" + rev: "v0.8.4" hooks: - id: ruff args: ["--fix"] From 7e485108873215dfb03ca81f1f9c718791dd3d46 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 00:57:36 +0000 Subject: [PATCH 71/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.4 → v0.8.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.4...v0.8.6) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7f879649..424cb08d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.4" + rev: "v0.8.6" hooks: - id: ruff args: ["--fix"] From 8d79ed816335be8e43141b6555897a256db939b5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 23:32:28 +0000 Subject: [PATCH 72/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.6 → v0.9.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.6...v0.9.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 424cb08d..945de229 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.6" + rev: "v0.9.1" hooks: - id: ruff args: ["--fix"] From 1a08090a5784d026c67c8ef7243336249da79897 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 20:13:52 +0000 Subject: [PATCH 73/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.1 → v0.11.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.1...v0.11.6) - [github.com/tox-dev/pyproject-fmt: v2.5.0 → v2.5.1](https://github.com/tox-dev/pyproject-fmt/compare/v2.5.0...v2.5.1) - [github.com/codespell-project/codespell: v2.3.0 → v2.4.1](https://github.com/codespell-project/codespell/compare/v2.3.0...v2.4.1) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 945de229..4a16a237 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.1" + rev: "v0.11.6" hooks: - id: ruff args: ["--fix"] @@ -20,13 +20,13 @@ repos: exclude: ^pylint_django/tests/input.*$ args: [--line-length=120] - repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.5.0" + rev: "v2.5.1" hooks: - id: pyproject-fmt # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version additional_dependencies: ["tox>=4.9"] - repo: https://github.com/codespell-project/codespell - rev: v2.3.0 + rev: v2.4.1 hooks: - id: codespell args: ["--toml=pyproject.toml"] From 8c27fe4eb54a5fd0290affe1312378a3ab11e4f2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 20:26:46 +0000 Subject: [PATCH 74/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.6 → v0.11.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.6...v0.11.13) - [github.com/tox-dev/pyproject-fmt: v2.5.1 → v2.6.0](https://github.com/tox-dev/pyproject-fmt/compare/v2.5.1...v2.6.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4a16a237..9e3112cd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.6" + rev: "v0.11.13" hooks: - id: ruff args: ["--fix"] @@ -20,7 +20,7 @@ repos: exclude: ^pylint_django/tests/input.*$ args: [--line-length=120] - repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.5.1" + rev: "v2.6.0" hooks: - id: pyproject-fmt # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version From 94c0dd1ffc9c419d835bc487c52992b6b0731e8e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 20:39:54 +0000 Subject: [PATCH 75/75] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.13 → v0.12.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.13...v0.12.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e3112cd..ba5b0e14 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: args: [--fix=lf] - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.13" + rev: "v0.12.0" hooks: - id: ruff args: ["--fix"] pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy