From 9e710085a6a4e271ab58cbc69f702c1991a5ba7f Mon Sep 17 00:00:00 2001 From: ms-gh-admin <100975654+ms-gh-admin@users.noreply.github.com> Date: Thu, 21 Jul 2022 00:42:41 -0600 Subject: [PATCH 01/37] Configure Renovate (#121) * Add renovate.json * Add renovate.json. * Fix renovate configuration. * Update renovate.json * Update renovate.json * Update renovate.json * Update renovate.json * Update renovate.json * Update renovate.json * Update renovate.json Co-authored-by: Renovate Bot Co-authored-by: Leo Kirchner --- renovate.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..86bb4aee --- /dev/null +++ b/renovate.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "baseBranches": ["develop"], + "constraints": { + "python": "3.7" + }, + "enabledManagers": ["pip_requirements", "poetry"], + "extends": [ + "config:base" + ], + "labels": [ + "dependencies" + ], + "rangeStrategy": "in-range-only" +} From 434a9e9483857bbb97251414bf29dba206217195 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Mon, 25 Jul 2022 14:08:16 +0200 Subject: [PATCH 02/37] Update renovate.json (#140) * Update renovate.json * Add renovate config validation to the CI. * Update version for renovate configuration checking action. --- .github/workflows/ci.yml | 9 +++++++++ renovate.json | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae74dd4f..1fad2df6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,15 @@ on: # yamllint disable-line rule:truthy - "push" - "pull_request" jobs: + validate_renovate: + runs-on: "ubuntu-20.04" + steps: + - name: "Check out repository code" + uses: "actions/checkout@v2" + - name: "Validate renovate configuration" + uses: "rinchsan/renovate-config-validator@v0.0.11" + with: + pattern: "renovate.json" black: runs-on: "ubuntu-20.04" env: diff --git a/renovate.json b/renovate.json index 86bb4aee..c4a04d58 100644 --- a/renovate.json +++ b/renovate.json @@ -11,5 +11,13 @@ "labels": [ "dependencies" ], + "packageRules": [ + { + "matchDepTypes": ["devDependencies"], + "matchUpdateTypes": ["patch", "minor"], + "groupName": "Update development dependencies (non-major releases)", + "schedule": ["before 5am on friday"] + } + ], "rangeStrategy": "in-range-only" } From 7a9a182d33f2d2443ef2d99e45e3c968f210c6ad Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Tue, 26 Jul 2022 15:28:41 +0200 Subject: [PATCH 03/37] Update renovate.json --- renovate.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/renovate.json b/renovate.json index c4a04d58..4c28a5e5 100644 --- a/renovate.json +++ b/renovate.json @@ -8,6 +8,9 @@ "extends": [ "config:base" ], + "constraints": { + "poetry": ">=1.1.14" + }, "labels": [ "dependencies" ], From 86a0cc726e3b0233b1917e706ad98be0209350d6 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Mon, 29 Aug 2022 08:43:55 +0200 Subject: [PATCH 04/37] Update renovate.json --- renovate.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/renovate.json b/renovate.json index 4c28a5e5..a02530e7 100644 --- a/renovate.json +++ b/renovate.json @@ -2,15 +2,13 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "baseBranches": ["develop"], "constraints": { - "python": "3.7" + "python": ">=3.7", + "poetry": ">=1.1.14" }, "enabledManagers": ["pip_requirements", "poetry"], "extends": [ "config:base" ], - "constraints": { - "poetry": ">=1.1.14" - }, "labels": [ "dependencies" ], From 7ea9cca9a41e64364cd738bb009503271b8d56ff Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Tue, 6 Sep 2022 17:25:03 +0200 Subject: [PATCH 05/37] Limit redundant CI concurrency (#149) * Limit redundant CI concurrency * Update .github/workflows/ci.yml Co-authored-by: Christian Adell Co-authored-by: Christian Adell --- .github/workflows/ci.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fad2df6..392dfe9a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,16 @@ --- name: "CI" -on: # yamllint disable-line rule:truthy - - "push" - - "pull_request" +concurrency: # Cancel any existing runs of this workflow for this same PR + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true +on: # yamllint disable + push: + branches: + - "main" + - "develop" + tags: + - "v*" + pull_request: ~ jobs: validate_renovate: runs-on: "ubuntu-20.04" From 0603123013672d053a878c3406ab24a0d7c49469 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 09:52:39 +0200 Subject: [PATCH 06/37] Update dependency colorama to v0.4.5 (#150) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 91 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 32 deletions(-) diff --git a/poetry.lock b/poetry.lock index a6e546b1..2f1f6ffe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -16,6 +16,7 @@ python-versions = ">=3.6.2" [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" @@ -48,10 +49,10 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "babel" @@ -134,7 +135,7 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -166,7 +167,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" wrapt = ">=1.10,<2" [package.extras] -dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"] +dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] [[package]] name = "dill" @@ -253,9 +254,9 @@ typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -282,10 +283,10 @@ optional = false python-versions = ">=3.6.1,<4.0" [package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" @@ -435,7 +436,7 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] [[package]] name = "py" @@ -565,7 +566,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "pytest-redislite" @@ -581,7 +582,7 @@ redislite = "*" [package.extras] build = ["bump2version"] -tests = ["redis", "types-redis", "pytest-mypy"] +tests = ["pytest-mypy", "redis", "types-redis"] [[package]] name = "pytest-structlog" @@ -641,6 +642,7 @@ python-versions = ">=3.6.0" [package.dependencies] psutil = "*" redis = "*" +setuptools = ">38.0" [[package]] name = "requests" @@ -660,6 +662,19 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +[[package]] +name = "setuptools" +version = "65.3.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "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)", "mock", "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-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 = "smmap" version = "5.0.0" @@ -705,8 +720,8 @@ sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinx-rtd-theme" @@ -721,7 +736,7 @@ docutils = "<0.18" sphinx = ">=1.6" [package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client"] [[package]] name = "sphinxcontrib-applehelp" @@ -732,7 +747,7 @@ optional = false python-versions = ">=3.5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -744,7 +759,7 @@ optional = false python-versions = ">=3.5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -756,8 +771,8 @@ optional = false python-versions = ">=3.6" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" @@ -768,7 +783,7 @@ optional = false python-versions = ">=3.5" [package.extras] -test = ["pytest", "flake8", "mypy"] +test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" @@ -779,7 +794,7 @@ optional = false python-versions = ">=3.5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -791,7 +806,7 @@ optional = false python-versions = ">=3.5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -818,9 +833,9 @@ python-versions = ">=3.6" typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -dev = ["pre-commit", "rich", "cogapp", "tomli", "coverage", "freezegun (>=0.2.8)", "pretend", "pytest-asyncio", "pytest (>=6.0)", "simplejson", "furo", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +dev = ["cogapp", "coverage[toml]", "freezegun (>=0.2.8)", "furo", "pre-commit", "pretend", "pytest (>=6.0)", "pytest-asyncio", "rich", "simplejson", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "tomli", "twisted"] docs = ["furo", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] -tests = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest-asyncio", "pytest (>=6.0)", "simplejson"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio", "simplejson"] [[package]] name = "toml" @@ -879,8 +894,8 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -902,6 +917,7 @@ python-versions = ">=3.5" [package.dependencies] pathspec = ">=0.5.3" pyyaml = "*" +setuptools = "*" [[package]] name = "zipp" @@ -912,8 +928,8 @@ optional = false python-versions = ">=3.6" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] [extras] redis = ["redis"] @@ -921,7 +937,7 @@ redis = ["redis"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "1375d15aec568b9cee37b71b40d30dfd8d268d44656146b776204f4a282aa4a8" +content-hash = "6125dec2996422d8c4a6257f9da3a3bc6ae477ff9a21580adfd3011643820f27" [metadata.files] alabaster = [ @@ -990,8 +1006,8 @@ click = [ {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] coverage = [ {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"}, @@ -1386,6 +1402,13 @@ pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -1436,6 +1459,10 @@ requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] +setuptools = [ + {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, + {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, +] smmap = [ {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, From e6f0bea6624a51809d0ce740712e986281be8f1b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:46:50 +0200 Subject: [PATCH 07/37] Update dependency yamllint to v1.28.0 (#151) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2f1f6ffe..784d3312 100644 --- a/poetry.lock +++ b/poetry.lock @@ -908,11 +908,11 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "yamllint" -version = "1.26.3" +version = "1.28.0" description = "A linter for YAML files." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] pathspec = ">=0.5.3" @@ -1628,7 +1628,7 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] yamllint = [ - {file = "yamllint-1.26.3.tar.gz", hash = "sha256:3934dcde484374596d6b52d8db412929a169f6d9e52e20f9ade5bf3523d9b96e"}, + {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, ] zipp = [ {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, From a672325fe79a609e50c54a2b533138f1b58ba9fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:47:03 +0200 Subject: [PATCH 08/37] Update dependency bandit to v1.7.4 (#152) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 784d3312..531398a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -67,11 +67,11 @@ pytz = ">=2015.7" [[package]] name = "bandit" -version = "1.7.1" +version = "1.7.4" description = "Security oriented static analyser for python code." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} @@ -79,6 +79,11 @@ GitPython = ">=1.0.1" PyYAML = ">=5.3.1" stevedore = ">=1.20.0" +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] +toml = ["toml"] +yaml = ["PyYAML"] + [[package]] name = "black" version = "22.3.0" @@ -965,8 +970,8 @@ babel = [ {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, ] bandit = [ - {file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"}, - {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"}, + {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, + {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, From 82b325719347f73511382c8f47c3a5fec8f0bc30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:47:30 +0200 Subject: [PATCH 09/37] Update dependency types-toml to v0.10.8 (#155) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 531398a1..2dc02cfb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -876,7 +876,7 @@ python-versions = "*" [[package]] name = "types-toml" -version = "0.10.7" +version = "0.10.8" description = "Typing stubs for toml" category = "dev" optional = false @@ -1555,8 +1555,8 @@ types-redis = [ {file = "types_redis-4.2.3-py3-none-any.whl", hash = "sha256:cf767df39b0e36f6ae256fb251a05f3e4ca5cb3b1ba62d7a7921855f62f68070"}, ] types-toml = [ - {file = "types-toml-0.10.7.tar.gz", hash = "sha256:a567fe2614b177d537ad99a661adc9bfc8c55a46f95e66370a4ed2dd171335f9"}, - {file = "types_toml-0.10.7-py3-none-any.whl", hash = "sha256:05a8da4bfde2f1ee60e90c7071c063b461f74c63a9c3c1099470c08d6fa58615"}, + {file = "types-toml-0.10.8.tar.gz", hash = "sha256:b7e7ea572308b1030dc86c3ba825c5210814c2825612ec679eb7814f8dd9295a"}, + {file = "types_toml-0.10.8-py3-none-any.whl", hash = "sha256:8300fd093e5829eb9c1fba69cee38130347d4b74ddf32d0a7df650ae55c2b599"}, ] typing-extensions = [ {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, From 7f24f778ae072bb9d43e6829eb94fc67af1f6569 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:48:02 +0200 Subject: [PATCH 10/37] Update dependency types-redis to v4.3.21 (#159) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2dc02cfb..16a8732a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -868,7 +868,7 @@ python-versions = ">=3.6" [[package]] name = "types-redis" -version = "4.2.3" +version = "4.3.21" description = "Typing stubs for redis" category = "dev" optional = false @@ -1551,8 +1551,8 @@ typed-ast = [ {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, ] types-redis = [ - {file = "types-redis-4.2.3.tar.gz", hash = "sha256:05fe5b38b24f4adae8d9780f90d5883066246251a41f329d5b19e3861fd8ab60"}, - {file = "types_redis-4.2.3-py3-none-any.whl", hash = "sha256:cf767df39b0e36f6ae256fb251a05f3e4ca5cb3b1ba62d7a7921855f62f68070"}, + {file = "types-redis-4.3.21.tar.gz", hash = "sha256:fd017a6733af193d14f1bb29b4ff79c0abc906e8654158d17aba457a6381afe2"}, + {file = "types_redis-4.3.21-py3-none-any.whl", hash = "sha256:cca7e17e3efb5dfdc7c9841bd5963fdd717ab68c4d2d8c6f49a9175fe2f29ce4"}, ] types-toml = [ {file = "types-toml-0.10.8.tar.gz", hash = "sha256:b7e7ea572308b1030dc86c3ba825c5210814c2825612ec679eb7814f8dd9295a"}, From 7d39a6854232f1797b00cc4a5f546fb7ad583896 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:48:42 +0200 Subject: [PATCH 11/37] Update dependency pytest to v7.1.3 (#158) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/poetry.lock b/poetry.lock index 16a8732a..ca1ddca7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -32,14 +32,6 @@ python-versions = ">=3.6" [package.dependencies] typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" version = "21.4.0" @@ -538,14 +530,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.0.1" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -957,10 +948,6 @@ async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, @@ -1380,8 +1367,8 @@ pyparsing = [ {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pytest = [ - {file = "pytest-7.0.1-py3-none-any.whl", hash = "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db"}, - {file = "pytest-7.0.1.tar.gz", hash = "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171"}, + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, ] pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, From 399050238f011c0002b6137d8ba4c0fdb902a2cb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:49:02 +0200 Subject: [PATCH 12/37] Update dependency mypy to v0.971 (#157) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/poetry.lock b/poetry.lock index ca1ddca7..8646297a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -345,7 +345,7 @@ python-versions = "*" [[package]] name = "mypy" -version = "0.950" +version = "0.971" description = "Optional static typing for Python" category = "dev" optional = false @@ -1219,29 +1219,29 @@ mistune = [ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] mypy = [ - {file = "mypy-0.950-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b"}, - {file = "mypy-0.950-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0"}, - {file = "mypy-0.950-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22"}, - {file = "mypy-0.950-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb"}, - {file = "mypy-0.950-cp310-cp310-win_amd64.whl", hash = "sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334"}, - {file = "mypy-0.950-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f"}, - {file = "mypy-0.950-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc"}, - {file = "mypy-0.950-cp36-cp36m-win_amd64.whl", hash = "sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2"}, - {file = "mypy-0.950-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed"}, - {file = "mypy-0.950-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075"}, - {file = "mypy-0.950-cp37-cp37m-win_amd64.whl", hash = "sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b"}, - {file = "mypy-0.950-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d"}, - {file = "mypy-0.950-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a"}, - {file = "mypy-0.950-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605"}, - {file = "mypy-0.950-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2"}, - {file = "mypy-0.950-cp38-cp38-win_amd64.whl", hash = "sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff"}, - {file = "mypy-0.950-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8"}, - {file = "mypy-0.950-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038"}, - {file = "mypy-0.950-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2"}, - {file = "mypy-0.950-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519"}, - {file = "mypy-0.950-cp39-cp39-win_amd64.whl", hash = "sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef"}, - {file = "mypy-0.950-py3-none-any.whl", hash = "sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb"}, - {file = "mypy-0.950.tar.gz", hash = "sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, + {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, + {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, + {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, + {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, + {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, + {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, + {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, + {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, + {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, + {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, + {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, + {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, + {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, + {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, + {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, + {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, + {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, From 5e3f27be2f509c1b8d16c6088f21be31e29a81e8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:49:14 +0200 Subject: [PATCH 13/37] Update dependency black to v22.8.0 (#156) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8646297a..f4c8f2a2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -78,7 +78,7 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "22.3.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -89,7 +89,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -961,29 +961,29 @@ bandit = [ {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, ] black = [ - {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, - {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, - {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, - {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, - {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, - {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, - {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, - {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, - {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, - {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, - {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, - {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, - {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, - {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, - {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, - {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, - {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, - {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, - {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, + {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, + {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, + {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, + {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, + {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, + {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, + {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, + {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, + {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, + {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, + {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, + {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, + {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, + {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, + {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, + {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, + {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, ] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, From 8855dfef7126c3d70c6544f2b08632b95c931ff6 Mon Sep 17 00:00:00 2001 From: itdependsnetworks Date: Fri, 14 Oct 2022 00:13:43 -0400 Subject: [PATCH 14/37] Add diagram from Glenn's blog --- README.md | 25 +++++++++++++++++++++++++ docs/images/diffsync_components.png | Bin 0 -> 58390 bytes docs/images/diffsync_diff_creation.png | Bin 0 -> 95756 bytes docs/images/diffsync_sync.png | Bin 0 -> 75657 bytes 4 files changed, 25 insertions(+) create mode 100644 docs/images/diffsync_components.png create mode 100644 docs/images/diffsync_diff_creation.png create mode 100644 docs/images/diffsync_sync.png diff --git a/README.md b/README.md index 4ac11e88..96862a55 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,31 @@ DiffSync is a utility library that can be used to compare and synchronize differ For example, it can be used to compare a list of devices from 2 inventory systems and, if required, synchronize them in either direction. +# Primary Use Cases + +DiffSync is at its most useful when you have multiple sources or sets of data to compare and/or synchronize, and especially if any of the following are true: + +- If you need to repeatedly compare or synchronize the data sets as one or both change over time. +- If you need to account for not only the creation of new records, but also changes to and deletion of existing records as well. +- If various types of data in your data set naturally form a tree-like or parent-child relationship with other data. +- If the different data sets have some attributes in common and other attributes that are exclusive to one or the other. + +# Overview of DiffSync + +DiffSync acts as an intermediate translation layer between all of the data sets you are diffing and/or syncing. In practical terms, this means that to use DiffSync, you will define a set of data models as well as the “adapters” needed to translate between each base data source and the data model. In Python terms, the adapters will be subclasses of the `DiffSync` class, and each data model class will be a subclass of the `DiffSyncModel` class. + +![Diffsync Components](./docs/images/diffsync_components.png) + +Once you have used each adapter to load each data source into a collection of data model records, you can then ask DiffSync to “diff” the two data sets, and it will produce a structured representation of the difference between them. In Python, this is accomplished by calling the `diff_to()` or `diff_from()` method on one adapter and passing the other adapter as a parameter. + +![Diffsync Diff Creation](./docs/images/diffsync_diff_creation.png) + +You can also ask DiffSync to “sync” one data set onto the other, and it will instruct your adapter as to the steps it needs to take to make sure that its data set accurately reflects the other. In Python, this is accomplished by calling the `sync_to()` or `sync_from()` method on one adapter and passing the other adapter as a parameter. + +![Diffsync Sync](./docs/images/diffsync_sync.png) + +# Simple Example + ```python A = DiffSyncSystemA() B = DiffSyncSystemB() diff --git a/docs/images/diffsync_components.png b/docs/images/diffsync_components.png new file mode 100644 index 0000000000000000000000000000000000000000..b96961a26d61d61b515213c0b0c4cb6d876b55bc GIT binary patch literal 58390 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 literal 0 HcmV?d00001 diff --git a/docs/images/diffsync_diff_creation.png b/docs/images/diffsync_diff_creation.png new file mode 100644 index 0000000000000000000000000000000000000000..5d46412f5f28aab47e942e171df535862ee8c7ea GIT binary patch literal 95756 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

`(-Vp3jkJO4-0Q3Y59b^s=ySVi+c$a*@3F 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 P0}yz+`njxgN@xNAG#KhX literal 0 HcmV?d00001 diff --git a/docs/images/diffsync_sync.png b/docs/images/diffsync_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..1afe152a573f9280fe1bac8c42caa2eaa4ef9aae GIT binary patch literal 75657 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 literal 0 HcmV?d00001 From 84cd190f2f23f9ad08f060eec3bbabed8c3b4b63 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 09:41:58 +0200 Subject: [PATCH 15/37] Update dependency mypy to v0.982 (#160) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/poetry.lock b/poetry.lock index f4c8f2a2..77a84c6e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -345,11 +345,11 @@ python-versions = "*" [[package]] name = "mypy" -version = "0.971" +version = "0.982" description = "Optional static typing for Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] mypy-extensions = ">=0.4.3" @@ -1219,29 +1219,30 @@ mistune = [ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] mypy = [ - {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, - {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, - {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, - {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, - {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, - {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, - {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, - {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, - {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, - {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, - {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, - {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, - {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, - {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, - {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, - {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, - {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, - {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, - {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, - {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, - {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, - {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, - {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, + {file = "mypy-0.982-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5085e6f442003fa915aeb0a46d4da58128da69325d8213b4b35cc7054090aed5"}, + {file = "mypy-0.982-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41fd1cf9bc0e1c19b9af13a6580ccb66c381a5ee2cf63ee5ebab747a4badeba3"}, + {file = "mypy-0.982-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f793e3dd95e166b66d50e7b63e69e58e88643d80a3dcc3bcd81368e0478b089c"}, + {file = "mypy-0.982-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ebe67adf4d021b28c3f547da6aa2cce660b57f0432617af2cca932d4d378a6"}, + {file = "mypy-0.982-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:175f292f649a3af7082fe36620369ffc4661a71005aa9f8297ea473df5772046"}, + {file = "mypy-0.982-cp310-cp310-win_amd64.whl", hash = "sha256:8ee8c2472e96beb1045e9081de8e92f295b89ac10c4109afdf3a23ad6e644f3e"}, + {file = "mypy-0.982-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58f27ebafe726a8e5ccb58d896451dd9a662a511a3188ff6a8a6a919142ecc20"}, + {file = "mypy-0.982-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6af646bd46f10d53834a8e8983e130e47d8ab2d4b7a97363e35b24e1d588947"}, + {file = "mypy-0.982-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7aeaa763c7ab86d5b66ff27f68493d672e44c8099af636d433a7f3fa5596d40"}, + {file = "mypy-0.982-cp37-cp37m-win_amd64.whl", hash = "sha256:724d36be56444f569c20a629d1d4ee0cb0ad666078d59bb84f8f887952511ca1"}, + {file = "mypy-0.982-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14d53cdd4cf93765aa747a7399f0961a365bcddf7855d9cef6306fa41de01c24"}, + {file = "mypy-0.982-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ae64555d480ad4b32a267d10cab7aec92ff44de35a7cd95b2b7cb8e64ebe3e"}, + {file = "mypy-0.982-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6389af3e204975d6658de4fb8ac16f58c14e1bacc6142fee86d1b5b26aa52bda"}, + {file = "mypy-0.982-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b35ce03a289480d6544aac85fa3674f493f323d80ea7226410ed065cd46f206"}, + {file = "mypy-0.982-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6e564f035d25c99fd2b863e13049744d96bd1947e3d3d2f16f5828864506763"}, + {file = "mypy-0.982-cp38-cp38-win_amd64.whl", hash = "sha256:cebca7fd333f90b61b3ef7f217ff75ce2e287482206ef4a8b18f32b49927b1a2"}, + {file = "mypy-0.982-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a705a93670c8b74769496280d2fe6cd59961506c64f329bb179970ff1d24f9f8"}, + {file = "mypy-0.982-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75838c649290d83a2b83a88288c1eb60fe7a05b36d46cbea9d22efc790002146"}, + {file = "mypy-0.982-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:91781eff1f3f2607519c8b0e8518aad8498af1419e8442d5d0afb108059881fc"}, + {file = "mypy-0.982-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa97b9ddd1dd9901a22a879491dbb951b5dec75c3b90032e2baa7336777363b"}, + {file = "mypy-0.982-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a692a8e7d07abe5f4b2dd32d731812a0175626a90a223d4b58f10f458747dd8a"}, + {file = "mypy-0.982-cp39-cp39-win_amd64.whl", hash = "sha256:eb7a068e503be3543c4bd329c994103874fa543c1727ba5288393c21d912d795"}, + {file = "mypy-0.982-py3-none-any.whl", hash = "sha256:1021c241e8b6e1ca5a47e4d52601274ac078a89845cfde66c6d5f769819ffa1d"}, + {file = "mypy-0.982.tar.gz", hash = "sha256:85f7a343542dc8b1ed0a888cdd34dca56462654ef23aa673907305b260b3d746"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, From 280c73d9f07db8882920fdfe53354b17b7e19148 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 09:43:35 +0200 Subject: [PATCH 16/37] Update dependency pytest-cov to v4 (#161) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 77a84c6e..2775ce92 100644 --- a/poetry.lock +++ b/poetry.lock @@ -551,7 +551,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "pytest-cov" -version = "3.0.0" +version = "4.0.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false @@ -1372,8 +1372,8 @@ pytest = [ {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, ] pytest-cov = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, + {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, + {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, ] pytest-redislite = [ {file = "pytest-redislite-0.1.0.tar.gz", hash = "sha256:087e3c33a05adebd4ced5b8f53e95375d2c57e2b235d828156c084e7e5f21a09"}, From f89466af998862a6ff3b1eb2d17e789cfd9aae1d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 09:45:40 +0200 Subject: [PATCH 17/37] Update dependency invoke to v1.7.3 (#162) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2775ce92..a55f8274 100644 --- a/poetry.lock +++ b/poetry.lock @@ -265,7 +265,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.7.1" +version = "1.7.3" description = "Pythonic task execution" category = "dev" optional = false @@ -1085,8 +1085,8 @@ iniconfig = [ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.7.1-py3-none-any.whl", hash = "sha256:2dc975b4f92be0c0a174ad2d063010c8a1fdb5e9389d69871001118b4fcac4fb"}, - {file = "invoke-1.7.1.tar.gz", hash = "sha256:7b6deaf585eee0a848205d0b8c0014b9bf6f287a8eb798818a642dff1df14b19"}, + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, From 3d606e47842ec8e9fbdc4a31248ad633c1f05c7a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 09:46:30 +0200 Subject: [PATCH 18/37] Update dependency black to v22.10.0 (#163) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/poetry.lock b/poetry.lock index a55f8274..622ab6c2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -78,11 +78,11 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "22.8.0" +version = "22.10.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" @@ -961,29 +961,18 @@ bandit = [ {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, ] black = [ - {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, - {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, - {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, - {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, - {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, - {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, - {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, - {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, - {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, - {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, - {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, - {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, - {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, - {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, - {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, - {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, - {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, - {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, - {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, From 3048fd599bd0c21f5e5bc13346a84112493bd8ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 09:47:06 +0200 Subject: [PATCH 19/37] Update dependency pylint to v2.15.4 (#165) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 622ab6c2..91cc35f3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -44,7 +44,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "babel" @@ -116,7 +116,7 @@ optional = false python-versions = ">=3.5.0" [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" @@ -281,9 +281,9 @@ python-versions = ">=3.6.1,<4.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" @@ -656,7 +656,7 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "setuptools" @@ -1610,6 +1610,7 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] yamllint = [ + {file = "yamllint-1.28.0-py2.py3-none-any.whl", hash = "sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2"}, {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, ] zipp = [ From 68597b020e963ce7c1eb313f7d94f5a427fab979 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 11:30:10 +0200 Subject: [PATCH 20/37] Update dependency m2r2 to v0.3.3 (#164) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/poetry.lock b/poetry.lock index 91cc35f3..a80221b5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -961,14 +961,23 @@ bandit = [ {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, ] black = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, From ea88dce139af907d3848b20a81a997f20e71544c Mon Sep 17 00:00:00 2001 From: Ken Celenza Date: Tue, 18 Oct 2022 03:23:53 -0400 Subject: [PATCH 21/37] Diags dev (#169) * source images from githubusercontent * update end-line for readme --- README.md | 7 ++++--- docs/source/overview/index.rst | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 96862a55..72db6f54 100644 --- a/README.md +++ b/README.md @@ -17,15 +17,16 @@ DiffSync is at its most useful when you have multiple sources or sets of data to DiffSync acts as an intermediate translation layer between all of the data sets you are diffing and/or syncing. In practical terms, this means that to use DiffSync, you will define a set of data models as well as the “adapters” needed to translate between each base data source and the data model. In Python terms, the adapters will be subclasses of the `DiffSync` class, and each data model class will be a subclass of the `DiffSyncModel` class. -![Diffsync Components](./docs/images/diffsync_components.png) +![Diffsync Components](https://raw.githubusercontent.com/networktocode/diffsync/develop/docs/images/diffsync_components.png "Diffsync Components") + Once you have used each adapter to load each data source into a collection of data model records, you can then ask DiffSync to “diff” the two data sets, and it will produce a structured representation of the difference between them. In Python, this is accomplished by calling the `diff_to()` or `diff_from()` method on one adapter and passing the other adapter as a parameter. -![Diffsync Diff Creation](./docs/images/diffsync_diff_creation.png) +![Diffsync Diff Creation](https://raw.githubusercontent.com/networktocode/diffsync/develop/docs/images/diffsync_diff_creation.png "Diffsync Diff Creation") You can also ask DiffSync to “sync” one data set onto the other, and it will instruct your adapter as to the steps it needs to take to make sure that its data set accurately reflects the other. In Python, this is accomplished by calling the `sync_to()` or `sync_from()` method on one adapter and passing the other adapter as a parameter. -![Diffsync Sync](./docs/images/diffsync_sync.png) +![Diffsync Sync](https://raw.githubusercontent.com/networktocode/diffsync/develop/docs/images/diffsync_sync.png "Diffsync Sync") # Simple Example diff --git a/docs/source/overview/index.rst b/docs/source/overview/index.rst index 89a03204..f50088df 100644 --- a/docs/source/overview/index.rst +++ b/docs/source/overview/index.rst @@ -4,4 +4,4 @@ Overview .. mdinclude:: ../../../README.md :start-line: 2 - :end-line: 25 \ No newline at end of file + :end-line: 29 \ No newline at end of file From 538b66152a4e2935817f2f1d6e75b4236c77fd27 Mon Sep 17 00:00:00 2001 From: ubaumann Date: Tue, 18 Oct 2022 09:53:26 +0200 Subject: [PATCH 22/37] Add 'skip' counter to diff.summary() (#168) * Add 'skip' to diff.summary() * Fix location of variable and comment * Update summary in example 6 * Add comment to skip callculation in diff.summary() --- diffsync/diff.py | 10 ++++++++++ diffsync/enum.py | 1 + diffsync/helpers.py | 1 + examples/06-ip-prefixes/README.md | 4 ++-- tests/unit/conftest.py | 2 ++ tests/unit/test_diff.py | 4 ++-- tests/unit/test_diffsync.py | 16 ++++++++-------- tests/unit/test_diffsync_model_flags.py | 14 +++++++------- 8 files changed, 33 insertions(+), 19 deletions(-) diff --git a/diffsync/diff.py b/diffsync/diff.py index de153cef..afeea436 100644 --- a/diffsync/diff.py +++ b/diffsync/diff.py @@ -33,6 +33,7 @@ def __init__(self): `self.children[group][unique_id] == DiffElement(...)` """ + self.models_processed = 0 def __len__(self): """Total number of DiffElements stored herein.""" @@ -115,6 +116,15 @@ def summary(self) -> Mapping[Text, int]: child_summary = child.summary() for key in summary: summary[key] += child_summary[key] + summary[DiffSyncActions.SKIP] = ( + self.models_processed + - summary[DiffSyncActions.CREATE] + # Updated elements are doubly accumulated in models_processed as they exist in SCR and DST. + - 2 * summary[DiffSyncActions.UPDATE] + - summary[DiffSyncActions.DELETE] + # 'no-change' elements are doubly accumulated in models_processed as they exist in SCR and DST. + - 2 * summary["no-change"] + ) return summary def str(self, indent: int = 0): diff --git a/diffsync/enum.py b/diffsync/enum.py index 66b4e5c7..57179c97 100644 --- a/diffsync/enum.py +++ b/diffsync/enum.py @@ -95,4 +95,5 @@ class DiffSyncActions: # pylint: disable=too-few-public-methods CREATE = "create" UPDATE = "update" DELETE = "delete" + SKIP = "skip" NO_CHANGE = None diff --git a/diffsync/helpers.py b/diffsync/helpers.py index 202875ee..4e4651a9 100644 --- a/diffsync/helpers.py +++ b/diffsync/helpers.py @@ -93,6 +93,7 @@ def calculate_diffs(self) -> Diff: self.diff.add(diff_element) self.logger.info("Diff calculation complete") + self.diff.models_processed = self.models_processed self.diff.complete() return self.diff diff --git a/examples/06-ip-prefixes/README.md b/examples/06-ip-prefixes/README.md index e1e7266b..da2aa8e4 100644 --- a/examples/06-ip-prefixes/README.md +++ b/examples/06-ip-prefixes/README.md @@ -82,7 +82,7 @@ From this `diff`, we can check the summary of what would happen. ```py >>> diff.summary() -{'create': 2, 'update': 1, 'delete': 1, 'no-change': 0} +{'create': 2, 'update': 1, 'delete': 1, 'no-change': 0, 'skip': 0} ``` And, also go into the details. We can see how the `'+'` and + `'-'` represent the actual changes in the target adapter: create, delete or update (when both symbols appear). @@ -119,5 +119,5 @@ Now, if we reload the IPAM B, and try to check the difference, we should see no >>> new_ipam_b.load() >>> diff = ipam_a.diff_to(new_ipam_b) >>> diff.summary() -{'create': 0, 'update': 0, 'delete': 0, 'no-change': 3} +{'create': 0, 'update': 0, 'delete': 0, 'no-change': 3, 'skip': 0} ``` diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index e2d3a28c..07b8fc8d 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -449,6 +449,8 @@ def diff_with_children(): address_element.add_attrs(source={"state": "NC"}, dest={"state": "NC"}) diff.add(address_element) + diff.models_processed = 8 + return diff diff --git a/tests/unit/test_diff.py b/tests/unit/test_diff.py index c74f19d5..63c63102 100644 --- a/tests/unit/test_diff.py +++ b/tests/unit/test_diff.py @@ -34,7 +34,7 @@ def test_diff_empty(): def test_diff_summary_with_no_diffs(): diff = Diff() - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 0} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 0, "skip": 0} def test_diff_str_with_no_diffs(): @@ -91,7 +91,7 @@ def test_diff_summary_with_diffs(diff_with_children): # Delete person "Sully" # Update interface "device1_eth0" # No change to address "RTP" and device "device1" - assert diff_with_children.summary() == {"create": 1, "update": 1, "delete": 1, "no-change": 2} + assert diff_with_children.summary() == {"create": 1, "update": 1, "delete": 1, "no-change": 2, "skip": 0} def test_diff_str_with_diffs(diff_with_children): diff --git a/tests/unit/test_diffsync.py b/tests/unit/test_diffsync.py index c9e1f26b..b30c2ad7 100644 --- a/tests/unit/test_diffsync.py +++ b/tests/unit/test_diffsync.py @@ -810,30 +810,30 @@ def test_diffsync_diff_with_skip_unmatched_src_flag( backend_a, backend_a_with_extra_models, backend_a_minus_some_models ): diff = backend_a.diff_from(backend_a_with_extra_models) - assert diff.summary() == {"create": 2, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 2, "update": 0, "delete": 0, "no-change": 23, "skip": 0} # SKIP_UNMATCHED_SRC should mean that extra models in the src are not flagged for creation in the dest diff = backend_a.diff_from(backend_a_with_extra_models, flags=DiffSyncFlags.SKIP_UNMATCHED_SRC) - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23, "skip": 2} # SKIP_UNMATCHED_SRC should NOT mean that extra models in the dst are not flagged for deletion in the src diff = backend_a.diff_from(backend_a_minus_some_models, flags=DiffSyncFlags.SKIP_UNMATCHED_SRC) - assert diff.summary() == {"create": 0, "update": 0, "delete": 12, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 12, "no-change": 11, "skip": 0} def test_diffsync_diff_with_skip_unmatched_dst_flag( backend_a, backend_a_with_extra_models, backend_a_minus_some_models ): diff = backend_a.diff_from(backend_a_minus_some_models) - assert diff.summary() == {"create": 0, "update": 0, "delete": 12, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 12, "no-change": 11, "skip": 0} # SKIP_UNMATCHED_DST should mean that missing models in the src are not flagged for deletion from the dest diff = backend_a.diff_from(backend_a_minus_some_models, flags=DiffSyncFlags.SKIP_UNMATCHED_DST) - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 11, "skip": 2} # SKIP_UNMATCHED_DST should NOT mean that extra models in the src are not flagged for creation in the dest diff = backend_a.diff_from(backend_a_with_extra_models, flags=DiffSyncFlags.SKIP_UNMATCHED_DST) - assert diff.summary() == {"create": 2, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 2, "update": 0, "delete": 0, "no-change": 23, "skip": 0} def test_diffsync_diff_with_skip_unmatched_both_flag( @@ -841,11 +841,11 @@ def test_diffsync_diff_with_skip_unmatched_both_flag( ): # SKIP_UNMATCHED_BOTH should mean that extra models in the src are not flagged for creation in the dest diff = backend_a.diff_from(backend_a_with_extra_models, flags=DiffSyncFlags.SKIP_UNMATCHED_BOTH) - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23, "skip": 2} # SKIP_UNMATCHED_BOTH should mean that missing models in the src are not flagged for deletion from the dest diff = backend_a.diff_from(backend_a_minus_some_models, flags=DiffSyncFlags.SKIP_UNMATCHED_BOTH) - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 11, "skip": 2} def test_diffsync_sync_with_skip_unmatched_src_flag(backend_a, backend_a_with_extra_models): diff --git a/tests/unit/test_diffsync_model_flags.py b/tests/unit/test_diffsync_model_flags.py index 6d1740cd..b7950aef 100644 --- a/tests/unit/test_diffsync_model_flags.py +++ b/tests/unit/test_diffsync_model_flags.py @@ -24,20 +24,20 @@ def test_diffsync_diff_with_skip_unmatched_src_flag_on_models(backend_a, backend_a_with_extra_models): # Validate that there are 2 extras objects out of the box diff = backend_a.diff_from(backend_a_with_extra_models) - assert diff.summary() == {"create": 2, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 2, "update": 0, "delete": 0, "no-change": 23, "skip": 0} # Check that only 1 object is affected by the flag backend_a_with_extra_models.get( backend_a_with_extra_models.site, "lax" ).model_flags |= DiffSyncModelFlags.SKIP_UNMATCHED_SRC diff = backend_a.diff_from(backend_a_with_extra_models) - assert diff.summary() == {"create": 1, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 1, "update": 0, "delete": 0, "no-change": 23, "skip": 1} backend_a_with_extra_models.get( backend_a_with_extra_models.device, "nyc-spine3" ).model_flags |= DiffSyncModelFlags.SKIP_UNMATCHED_SRC diff = backend_a.diff_from(backend_a_with_extra_models) - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23, "skip": 2} def test_diffsync_sync_with_skip_unmatched_src_flag_on_models(backend_a, backend_a_with_extra_models): @@ -58,23 +58,23 @@ def test_diffsync_sync_with_skip_unmatched_src_flag_on_models(backend_a, backend assert "nyc-spine3" not in backend_a.get(backend_a.site, "nyc").devices diff = backend_a.diff_from(backend_a_with_extra_models) - assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23} + assert diff.summary() == {"create": 0, "update": 0, "delete": 0, "no-change": 23, "skip": 2} def test_diffsync_diff_with_skip_unmatched_dst_flag_on_models(backend_a, backend_a_minus_some_models): # Validate that there are 3 extras objects out of the box diff = backend_a.diff_from(backend_a_minus_some_models) - assert diff.summary() == {"create": 0, "update": 0, "delete": 12, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 12, "no-change": 11, "skip": 0} # Check that only the device "rdu-spine1" and its 2 interfaces are affected by the flag backend_a.get(backend_a.device, "rdu-spine1").model_flags |= DiffSyncModelFlags.SKIP_UNMATCHED_DST diff = backend_a.diff_from(backend_a_minus_some_models) - assert diff.summary() == {"create": 0, "update": 0, "delete": 9, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 9, "no-change": 11, "skip": 1} # Check that only one additional device "sfo-spine2" and its 3 interfaces are affected by the flag backend_a.get(backend_a.device, "sfo-spine2").model_flags |= DiffSyncModelFlags.SKIP_UNMATCHED_DST diff = backend_a.diff_from(backend_a_minus_some_models) - assert diff.summary() == {"create": 0, "update": 0, "delete": 5, "no-change": 11} + assert diff.summary() == {"create": 0, "update": 0, "delete": 5, "no-change": 11, "skip": 2} def test_diffsync_sync_with_skip_unmatched_dst_flag_on_models(backend_a, backend_a_minus_some_models): From b2c57e28be8223ac5d7e62100e5ecc4319924ae9 Mon Sep 17 00:00:00 2001 From: Ken Celenza Date: Fri, 21 Oct 2022 10:19:35 -0400 Subject: [PATCH 23/37] Add documentation around ordering (#170) * Add documentation around ordering * update note * Update docs and add diag * Update docs/source/getting_started/01-getting-started.md Co-authored-by: Glenn Matthews Co-authored-by: Glenn Matthews --- .../images/preorder-tree-traversal.drawio.png | Bin 0 -> 50489 bytes .../getting_started/01-getting-started.md | 71 ++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 docs/images/preorder-tree-traversal.drawio.png diff --git a/docs/images/preorder-tree-traversal.drawio.png b/docs/images/preorder-tree-traversal.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..39babfb18399a4ccd938f8dd578eef0cd3a68e7e GIT binary patch literal 50489 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 literal 0 HcmV?d00001 diff --git a/docs/source/getting_started/01-getting-started.md b/docs/source/getting_started/01-getting-started.md index 61fca515..1ee7a562 100644 --- a/docs/source/getting_started/01-getting-started.md +++ b/docs/source/getting_started/01-getting-started.md @@ -56,6 +56,77 @@ class BackendA(DiffSync): It's up to the implementer to populate the `DiffSync`'s internal cache with the appropriate data. In the example below we are using the `load()` method to populate the cache but it's not mandatory, it could be done differently. +## Model Processing Ordering Logic + +The models will be processed in a specfic order as defined by `top_level` atttribute on the `DiffSync` object and then the `_children` attribute on the `DiffSyncModel`. The processing algorithm is technically a "Preorder Tree Traversal", which means that "a parent node is processed before any of its child nodes is done." This can be described as: + +- Start with the first element of the first model in `top_level` and process it. +- If that model has `_children` set on it, for each child of each child model, in order: + - Process that child element. + - If the child has has `_children` of its own, process its children, and so on until the complete end of lineage (e.g. children, children of children, etc.) + - Proceed to the next child element, or to the next model in `_children` if done with all elements of that model. +- Repeat for the next element of the top-level model, until done with all elements of that model. +- Continue to the first element of the next model in the `top_level` attribute, and repeat the process, and so on. + +Given the following Scenario: + +```python + +class Site(DiffSyncModel): + _children = {"vlan": "vlans", "prefix": "prefixes"} + [...] + +class Device(DiffSyncModel): + _children = {"interface": "interfaces"} + [...] + +class Vlan(DiffSyncModel): + [...] + +class Prefix(DiffSyncModel): + [...] + +class Interface(DiffSyncModel): + _children = {"ip_address": "ip_addresses"} + [...] + +class IPAddress(DiffSyncModel): + [...] + +class Cable(DiffSyncModel): + [...] + + +class Nautobot(DiffSync): + site = Site + device = Device + interface = Interface + ip_address = IPAddress + cable = Cable + vlan = Vlan + prefix = Prefix + + top_level = ["site", "device", "cable"] + [...] + +``` + +Would result in processing in the following order for each element until there is no elements left: + +- site + - vlan + - prefix +- device + - interface + - ip_address +- cable + +> Note: This applies to the actual diff sync (`Diffsync.sync_from/Diffsync.sync_to`), and not the loading of the data (`Diffsync.load`), which is up to the developer to determine the order. + +This can be visualized here in the included diagram. + +![Preorder Tree Traversal](../../images/preorder-tree-traversal.drawio.png "Preorder Tree Traversal") + # Store data in a `DiffSync` object To add a site to the local cache/store, you need to pass a valid `DiffSyncModel` object to the `add()` function. From e9d94575ac7e35889a24595513e62c62003e0201 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 09:38:36 +0200 Subject: [PATCH 24/37] Update dependency colorama to v0.4.6 (#172) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index a80221b5..5a712103 100644 --- a/poetry.lock +++ b/poetry.lock @@ -132,11 +132,11 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" [[package]] name = "coverage" @@ -996,8 +996,8 @@ click = [ {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] coverage = [ {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"}, From f9e4cb5010f785800cebf3aeb46c144158e9cf5d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 08:56:00 +0100 Subject: [PATCH 25/37] Update dependency pytest to v7.2.0 (#173) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5a712103..28ec7f3c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -185,6 +185,17 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "exceptiongroup" +version = "1.0.0rc9" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "flake8" version = "3.9.2" @@ -435,14 +446,6 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "pycodestyle" version = "2.7.0" @@ -530,7 +533,7 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.3" +version = "7.2.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -539,12 +542,12 @@ python-versions = ">=3.7" [package.dependencies] attrs = ">=19.2.0" 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" -py = ">=1.8.2" -tomli = ">=1.0.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] @@ -1054,6 +1057,10 @@ docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] +exceptiongroup = [ + {file = "exceptiongroup-1.0.0rc9-py3-none-any.whl", hash = "sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337"}, + {file = "exceptiongroup-1.0.0rc9.tar.gz", hash = "sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96"}, +] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, @@ -1300,10 +1307,6 @@ psutil = [ {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, ] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] pycodestyle = [ {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, @@ -1366,8 +1369,8 @@ pyparsing = [ {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, ] pytest-cov = [ {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, From 6f022dd28444c287a8cbaf546d0a340f32511b38 Mon Sep 17 00:00:00 2001 From: Ken Celenza Date: Wed, 2 Nov 2022 05:47:27 -0400 Subject: [PATCH 26/37] =?UTF-8?q?Update=20docker,=20add=20methods=20to=20l?= =?UTF-8?q?oad=20from=20dictionary,=20get=20tree=20traversa=E2=80=A6=20(#1?= =?UTF-8?q?74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update docker, add methods to load from dictionary, get tree traversal, and update docs * Apply suggestions from code review Co-authored-by: Glenn Matthews * Additional recommended updates for loop efficiency and using classmethod * update docs * mypy feedback * lock poetry Co-authored-by: Glenn Matthews --- Dockerfile | 3 + diffsync/__init__.py | 94 +- diffsync/utils.py | 48 +- .../getting_started/01-getting-started.md | 18 + poetry.lock | 823 +++++++++--------- tests/unit/test_diffsync.py | 168 +++- 6 files changed, 703 insertions(+), 451 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4be95761..faf234ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,9 @@ ARG PYTHON_VER FROM python:${PYTHON_VER}-slim +RUN apt-get update \ + && apt-get install -y --no-install-recommends build-essential + RUN pip install --upgrade pip \ && pip install poetry diff --git a/diffsync/__init__.py b/diffsync/__init__.py index 21919612..9a0dd039 100644 --- a/diffsync/__init__.py +++ b/diffsync/__init__.py @@ -20,12 +20,13 @@ from pydantic import BaseModel, PrivateAttr import structlog # type: ignore -from .diff import Diff -from .enum import DiffSyncModelFlags, DiffSyncFlags, DiffSyncStatus -from .exceptions import DiffClassMismatch, ObjectAlreadyExists, ObjectStoreWrongType, ObjectNotFound -from .helpers import DiffSyncDiffer, DiffSyncSyncer -from .store import BaseStore -from .store.local import LocalStore +from diffsync.diff import Diff +from diffsync.enum import DiffSyncModelFlags, DiffSyncFlags, DiffSyncStatus +from diffsync.exceptions import DiffClassMismatch, ObjectAlreadyExists, ObjectStoreWrongType, ObjectNotFound +from diffsync.helpers import DiffSyncDiffer, DiffSyncSyncer +from diffsync.store import BaseStore +from diffsync.store.local import LocalStore +from diffsync.utils import get_path, set_key, tree_string class DiffSyncModel(BaseModel): @@ -396,7 +397,7 @@ def remove_child(self, child: "DiffSyncModel"): childs.remove(child.get_unique_id()) -class DiffSync: +class DiffSync: # pylint: disable=too-many-public-methods """Class for storing a group of DiffSyncModel instances and diffing/synchronizing to another DiffSync instance.""" # In any subclass, you would add mapping of names to specific model classes here: @@ -460,6 +461,26 @@ def __len__(self): """Total number of elements stored.""" return self.store.count() + @classmethod + def _get_initial_value_order(cls) -> List[str]: + """Get the initial value order of diffsync object. + + Returns: + List of model-referencing attribute names in the order they are initially processed. + """ + if hasattr(cls, "top_level") and isinstance(getattr(cls, "top_level"), list): + value_order = cls.top_level.copy() + else: + value_order = [] + + for item in dir(cls): + _method = getattr(cls, item) + if item in value_order: + continue + if isclass(_method) and issubclass(_method, DiffSyncModel): + value_order.append(item) + return value_order + def load(self): """Load all desired data from whatever backend data source into this instance.""" # No-op in this generic class @@ -489,6 +510,18 @@ def str(self, indent: int = 0) -> str: output += "\n" + model.str(indent=indent + 2) return output + def load_from_dict(self, data: Dict): + """The reverse of `dict` method, taking a dictionary and loading into the inventory. + + Args: + data: Dictionary in the format that `dict` would export as + """ + value_order = self._get_initial_value_order() + for field_name in value_order: + model_class = getattr(self, field_name) + for values in data.get(field_name, {}).values(): + self.add(model_class(**values)) + # ------------------------------------------------------------------------------ # Synchronization between DiffSync instances # ------------------------------------------------------------------------------ @@ -625,7 +658,6 @@ def get_all_model_names(self): def get( self, obj: Union[Text, DiffSyncModel, Type[DiffSyncModel]], identifier: Union[Text, Mapping] ) -> DiffSyncModel: - """Get one object from the data store based on its unique id. Args: @@ -638,6 +670,26 @@ def get( """ return self.store.get(model=obj, identifier=identifier) + def get_or_none( + self, obj: Union[Text, DiffSyncModel, Type[DiffSyncModel]], identifier: Union[Text, Mapping] + ) -> Optional[DiffSyncModel]: + """Get one object from the data store based on its unique id or get a None + + Args: + obj: DiffSyncModel class or instance, or modelname string, that defines the type of the object to retrieve + identifier: Unique ID of the object to retrieve, or dict of unique identifier keys/values + + Raises: + ValueError: if obj is a str and identifier is a dict (can't convert dict into a uid str without a model class) + + Returns: + DiffSyncModel matching provided criteria + """ + try: + return self.get(obj, identifier) + except ObjectNotFound: + return None + def get_all(self, obj: Union[Text, DiffSyncModel, Type[DiffSyncModel]]) -> List[DiffSyncModel]: """Get all objects of a given type. @@ -663,6 +715,32 @@ def get_by_uids( """ return self.store.get_by_uids(uids=uids, model=obj) + @classmethod + def get_tree_traversal(cls, as_dict: bool = False) -> Union[Text, Mapping]: + """Get a string describing the tree traversal for the diffsync object. + + Args: + as_dict: Whether or not to return as a dictionary + + Returns: + A string or dictionary representation of tree + """ + value_order = cls._get_initial_value_order() + output_dict: Dict = {} + for key in value_order: + model_obj = getattr(cls, key) + if not get_path(output_dict, key): + set_key(output_dict, [key]) + if hasattr(model_obj, "_children"): + children = getattr(model_obj, "_children") + for child_key in list(children.keys()): + path = get_path(output_dict, key) or [key] + path.append(child_key) + set_key(output_dict, path) + if as_dict: + return output_dict + return tree_string(output_dict, cls.__name__) + def add(self, obj: DiffSyncModel): """Add a DiffSyncModel object to the store. diff --git a/diffsync/utils.py b/diffsync/utils.py index e74ea198..94b0aa94 100644 --- a/diffsync/utils.py +++ b/diffsync/utils.py @@ -16,7 +16,12 @@ """ from collections import OrderedDict -from typing import List +from typing import Iterator, List, Dict, Optional + +SPACE = " " +BRANCH = "│ " +TEE = "├── " +LAST = "└── " def intersection(lst1, lst2) -> List: @@ -42,3 +47,44 @@ def __missing__(self, key): """When trying to access a nonexistent key, initialize the key value based on the internal factory.""" self[key] = value = self.factory() return value + + +# from: https://stackoverflow.com/questions/72618673/list-directory-tree-structure-in-python-from-a-list-of-path-file +def _tree(data: Dict, prefix: str = "") -> Iterator[str]: + """Given a dictionary will yield a visual tree structure. + + A recursive generator, given a dictionary will yield a visual tree structure line by line + with each line prefixed by the same characters. + """ + # contents each get pointers that are ├── with a final └── : + pointers = [TEE] * (len(data) - 1) + [LAST] + for pointer, path in zip(pointers, data): + yield prefix + pointer + path + if isinstance(data[path], dict): # extend the prefix and recurse: + extension = BRANCH if pointer == TEE else SPACE + # i.e. SPACE because LAST, └── , above so no more | + yield from _tree(data[path], prefix=prefix + extension) + + +def tree_string(data: Dict, root: str) -> str: + """String wrapper around `_tree` function to add header and provide tree view of a dictionary.""" + return "\n".join([root, *_tree(data)]) + + +def set_key(data: Dict, keys: List): + """Set a nested dictionary key given a list of keys.""" + current_level = data + for key in keys: + current_level = current_level.setdefault(key, {}) + + +def get_path(nested_dict: Dict, search_value: str) -> Optional[List]: + """Find the path of keys in a dictionary, given a single unique value.""" + for key in nested_dict.keys(): + if key == search_value: + return [key] + if isinstance(nested_dict[key], dict): + path = get_path(nested_dict[key], search_value) + if path is not None: + return [key] + path + return None diff --git a/docs/source/getting_started/01-getting-started.md b/docs/source/getting_started/01-getting-started.md index 1ee7a562..6f0cc0f8 100644 --- a/docs/source/getting_started/01-getting-started.md +++ b/docs/source/getting_started/01-getting-started.md @@ -127,6 +127,24 @@ This can be visualized here in the included diagram. ![Preorder Tree Traversal](../../images/preorder-tree-traversal.drawio.png "Preorder Tree Traversal") +### Mapping Tree Traversal with `get_tree_traversal` method + +For your convenience, there is a helper method that will provide a mapping of the order. The `DiffSync.get_tree_traversal()` class method will return a tree-like string, or optionally a dictionary when passing the `as_dict=True` parameter. + +```python +>>> from nautobot_device_onboarding.network_importer.adapters.network_device.adapter import NetworkImporterAdapter +>>> print(NetworkImporterAdapter.get_tree_traversal()) +NetworkImporterAdapter +├── status +├── site +│ ├── vlan +│ └── prefix +└── device + └── interface + └── ip_address +>>> +``` + # Store data in a `DiffSync` object To add a site to the local cache/store, you need to pass a valid `DiffSyncModel` object to the `add()` function. diff --git a/poetry.lock b/poetry.lock index 28ec7f3c..eebb1a8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8,7 +8,7 @@ python-versions = "*" [[package]] name = "astroid" -version = "2.11.5" +version = "2.11.7" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false @@ -34,21 +34,21 @@ typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.10.1" +version = "2.11.0" description = "Internationalization utilities" category = "dev" optional = false @@ -101,30 +101,30 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode-backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -140,7 +140,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 [[package]] name = "coverage" -version = "6.4.1" +version = "6.5.0" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -168,26 +168,26 @@ dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version [[package]] name = "dill" -version = "0.3.4" +version = "0.3.6" description = "serialize all of python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*" +python-versions = ">=3.7" [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] name = "docutils" -version = "0.17.1" +version = "0.19" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [[package]] name = "exceptiongroup" -version = "1.0.0rc9" +version = "1.0.0" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false @@ -198,17 +198,17 @@ test = ["pytest (>=6)"] [[package]] name = "flake8" -version = "3.9.2" +version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6.1" [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "gitdb" @@ -223,19 +223,19 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.20" -description = "Python Git Library" +version = "3.1.29" +description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -243,7 +243,7 @@ python-versions = ">=3.5" [[package]] name = "imagesize" -version = "1.3.0" +version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" optional = false @@ -251,7 +251,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.8.3" +version = "4.2.0" description = "Read metadata from Python packages" category = "main" optional = false @@ -263,8 +263,7 @@ zipp = ">=0.5" [package.extras] docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] [[package]] name = "iniconfig" @@ -298,11 +297,11 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -312,39 +311,39 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "lazy-object-proxy" -version = "1.7.1" +version = "1.8.0" description = "A fast and thorough lazy object proxy." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "m2r2" -version = "0.3.2" +version = "0.3.3" description = "Markdown and reStructuredText in a single file." category = "dev" optional = false python-versions = "*" [package.dependencies] -docutils = "*" +docutils = ">=0.19" mistune = "0.8.4" [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mccabe" -version = "0.6.1" +version = "0.7.0" description = "McCabe checker, plugin for flake8" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "mistune" @@ -394,15 +393,15 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "pbr" -version = "5.9.0" +version = "5.11.0" description = "Python Build Reasonableness" category = "dev" optional = false @@ -410,14 +409,14 @@ python-versions = ">=2.6" [[package]] name = "platformdirs" -version = "2.4.0" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] @@ -437,33 +436,33 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "psutil" -version = "5.9.0" +version = "5.9.3" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.9.1" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [[package]] name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" +version = "1.10.2" +description = "Data validation and settings management using python type hints" category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] -typing-extensions = ">=3.7.4.3" +typing-extensions = ">=4.1.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -485,20 +484,23 @@ toml = ["toml"] [[package]] name = "pyflakes" -version = "2.3.1" +version = "2.5.0" description = "passive checker of Python programs" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [[package]] name = "pygments" -version = "2.12.0" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pylint" version = "2.13.9" @@ -522,11 +524,11 @@ testutil = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -597,7 +599,7 @@ structlog = "*" [[package]] name = "pytz" -version = "2022.1" +version = "2022.6" description = "World timezone definitions, modern and historical" category = "dev" optional = false @@ -613,7 +615,7 @@ python-versions = ">=3.6" [[package]] name = "redis" -version = "4.3.1" +version = "4.3.4" description = "Python client for Redis database and key-value store" category = "main" optional = false @@ -632,11 +634,11 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "redislite" -version = "6.0.674960" +version = "6.2.805324" description = "Redis built into a python package" category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" [package.dependencies] psutil = "*" @@ -645,32 +647,32 @@ setuptools = ">38.0" [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "65.3.0" +version = "65.5.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +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-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)", "mock", "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-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"] @@ -692,47 +694,46 @@ python-versions = "*" [[package]] name = "sphinx" -version = "4.5.0" +version = "3.5.3" description = "Python documentation generator" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=1.3" colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" +docutils = ">=0.12" imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} Jinja2 = ">=2.3" packaging = "*" Pygments = ">=2.0" requests = ">=2.5.0" +setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-htmlhelp = "*" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.800)"] test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinx-rtd-theme" -version = "1.0.0" +version = "0.5.1" description = "Read the Docs theme for Sphinx" category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = "*" [package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" +sphinx = "*" [package.extras] dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client"] @@ -810,7 +811,7 @@ test = ["pytest"] [[package]] name = "stevedore" -version = "3.5.0" +version = "3.5.2" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false @@ -846,15 +847,15 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "typed-ast" -version = "1.5.3" +version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -862,7 +863,7 @@ python-versions = ">=3.6" [[package]] name = "types-redis" -version = "4.3.21" +version = "4.3.21.3" description = "Typing stubs for redis" category = "dev" optional = false @@ -878,23 +879,23 @@ python-versions = "*" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.12" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -920,15 +921,15 @@ setuptools = "*" [[package]] name = "zipp" -version = "3.6.0" +version = "3.10.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "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] redis = ["redis"] @@ -944,20 +945,20 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] astroid = [ - {file = "astroid-2.11.5-py3-none-any.whl", hash = "sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b"}, - {file = "astroid-2.11.5.tar.gz", hash = "sha256:f4e4ec5294c4b07ac38bab9ca5ddd3914d4bf46f9006eb5c0ae755755061044e"}, + {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, + {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, ] async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] babel = [ - {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, - {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, + {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, + {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, ] bandit = [ {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, @@ -987,103 +988,112 @@ black = [ {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] coverage = [ - {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"}, - {file = "coverage-6.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ce1b258493cbf8aec43e9b50d89982346b98e9ffdfaae8ae5793bc112fb0068"}, - {file = "coverage-6.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c4e737f60c6936460c5be330d296dd5b48b3963f48634c53b3f7deb0f34ec4"}, - {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84e65ef149028516c6d64461b95a8dbcfce95cfd5b9eb634320596173332ea84"}, - {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f69718750eaae75efe506406c490d6fc5a6161d047206cc63ce25527e8a3adad"}, - {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e57816f8ffe46b1df8f12e1b348f06d164fd5219beba7d9433ba79608ef011cc"}, - {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:01c5615d13f3dd3aa8543afc069e5319cfa0c7d712f6e04b920431e5c564a749"}, - {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ab269400706fab15981fd4bd5080c56bd5cc07c3bccb86aab5e1d5a88dc8f4"}, - {file = "coverage-6.4.1-cp310-cp310-win32.whl", hash = "sha256:a7f3049243783df2e6cc6deafc49ea123522b59f464831476d3d1448e30d72df"}, - {file = "coverage-6.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2ddcac99b2d2aec413e36d7a429ae9ebcadf912946b13ffa88e7d4c9b712d6"}, - {file = "coverage-6.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb73e0011b8793c053bfa85e53129ba5f0250fdc0392c1591fd35d915ec75c46"}, - {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106c16dfe494de3193ec55cac9640dd039b66e196e4641fa8ac396181578b982"}, - {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f4f3df85aa39da00fd3ec4b5abeb7407e82b68c7c5ad181308b0e2526da5d4"}, - {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:961e2fb0680b4f5ad63234e0bf55dfb90d302740ae9c7ed0120677a94a1590cb"}, - {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cec3a0f75c8f1031825e19cd86ee787e87cf03e4fd2865c79c057092e69e3a3b"}, - {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:129cd05ba6f0d08a766d942a9ed4b29283aff7b2cccf5b7ce279d50796860bb3"}, - {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bf5601c33213d3cb19d17a796f8a14a9eaa5e87629a53979a5981e3e3ae166f6"}, - {file = "coverage-6.4.1-cp37-cp37m-win32.whl", hash = "sha256:269eaa2c20a13a5bf17558d4dc91a8d078c4fa1872f25303dddcbba3a813085e"}, - {file = "coverage-6.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f02cbbf8119db68455b9d763f2f8737bb7db7e43720afa07d8eb1604e5c5ae28"}, - {file = "coverage-6.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ffa9297c3a453fba4717d06df579af42ab9a28022444cae7fa605af4df612d54"}, - {file = "coverage-6.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:145f296d00441ca703a659e8f3eb48ae39fb083baba2d7ce4482fb2723e050d9"}, - {file = "coverage-6.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d44996140af8b84284e5e7d398e589574b376fb4de8ccd28d82ad8e3bea13"}, - {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bd9a6fc18aab8d2e18f89b7ff91c0f34ff4d5e0ba0b33e989b3cd4194c81fd9"}, - {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3384f2a3652cef289e38100f2d037956194a837221edd520a7ee5b42d00cc605"}, - {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b3e07152b4563722be523e8cd0b209e0d1a373022cfbde395ebb6575bf6790d"}, - {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1480ff858b4113db2718848d7b2d1b75bc79895a9c22e76a221b9d8d62496428"}, - {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:865d69ae811a392f4d06bde506d531f6a28a00af36f5c8649684a9e5e4a85c83"}, - {file = "coverage-6.4.1-cp38-cp38-win32.whl", hash = "sha256:664a47ce62fe4bef9e2d2c430306e1428ecea207ffd68649e3b942fa8ea83b0b"}, - {file = "coverage-6.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:26dff09fb0d82693ba9e6231248641d60ba606150d02ed45110f9ec26404ed1c"}, - {file = "coverage-6.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9c80df769f5ec05ad21ea34be7458d1dc51ff1fb4b2219e77fe24edf462d6df"}, - {file = "coverage-6.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39ee53946bf009788108b4dd2894bf1349b4e0ca18c2016ffa7d26ce46b8f10d"}, - {file = "coverage-6.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b66caa62922531059bc5ac04f836860412f7f88d38a476eda0a6f11d4724f4"}, - {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd180ed867e289964404051a958f7cccabdeed423f91a899829264bb7974d3d3"}, - {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3"}, - {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8c08da0bd238f2970230c2a0d28ff0e99961598cb2e810245d7fc5afcf1254e8"}, - {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d42c549a8f41dc103a8004b9f0c433e2086add8a719da00e246e17cbe4056f72"}, - {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:309ce4a522ed5fca432af4ebe0f32b21d6d7ccbb0f5fcc99290e71feba67c264"}, - {file = "coverage-6.4.1-cp39-cp39-win32.whl", hash = "sha256:fdb6f7bd51c2d1714cea40718f6149ad9be6a2ee7d93b19e9f00934c0f2a74d9"}, - {file = "coverage-6.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:342d4aefd1c3e7f620a13f4fe563154d808b69cccef415415aece4c786665397"}, - {file = "coverage-6.4.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:4803e7ccf93230accb928f3a68f00ffa80a88213af98ed338a57ad021ef06815"}, - {file = "coverage-6.4.1.tar.gz", hash = "sha256:4321f075095a096e70aff1d002030ee612b65a205a0a0f5b815280d5dc58100c"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, ] deprecated = [ {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, ] dill = [ - {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, - {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, ] docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] exceptiongroup = [ - {file = "exceptiongroup-1.0.0rc9-py3-none-any.whl", hash = "sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337"}, - {file = "exceptiongroup-1.0.0rc9.tar.gz", hash = "sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96"}, + {file = "exceptiongroup-1.0.0-py3-none-any.whl", hash = "sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41"}, + {file = "exceptiongroup-1.0.0.tar.gz", hash = "sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad"}, ] flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, ] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] gitpython = [ - {file = "GitPython-3.1.20-py3-none-any.whl", hash = "sha256:b1e1c269deab1b08ce65403cf14e10d2ef1f6c89e33ea7c5e5bb0222ea593b8a"}, - {file = "GitPython-3.1.20.tar.gz", hash = "sha256:df0e072a200703a65387b0cfdf0466e3bab729c0458cf6b7349d0e9877636519"}, + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.8.3-py3-none-any.whl", hash = "sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e"}, - {file = "importlib_metadata-4.8.3.tar.gz", hash = "sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668"}, + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1098,126 +1108,79 @@ isort = [ {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] lazy-object-proxy = [ - {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, - {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, + {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, + {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, + {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, + {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, ] m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, + {file = "m2r2-0.3.3-py3-none-any.whl", hash = "sha256:2ee32a5928c3598b67c70e6d22981ec936c03d5bfd2f64229e77678731952f16"}, + {file = "m2r2-0.3.3.tar.gz", hash = "sha256:f9b6e9efbc2b6987dbd43d2fd15a6d115ba837d8158ae73295542635b4086e75"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] mistune = [ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, @@ -1258,115 +1221,120 @@ packaging = [ {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] pbr = [ - {file = "pbr-5.9.0-py2.py3-none-any.whl", hash = "sha256:e547125940bcc052856ded43be8e101f63828c2d94239ffbe2b327ba3d5ccf0a"}, - {file = "pbr-5.9.0.tar.gz", hash = "sha256:e8dca2f4b43560edef58813969f52a56cef023146cbb8931626db80e6c1c4308"}, + {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"}, + {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"}, ] platformdirs = [ - {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, - {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] psutil = [ - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, - {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, - {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, - {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, - {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, - {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, - {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, - {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, - {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, - {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, - {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, - {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, - {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, - {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, - {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, - {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, - {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, - {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, - {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, + {file = "psutil-5.9.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b4a247cd3feaae39bb6085fcebf35b3b8ecd9b022db796d89c8f05067ca28e71"}, + {file = "psutil-5.9.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5fa88e3d5d0b480602553d362c4b33a63e0c40bfea7312a7bf78799e01e0810b"}, + {file = "psutil-5.9.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:767ef4fa33acda16703725c0473a91e1832d296c37c63896c7153ba81698f1ab"}, + {file = "psutil-5.9.3-cp27-cp27m-win32.whl", hash = "sha256:9a4af6ed1094f867834f5f07acd1250605a0874169a5fcadbcec864aec2496a6"}, + {file = "psutil-5.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:fa5e32c7d9b60b2528108ade2929b115167fe98d59f89555574715054f50fa31"}, + {file = "psutil-5.9.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:fe79b4ad4836e3da6c4650cb85a663b3a51aef22e1a829c384e18fae87e5e727"}, + {file = "psutil-5.9.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:db8e62016add2235cc87fb7ea000ede9e4ca0aa1f221b40cef049d02d5d2593d"}, + {file = "psutil-5.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:941a6c2c591da455d760121b44097781bc970be40e0e43081b9139da485ad5b7"}, + {file = "psutil-5.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71b1206e7909792d16933a0d2c1c7f04ae196186c51ba8567abae1d041f06dcb"}, + {file = "psutil-5.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f57d63a2b5beaf797b87024d018772439f9d3103a395627b77d17a8d72009543"}, + {file = "psutil-5.9.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7507f6c7b0262d3e7b0eeda15045bf5881f4ada70473b87bc7b7c93b992a7d7"}, + {file = "psutil-5.9.3-cp310-cp310-win32.whl", hash = "sha256:1b540599481c73408f6b392cdffef5b01e8ff7a2ac8caae0a91b8222e88e8f1e"}, + {file = "psutil-5.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:547ebb02031fdada635452250ff39942db8310b5c4a8102dfe9384ee5791e650"}, + {file = "psutil-5.9.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d8c3cc6bb76492133474e130a12351a325336c01c96a24aae731abf5a47fe088"}, + {file = "psutil-5.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d880053c6461c9b89cd5d4808f3b8336665fa3acdefd6777662c5ed73a851a"}, + {file = "psutil-5.9.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8b50241dd3c2ed498507f87a6602825073c07f3b7e9560c58411c14fe1e1c9"}, + {file = "psutil-5.9.3-cp36-cp36m-win32.whl", hash = "sha256:828c9dc9478b34ab96be75c81942d8df0c2bb49edbb481f597314d92b6441d89"}, + {file = "psutil-5.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:ed15edb14f52925869250b1375f0ff58ca5c4fa8adefe4883cfb0737d32f5c02"}, + {file = "psutil-5.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d266cd05bd4a95ca1c2b9b5aac50d249cf7c94a542f47e0b22928ddf8b80d1ef"}, + {file = "psutil-5.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e4939ff75149b67aef77980409f156f0082fa36accc475d45c705bb00c6c16a"}, + {file = "psutil-5.9.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68fa227c32240c52982cb931801c5707a7f96dd8927f9102d6c7771ea1ff5698"}, + {file = "psutil-5.9.3-cp37-cp37m-win32.whl", hash = "sha256:beb57d8a1ca0ae0eb3d08ccaceb77e1a6d93606f0e1754f0d60a6ebd5c288837"}, + {file = "psutil-5.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:12500d761ac091f2426567f19f95fd3f15a197d96befb44a5c1e3cbe6db5752c"}, + {file = "psutil-5.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba38cf9984d5462b506e239cf4bc24e84ead4b1d71a3be35e66dad0d13ded7c1"}, + {file = "psutil-5.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46907fa62acaac364fff0b8a9da7b360265d217e4fdeaca0a2397a6883dffba2"}, + {file = "psutil-5.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a04a1836894c8279e5e0a0127c0db8e198ca133d28be8a2a72b4db16f6cf99c1"}, + {file = "psutil-5.9.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a4e07611997acf178ad13b842377e3d8e9d0a5bac43ece9bfc22a96735d9a4f"}, + {file = "psutil-5.9.3-cp38-cp38-win32.whl", hash = "sha256:6ced1ad823ecfa7d3ce26fe8aa4996e2e53fb49b7fed8ad81c80958501ec0619"}, + {file = "psutil-5.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35feafe232d1aaf35d51bd42790cbccb882456f9f18cdc411532902370d660df"}, + {file = "psutil-5.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:538fcf6ae856b5e12d13d7da25ad67f02113c96f5989e6ad44422cb5994ca7fc"}, + {file = "psutil-5.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a3d81165b8474087bb90ec4f333a638ccfd1d69d34a9b4a1a7eaac06648f9fbe"}, + {file = "psutil-5.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a7826e68b0cf4ce2c1ee385d64eab7d70e3133171376cac53d7c1790357ec8f"}, + {file = "psutil-5.9.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ec296f565191f89c48f33d9544d8d82b0d2af7dd7d2d4e6319f27a818f8d1cc"}, + {file = "psutil-5.9.3-cp39-cp39-win32.whl", hash = "sha256:9ec95df684583b5596c82bb380c53a603bb051cf019d5c849c47e117c5064395"}, + {file = "psutil-5.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4bd4854f0c83aa84a5a40d3b5d0eb1f3c128f4146371e03baed4589fe4f3c931"}, + {file = "psutil-5.9.3.tar.gz", hash = "sha256:7ccfcdfea4fc4b0a02ca2c31de7fcd186beb9cff8207800e14ab66f79c773af6"}, ] pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, ] pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, ] pydocstyle = [ {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, ] pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pylint = [ {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, ] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, @@ -1385,8 +1353,8 @@ pytest-structlog = [ {file = "pytest_structlog-0.5-py2.py3-none-any.whl", hash = "sha256:057c9e6b20cedc10071b65623e6dc9af4a025e5a13d73defa992da465e32ac22"}, ] pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, + {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, + {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -1431,31 +1399,34 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] redis = [ - {file = "redis-4.3.1-py3-none-any.whl", hash = "sha256:84316970995a7adb907a56754d2b92d88fc2d252963dc5ac34c88f0f1a22c25d"}, - {file = "redis-4.3.1.tar.gz", hash = "sha256:94b617b4cd296e94991146f66fc5559756fbefe9493604f0312e4d3298ac63e9"}, + {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, + {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, ] redislite = [ - {file = "redislite-6.0.674960-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:24c02a9b644d3397616989d93175a8b4c9940fbafe3a6b244c1513e0778c99d9"}, - {file = "redislite-6.0.674960-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:c75a09b26ef05335e7276f416352f1af0db57e80cff25fe8aac38b92fffd0215"}, - {file = "redislite-6.0.674960-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:f27402586a9639b66aeb59189e44d027065a71c7c01e56b701be865de8406fe8"}, - {file = "redislite-6.0.674960-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ab26ec837b0c1a744e58288e2986c48b0c18773071efba5072117640e3795bd3"}, - {file = "redislite-6.0.674960-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:937e4a200402590b02aff537a6327322162f02c0b8bf359e063ed680dc4f8bd3"}, - {file = "redislite-6.0.674960-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:170eb1353e3ea56c58d58019029eb4797a24a4b9996dc8a8df2f774b66e54803"}, - {file = "redislite-6.0.674960-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:10551f3c3acbb45e6b398120f4586d02cbf0a1499ede06b7817be6111c645089"}, - {file = "redislite-6.0.674960-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:9859ca5d24bb0594a61c3cba87f62ec46934e3f539bb8cab373c53bcdb6f0a97"}, - {file = "redislite-6.0.674960-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:66c927fae6df8e40d2f5ff16d47f3f4708ee62a37562394ebc18bacf8c99c034"}, - {file = "redislite-6.0.674960-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:472abdf314ca20ba72e33864fd52405a8679a15433069180fba6c5baa3566918"}, - {file = "redislite-6.0.674960-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:50e6c92dd07bc65dc64658b6bae2959d23e9e1ac85bfdb8214aab3ac8b30e807"}, - {file = "redislite-6.0.674960-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:1ea50ae4da7ca65e618b5103bde77e0d27c0458c619a6c2f57d3069c04c2c5b3"}, - {file = "redislite-6.0.674960.tar.gz", hash = "sha256:6ffc1c2233d5ca036f907e521ca8e0e0d5ce9957357e18de997332b4978357de"}, + {file = "redislite-6.2.805324-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0f0642a5a6b79d086260e2ce42a95744dc5e5339f571ac149705730de8f68be9"}, + {file = "redislite-6.2.805324-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6abef5810940eca315b8c90f45b0ebda8e76c0a0ea6e9f606b8166f01a082b1"}, + {file = "redislite-6.2.805324-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0b3f202cee43bda332f97615ecf4a7c3b2b91c9ab28abf0494a21f6829d19101"}, + {file = "redislite-6.2.805324-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a704fdfb74b4b1711f86b98deeb0627ed7bbdf21653e48146d9369cda2fc40c4"}, + {file = "redislite-6.2.805324-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:09989c29788e2a4ab0c946869582451f6a46b4099a17482560d990250ffad696"}, + {file = "redislite-6.2.805324-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ad793d9b45d2e77d36753b695391c1a9e77a84b1782f7ea5d42fb5af3bbe86a"}, + {file = "redislite-6.2.805324-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ba35f7600d119a1db1cbae77c0591b8e0feb351689117c68c23bc5f34d3442af"}, + {file = "redislite-6.2.805324-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4904fe27211637c17dd98b4547cc6de4cacf231b394b5174d7acca38409db5c4"}, + {file = "redislite-6.2.805324-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bdd673e51b42d515b273518c4670d2d94d54542baa67b2d4c8951e47e05cd349"}, + {file = "redislite-6.2.805324-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbb1433b4a2d88889b550bd08c6885a58446d204c6ee031a5a2fdee83620f46"}, + {file = "redislite-6.2.805324-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:79f4540aa4c5f6cd85370a504b6610ef6995775307389559ad4001f61949c229"}, + {file = "redislite-6.2.805324-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:731b6d239f67f8fc9e3d801dca26269291b94be772c37bc2b65a884c9d79138e"}, + {file = "redislite-6.2.805324-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4640ed4533c176b3b1fab4592af39d3fab6423843c7634b6b5aba980dfc5d578"}, + {file = "redislite-6.2.805324-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e86ef58c491a6dc0c04fad86c286bb43edc128b26006ef90b2b49ed1d38e089"}, + {file = "redislite-6.2.805324-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7723317952715b7fa5e21d14ef3cf4d5a18f43f828e04b39712fa8d13d2274ff"}, + {file = "redislite-6.2.805324.tar.gz", hash = "sha256:603b28bcdfdbe45edfe0046dc99b0fcbe3d5c533d1b7e5d9c3ff6208a656e7f1"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] setuptools = [ - {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, - {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, + {file = "setuptools-65.5.0-py3-none-any.whl", hash = "sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356"}, + {file = "setuptools-65.5.0.tar.gz", hash = "sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17"}, ] smmap = [ {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, @@ -1466,12 +1437,12 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, + {file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, + {file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, ] sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, + {file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, + {file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, ] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, @@ -1498,8 +1469,8 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] stevedore = [ - {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"}, - {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"}, + {file = "stevedore-3.5.2-py3-none-any.whl", hash = "sha256:fa2630e3d0ad3e22d4914aff2501445815b9a4467a6edc49387c667a38faf5bf"}, + {file = "stevedore-3.5.2.tar.gz", hash = "sha256:cf99f41fc0d5a4f185ca4d3d42b03be9011b0a1ec1a4ea1a282be1b4b306dcc2"}, ] structlog = [ {file = "structlog-21.5.0-py3-none-any.whl", hash = "sha256:fd7922e195262b337da85c2a91c84be94ccab1f8fd1957bd6986f6904e3761c8"}, @@ -1510,50 +1481,50 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typed-ast = [ - {file = "typed_ast-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ad3b48cf2b487be140072fb86feff36801487d4abb7382bb1929aaac80638ea"}, - {file = "typed_ast-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:542cd732351ba8235f20faa0fc7398946fe1a57f2cdb289e5497e1e7f48cfedb"}, - {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc2c11ae59003d4a26dda637222d9ae924387f96acae9492df663843aefad55"}, - {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd5df1313915dbd70eaaa88c19030b441742e8b05e6103c631c83b75e0435ccc"}, - {file = "typed_ast-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:e34f9b9e61333ecb0f7d79c21c28aa5cd63bec15cb7e1310d7d3da6ce886bc9b"}, - {file = "typed_ast-1.5.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f818c5b81966d4728fec14caa338e30a70dfc3da577984d38f97816c4b3071ec"}, - {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3042bfc9ca118712c9809201f55355479cfcdc17449f9f8db5e744e9625c6805"}, - {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fff9fdcce59dc61ec1b317bdb319f8f4e6b69ebbe61193ae0a60c5f9333dc49"}, - {file = "typed_ast-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8e0b8528838ffd426fea8d18bde4c73bcb4167218998cc8b9ee0a0f2bfe678a6"}, - {file = "typed_ast-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ef1d96ad05a291f5c36895d86d1375c0ee70595b90f6bb5f5fdbee749b146db"}, - {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed44e81517364cb5ba367e4f68fca01fba42a7a4690d40c07886586ac267d9b9"}, - {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f60d9de0d087454c91b3999a296d0c4558c1666771e3460621875021bf899af9"}, - {file = "typed_ast-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9e237e74fd321a55c90eee9bc5d44be976979ad38a29bbd734148295c1ce7617"}, - {file = "typed_ast-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee852185964744987609b40aee1d2eb81502ae63ee8eef614558f96a56c1902d"}, - {file = "typed_ast-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27e46cdd01d6c3a0dd8f728b6a938a6751f7bd324817501c15fb056307f918c6"}, - {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d64dabc6336ddc10373922a146fa2256043b3b43e61f28961caec2a5207c56d5"}, - {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8cdf91b0c466a6c43f36c1964772918a2c04cfa83df8001ff32a89e357f8eb06"}, - {file = "typed_ast-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:9cc9e1457e1feb06b075c8ef8aeb046a28ec351b1958b42c7c31c989c841403a"}, - {file = "typed_ast-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e20d196815eeffb3d76b75223e8ffed124e65ee62097e4e73afb5fec6b993e7a"}, - {file = "typed_ast-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37e5349d1d5de2f4763d534ccb26809d1c24b180a477659a12c4bde9dd677d74"}, - {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f1a27592fac87daa4e3f16538713d705599b0a27dfe25518b80b6b017f0a6d"}, - {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8831479695eadc8b5ffed06fdfb3e424adc37962a75925668deeb503f446c0a3"}, - {file = "typed_ast-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:20d5118e494478ef2d3a2702d964dae830aedd7b4d3b626d003eea526be18718"}, - {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, + {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"}, ] types-redis = [ - {file = "types-redis-4.3.21.tar.gz", hash = "sha256:fd017a6733af193d14f1bb29b4ff79c0abc906e8654158d17aba457a6381afe2"}, - {file = "types_redis-4.3.21-py3-none-any.whl", hash = "sha256:cca7e17e3efb5dfdc7c9841bd5963fdd717ab68c4d2d8c6f49a9175fe2f29ce4"}, + {file = "types-redis-4.3.21.3.tar.gz", hash = "sha256:2e1f184056188c8754ded0b5173dc01824d2bfe41975fe318068a68beedfb62c"}, + {file = "types_redis-4.3.21.3-py3-none-any.whl", hash = "sha256:77ee5b8ca3a779e09807348c7f0b33c0f38a46096cd6c8a2e0176b28b3784b34"}, ] types-toml = [ {file = "types-toml-0.10.8.tar.gz", hash = "sha256:b7e7ea572308b1030dc86c3ba825c5210814c2825612ec679eb7814f8dd9295a"}, {file = "types_toml-0.10.8-py3-none-any.whl", hash = "sha256:8300fd093e5829eb9c1fba69cee38130347d4b74ddf32d0a7df650ae55c2b599"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] wrapt = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, @@ -1626,6 +1597,6 @@ yamllint = [ {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, ] zipp = [ - {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, - {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, + {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, + {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] diff --git a/tests/unit/test_diffsync.py b/tests/unit/test_diffsync.py index b30c2ad7..6d2588b5 100644 --- a/tests/unit/test_diffsync.py +++ b/tests/unit/test_diffsync.py @@ -1,19 +1,5 @@ -"""Unit tests for the DiffSync class. - -Copyright (c) 2020-2021 Network To Code, LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" +"""Unit tests for the DiffSync class.""" +# pylint: disable=too-many-lines from unittest import mock @@ -898,3 +884,153 @@ class NoDeleteInterfaceDiffSync(BackendA): diff = extra_models.diff_from(backend_a) print(diff.str()) # for debugging of any failure assert not diff.has_diffs() + + +def test_diffsync_tree_traversal(): + assert BackendA.get_tree_traversal(True) == {"site": {"device": {"interface": {}}, "person": {}}, "unused": {}} + text = """\ +BackendA +├── site +│ ├── device +│ │ └── interface +│ └── person +└── unused""" + assert BackendA.get_tree_traversal() == text + + +def test_diffsync_load_from_dict(backend_a): + data = { + "device": { + "nyc-spine1": { + "interfaces": ["nyc-spine1__eth0", "nyc-spine1__eth1"], + "name": "nyc-spine1", + "role": "spine", + "site_name": "nyc", + }, + "nyc-spine2": { + "interfaces": ["nyc-spine2__eth0", "nyc-spine2__eth1"], + "name": "nyc-spine2", + "role": "spine", + "site_name": "nyc", + }, + "rdu-spine1": { + "interfaces": ["rdu-spine1__eth0", "rdu-spine1__eth1"], + "name": "rdu-spine1", + "role": "spine", + "site_name": "rdu", + }, + "rdu-spine2": { + "interfaces": ["rdu-spine2__eth0", "rdu-spine2__eth1"], + "name": "rdu-spine2", + "role": "spine", + "site_name": "rdu", + }, + "sfo-spine1": { + "interfaces": ["sfo-spine1__eth0", "sfo-spine1__eth1"], + "name": "sfo-spine1", + "role": "spine", + "site_name": "sfo", + }, + "sfo-spine2": { + "interfaces": ["sfo-spine2__eth0", "sfo-spine2__eth1", "sfo-spine2__eth2"], + "name": "sfo-spine2", + "role": "spine", + "site_name": "sfo", + }, + }, + "interface": { + "nyc-spine1__eth0": { + "description": "Interface 0", + "device_name": "nyc-spine1", + "name": "eth0", + }, + "nyc-spine1__eth1": { + "description": "Interface 1", + "device_name": "nyc-spine1", + "name": "eth1", + }, + "nyc-spine2__eth0": { + "description": "Interface 0", + "device_name": "nyc-spine2", + "name": "eth0", + }, + "nyc-spine2__eth1": { + "description": "Interface 1", + "device_name": "nyc-spine2", + "name": "eth1", + }, + "rdu-spine1__eth0": { + "description": "Interface 0", + "device_name": "rdu-spine1", + "name": "eth0", + }, + "rdu-spine1__eth1": { + "description": "Interface 1", + "device_name": "rdu-spine1", + "name": "eth1", + }, + "rdu-spine2__eth0": { + "description": "Interface 0", + "device_name": "rdu-spine2", + "name": "eth0", + }, + "rdu-spine2__eth1": { + "description": "Interface 1", + "device_name": "rdu-spine2", + "name": "eth1", + }, + "sfo-spine1__eth0": { + "description": "Interface 0", + "device_name": "sfo-spine1", + "name": "eth0", + }, + "sfo-spine1__eth1": { + "description": "Interface 1", + "device_name": "sfo-spine1", + "name": "eth1", + }, + "sfo-spine2__eth0": { + "description": "TBD", + "device_name": "sfo-spine2", + "name": "eth0", + }, + "sfo-spine2__eth1": { + "description": "ddd", + "device_name": "sfo-spine2", + "name": "eth1", + }, + "sfo-spine2__eth2": { + "description": "Interface 2", + "device_name": "sfo-spine2", + "name": "eth2", + }, + }, + "person": {"Glenn Matthews": {"name": "Glenn Matthews"}}, + "site": { + "nyc": {"devices": ["nyc-spine1", "nyc-spine2"], "name": "nyc"}, + "rdu": { + "devices": ["rdu-spine1", "rdu-spine2"], + "name": "rdu", + "people": ["Glenn Matthews"], + }, + "sfo": {"devices": ["sfo-spine1", "sfo-spine2"], "name": "sfo"}, + }, + } + backend_a_by_dict = BackendA() + backend_a_by_dict.load_from_dict(data) + assert backend_a.dict() == backend_a_by_dict.dict() + + +def test_diffsync_get_or_none(backend_a): + assert backend_a.get_or_none(backend_a.site, "rdu") is not None + assert backend_a.get_or_none(backend_a.site, "does-not-exist") is None + + +def test_diffsync_get_initial_value_order(): + assert BackendA._get_initial_value_order() == [ # pylint: disable=protected-access + "site", + "unused", + "device", + "interface", + "person", + ] From b10617136e4f5ebd44457e629c6db82decf9658d Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Wed, 2 Nov 2022 11:40:37 +0100 Subject: [PATCH 27/37] Remove pytest-redislite. (#176) --- .github/workflows/ci.yml | 2 + Dockerfile | 7 +- poetry.lock | 136 +++++++++++++++++----------------- pyproject.toml | 2 +- tests/unit/test_redisstore.py | 32 ++++---- 5 files changed, 95 insertions(+), 84 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 392dfe9a..27b2357b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,6 +140,8 @@ jobs: uses: "networktocode/gh-action-setup-poetry-environment@v2" with: python-version: "${{ matrix.python-version }}" + - name: "Install redis" + run: "sudo apt-get install -y redis" - name: "Run poetry Install" run: "poetry install" - name: "Run Tests" diff --git a/Dockerfile b/Dockerfile index faf234ec..824f054d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,12 +2,15 @@ ARG PYTHON_VER FROM python:${PYTHON_VER}-slim -RUN apt-get update \ - && apt-get install -y --no-install-recommends build-essential +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + redis \ + && rm -rf /var/lib/apt/lists/* RUN pip install --upgrade pip \ && pip install poetry + WORKDIR /local COPY pyproject.toml /local COPY poetry.lock /local diff --git a/poetry.lock b/poetry.lock index eebb1a8a..456edde1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -44,11 +44,11 @@ python-versions = ">=3.5" dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] -name = "babel" -version = "2.11.0" +name = "Babel" +version = "2.10.3" description = "Internationalization utilities" category = "dev" optional = false @@ -116,7 +116,7 @@ optional = false python-versions = ">=3.6.0" [package.extras] -unicode-backport = ["unicodedata2"] +unicode_backport = ["unicodedata2"] [[package]] name = "click" @@ -153,7 +153,7 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 toml = ["tomli"] [[package]] -name = "deprecated" +name = "Deprecated" version = "1.2.13" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." category = "main" @@ -222,7 +222,7 @@ python-versions = ">=3.6" smmap = ">=3.0.1,<6" [[package]] -name = "gitpython" +name = "GitPython" version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "dev" @@ -291,12 +291,12 @@ python-versions = ">=3.6.1,<4.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] -name = "jinja2" +name = "Jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "dev" @@ -330,7 +330,7 @@ docutils = ">=0.19" mistune = "0.8.4" [[package]] -name = "markupsafe" +name = "MarkupSafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" @@ -345,6 +345,20 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mirakuru" +version = "2.4.2" +description = "Process executor (not only) for tests." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +psutil = {version = ">=4.0.0", markers = "sys_platform != \"cygwin\""} + +[package.extras] +tests = ["pytest", "pytest-cov", "python-daemon"] + [[package]] name = "mistune" version = "0.8.4" @@ -434,6 +448,17 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "port-for" +version = "0.6.2" +description = "Utility that helps with local TCP ports management. It can find an unused TCP localhost port and remember the association." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +tests = ["pytest", "pytest-cov"] + [[package]] name = "psutil" version = "5.9.3" @@ -491,7 +516,7 @@ optional = false python-versions = ">=3.6" [[package]] -name = "pygments" +name = "Pygments" version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" @@ -570,20 +595,21 @@ pytest = ">=4.6" testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] -name = "pytest-redislite" -version = "0.1.0" -description = "Pytest plugin for testing code using Redis" +name = "pytest-redis" +version = "2.4.0" +description = "Redis fixtures and fixture factories for Pytest." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -pytest = "*" -redislite = "*" +mirakuru = "*" +port-for = ">=0.6.0" +pytest = ">=6.2.0" +redis = "*" [package.extras] -build = ["bump2version"] -tests = ["pytest-mypy", "redis", "types-redis"] +tests = ["mock", "pytest-cov", "pytest-xdist"] [[package]] name = "pytest-structlog" @@ -606,7 +632,7 @@ optional = false python-versions = "*" [[package]] -name = "pyyaml" +name = "PyYAML" version = "6.0" description = "YAML parser and emitter for Python" category = "dev" @@ -632,19 +658,6 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] -[[package]] -name = "redislite" -version = "6.2.805324" -description = "Redis built into a python package" -category = "dev" -optional = false -python-versions = ">=3.7.0" - -[package.dependencies] -psutil = "*" -redis = "*" -setuptools = ">38.0" - [[package]] name = "requests" version = "2.28.1" @@ -661,7 +674,7 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" @@ -693,7 +706,7 @@ optional = false python-versions = "*" [[package]] -name = "sphinx" +name = "Sphinx" version = "3.5.3" description = "Python documentation generator" category = "dev" @@ -937,7 +950,7 @@ redis = ["redis"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "6125dec2996422d8c4a6257f9da3a3bc6ae477ff9a21580adfd3011643820f27" +content-hash = "e78953b319fbca921d80bf6b0ac66bf5a92904149248f8c6fd66b22346d7ef25" [metadata.files] alabaster = [ @@ -956,9 +969,9 @@ attrs = [ {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] -babel = [ - {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, - {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, +Babel = [ + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, ] bandit = [ {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, @@ -1055,7 +1068,7 @@ coverage = [ {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, ] -deprecated = [ +Deprecated = [ {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, ] @@ -1079,7 +1092,7 @@ gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -gitpython = [ +GitPython = [ {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] @@ -1107,7 +1120,7 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ +Jinja2 = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] @@ -1136,7 +1149,7 @@ m2r2 = [ {file = "m2r2-0.3.3-py3-none-any.whl", hash = "sha256:2ee32a5928c3598b67c70e6d22981ec936c03d5bfd2f64229e77678731952f16"}, {file = "m2r2-0.3.3.tar.gz", hash = "sha256:f9b6e9efbc2b6987dbd43d2fd15a6d115ba837d8158ae73295542635b4086e75"}, ] -markupsafe = [ +MarkupSafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, @@ -1182,6 +1195,10 @@ mccabe = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +mirakuru = [ + {file = "mirakuru-2.4.2-py3-none-any.whl", hash = "sha256:fdb67d141cc9f7abd485a515d618daf3272c3e6ff48380749997ff8e8c5f2cb2"}, + {file = "mirakuru-2.4.2.tar.gz", hash = "sha256:ec84d4d81b4bca96cb0e598c6b3d198a92f036a0c1223c881482c02a98508226"}, +] mistune = [ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, @@ -1236,6 +1253,10 @@ pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] +port-for = [ + {file = "port-for-0.6.2.tar.gz", hash = "sha256:9d4e73523d98f2f9f270308bbf415926c698b5439db8909384a79f152328b4d2"}, + {file = "port_for-0.6.2-py3-none-any.whl", hash = "sha256:be154fdc1d8b2c50820cf1910151e0e9792f82a00ed09b8c277b551e5c99bb5a"}, +] psutil = [ {file = "psutil-5.9.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b4a247cd3feaae39bb6085fcebf35b3b8ecd9b022db796d89c8f05067ca28e71"}, {file = "psutil-5.9.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5fa88e3d5d0b480602553d362c4b33a63e0c40bfea7312a7bf78799e01e0810b"}, @@ -1324,7 +1345,7 @@ pyflakes = [ {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] -pygments = [ +Pygments = [ {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] @@ -1344,9 +1365,9 @@ pytest-cov = [ {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, ] -pytest-redislite = [ - {file = "pytest-redislite-0.1.0.tar.gz", hash = "sha256:087e3c33a05adebd4ced5b8f53e95375d2c57e2b235d828156c084e7e5f21a09"}, - {file = "pytest_redislite-0.1.0-py3-none-any.whl", hash = "sha256:a6c0af71f349fc7ee9cdf763bfde31165ef311ffad059e3959f64dc6e6f8cc9f"}, +pytest-redis = [ + {file = "pytest-redis-2.4.0.tar.gz", hash = "sha256:8a07520abed3cd341e8da1793059aa5717b02e56c43e7c76435db682cede10aa"}, + {file = "pytest_redis-2.4.0-py3-none-any.whl", hash = "sha256:3cf00ad3f7241e38ce6f1bcb66af11b91956a889f1e216cfc026e81aa638a4e7"}, ] pytest-structlog = [ {file = "pytest-structlog-0.5.tar.gz", hash = "sha256:e2a878e98ee1d4d8883c918ebc318f800fbf7992cdaec1f4792a7b92a0369118"}, @@ -1356,7 +1377,7 @@ pytz = [ {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, ] -pyyaml = [ +PyYAML = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1402,24 +1423,6 @@ redis = [ {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, ] -redislite = [ - {file = "redislite-6.2.805324-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0f0642a5a6b79d086260e2ce42a95744dc5e5339f571ac149705730de8f68be9"}, - {file = "redislite-6.2.805324-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6abef5810940eca315b8c90f45b0ebda8e76c0a0ea6e9f606b8166f01a082b1"}, - {file = "redislite-6.2.805324-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0b3f202cee43bda332f97615ecf4a7c3b2b91c9ab28abf0494a21f6829d19101"}, - {file = "redislite-6.2.805324-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a704fdfb74b4b1711f86b98deeb0627ed7bbdf21653e48146d9369cda2fc40c4"}, - {file = "redislite-6.2.805324-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:09989c29788e2a4ab0c946869582451f6a46b4099a17482560d990250ffad696"}, - {file = "redislite-6.2.805324-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ad793d9b45d2e77d36753b695391c1a9e77a84b1782f7ea5d42fb5af3bbe86a"}, - {file = "redislite-6.2.805324-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ba35f7600d119a1db1cbae77c0591b8e0feb351689117c68c23bc5f34d3442af"}, - {file = "redislite-6.2.805324-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4904fe27211637c17dd98b4547cc6de4cacf231b394b5174d7acca38409db5c4"}, - {file = "redislite-6.2.805324-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bdd673e51b42d515b273518c4670d2d94d54542baa67b2d4c8951e47e05cd349"}, - {file = "redislite-6.2.805324-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbb1433b4a2d88889b550bd08c6885a58446d204c6ee031a5a2fdee83620f46"}, - {file = "redislite-6.2.805324-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:79f4540aa4c5f6cd85370a504b6610ef6995775307389559ad4001f61949c229"}, - {file = "redislite-6.2.805324-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:731b6d239f67f8fc9e3d801dca26269291b94be772c37bc2b65a884c9d79138e"}, - {file = "redislite-6.2.805324-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4640ed4533c176b3b1fab4592af39d3fab6423843c7634b6b5aba980dfc5d578"}, - {file = "redislite-6.2.805324-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e86ef58c491a6dc0c04fad86c286bb43edc128b26006ef90b2b49ed1d38e089"}, - {file = "redislite-6.2.805324-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7723317952715b7fa5e21d14ef3cf4d5a18f43f828e04b39712fa8d13d2274ff"}, - {file = "redislite-6.2.805324.tar.gz", hash = "sha256:603b28bcdfdbe45edfe0046dc99b0fcbe3d5c533d1b7e5d9c3ff6208a656e7f1"}, -] requests = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, @@ -1436,7 +1439,7 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] -sphinx = [ +Sphinx = [ {file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, {file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, ] @@ -1593,7 +1596,6 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] yamllint = [ - {file = "yamllint-1.28.0-py2.py3-none-any.whl", hash = "sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2"}, {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, ] zipp = [ diff --git a/pyproject.toml b/pyproject.toml index cb164bf9..bf6fde2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ sphinx-rtd-theme = "*" toml = "*" types-toml = "*" types-redis = "*" -pytest-redislite = { version = "^0.1.0", python = "^3.7"} +pytest-redis = "^2.4.0" [tool.black] line-length = 120 diff --git a/tests/unit/test_redisstore.py b/tests/unit/test_redisstore.py index 7b1f1cb3..67d011d0 100644 --- a/tests/unit/test_redisstore.py +++ b/tests/unit/test_redisstore.py @@ -4,8 +4,12 @@ from diffsync.exceptions import ObjectStoreException -def test_redisstore_init(redis_url): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def _get_path_from_redisdb(redisdb_instance): + return f"unix://{redisdb_instance.connection_pool.connection_kwargs['path']}" + + +def test_redisstore_init(redisdb): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) assert str(store) == "mystore (123)" @@ -14,37 +18,37 @@ def test_redisstore_init_wrong(): RedisStore(name="mystore", store_id="123", url="redis://wrong") -def test_redisstore_add_obj(redis_url, make_site): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def test_redisstore_add_obj(redisdb, make_site): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) site = make_site() store.add(obj=site) assert store.count() == 1 -def test_redisstore_add_obj_twice(redis_url, make_site): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def test_redisstore_add_obj_twice(redisdb, make_site): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) site = make_site() store.add(obj=site) store.add(obj=site) assert store.count() == 1 -def test_redisstore_get_all_obj(redis_url, make_site): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def test_redisstore_get_all_obj(redisdb, make_site): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) site = make_site() store.add(obj=site) assert store.get_all(model=site.__class__)[0] == site -def test_redisstore_get_obj(redis_url, make_site): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def test_redisstore_get_obj(redisdb, make_site): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) site = make_site() store.add(obj=site) assert store.get(model=site.__class__, identifier=site.name) == site -def test_redisstore_remove_obj(redis_url, make_site): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def test_redisstore_remove_obj(redisdb, make_site): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) site = make_site() store.add(obj=site) assert store.count(model=site.__class__) == store.count() == 1 @@ -52,8 +56,8 @@ def test_redisstore_remove_obj(redis_url, make_site): assert store.count(model=site.__class__) == store.count() == 0 -def test_redisstore_get_all_model_names(redis_url, make_site, make_device): - store = RedisStore(name="mystore", store_id="123", url=redis_url) +def test_redisstore_get_all_model_names(redisdb, make_site, make_device): + store = RedisStore(name="mystore", store_id="123", url=_get_path_from_redisdb(redisdb)) site = make_site() store.add(obj=site) device = make_device() From 5e0e99d35a2b56521f61c10129ca64ed397d423f Mon Sep 17 00:00:00 2001 From: Christian Adell Date: Tue, 8 Nov 2022 09:01:39 +0100 Subject: [PATCH 28/37] Add a Slack notify step in CI --- .github/workflows/ci.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 27b2357b..4e793a59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -203,3 +203,39 @@ jobs: password: "${{ secrets.PYPI_API_TOKEN }}" needs: - "unittest" + slack-notify: + needs: + - "publish_gh" + - "publish_pypi" + name: "Send notification to the Slack" + runs-on: "ubuntu-20.04" + env: + SLACK_WEBHOOK_URL: "${{ secrets.SLACK_WEBHOOK_URL }}" + SLACK_MESSAGE: >- + *NOTIFICATION: NEW-RELEASE-PUBLISHED*\n + Repository: <${{ github.server_url }}/${{ github.repository }}|${{ github.repository }}>\n + Release: <${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}>\n + Published by: <${{ github.server_url }}/${{ github.actor }}|${{ github.actor }}> + steps: + - name: "Send a notification to Slack" + # ENVs cannot be used directly in job.if. This is a workaround to check + # if SLACK_WEBHOOK_URL is present. + if: "${{ env.SLACK_WEBHOOK_URL != '' }}" + uses: "slackapi/slack-github-action@v1.23.0" + with: + payload: | + { + "text": "${{ env.SLACK_MESSAGE }}", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "${{ env.SLACK_MESSAGE }}" + } + } + ] + } + env: + SLACK_WEBHOOK_URL: "${{ secrets.SLACK_WEBHOOK_URL }}" + SLACK_WEBHOOK_TYPE: "INCOMING_WEBHOOK" From f6afd05e25f02d7a1eaed7674d8f9e34d373a564 Mon Sep 17 00:00:00 2001 From: Ken Celenza Date: Mon, 28 Nov 2022 07:24:27 -0500 Subject: [PATCH 29/37] Add methods for get or add/update model (#182) --- diffsync/__init__.py | 26 ++++++++- diffsync/store/__init__.py | 45 ++++++++++++++++ tests/unit/test_diffsync.py | 102 ++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 2 deletions(-) diff --git a/diffsync/__init__.py b/diffsync/__init__.py index 9a0dd039..ce7cd975 100644 --- a/diffsync/__init__.py +++ b/diffsync/__init__.py @@ -790,12 +790,23 @@ def get_or_instantiate( """ return self.store.get_or_instantiate(model=model, ids=ids, attrs=attrs) + def get_or_add_model_instance(self, obj: DiffSyncModel) -> Tuple[DiffSyncModel, bool]: + """Attempt to get the object with provided obj identifiers or instantiate obj. + + Args: + obj: An obj of the DiffSyncModel to get or add. + + Returns: + Provides the existing or new object and whether it was created or not. + """ + return self.store.get_or_add_model_instance(obj=obj) + def update_or_instantiate(self, model: Type[DiffSyncModel], ids: Dict, attrs: Dict) -> Tuple[DiffSyncModel, bool]: """Attempt to update an existing object with provided ids/attrs or instantiate it with provided identifiers and attrs. Args: - model (DiffSyncModel): The DiffSyncModel to get or create. - ids (Dict): Identifiers for the DiffSyncModel to get or create with. + model (DiffSyncModel): The DiffSyncModel to update or create. + ids (Dict): Identifiers for the DiffSyncModel to update or create with. attrs (Dict): Attributes when creating/updating an object if it doesn't exist. Pass in empty dict, if no specific attrs. Returns: @@ -803,6 +814,17 @@ def update_or_instantiate(self, model: Type[DiffSyncModel], ids: Dict, attrs: Di """ return self.store.update_or_instantiate(model=model, ids=ids, attrs=attrs) + def update_or_add_model_instance(self, obj: DiffSyncModel) -> Tuple[DiffSyncModel, bool]: + """Attempt to update an existing object with provided obj ids/attrs or instantiate obj. + + Args: + instance: An instance of the DiffSyncModel to update or create. + + Returns: + Provides the existing or new object and whether it was created or not. + """ + return self.store.update_or_add_model_instance(obj=obj) + def count(self, model: Union[Text, "DiffSyncModel", Type["DiffSyncModel"], None] = None): """Count how many objects of one model type exist in the backend store. diff --git a/diffsync/store/__init__.py b/diffsync/store/__init__.py index d2de62f9..aed32ede 100644 --- a/diffsync/store/__init__.py +++ b/diffsync/store/__init__.py @@ -159,6 +159,24 @@ def get_or_instantiate( return obj, created + def get_or_add_model_instance(self, obj: "DiffSyncModel") -> Tuple["DiffSyncModel", bool]: + """Attempt to get the object with provided obj identifiers or instantiate obj. + + Args: + obj: An obj of the DiffSyncModel to get or add. + + Returns: + Provides the existing or new object and whether it was added or not. + """ + model = obj.get_type() + ids = obj.get_unique_id() + + try: + return self.get(model=model, identifier=ids), False + except ObjectNotFound: + self.add(obj=obj) + return obj, True + def update_or_instantiate( self, *, model: Type["DiffSyncModel"], ids: Dict, attrs: Dict ) -> Tuple["DiffSyncModel", bool]: @@ -188,6 +206,33 @@ def update_or_instantiate( return obj, created + def update_or_add_model_instance(self, obj: "DiffSyncModel") -> Tuple["DiffSyncModel", bool]: + """Attempt to update an existing object with provided ids/attrs or instantiate obj. + + Args: + instance: An instance of the DiffSyncModel to update or create. + + Returns: + Provides the existing or new object and whether it was added or not. + """ + model = obj.get_type() + ids = obj.get_unique_id() + attrs = obj.get_attrs() + + added = False + try: + obj = self.get(model=model, identifier=ids) + except ObjectNotFound: + # Add the object to the diffsync instance + self.add(obj=obj) + added = True + + # Update existing obj with attrs + for attr, value in attrs.items(): + setattr(obj, attr, value) + + return obj, added + def _get_object_class_and_model( self, model: Union[Text, "DiffSyncModel", Type["DiffSyncModel"]] ) -> Tuple[Union["DiffSyncModel", Type["DiffSyncModel"], None], str]: diff --git a/tests/unit/test_diffsync.py b/tests/unit/test_diffsync.py index 6d2588b5..d8471f3d 100644 --- a/tests/unit/test_diffsync.py +++ b/tests/unit/test_diffsync.py @@ -162,6 +162,72 @@ def test_diffsync_get_or_instantiate_retrieve_existing_object_wo_attrs(generic_d assert obj.description is None +def test_diffsync_get_or_add_model_instance_create_non_existent_object(generic_diffsync): + generic_diffsync.interface = Interface + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf = generic_diffsync.interface(**intf_identifiers) + + # Assert that the object does not currently exist. + with pytest.raises(ObjectNotFound): + generic_diffsync.get(Interface, intf_identifiers) + + obj, created = generic_diffsync.get_or_add_model_instance(intf) + assert created + assert obj is generic_diffsync.get(Interface, intf_identifiers) + assert obj is generic_diffsync.get("interface", intf_identifiers) + + +def test_diffsync_get_or_add_model_instance_retrieve_existing_object(generic_diffsync): + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf = Interface(**intf_identifiers) + generic_diffsync.add(intf) + + obj, created = generic_diffsync.get_or_add_model_instance(intf) + assert obj is intf + assert not created + + +def test_diffsync_get_or_add_model_instance_retrieve_existing_object_w_attrs(generic_diffsync): + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf_attrs = {"interface_type": "ethernet"} + intf_combine = {**intf_identifiers, **intf_attrs} + intf = Interface(**intf_combine) + generic_diffsync.add(intf) + + obj, created = generic_diffsync.get_or_add_model_instance(intf) + assert obj is intf + assert not created + assert obj.interface_type == "ethernet" + assert obj.description is None + + +def test_diffsync_get_or_add_model_instance_retrieve_create_non_existent_w_attrs(generic_diffsync): + generic_diffsync.interface = Interface + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf_attrs = {"interface_type": "1000base-t", "description": "Testing"} + intf_combine = {**intf_identifiers, **intf_attrs} + intf = Interface(**intf_combine) + + obj, created = generic_diffsync.get_or_add_model_instance(intf) + assert created + assert obj.interface_type == "1000base-t" + assert obj.description == "Testing" + assert obj is generic_diffsync.get(Interface, intf_identifiers) + assert obj is generic_diffsync.get("interface", intf_identifiers) + + +def test_diffsync_get_or_add_model_instance_retrieve_existing_object_wo_attrs(generic_diffsync): + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf = Interface(**intf_identifiers) + generic_diffsync.add(intf) + + obj, created = generic_diffsync.get_or_add_model_instance(intf) + assert obj is intf + assert not created + assert obj.interface_type == "ethernet" + assert obj.description is None + + def test_diffsync_update_or_instantiate_retrieve_existing_object_w_updated_attrs(generic_diffsync): intf_identifiers = {"device_name": "device1", "name": "eth1"} intf_attrs = {"interface_type": "1000base-t", "description": "Testing"} @@ -194,6 +260,42 @@ def test_diffsync_update_or_instantiate_create_object_w_attrs(generic_diffsync): assert obj.description == "Testing" +def test_diffsync_update_or_add_model_instance_retrieve_existing_object_w_updated_attrs(generic_diffsync): + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf_attrs = {"interface_type": "1000base-t", "description": "Testing"} + intf_combine = {**intf_identifiers, **intf_attrs} + intf = Interface(**intf_combine) + generic_diffsync.add(intf) + + obj, created = generic_diffsync.update_or_add_model_instance(intf) + assert obj is intf + assert not created + assert obj.interface_type == "1000base-t" + assert obj.description == "Testing" + + +def test_diffsync_update_or_add_model_instance_create_object(generic_diffsync): + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf = Interface(**intf_identifiers) + + obj, created = generic_diffsync.update_or_add_model_instance(intf) + assert created + assert obj.interface_type == "ethernet" + assert obj.description is None + + +def test_diffsync_update_or_add_model_instance_create_object_w_attrs(generic_diffsync): + intf_identifiers = {"device_name": "device1", "name": "eth1"} + intf_attrs = {"interface_type": "1000base-t", "description": "Testing"} + intf_combine = {**intf_identifiers, **intf_attrs} + intf = Interface(**intf_combine) + + obj, created = generic_diffsync.update_or_add_model_instance(intf) + assert created + assert obj.interface_type == "1000base-t" + assert obj.description == "Testing" + + def test_diffsync_get_with_generic_model(generic_diffsync, generic_diffsync_model): generic_diffsync.add(generic_diffsync_model) # The generic_diffsync_model has an empty identifier/unique-id From c91f2c7f65f1d516957b4e658206e13fc2384d22 Mon Sep 17 00:00:00 2001 From: Daniel Konrad Date: Tue, 29 Nov 2022 08:55:30 +0100 Subject: [PATCH 30/37] Feature/dakonr dx sync to (#188) * return diff to improve dx * added tests for sync_to and sync_from methods * run black on init * moved pylint: disable=too-many-arguments comment --- diffsync/__init__.py | 20 +++++++++++++++----- tests/unit/test_diffsync.py | 7 +++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/diffsync/__init__.py b/diffsync/__init__.py index ce7cd975..114391f1 100644 --- a/diffsync/__init__.py +++ b/diffsync/__init__.py @@ -526,14 +526,14 @@ def load_from_dict(self, data: Dict): # Synchronization between DiffSync instances # ------------------------------------------------------------------------------ - def sync_from( + def sync_from( # pylint: disable=too-many-arguments self, source: "DiffSync", diff_class: Type[Diff] = Diff, flags: DiffSyncFlags = DiffSyncFlags.NONE, callback: Optional[Callable[[Text, int, int], None]] = None, diff: Optional[Diff] = None, - ): # pylint: disable=too-many-arguments: + ) -> Diff: """Synchronize data from the given source DiffSync object into the current DiffSync object. Args: @@ -543,6 +543,10 @@ def sync_from( callback (function): Function with parameters (stage, current, total), to be called at intervals as the calculation of the diff and subsequent sync proceed. diff (Diff): An existing diff to be used rather than generating a completely new diff. + Returns: + Diff: Diff between origin object and source + Raises: + DiffClassMismatch: The provided diff's class does not match the diff_class """ if diff_class and diff: if not isinstance(diff, diff_class): @@ -558,14 +562,16 @@ def sync_from( if result: self.sync_complete(source, diff, flags, syncer.base_logger) - def sync_to( + return diff + + def sync_to( # pylint: disable=too-many-arguments self, target: "DiffSync", diff_class: Type[Diff] = Diff, flags: DiffSyncFlags = DiffSyncFlags.NONE, callback: Optional[Callable[[Text, int, int], None]] = None, diff: Optional[Diff] = None, - ): # pylint: disable=too-many-arguments + ) -> Diff: """Synchronize data from the current DiffSync object into the given target DiffSync object. Args: @@ -575,8 +581,12 @@ def sync_to( callback (function): Function with parameters (stage, current, total), to be called at intervals as the calculation of the diff and subsequent sync proceed. diff (Diff): An existing diff that will be used when determining what needs to be synced. + Returns: + Diff: Diff between origin object and target + Raises: + DiffClassMismatch: The provided diff's class does not match the diff_class """ - target.sync_from(self, diff_class=diff_class, flags=flags, callback=callback, diff=diff) + return target.sync_from(self, diff_class=diff_class, flags=flags, callback=callback, diff=diff) def sync_complete( self, diff --git a/tests/unit/test_diffsync.py b/tests/unit/test_diffsync.py index d8471f3d..ebf0e494 100644 --- a/tests/unit/test_diffsync.py +++ b/tests/unit/test_diffsync.py @@ -42,7 +42,9 @@ def test_diffsync_diff_self_with_no_data_has_no_diffs(generic_diffsync): def test_diffsync_sync_self_with_no_data_is_noop(generic_diffsync): generic_diffsync.sync_complete = mock.Mock() generic_diffsync.sync_from(generic_diffsync) - generic_diffsync.sync_to(generic_diffsync) + diff = generic_diffsync.sync_to(generic_diffsync) + # Check if the returning Diff object has diffs + assert not diff.has_diffs() # sync_complete() should only be called if something actually changed assert not generic_diffsync.sync_complete.called @@ -588,12 +590,13 @@ def test_diffsync_sync_to_w_diff(backend_a, backend_b): backend_a.diff_from = mock.Mock() backend_a.diff_to = mock.Mock() # Perform full sync - backend_b.sync_to(backend_a, diff=diff) + result_diff = backend_b.sync_to(backend_a, diff=diff) # Assert none of the diff methods have been called assert not backend_b.diff_from.called assert not backend_b.diff_to.called assert not backend_a.diff_from.called assert not backend_a.diff_to.called + assert result_diff.has_diffs() def test_diffsync_sync_from_w_diff(backend_a, backend_b): From 2029a68913dc24229681071045d3987faea34180 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Tue, 29 Nov 2022 11:17:37 +0100 Subject: [PATCH 31/37] Update README.md (#189) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 72db6f54..e599cfad 100644 --- a/README.md +++ b/README.md @@ -75,5 +75,7 @@ The project is following Network to Code software development guidelines and are - Black, Pylint, Bandit, flake8, and pydocstyle, mypy for Python linting, formatting and type hint checking. - pytest, coverage, and unittest for unit tests. +You can ensure your contribution adheres to these checks by running `invoke tests` from the CLI. + # Questions Please see the [documentation](https://diffsync.readthedocs.io/en/latest/index.html) for detailed documentation on how to use `diffsync`. For any additional questions or comments, feel free to swing by the [Network to Code slack channel](https://networktocode.slack.com/) (channel #networktocode). Sign up [here](http://slack.networktocode.com/) From 748f1369b6a17865f4674550709c8c520881e144 Mon Sep 17 00:00:00 2001 From: Daniel Konrad Date: Tue, 6 Dec 2022 09:11:44 +0100 Subject: [PATCH 32/37] Contributor Ramp up (#190) * added build job to documentation * added redis backend * rewrite invoke build line --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e599cfad..96484f44 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ The project is following Network to Code software development guidelines and are - pytest, coverage, and unittest for unit tests. You can ensure your contribution adheres to these checks by running `invoke tests` from the CLI. +The command `invoke build` builds a docker container with all the necessary dependencies (including the redis backend) locally to facilitate the execution of these tests. # Questions Please see the [documentation](https://diffsync.readthedocs.io/en/latest/index.html) for detailed documentation on how to use `diffsync`. For any additional questions or comments, feel free to swing by the [Network to Code slack channel](https://networktocode.slack.com/) (channel #networktocode). Sign up [here](http://slack.networktocode.com/) From b9b3b7a765499b79b37de0bbd36374ec5dc9767d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 15:42:26 +0100 Subject: [PATCH 33/37] Bump setuptools from 65.5.0 to 65.5.1 (#196) Bumps [setuptools](https://github.com/pypa/setuptools) from 65.5.0 to 65.5.1. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/CHANGES.rst) - [Commits](https://github.com/pypa/setuptools/compare/v65.5.0...v65.5.1) --- updated-dependencies: - dependency-name: setuptools dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 456edde1..7dcedcbe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -44,7 +44,7 @@ python-versions = ">=3.5" dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "Babel" @@ -116,7 +116,7 @@ optional = false python-versions = ">=3.6.0" [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" @@ -291,9 +291,9 @@ python-versions = ">=3.6.1,<4.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "Jinja2" @@ -674,11 +674,11 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "65.5.0" +version = "65.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false @@ -686,7 +686,7 @@ python-versions = ">=3.7" [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-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)", "mock", "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-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +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]] @@ -1428,8 +1428,8 @@ requests = [ {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] setuptools = [ - {file = "setuptools-65.5.0-py3-none-any.whl", hash = "sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356"}, - {file = "setuptools-65.5.0.tar.gz", hash = "sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17"}, + {file = "setuptools-65.5.1-py3-none-any.whl", hash = "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31"}, + {file = "setuptools-65.5.1.tar.gz", hash = "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f"}, ] smmap = [ {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, @@ -1596,6 +1596,7 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] yamllint = [ + {file = "yamllint-1.28.0-py2.py3-none-any.whl", hash = "sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2"}, {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, ] zipp = [ From 36c858d5927df573e49a82f6b73cd3e5cbb31130 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Fri, 3 Mar 2023 10:12:55 +0100 Subject: [PATCH 34/37] Update CI. (#212) * Update CI. * Fix mypy errors and make its configuration simpler. --- .github/workflows/ci.yml | 20 +- diffsync/__init__.py | 4 +- diffsync/helpers.py | 2 +- diffsync/store/__init__.py | 2 +- poetry.lock | 1729 ++++++++++++++++++++---------------- pyproject.toml | 4 + tasks.py | 2 +- 7 files changed, 997 insertions(+), 766 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e793a59..ec1b68d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Linting: black" run: "poetry run invoke black" bandit: @@ -40,7 +40,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Linting: bandit" run: "poetry run invoke bandit" needs: @@ -53,7 +53,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Linting: pydocstyle" run: "poetry run invoke pydocstyle" needs: @@ -66,7 +66,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Linting: flake8" run: "poetry run invoke flake8" needs: @@ -79,8 +79,8 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" - - name: "Linting: flake8" + uses: "networktocode/gh-action-setup-poetry-environment@v5" + - name: "Linting: mypy" run: "poetry run invoke mypy" needs: - "black" @@ -92,7 +92,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Linting: yamllint" run: "poetry run invoke yamllint" needs: @@ -103,7 +103,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Build Container" run: "poetry run invoke build" needs: @@ -118,7 +118,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v1" + uses: "networktocode/gh-action-setup-poetry-environment@v5" - name: "Build Container" run: "poetry run invoke build" - name: "Linting: Pylint" @@ -137,7 +137,7 @@ jobs: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v2" + uses: "networktocode/gh-action-setup-poetry-environment@v5" with: python-version: "${{ matrix.python-version }}" - name: "Install redis" diff --git a/diffsync/__init__.py b/diffsync/__init__.py index 114391f1..3fbe7186 100644 --- a/diffsync/__init__.py +++ b/diffsync/__init__.py @@ -593,7 +593,7 @@ def sync_complete( source: "DiffSync", diff: Diff, flags: DiffSyncFlags = DiffSyncFlags.NONE, - logger: structlog.BoundLogger = None, + logger: Optional[structlog.BoundLogger] = None, ): """Callback triggered after a `sync_from` operation has completed and updated the model data of this instance. @@ -786,7 +786,7 @@ def remove(self, obj: DiffSyncModel, remove_children: bool = False): return self.store.remove(obj=obj, remove_children=remove_children) def get_or_instantiate( - self, model: Type[DiffSyncModel], ids: Dict, attrs: Dict = None + self, model: Type[DiffSyncModel], ids: Dict, attrs: Optional[Dict] = None ) -> Tuple[DiffSyncModel, bool]: """Attempt to get the object with provided identifiers or instantiate it with provided identifiers and attrs. diff --git a/diffsync/helpers.py b/diffsync/helpers.py index 4e4651a9..e9404105 100644 --- a/diffsync/helpers.py +++ b/diffsync/helpers.py @@ -328,7 +328,7 @@ def perform_sync(self) -> bool: self.base_logger.info("Sync complete") return changed - def sync_diff_element(self, element: DiffElement, parent_model: "DiffSyncModel" = None) -> bool: + def sync_diff_element(self, element: DiffElement, parent_model: Optional["DiffSyncModel"] = None) -> bool: """Recursively synchronize the given DiffElement and its children, if any, into the dst_diffsync. Helper method to `perform_sync`. diff --git a/diffsync/store/__init__.py b/diffsync/store/__init__.py index aed32ede..0b750594 100644 --- a/diffsync/store/__init__.py +++ b/diffsync/store/__init__.py @@ -134,7 +134,7 @@ def count(self, *, model: Union[Text, "DiffSyncModel", Type["DiffSyncModel"], No raise NotImplementedError def get_or_instantiate( - self, *, model: Type["DiffSyncModel"], ids: Dict, attrs: Dict = None + self, *, model: Type["DiffSyncModel"], ids: Dict, attrs: Optional[Dict] = None ) -> Tuple["DiffSyncModel", bool]: """Attempt to get the object with provided identifiers or instantiate it with provided identifiers and attrs. diff --git a/poetry.lock b/poetry.lock index 7dcedcbe..38c39ab8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,16 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "astroid" @@ -13,6 +19,10 @@ description = "An abstract syntax tree for Python with inference support." category = "dev" 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" @@ -28,34 +38,47 @@ description = "Timeout context manager for asyncio programs" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} [[package]] name = "attrs" -version = "22.1.0" +version = "22.2.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] [[package]] -name = "Babel" -version = "2.10.3" +name = "babel" +version = "2.12.1" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] [package.dependencies] -pytz = ">=2015.7" +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "bandit" @@ -64,6 +87,10 @@ description = "Security oriented static analyser for python code." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, + {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, +] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} @@ -78,11 +105,25 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "22.10.0" +version = "22.12.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] [package.dependencies] click = ">=8.0.0" @@ -101,22 +142,190 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2022.9.24" +version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[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 = "charset-normalizer" -version = "2.1.1" +version = "3.0.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode-backport = ["unicodedata2"] +python-versions = "*" +files = [ + {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, + {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, +] [[package]] name = "click" @@ -125,6 +334,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -137,14 +350,71 @@ 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 = "6.5.0" +version = "7.2.1" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8"}, + {file = "coverage-7.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03"}, + {file = "coverage-7.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339"}, + {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a"}, + {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820"}, + {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4"}, + {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6"}, + {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833"}, + {file = "coverage-7.2.1-cp310-cp310-win32.whl", hash = "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4"}, + {file = "coverage-7.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6"}, + {file = "coverage-7.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6"}, + {file = "coverage-7.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9"}, + {file = "coverage-7.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b"}, + {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319"}, + {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508"}, + {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed"}, + {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e"}, + {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b"}, + {file = "coverage-7.2.1-cp311-cp311-win32.whl", hash = "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80"}, + {file = "coverage-7.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273"}, + {file = "coverage-7.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97"}, + {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84"}, + {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd"}, + {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc"}, + {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e"}, + {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54"}, + {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5"}, + {file = "coverage-7.2.1-cp37-cp37m-win32.whl", hash = "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae"}, + {file = "coverage-7.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff"}, + {file = "coverage-7.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657"}, + {file = "coverage-7.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1"}, + {file = "coverage-7.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3"}, + {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99"}, + {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384"}, + {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa"}, + {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec"}, + {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2"}, + {file = "coverage-7.2.1-cp38-cp38-win32.whl", hash = "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0"}, + {file = "coverage-7.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb"}, + {file = "coverage-7.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef"}, + {file = "coverage-7.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454"}, + {file = "coverage-7.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993"}, + {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6"}, + {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63"}, + {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58"}, + {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e"}, + {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431"}, + {file = "coverage-7.2.1-cp39-cp39-win32.whl", hash = "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8"}, + {file = "coverage-7.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a"}, + {file = "coverage-7.2.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616"}, + {file = "coverage-7.2.1.tar.gz", hash = "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -153,18 +423,50 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 toml = ["tomli"] [[package]] -name = "Deprecated" -version = "1.2.13" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" +name = "cryptography" +version = "39.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" +files = [ + {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, + {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"}, + {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"}, + {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"}, + {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"}, + {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"}, + {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"}, +] [package.dependencies] -wrapt = ">=1.10,<2" +cffi = ">=1.12" [package.extras] -dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] +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", "types-pytz", "types-requests"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] [[package]] name = "dill" @@ -173,6 +475,10 @@ description = "serialize all of python" category = "dev" 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)"] @@ -184,14 +490,22 @@ description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] [[package]] name = "exceptiongroup" -version = "1.0.0" +version = "1.1.0" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, + {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, +] [package.extras] test = ["pytest (>=6)"] @@ -203,6 +517,10 @@ description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] [package.dependencies] importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} @@ -212,22 +530,30 @@ pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] -name = "GitPython" -version = "3.1.29" -description = "GitPython is a python library used to interact with Git repositories" +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" @@ -240,6 +566,10 @@ 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 = "imagesize" @@ -248,6 +578,10 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] name = "importlib-metadata" @@ -256,6 +590,10 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} @@ -267,41 +605,57 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +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 = "invoke" -version = "1.7.3" +version = "2.0.0" description = "Pythonic task execution" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "invoke-2.0.0-py3-none-any.whl", hash = "sha256:a860582bcf7a4b336fe18ef53937f0f28cec1c0053ffa767c2fcf7ba0b850f59"}, + {file = "invoke-2.0.0.tar.gz", hash = "sha256:7ab5dd9cd76b787d560a78b1a9810d252367ab595985c50612702be21d671dd7"}, +] [[package]] name = "isort" -version = "5.10.1" +version = "5.11.5" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +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 = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] -name = "Jinja2" +name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -311,31 +665,125 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "lazy-object-proxy" -version = "1.8.0" +version = "1.9.0" description = "A fast and thorough lazy object proxy." category = "dev" 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 = "m2r2" -version = "0.3.3" +version = "0.3.3.post2" description = "Markdown and reStructuredText in a single file." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "m2r2-0.3.3.post2-py3-none-any.whl", hash = "sha256:86157721eb6eabcd54d4eea7195890cc58fa6188b8d0abea633383cfbb5e11e3"}, + {file = "m2r2-0.3.3.post2.tar.gz", hash = "sha256:e62bcb0e74b3ce19cda0737a0556b04cf4a43b785072fcef474558f2c1482ca8"}, +] [package.dependencies] docutils = ">=0.19" mistune = "0.8.4" [[package]] -name = "MarkupSafe" -version = "2.1.1" +name = "markupsafe" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] [[package]] name = "mccabe" @@ -344,21 +792,26 @@ description = "McCabe checker, plugin for flake8" category = "dev" 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 = "mirakuru" -version = "2.4.2" +version = "2.5.1" description = "Process executor (not only) for tests." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mirakuru-2.5.1-py3-none-any.whl", hash = "sha256:0a16f897841741f8cd784f790e54d74e61456ba36be9cb9de731b49e2e7a45dc"}, + {file = "mirakuru-2.5.1.tar.gz", hash = "sha256:5a60d641fa92c8bfcd383f6e52f7a0bf3f081da0467fc6e3e6a3f6b3e3e47a7b"}, +] [package.dependencies] psutil = {version = ">=4.0.0", markers = "sys_platform != \"cygwin\""} -[package.extras] -tests = ["pytest", "pytest-cov", "python-daemon"] - [[package]] name = "mistune" version = "0.8.4" @@ -366,14 +819,46 @@ description = "The fastest markdown parser in pure Python" category = "dev" optional = false python-versions = "*" +files = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] [[package]] name = "mypy" -version = "0.982" +version = "1.0.1" description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mypy-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:71a808334d3f41ef011faa5a5cd8153606df5fc0b56de5b2e89566c8093a0c9a"}, + {file = "mypy-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:920169f0184215eef19294fa86ea49ffd4635dedfdea2b57e45cb4ee85d5ccaf"}, + {file = "mypy-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27a0f74a298769d9fdc8498fcb4f2beb86f0564bcdb1a37b58cbbe78e55cf8c0"}, + {file = "mypy-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:65b122a993d9c81ea0bfde7689b3365318a88bde952e4dfa1b3a8b4ac05d168b"}, + {file = "mypy-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:5deb252fd42a77add936b463033a59b8e48eb2eaec2976d76b6878d031933fe4"}, + {file = "mypy-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2013226d17f20468f34feddd6aae4635a55f79626549099354ce641bc7d40262"}, + {file = "mypy-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:48525aec92b47baed9b3380371ab8ab6e63a5aab317347dfe9e55e02aaad22e8"}, + {file = "mypy-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96b8a0c019fe29040d520d9257d8c8f122a7343a8307bf8d6d4a43f5c5bfcc8"}, + {file = "mypy-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:448de661536d270ce04f2d7dddaa49b2fdba6e3bd8a83212164d4174ff43aa65"}, + {file = "mypy-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:d42a98e76070a365a1d1c220fcac8aa4ada12ae0db679cb4d910fabefc88b994"}, + {file = "mypy-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64f48c6176e243ad015e995de05af7f22bbe370dbb5b32bd6988438ec873919"}, + {file = "mypy-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd63e4f50e3538617887e9aee91855368d9fc1dea30da743837b0df7373bc4"}, + {file = "mypy-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbeb24514c4acbc78d205f85dd0e800f34062efcc1f4a4857c57e4b4b8712bff"}, + {file = "mypy-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a2948c40a7dd46c1c33765718936669dc1f628f134013b02ff5ac6c7ef6942bf"}, + {file = "mypy-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bc8d6bd3b274dd3846597855d96d38d947aedba18776aa998a8d46fabdaed76"}, + {file = "mypy-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:17455cda53eeee0a4adb6371a21dd3dbf465897de82843751cf822605d152c8c"}, + {file = "mypy-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e831662208055b006eef68392a768ff83596035ffd6d846786578ba1714ba8f6"}, + {file = "mypy-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e60d0b09f62ae97a94605c3f73fd952395286cf3e3b9e7b97f60b01ddfbbda88"}, + {file = "mypy-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:0af4f0e20706aadf4e6f8f8dc5ab739089146b83fd53cb4a7e0e850ef3de0bb6"}, + {file = "mypy-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24189f23dc66f83b839bd1cce2dfc356020dfc9a8bae03978477b15be61b062e"}, + {file = "mypy-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93a85495fb13dc484251b4c1fd7a5ac370cd0d812bbfc3b39c1bafefe95275d5"}, + {file = "mypy-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f546ac34093c6ce33f6278f7c88f0f147a4849386d3bf3ae193702f4fe31407"}, + {file = "mypy-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c6c2ccb7af7154673c591189c3687b013122c5a891bb5651eca3db8e6c6c55bd"}, + {file = "mypy-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:15b5a824b58c7c822c51bc66308e759243c32631896743f030daf449fe3677f3"}, + {file = "mypy-1.0.1-py3-none-any.whl", hash = "sha256:eda5c8b9949ed411ff752b9a01adda31afe7eae1e53e946dbdf9db23865e66c4"}, + {file = "mypy-1.0.1.tar.gz", hash = "sha256:28cea5a6392bb43d266782983b5a4216c25544cd7d80be681a155ddcdafd152d"}, +] [package.dependencies] mypy-extensions = ">=0.4.3" @@ -383,16 +868,21 @@ typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] python2 = ["typed-ast (>=1.4.0,<2)"] reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] name = "packaging" @@ -401,37 +891,56 @@ description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.10.1" +version = "0.11.0" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, + {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, +] [[package]] name = "pbr" -version = "5.11.0" +version = "5.11.1" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "3.0.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, + {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -440,6 +949,10 @@ 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\""} @@ -450,22 +963,39 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "port-for" -version = "0.6.2" +version = "0.6.3" description = "Utility that helps with local TCP ports management. It can find an unused TCP localhost port and remember the association." category = "dev" optional = false python-versions = ">=3.7" - -[package.extras] -tests = ["pytest", "pytest-cov"] +files = [ + {file = "port-for-0.6.3.tar.gz", hash = "sha256:232bd999015b7fbdf19f90f3a9298cc742252d67650108123940bfc75c6f4d4e"}, + {file = "port_for-0.6.3-py3-none-any.whl", hash = "sha256:31860afde6cb552e1830c927def3288350c8fbbe9aea8aed8150ed9d1aa0de81"}, +] [[package]] name = "psutil" -version = "5.9.3" +version = "5.9.4" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, + {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, + {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, + {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, + {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, + {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, + {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, + {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, +] [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] @@ -477,17 +1007,71 @@ description = "Python style guide checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[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 = "pydantic" -version = "1.10.2" +version = "1.10.5" description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5920824fe1e21cbb3e38cf0f3dd24857c8959801d1031ce1fac1d50857a03bfb"}, + {file = "pydantic-1.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3bb99cf9655b377db1a9e47fa4479e3330ea96f4123c6c8200e482704bf1eda2"}, + {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2185a3b3d98ab4506a3f6707569802d2d92c3a7ba3a9a35683a7709ea6c2aaa2"}, + {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f582cac9d11c227c652d3ce8ee223d94eb06f4228b52a8adaafa9fa62e73d5c9"}, + {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c9e5b778b6842f135902e2d82624008c6a79710207e28e86966cd136c621bfee"}, + {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72ef3783be8cbdef6bca034606a5de3862be6b72415dc5cb1fb8ddbac110049a"}, + {file = "pydantic-1.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:45edea10b75d3da43cfda12f3792833a3fa70b6eee4db1ed6aed528cef17c74e"}, + {file = "pydantic-1.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63200cd8af1af2c07964546b7bc8f217e8bda9d0a2ef0ee0c797b36353914984"}, + {file = "pydantic-1.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:305d0376c516b0dfa1dbefeae8c21042b57b496892d721905a6ec6b79494a66d"}, + {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd326aff5d6c36f05735c7c9b3d5b0e933b4ca52ad0b6e4b38038d82703d35b"}, + {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bb0452d7b8516178c969d305d9630a3c9b8cf16fcf4713261c9ebd465af0d73"}, + {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9a9d9155e2a9f38b2eb9374c88f02fd4d6851ae17b65ee786a87d032f87008f8"}, + {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f836444b4c5ece128b23ec36a446c9ab7f9b0f7981d0d27e13a7c366ee163f8a"}, + {file = "pydantic-1.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:8481dca324e1c7b715ce091a698b181054d22072e848b6fc7895cd86f79b4449"}, + {file = "pydantic-1.10.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87f831e81ea0589cd18257f84386bf30154c5f4bed373b7b75e5cb0b5d53ea87"}, + {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ce1612e98c6326f10888df951a26ec1a577d8df49ddcaea87773bfbe23ba5cc"}, + {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58e41dd1e977531ac6073b11baac8c013f3cd8706a01d3dc74e86955be8b2c0c"}, + {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6a4b0aab29061262065bbdede617ef99cc5914d1bf0ddc8bcd8e3d7928d85bd6"}, + {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36e44a4de37b8aecffa81c081dbfe42c4d2bf9f6dff34d03dce157ec65eb0f15"}, + {file = "pydantic-1.10.5-cp37-cp37m-win_amd64.whl", hash = "sha256:261f357f0aecda005934e413dfd7aa4077004a174dafe414a8325e6098a8e419"}, + {file = "pydantic-1.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b429f7c457aebb7fbe7cd69c418d1cd7c6fdc4d3c8697f45af78b8d5a7955760"}, + {file = "pydantic-1.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:663d2dd78596c5fa3eb996bc3f34b8c2a592648ad10008f98d1348be7ae212fb"}, + {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51782fd81f09edcf265823c3bf43ff36d00db246eca39ee765ef58dc8421a642"}, + {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c428c0f64a86661fb4873495c4fac430ec7a7cef2b8c1c28f3d1a7277f9ea5ab"}, + {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:76c930ad0746c70f0368c4596020b736ab65b473c1f9b3872310a835d852eb19"}, + {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3257bd714de9db2102b742570a56bf7978e90441193acac109b1f500290f5718"}, + {file = "pydantic-1.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:f5bee6c523d13944a1fdc6f0525bc86dbbd94372f17b83fa6331aabacc8fd08e"}, + {file = "pydantic-1.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:532e97c35719f137ee5405bd3eeddc5c06eb91a032bc755a44e34a712420daf3"}, + {file = "pydantic-1.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca9075ab3de9e48b75fa8ccb897c34ccc1519177ad8841d99f7fd74cf43be5bf"}, + {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd46a0e6296346c477e59a954da57beaf9c538da37b9df482e50f836e4a7d4bb"}, + {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3353072625ea2a9a6c81ad01b91e5c07fa70deb06368c71307529abf70d23325"}, + {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3f9d9b2be177c3cb6027cd67fbf323586417868c06c3c85d0d101703136e6b31"}, + {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b473d00ccd5c2061fd896ac127b7755baad233f8d996ea288af14ae09f8e0d1e"}, + {file = "pydantic-1.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:5f3bc8f103b56a8c88021d481410874b1f13edf6e838da607dcb57ecff9b4594"}, + {file = "pydantic-1.10.5-py3-none-any.whl", hash = "sha256:7c5b94d598c90f2f46b3a983ffb46ab806a67099d118ae0da7ef21a2a4033b28"}, + {file = "pydantic-1.10.5.tar.gz", hash = "sha256:9e337ac83686645a46db0e825acceea8e02fca4062483f40e9ae178e8bd1103a"}, +] [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -495,17 +1079,22 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] [package.dependencies] -snowballstemmer = "*" +importlib-metadata = {version = ">=2.0.0,<5.0.0", markers = "python_version < \"3.8\""} +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pyflakes" @@ -514,14 +1103,22 @@ description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] [[package]] -name = "Pygments" -version = "2.13.0" +name = "pygments" +version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +] [package.extras] plugins = ["importlib-metadata"] @@ -533,6 +1130,10 @@ description = "python code static checker" category = "dev" 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" @@ -554,17 +1155,25 @@ description = "pyparsing module - Classes and methods to define and execute pars category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, + {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -586,6 +1195,10 @@ description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, + {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, +] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} @@ -601,6 +1214,10 @@ description = "Redis fixtures and fixture factories for Pytest." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-redis-2.4.0.tar.gz", hash = "sha256:8a07520abed3cd341e8da1793059aa5717b02e56c43e7c76435db682cede10aa"}, + {file = "pytest_redis-2.4.0-py3-none-any.whl", hash = "sha256:3cf00ad3f7241e38ce6f1bcb66af11b91956a889f1e216cfc026e81aa638a4e7"}, +] [package.dependencies] mirakuru = "*" @@ -613,11 +1230,15 @@ tests = ["mock", "pytest-cov", "pytest-xdist"] [[package]] name = "pytest-structlog" -version = "0.5" +version = "0.6" description = "Structured logging assertions" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pytest-structlog-0.6.tar.gz", hash = "sha256:10a641728b31835fedfa121336f2f6f47c3a4f54c1747d913ac8c3af8cbf27c0"}, + {file = "pytest_structlog-0.6-py2.py3-none-any.whl", hash = "sha256:03fa8335ee4ca2287f73344c718eb015218c0969a8dddf7447d05e87c9bb7c19"}, +] [package.dependencies] pytest = "*" @@ -625,33 +1246,81 @@ structlog = "*" [[package]] name = "pytz" -version = "2022.6" +version = "2022.7.1" description = "World timezone definitions, modern and historical" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, + {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, +] [[package]] -name = "PyYAML" +name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "redis" -version = "4.3.4" +version = "4.5.1" description = "Python client for Redis database and key-value store" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "redis-4.5.1-py3-none-any.whl", hash = "sha256:5deb072d26e67d2be1712603bfb7947ec3431fb0eec9c578994052e33035af6d"}, + {file = "redis-4.5.1.tar.gz", hash = "sha256:1eec3741cda408d3a5f84b78d089c8b8d895f21b3b050988351e925faf202864"}, +] [package.dependencies] async-timeout = ">=4.0.2" -deprecated = ">=1.2.3" importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""} -packaging = ">=20.4" typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] @@ -660,15 +1329,19 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "dev" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" @@ -678,14 +1351,18 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "65.5.1" +version = "67.4.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "setuptools-67.4.0-py3-none-any.whl", hash = "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251"}, + {file = "setuptools-67.4.0.tar.gz", hash = "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330"}, +] [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-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +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"] @@ -696,6 +1373,10 @@ description = "A pure Python implementation of a sliding window memory map manag category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "snowballstemmer" @@ -704,14 +1385,22 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "dev" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] -name = "Sphinx" +name = "sphinx" version = "3.5.3" description = "Python documentation generator" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, + {file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -744,6 +1433,10 @@ description = "Read the Docs theme for Sphinx" category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, + {file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, +] [package.dependencies] sphinx = "*" @@ -758,6 +1451,10 @@ description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -770,6 +1467,10 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -782,6 +1483,10 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -794,6 +1499,10 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] [package.extras] test = ["flake8", "mypy", "pytest"] @@ -805,6 +1514,10 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -817,6 +1530,10 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -829,6 +1546,10 @@ description = "Manage dynamic plugins for Python applications" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "stevedore-3.5.2-py3-none-any.whl", hash = "sha256:fa2630e3d0ad3e22d4914aff2501445815b9a4467a6edc49387c667a38faf5bf"}, + {file = "stevedore-3.5.2.tar.gz", hash = "sha256:cf99f41fc0d5a4f185ca4d3d42b03be9011b0a1ec1a4ea1a282be1b4b306dcc2"}, +] [package.dependencies] importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} @@ -841,6 +1562,10 @@ description = "Structured Logging for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "structlog-21.5.0-py3-none-any.whl", hash = "sha256:fd7922e195262b337da85c2a91c84be94ccab1f8fd1957bd6986f6904e3761c8"}, + {file = "structlog-21.5.0.tar.gz", hash = "sha256:68c4c29c003714fe86834f347cb107452847ba52414390a7ee583472bde00fc9"}, +] [package.dependencies] typing-extensions = {version = "*", markers = "python_version < \"3.8\""} @@ -857,6 +1582,10 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" @@ -865,6 +1594,10 @@ description = "A lil' TOML parser" category = "dev" 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" @@ -873,38 +1606,99 @@ description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" 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 = "types-pyopenssl" +version = "23.0.0.4" +description = "Typing stubs for pyOpenSSL" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-pyOpenSSL-23.0.0.4.tar.gz", hash = "sha256:8b3550b6e19d51ce78aabd724b0d8ebd962081a5fce95e7f85a592dfcdbc16bf"}, + {file = "types_pyOpenSSL-23.0.0.4-py3-none-any.whl", hash = "sha256:ad49e15bb8bb2f251b8fc24776f414d877629e44b1b049240063ab013b5a6a7d"}, +] + +[package.dependencies] +cryptography = ">=35.0.0" [[package]] name = "types-redis" -version = "4.3.21.3" +version = "4.5.1.4" description = "Typing stubs for redis" category = "dev" optional = false python-versions = "*" +files = [ + {file = "types-redis-4.5.1.4.tar.gz", hash = "sha256:7660178754d60a4cfacf5b33ee063aa0625311791c62075cd936136627a3f7bf"}, + {file = "types_redis-4.5.1.4-py3-none-any.whl", hash = "sha256:4ad21473605b9e1f96162b1298383dcbc73daa3bec2abe1fd3e81d077753f9ab"}, +] + +[package.dependencies] +cryptography = ">=35.0.0" +types-pyOpenSSL = "*" [[package]] name = "types-toml" -version = "0.10.8" +version = "0.10.8.5" description = "Typing stubs for toml" category = "dev" optional = false python-versions = "*" +files = [ + {file = "types-toml-0.10.8.5.tar.gz", hash = "sha256:bf80fce7d2d74be91148f47b88d9ae5adeb1024abef22aa2fdbabc036d6b8b3c"}, + {file = "types_toml-0.10.8.5-py3-none-any.whl", hash = "sha256:2432017febe43174af0f3c65f03116e3d3cf43e7e1406b8200e106da8cf98992"}, +] [[package]] name = "typing-extensions" -version = "4.4.0" +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 = "1.26.12" +version = "1.26.14" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, + {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] @@ -913,19 +1707,100 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" +category = "dev" 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 = "yamllint" -version = "1.28.0" +version = "1.29.0" description = "A linter for YAML files." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "yamllint-1.29.0-py3-none-any.whl", hash = "sha256:5153bf9f8205aa9dc6af6217e38bd4f5baf09d9a7c6f4ae1e23f90d9c00c49c5"}, + {file = "yamllint-1.29.0.tar.gz", hash = "sha256:66a755d5fbcbb8831f1a9568676329b5bac82c37995bcc9afd048b6459f9fa48"}, +] [package.dependencies] pathspec = ">=0.5.3" @@ -934,672 +1809,24 @@ setuptools = "*" [[package]] name = "zipp" -version = "3.10.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" 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)"] -testing = ["flake8 (<5)", "func-timeout", "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)"] +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] redis = ["redis"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.7" content-hash = "e78953b319fbca921d80bf6b0ac66bf5a92904149248f8c6fd66b22346d7ef25" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -astroid = [ - {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, - {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -Babel = [ - {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, - {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, -] -bandit = [ - {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, - {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -coverage = [ - {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, - {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, - {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, - {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, - {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, - {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, - {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, - {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, - {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, - {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, - {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, - {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, - {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, - {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, - {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, - {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, -] -Deprecated = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, -] -dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.0-py3-none-any.whl", hash = "sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41"}, - {file = "exceptiongroup-1.0.0.tar.gz", hash = "sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad"}, -] -flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -GitPython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -imagesize = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -invoke = [ - {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, - {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -Jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, - {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, - {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, - {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, -] -m2r2 = [ - {file = "m2r2-0.3.3-py3-none-any.whl", hash = "sha256:2ee32a5928c3598b67c70e6d22981ec936c03d5bfd2f64229e77678731952f16"}, - {file = "m2r2-0.3.3.tar.gz", hash = "sha256:f9b6e9efbc2b6987dbd43d2fd15a6d115ba837d8158ae73295542635b4086e75"}, -] -MarkupSafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mirakuru = [ - {file = "mirakuru-2.4.2-py3-none-any.whl", hash = "sha256:fdb67d141cc9f7abd485a515d618daf3272c3e6ff48380749997ff8e8c5f2cb2"}, - {file = "mirakuru-2.4.2.tar.gz", hash = "sha256:ec84d4d81b4bca96cb0e598c6b3d198a92f036a0c1223c881482c02a98508226"}, -] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] -mypy = [ - {file = "mypy-0.982-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5085e6f442003fa915aeb0a46d4da58128da69325d8213b4b35cc7054090aed5"}, - {file = "mypy-0.982-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41fd1cf9bc0e1c19b9af13a6580ccb66c381a5ee2cf63ee5ebab747a4badeba3"}, - {file = "mypy-0.982-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f793e3dd95e166b66d50e7b63e69e58e88643d80a3dcc3bcd81368e0478b089c"}, - {file = "mypy-0.982-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ebe67adf4d021b28c3f547da6aa2cce660b57f0432617af2cca932d4d378a6"}, - {file = "mypy-0.982-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:175f292f649a3af7082fe36620369ffc4661a71005aa9f8297ea473df5772046"}, - {file = "mypy-0.982-cp310-cp310-win_amd64.whl", hash = "sha256:8ee8c2472e96beb1045e9081de8e92f295b89ac10c4109afdf3a23ad6e644f3e"}, - {file = "mypy-0.982-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58f27ebafe726a8e5ccb58d896451dd9a662a511a3188ff6a8a6a919142ecc20"}, - {file = "mypy-0.982-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6af646bd46f10d53834a8e8983e130e47d8ab2d4b7a97363e35b24e1d588947"}, - {file = "mypy-0.982-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7aeaa763c7ab86d5b66ff27f68493d672e44c8099af636d433a7f3fa5596d40"}, - {file = "mypy-0.982-cp37-cp37m-win_amd64.whl", hash = "sha256:724d36be56444f569c20a629d1d4ee0cb0ad666078d59bb84f8f887952511ca1"}, - {file = "mypy-0.982-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14d53cdd4cf93765aa747a7399f0961a365bcddf7855d9cef6306fa41de01c24"}, - {file = "mypy-0.982-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ae64555d480ad4b32a267d10cab7aec92ff44de35a7cd95b2b7cb8e64ebe3e"}, - {file = "mypy-0.982-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6389af3e204975d6658de4fb8ac16f58c14e1bacc6142fee86d1b5b26aa52bda"}, - {file = "mypy-0.982-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b35ce03a289480d6544aac85fa3674f493f323d80ea7226410ed065cd46f206"}, - {file = "mypy-0.982-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6e564f035d25c99fd2b863e13049744d96bd1947e3d3d2f16f5828864506763"}, - {file = "mypy-0.982-cp38-cp38-win_amd64.whl", hash = "sha256:cebca7fd333f90b61b3ef7f217ff75ce2e287482206ef4a8b18f32b49927b1a2"}, - {file = "mypy-0.982-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a705a93670c8b74769496280d2fe6cd59961506c64f329bb179970ff1d24f9f8"}, - {file = "mypy-0.982-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75838c649290d83a2b83a88288c1eb60fe7a05b36d46cbea9d22efc790002146"}, - {file = "mypy-0.982-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:91781eff1f3f2607519c8b0e8518aad8498af1419e8442d5d0afb108059881fc"}, - {file = "mypy-0.982-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa97b9ddd1dd9901a22a879491dbb951b5dec75c3b90032e2baa7336777363b"}, - {file = "mypy-0.982-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a692a8e7d07abe5f4b2dd32d731812a0175626a90a223d4b58f10f458747dd8a"}, - {file = "mypy-0.982-cp39-cp39-win_amd64.whl", hash = "sha256:eb7a068e503be3543c4bd329c994103874fa543c1727ba5288393c21d912d795"}, - {file = "mypy-0.982-py3-none-any.whl", hash = "sha256:1021c241e8b6e1ca5a47e4d52601274ac078a89845cfde66c6d5f769819ffa1d"}, - {file = "mypy-0.982.tar.gz", hash = "sha256:85f7a343542dc8b1ed0a888cdd34dca56462654ef23aa673907305b260b3d746"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, -] -pbr = [ - {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"}, - {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -port-for = [ - {file = "port-for-0.6.2.tar.gz", hash = "sha256:9d4e73523d98f2f9f270308bbf415926c698b5439db8909384a79f152328b4d2"}, - {file = "port_for-0.6.2-py3-none-any.whl", hash = "sha256:be154fdc1d8b2c50820cf1910151e0e9792f82a00ed09b8c277b551e5c99bb5a"}, -] -psutil = [ - {file = "psutil-5.9.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b4a247cd3feaae39bb6085fcebf35b3b8ecd9b022db796d89c8f05067ca28e71"}, - {file = "psutil-5.9.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5fa88e3d5d0b480602553d362c4b33a63e0c40bfea7312a7bf78799e01e0810b"}, - {file = "psutil-5.9.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:767ef4fa33acda16703725c0473a91e1832d296c37c63896c7153ba81698f1ab"}, - {file = "psutil-5.9.3-cp27-cp27m-win32.whl", hash = "sha256:9a4af6ed1094f867834f5f07acd1250605a0874169a5fcadbcec864aec2496a6"}, - {file = "psutil-5.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:fa5e32c7d9b60b2528108ade2929b115167fe98d59f89555574715054f50fa31"}, - {file = "psutil-5.9.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:fe79b4ad4836e3da6c4650cb85a663b3a51aef22e1a829c384e18fae87e5e727"}, - {file = "psutil-5.9.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:db8e62016add2235cc87fb7ea000ede9e4ca0aa1f221b40cef049d02d5d2593d"}, - {file = "psutil-5.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:941a6c2c591da455d760121b44097781bc970be40e0e43081b9139da485ad5b7"}, - {file = "psutil-5.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71b1206e7909792d16933a0d2c1c7f04ae196186c51ba8567abae1d041f06dcb"}, - {file = "psutil-5.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f57d63a2b5beaf797b87024d018772439f9d3103a395627b77d17a8d72009543"}, - {file = "psutil-5.9.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7507f6c7b0262d3e7b0eeda15045bf5881f4ada70473b87bc7b7c93b992a7d7"}, - {file = "psutil-5.9.3-cp310-cp310-win32.whl", hash = "sha256:1b540599481c73408f6b392cdffef5b01e8ff7a2ac8caae0a91b8222e88e8f1e"}, - {file = "psutil-5.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:547ebb02031fdada635452250ff39942db8310b5c4a8102dfe9384ee5791e650"}, - {file = "psutil-5.9.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d8c3cc6bb76492133474e130a12351a325336c01c96a24aae731abf5a47fe088"}, - {file = "psutil-5.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d880053c6461c9b89cd5d4808f3b8336665fa3acdefd6777662c5ed73a851a"}, - {file = "psutil-5.9.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8b50241dd3c2ed498507f87a6602825073c07f3b7e9560c58411c14fe1e1c9"}, - {file = "psutil-5.9.3-cp36-cp36m-win32.whl", hash = "sha256:828c9dc9478b34ab96be75c81942d8df0c2bb49edbb481f597314d92b6441d89"}, - {file = "psutil-5.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:ed15edb14f52925869250b1375f0ff58ca5c4fa8adefe4883cfb0737d32f5c02"}, - {file = "psutil-5.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d266cd05bd4a95ca1c2b9b5aac50d249cf7c94a542f47e0b22928ddf8b80d1ef"}, - {file = "psutil-5.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e4939ff75149b67aef77980409f156f0082fa36accc475d45c705bb00c6c16a"}, - {file = "psutil-5.9.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68fa227c32240c52982cb931801c5707a7f96dd8927f9102d6c7771ea1ff5698"}, - {file = "psutil-5.9.3-cp37-cp37m-win32.whl", hash = "sha256:beb57d8a1ca0ae0eb3d08ccaceb77e1a6d93606f0e1754f0d60a6ebd5c288837"}, - {file = "psutil-5.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:12500d761ac091f2426567f19f95fd3f15a197d96befb44a5c1e3cbe6db5752c"}, - {file = "psutil-5.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba38cf9984d5462b506e239cf4bc24e84ead4b1d71a3be35e66dad0d13ded7c1"}, - {file = "psutil-5.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46907fa62acaac364fff0b8a9da7b360265d217e4fdeaca0a2397a6883dffba2"}, - {file = "psutil-5.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a04a1836894c8279e5e0a0127c0db8e198ca133d28be8a2a72b4db16f6cf99c1"}, - {file = "psutil-5.9.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a4e07611997acf178ad13b842377e3d8e9d0a5bac43ece9bfc22a96735d9a4f"}, - {file = "psutil-5.9.3-cp38-cp38-win32.whl", hash = "sha256:6ced1ad823ecfa7d3ce26fe8aa4996e2e53fb49b7fed8ad81c80958501ec0619"}, - {file = "psutil-5.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35feafe232d1aaf35d51bd42790cbccb882456f9f18cdc411532902370d660df"}, - {file = "psutil-5.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:538fcf6ae856b5e12d13d7da25ad67f02113c96f5989e6ad44422cb5994ca7fc"}, - {file = "psutil-5.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a3d81165b8474087bb90ec4f333a638ccfd1d69d34a9b4a1a7eaac06648f9fbe"}, - {file = "psutil-5.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a7826e68b0cf4ce2c1ee385d64eab7d70e3133171376cac53d7c1790357ec8f"}, - {file = "psutil-5.9.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ec296f565191f89c48f33d9544d8d82b0d2af7dd7d2d4e6319f27a818f8d1cc"}, - {file = "psutil-5.9.3-cp39-cp39-win32.whl", hash = "sha256:9ec95df684583b5596c82bb380c53a603bb051cf019d5c849c47e117c5064395"}, - {file = "psutil-5.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4bd4854f0c83aa84a5a40d3b5d0eb1f3c128f4146371e03baed4589fe4f3c931"}, - {file = "psutil-5.9.3.tar.gz", hash = "sha256:7ccfcdfea4fc4b0a02ca2c31de7fcd186beb9cff8207800e14ab66f79c773af6"}, -] -pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, -] -pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, -] -pydocstyle = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, -] -pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, -] -Pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pylint = [ - {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, - {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -pytest-cov = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, -] -pytest-redis = [ - {file = "pytest-redis-2.4.0.tar.gz", hash = "sha256:8a07520abed3cd341e8da1793059aa5717b02e56c43e7c76435db682cede10aa"}, - {file = "pytest_redis-2.4.0-py3-none-any.whl", hash = "sha256:3cf00ad3f7241e38ce6f1bcb66af11b91956a889f1e216cfc026e81aa638a4e7"}, -] -pytest-structlog = [ - {file = "pytest-structlog-0.5.tar.gz", hash = "sha256:e2a878e98ee1d4d8883c918ebc318f800fbf7992cdaec1f4792a7b92a0369118"}, - {file = "pytest_structlog-0.5-py2.py3-none-any.whl", hash = "sha256:057c9e6b20cedc10071b65623e6dc9af4a025e5a13d73defa992da465e32ac22"}, -] -pytz = [ - {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, - {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, -] -PyYAML = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -redis = [ - {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, - {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -setuptools = [ - {file = "setuptools-65.5.1-py3-none-any.whl", hash = "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31"}, - {file = "setuptools-65.5.1.tar.gz", hash = "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -Sphinx = [ - {file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, - {file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, - {file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -stevedore = [ - {file = "stevedore-3.5.2-py3-none-any.whl", hash = "sha256:fa2630e3d0ad3e22d4914aff2501445815b9a4467a6edc49387c667a38faf5bf"}, - {file = "stevedore-3.5.2.tar.gz", hash = "sha256:cf99f41fc0d5a4f185ca4d3d42b03be9011b0a1ec1a4ea1a282be1b4b306dcc2"}, -] -structlog = [ - {file = "structlog-21.5.0-py3-none-any.whl", hash = "sha256:fd7922e195262b337da85c2a91c84be94ccab1f8fd1957bd6986f6904e3761c8"}, - {file = "structlog-21.5.0.tar.gz", hash = "sha256:68c4c29c003714fe86834f347cb107452847ba52414390a7ee583472bde00fc9"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -typed-ast = [ - {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"}, -] -types-redis = [ - {file = "types-redis-4.3.21.3.tar.gz", hash = "sha256:2e1f184056188c8754ded0b5173dc01824d2bfe41975fe318068a68beedfb62c"}, - {file = "types_redis-4.3.21.3-py3-none-any.whl", hash = "sha256:77ee5b8ca3a779e09807348c7f0b33c0f38a46096cd6c8a2e0176b28b3784b34"}, -] -types-toml = [ - {file = "types-toml-0.10.8.tar.gz", hash = "sha256:b7e7ea572308b1030dc86c3ba825c5210814c2825612ec679eb7814f8dd9295a"}, - {file = "types_toml-0.10.8-py3-none-any.whl", hash = "sha256:8300fd093e5829eb9c1fba69cee38130347d4b74ddf32d0a7df650ae55c2b599"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] -yamllint = [ - {file = "yamllint-1.28.0-py2.py3-none-any.whl", hash = "sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2"}, - {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, -] -zipp = [ - {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, - {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, -] diff --git a/pyproject.toml b/pyproject.toml index f321c038..591899fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,6 +99,10 @@ testpaths = [ "tests" ] +[tool.mypy] +warn_unused_configs = true +ignore_missing_imports = true + [build-system] requires = ["poetry_core>=1.0.8"] build-backend = "poetry.core.masonry.api" diff --git a/tasks.py b/tasks.py index 941de668..c1efdf3c 100644 --- a/tasks.py +++ b/tasks.py @@ -197,7 +197,7 @@ def mypy(context, name=NAME, image_ver=IMAGE_VER, local=INVOKE_LOCAL): """ # pty is set to true to properly run the docker commands due to the invocation process of docker # https://docs.pyinvoke.org/en/latest/api/runners.html - Search for pty for more information - exec_cmd = 'find . -name "*.py" -not -path "*/examples/*" -not -path "*/docs/*" | xargs mypy --show-error-codes' + exec_cmd = "mypy -p diffsync" run_cmd(context, exec_cmd, name, image_ver, local) From 95fb491450fb3e71d612ac7fe530d7b3cf7a26a7 Mon Sep 17 00:00:00 2001 From: James Harr Date: Fri, 3 Mar 2023 09:54:53 -0600 Subject: [PATCH 35/37] Upgrade structlog, packaging dependencies (#211) * chore: update dependencies structlog, packaging * chore: poetry lock * style: reformat with black --------- Co-authored-by: James Harr --- examples/03-remote-system/diff.py | 1 - examples/03-remote-system/local_adapter.py | 1 - poetry.lock | 86 +++++++++++----------- pyproject.toml | 4 +- tests/unit/test_diffsync_model.py | 1 + 5 files changed, 45 insertions(+), 48 deletions(-) diff --git a/examples/03-remote-system/diff.py b/examples/03-remote-system/diff.py index 6c87191e..23ae7294 100644 --- a/examples/03-remote-system/diff.py +++ b/examples/03-remote-system/diff.py @@ -9,7 +9,6 @@ class AlphabeticalOrderDiff(Diff): def order_children_default(cls, children): """Simple diff to return all children in alphabetical order.""" for child in sorted(children.values()): - # it's possible to access additional information about the object # like child.action can be "update", "create" or "delete" diff --git a/examples/03-remote-system/local_adapter.py b/examples/03-remote-system/local_adapter.py index 8d934de1..eb39fdc5 100644 --- a/examples/03-remote-system/local_adapter.py +++ b/examples/03-remote-system/local_adapter.py @@ -43,7 +43,6 @@ def load(self, filename=COUNTRIES_FILE): # pylint: disable=arguments-differ # A Country object will be created for each country, it will be stored inside the adapter with self.add(), # and it will be linked to its parent with parent.add_child(item) for country in countries: - # Retrive the parent region object from the internal cache. region = self.get(obj=self.region, identifier=slugify(country.get("region"))) diff --git a/poetry.lock b/poetry.lock index 38c39ab8..5128cb6b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -105,32 +105,46 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "22.12.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -886,19 +900,16 @@ files = [ [[package]] name = "packaging" -version = "21.3" +version = "23.0" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "pathspec" version = "0.11.0" @@ -1148,21 +1159,6 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" [package.extras] testutil = ["gitpython (>3)"] -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pytest" version = "7.2.1" @@ -1557,23 +1553,25 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "structlog" -version = "21.5.0" +version = "22.3.0" description = "Structured Logging for Python" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "structlog-21.5.0-py3-none-any.whl", hash = "sha256:fd7922e195262b337da85c2a91c84be94ccab1f8fd1957bd6986f6904e3761c8"}, - {file = "structlog-21.5.0.tar.gz", hash = "sha256:68c4c29c003714fe86834f347cb107452847ba52414390a7ee583472bde00fc9"}, + {file = "structlog-22.3.0-py3-none-any.whl", hash = "sha256:b403f344f902b220648fa9f286a23c0cc5439a5844d271fec40562dbadbc70ad"}, + {file = "structlog-22.3.0.tar.gz", hash = "sha256:e7509391f215e4afb88b1b80fa3ea074be57a5a17d794bd436a5c949da023333"}, ] [package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -dev = ["cogapp", "coverage[toml]", "freezegun (>=0.2.8)", "furo", "pre-commit", "pretend", "pytest (>=6.0)", "pytest-asyncio", "rich", "simplejson", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "tomli", "twisted"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] -tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio", "simplejson"] +dev = ["structlog[docs,tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy", "rich", "twisted"] [[package]] name = "toml" @@ -1829,4 +1827,4 @@ redis = ["redis"] [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "e78953b319fbca921d80bf6b0ac66bf5a92904149248f8c6fd66b22346d7ef25" +content-hash = "37892839cc3207d00936d4f2d47780725bc0c299e1b1372a0bb4aba8907fe379" diff --git a/pyproject.toml b/pyproject.toml index 591899fb..abf7e872 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,8 +18,8 @@ include = [ [tool.poetry.dependencies] python = "^3.7" pydantic = "^1.7.4,!=1.8,!=1.8.1" -structlog = ">= 20.1.0, < 22.0.0" -packaging = "^21.3" +structlog = ">= 20.1.0, < 23.0.0" +packaging = ">= 21.3, < 24.0" colorama = {version = "^0.4.3", optional = true} redis = {version = "^4.3", optional = true} diff --git a/tests/unit/test_diffsync_model.py b/tests/unit/test_diffsync_model.py index d371f091..90ecbc85 100644 --- a/tests/unit/test_diffsync_model.py +++ b/tests/unit/test_diffsync_model.py @@ -358,6 +358,7 @@ class AttrChildOverlap(DiffSyncModel): def test_diffsync_model_subclass_inheritance(): """Verify that the class validation works properly even with a hierarchy of subclasses.""" + # Pylint would complain because we're not actually using any of the classes declared below # pylint: disable=unused-variable class Alpha(DiffSyncModel): From b3ea16ec47c5b296b3a3910cb80e7cd0fa54b39f Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Fri, 3 Mar 2023 16:59:45 +0100 Subject: [PATCH 36/37] Version bump. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index abf7e872..38ee5acd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "diffsync" -version = "1.7.0" +version = "1.7.1" description = "Library to easily sync/diff/update 2 different data sources" authors = ["Network to Code, LLC "] license = "Apache-2.0" From bd6cb387a62e916ab241b33bcf34f34d2617bbb6 Mon Sep 17 00:00:00 2001 From: Glenn Matthews Date: Tue, 18 Apr 2023 15:29:06 -0400 Subject: [PATCH 37/37] Update CHANGELOG and LICENSE, bump version to 1.8.0 --- CHANGELOG.md | 15 ++++++++++++++- LICENSE | 2 +- pyproject.toml | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a246a93e..84ad77e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## v1.8.0 - 2023-04-18 + +### Added + +- #182 - Added `get_or_add_model_instance()` and `update_or_add_model_instance()` APIs. +- #189 - Added note in `README.md` about running `invoke tests`. +- #190 - Added note in `README.md` about running `invoke build`. + +### Changed + +- #77/#188 - `sync_from()` and `sync_to()` now return the `Diff` that was applied. +- #211 - Loosened `packaging` and `structlog` library dependency constraints for broader compatibility. + ## v1.7.0 - 2022-11-03 ### Changed @@ -10,7 +23,7 @@ ### Added - #174 - Add methods to load data from dictionary and enable tree traversal -- #174 - Add a get_or_none method to the DiffSync class +- #174 - Add a `get_or_none` method to the DiffSync class - #168 - Add 'skip' counter to diff.summary() - #169/#170 - Add documentation about model processing order - #121/#140 - Add and configure renovate diff --git a/LICENSE b/LICENSE index 299fa730..5b75fec8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2020 Network to Code +Copyright 2020-2023 Network to Code Network to Code, LLC Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/pyproject.toml b/pyproject.toml index 38ee5acd..e7191dae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "diffsync" -version = "1.7.1" +version = "1.8.0" description = "Library to easily sync/diff/update 2 different data sources" authors = ["Network to Code, LLC "] license = "Apache-2.0"