From 8231e3f712ce4a1ebdd242798e5e9acb16de68d6 Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Wed, 22 Nov 2023 11:40:19 +0100 Subject: [PATCH 01/24] Feature/bump poetry (#22) * update poetry lock * ditch python versions 3.7 and 3.8 * support python 3.9 on dependencies * address tornado safety version * fix README * specify python version * only test on PRs * add nox-poetry * update GH actions constraints * try only poetry updated * downgrade poetry and update lock file --- .github/workflows/tests.yml | 5 - CONTRIBUTING.md | 4 +- README.md | 6 +- noxfile.py | 2 +- poetry.lock | 1437 ++++++++++++----------------------- pyproject.toml | 4 +- 6 files changed, 504 insertions(+), 954 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index be15e5e..98a47b1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,7 +1,6 @@ name: Tests on: - - push - pull_request jobs: @@ -16,12 +15,8 @@ jobs: - { python: "3.10", os: "ubuntu-latest", session: "safety" } - { python: "3.10", os: "ubuntu-latest", session: "mypy" } - { python: "3.9", os: "ubuntu-latest", session: "mypy" } - - { python: "3.8", os: "ubuntu-latest", session: "mypy" } - - { python: "3.7", os: "ubuntu-latest", session: "mypy" } - { python: "3.10", os: "ubuntu-latest", session: "tests" } - { python: "3.9", os: "ubuntu-latest", session: "tests" } - - { python: "3.8", os: "ubuntu-latest", session: "tests" } - - { python: "3.7", os: "ubuntu-latest", session: "tests" } - { python: "3.10", os: "windows-latest", session: "tests" } - { python: "3.10", os: "macos-latest", session: "tests" } - { python: "3.10", os: "ubuntu-latest", session: "typeguard" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1156d5f..bfbacca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ Here is a list of important resources for contributors: - [Issue Tracker] - [Code of Conduct] -[BSD 2-Clause license]: https://opensource.org/license/bsd-2-clause/ +[bsd 2-clause license]: https://opensource.org/license/bsd-2-clause/ [source code]: https://github.com/piskunow/kpm-tools [documentation]: https://kpm-tools.readthedocs.io/ [issue tracker]: https://github.com/piskunow/kpm-tools/issues @@ -37,7 +37,7 @@ Request features on the [Issue Tracker]. ## How to set up your development environment -You need Python 3.7+ and the following tools: +You need Python 3.9+ and the following tools: - [Poetry] - [Nox] diff --git a/README.md b/README.md index 6baa171..a64d50d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -<<<<<<< HEAD # kpm-tools + ======= + # KPM Tools [![PyPI](https://img.shields.io/pypi/v/kpm-tools.svg)][pypi_] @@ -51,7 +52,7 @@ To learn more, see the [Contributor Guide]. ## License -Distributed under the terms of the [MIT license][license], +Distributed under the terms of the [BSD 2-Clause license][license], _KPM Tools_ is free and open source software. ## Issues @@ -74,4 +75,3 @@ This project was generated from [@cjolowicz]'s [Hypermodern Python Cookiecutter] [license]: https://github.com/piskunow/kpm-tools/blob/main/LICENSE [contributor guide]: https://github.com/piskunow/kpm-tools/blob/main/CONTRIBUTING.md [command-line reference]: https://kpm-tools.readthedocs.io/en/latest/usage.html ->>>>>>> dccb53a (initial commit from hypermodern template) diff --git a/noxfile.py b/noxfile.py index 1f82ab1..e639112 100644 --- a/noxfile.py +++ b/noxfile.py @@ -23,7 +23,7 @@ package = "kpm_tools" -python_versions = ["3.10", "3.9", "3.8", "3.7"] +python_versions = ["3.10", "3.9"] nox.needs_version = ">= 2021.6.6" nox.options.sessions = ( "pre-commit", diff --git a/poetry.lock b/poetry.lock index adf4bc2..ff5c7a9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,47 +1,51 @@ [[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" [[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" +name = "argcomplete" +version = "3.1.6" +description = "Bash tab completion for argparse" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" + +[package.extras] +test = ["coverage", "pexpect", "wheel", "ruff", "mypy"] [[package]] name = "attrs" -version = "21.4.0" +version = "23.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.7" [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"] +cov = ["attrs", "coverage[toml] (>=5.3)"] +dev = ["attrs", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest-mypy-plugins", "pytest-xdist", "pytest (>=4.3.0)"] [[package]] name = "babel" -version = "2.10.1" +version = "2.13.1" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" -[package.dependencies] -pytz = ">=2015.7" +[package.extras] +dev = ["pytest (>=6.0)", "pytest-cov", "freezegun (>=1.0,<2.0)"] [[package]] name = "bandit" -version = "1.7.4" +version = "1.7.5" description = "Security oriented static analyser for python code." category = "dev" optional = false @@ -51,16 +55,17 @@ python-versions = ">=3.7" colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} GitPython = ">=1.0.1" PyYAML = ">=5.3.1" +rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml", "beautifulsoup4 (>=4.8.0)", "pylint (==1.9.4)"] -toml = ["toml"] +test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "beautifulsoup4 (>=4.8.0)", "pylint (==1.9.4)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] yaml = ["pyyaml"] [[package]] name = "beautifulsoup4" -version = "4.11.1" +version = "4.12.2" description = "Screen-scraping library" category = "dev" optional = false @@ -75,20 +80,20 @@ lxml = ["lxml"] [[package]] name = "black" -version = "22.3.0" +version = "23.11.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.8" [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_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\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -98,7 +103,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2022.5.18.1" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -106,26 +111,23 @@ python-versions = ">=3.6" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" category = "main" optional = false @@ -133,23 +135,36 @@ python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.4" +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 = "colorlog" +version = "6.7.0" +description = "Add colours to the output of Python's logging module." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "coverage" -version = "6.4.1" +version = "7.3.2" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -167,65 +182,76 @@ python-versions = ">=3.6,<4.0" [[package]] name = "distlib" -version = "0.3.4" +version = "0.3.7" description = "Distribution utilities" -category = "dev" +category = "main" optional = false python-versions = "*" [[package]] name = "docutils" -version = "0.17.1" +version = "0.20.1" 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 = "dparse" -version = "0.5.1" +version = "0.6.3" description = "A parser for Python dependency files" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] packaging = "*" -pyyaml = "*" -toml = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -pipenv = ["pipenv"] +conda = ["pyyaml"] +pipenv = ["pipenv (<=2022.12.19)"] [[package]] -name = "filelock" -version = "3.7.1" -description = "A platform independent file lock." +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx-autodoc-typehints (>=1.24)", "sphinx (>=7.2.6)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "pytest (>=7.4.3)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "flake8" -version = "4.0.1" +version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8.1" [package.dependencies] -importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.8.0,<2.9.0" -pyflakes = ">=2.4.0,<2.5.0" +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "flake8-bandit" -version = "3.0.0" +version = "4.1.1" description = "Automated security testing with bandit and flake8." category = "dev" optional = false @@ -233,111 +259,104 @@ python-versions = ">=3.6" [package.dependencies] bandit = ">=1.7.3" -flake8 = "*" -flake8-polyfill = "*" -pycodestyle = "*" +flake8 = ">=5.0.0" [[package]] name = "flake8-bugbear" -version = "22.4.25" +version = "23.9.16" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8.1" [package.dependencies] attrs = ">=19.2.0" -flake8 = ">=3.0.0" +flake8 = ">=6.0.0" [package.extras] -dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"] +dev = ["tox", "coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest"] [[package]] name = "flake8-docstrings" -version = "1.6.0" +version = "1.7.0" description = "Extension for flake8 which uses pydocstyle to check docstrings" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] flake8 = ">=3" pydocstyle = ">=2.1" -[[package]] -name = "flake8-polyfill" -version = "1.0.2" -description = "Polyfill package for Flake8 plugins" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = "*" - [[package]] name = "flake8-rst-docstrings" -version = "0.2.5" -description = "Python docstring reStructuredText (RST) validator" +version = "0.3.0" +description = "Python docstring reStructuredText (RST) validator for flake8" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3.0.0" +flake8 = ">=3" pygments = "*" restructuredtext-lint = "*" +[package.extras] +develop = ["build", "twine"] + [[package]] name = "furo" -version = "2022.4.7" +version = "2023.9.10" description = "A clean customisable Sphinx documentation theme." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.dependencies] beautifulsoup4 = "*" -pygments = ">=2.7,<3.0" -sphinx = ">=4.0,<5.0" +pygments = ">=2.7" +sphinx = ">=6.0,<8.0" +sphinx-basic-ng = "*" [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.11" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.27" -description = "GitPython is a python library used to interact with Git repositories" +version = "3.1.40" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} + +[package.extras] +test = ["black", "coverage", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar", "mock"] [[package]] name = "identify" -version = "2.5.1" +version = "2.5.32" description = "File identification library for Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] license = ["ukkonen"] [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -345,7 +364,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 @@ -353,40 +372,40 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.2.0" +version = "6.8.0" description = "Read metadata from Python packages" -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.dependencies] -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)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ruff", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[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" [[package]] name = "isort" -version = "5.10.1" +version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.8.0" [package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] -colors = ["colorama (>=0.4.3,<0.5.0)"] +colors = ["colorama (>=0.4.3)"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] [[package]] @@ -417,29 +436,28 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} [[package]] name = "markdown-it-py" -version = "2.1.0" +version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] mdurl = ">=0.1,<1.0" -typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code_style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +rtd = ["mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme", "jupyter-sphinx"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false @@ -447,31 +465,31 @@ 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 = "mdit-py-plugins" -version = "0.3.0" +version = "0.4.0" description = "Collection of plugins for markdown-it-py" category = "dev" optional = false -python-versions = "~=3.6" +python-versions = ">=3.8" [package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" +markdown-it-py = ">=1.0.0,<4.0.0" [package.extras] -code_style = ["pre-commit (==2.6)"] -rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] +code_style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "mdurl" -version = "0.1.1" +version = "0.1.2" description = "Markdown URL utilities" category = "dev" optional = false @@ -479,84 +497,111 @@ python-versions = ">=3.7" [[package]] name = "mypy" -version = "0.960" +version = "1.7.0" description = "Optional static typing for Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.dependencies] -mypy-extensions = ">=0.4.3" +mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} -typing-extensions = ">=3.10" +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<2)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] 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" [[package]] name = "myst-parser" -version = "0.17.2" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +version = "2.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] -docutils = ">=0.15,<0.18" +docutils = ">=0.16,<0.21" jinja2 = "*" -markdown-it-py = ">=1.0.0,<3.0.0" -mdit-py-plugins = ">=0.3.0,<0.4.0" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" pyyaml = "*" -sphinx = ">=3.1,<5" -typing-extensions = "*" +sphinx = ">=6,<8" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)"] -testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)"] +code_style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "sphinx-book-theme (==1.0.0rc2)", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-design2", "sphinx-copybutton", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-togglebutton"] +testing = ["beautifulsoup4", "coverage", "pytest (>=7,<8)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "nodeenv" -version = "1.6.0" +version = "1.8.0" description = "Node.js virtual environment builder" category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" [[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" +name = "nox" +version = "2023.4.22" +description = "Flexible test automation." +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[package.dependencies] +argcomplete = ">=1.9.4,<4.0" +colorlog = ">=2.6.1,<7.0.0" +packaging = ">=20.9" +virtualenv = ">=14" + +[package.extras] +tox_to_nox = ["jinja2", "tox (<4)"] + +[[package]] +name = "nox-poetry" +version = "1.0.3" +description = "nox-poetry" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" [package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +nox = ">=2020.8.22" +packaging = ">=20.9" +tomlkit = ">=0.7" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.11.2" 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 = "6.0.0" description = "Python Build Reasonableness" category = "dev" optional = false @@ -564,37 +609,34 @@ python-versions = ">=2.6" [[package]] name = "pep8-naming" -version = "0.13.0" +version = "0.13.3" description = "Check PEP-8 naming conventions, plugin for flake8" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3.9.1" +flake8 = ">=5.0.0" [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" +version = "4.0.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] -test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.24)", "sphinx (>=7.1.1)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest (>=7.4)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +python-versions = ">=3.8" [package.extras] dev = ["pre-commit", "tox"] @@ -602,134 +644,106 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.19.0" +version = "3.5.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} nodeenv = ">=0.11.1" pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" +virtualenv = ">=20.10.0" [[package]] name = "pre-commit-hooks" -version = "4.2.0" +version = "4.5.0" description = "Some out-of-the-box hooks for pre-commit." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] "ruamel.yaml" = ">=0.15" -toml = "*" - -[[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.*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "pycodestyle" -version = "2.8.0" +version = "2.11.1" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -snowballstemmer = "*" +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pyflakes" -version = "2.4.0" +version = "3.1.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.8" [[package]] name = "pygments" -version = "2.12.0" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.7" [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.4.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false 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\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} 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"] - -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pyupgrade" -version = "2.32.1" +version = "3.15.0" description = "A tool to automatically upgrade syntax for newer versions." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8.1" [package.dependencies] -tokenize-rt = ">=3.2.0" +tokenize-rt = ">=5.2.0" [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" category = "dev" optional = false @@ -737,21 +751,21 @@ python-versions = ">=3.6" [[package]] name = "requests" -version = "2.27.1" +version = "2.31.0" 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" [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\""} -urllib3 = ">=1.21.1,<1.27" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" [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 = "restructuredtext-lint" @@ -764,42 +778,62 @@ python-versions = "*" [package.dependencies] docutils = ">=0.11,<1.0" +[[package]] +name = "rich" +version = "13.7.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "ruamel.yaml" -version = "0.17.17" +version = "0.18.5" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "dev" optional = false -python-versions = ">=3" +python-versions = ">=3.7" [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] -docs = ["ryd"] +docs = ["ryd", "mercurial (>5.7)"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel.yaml.clib" -version = "0.2.6" +version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "safety" -version = "1.10.3" -description = "Checks installed dependencies for known vulnerabilities." +version = "2.3.4" +description = "Checks installed dependencies for known vulnerabilities and licenses." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = "*" [package.dependencies] -Click = ">=6.0" -dparse = ">=0.5.1" -packaging = "*" +Click = ">=8.0.2" +dparse = ">=0.6.2" +packaging = ">=21.0" requests = "*" +"ruamel.yaml" = ">=0.17.21" + +[package.extras] +github = ["pygithub (>=1.43.3)", "jinja2 (>=3.1.0)"] +gitlab = ["python-gitlab (>=1.3.0)"] [[package]] name = "six" @@ -811,11 +845,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" -version = "5.0.0" +version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "snowballstemmer" @@ -827,42 +861,43 @@ python-versions = "*" [[package]] name = "soupsieve" -version = "2.3.2.post1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [[package]] name = "sphinx" -version = "4.3.2" +version = "7.2.6" description = "Python documentation generator" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" [package.dependencies] alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.920)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] +lint = ["flake8 (>=3.5.0)", "flake8-simplify", "isort", "ruff", "mypy (>=0.990)", "sphinx-lint", "docutils-stubs", "types-requests"] +test = ["pytest (>=4.6)", "html5lib", "cython (>=3.0)", "setuptools (>=67.0)", "filelock"] [[package]] name = "sphinx-autobuild" @@ -880,13 +915,27 @@ sphinx = "*" [package.extras] test = ["pytest", "pytest-cov"] +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +description = "A modern skeleton for Sphinx themes." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +sphinx = ">=4.0" + +[package.extras] +docs = ["furo", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs", "ipython"] + [[package]] name = "sphinx-click" -version = "4.1.0" +version = "5.1.0" description = "Sphinx extension that automatically documents click applications" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] click = ">=7.0" @@ -895,11 +944,14 @@ sphinx = ">=2.0" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "1.0.7" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" + +[package.dependencies] +Sphinx = ">=5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -907,11 +959,14 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" + +[package.dependencies] +Sphinx = ">=5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -919,11 +974,14 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" + +[package.dependencies] +Sphinx = ">=5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -942,11 +1000,14 @@ test = ["pytest", "flake8", "mypy"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" + +[package.dependencies] +Sphinx = ">=5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -954,11 +1015,14 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" + +[package.dependencies] +Sphinx = ">=5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -966,31 +1030,22 @@ test = ["pytest"] [[package]] name = "stevedore" -version = "3.5.0" +version = "5.1.0" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.dependencies] -importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "tokenize-rt" -version = "4.2.1" +version = "5.2.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." category = "dev" optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.8" [[package]] name = "tomli" @@ -1001,709 +1056,207 @@ optional = false python-versions = ">=3.7" [[package]] -name = "tornado" -version = "6.1" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" +name = "tomlkit" +version = "0.12.3" +description = "Style preserving TOML library" +category = "main" optional = false -python-versions = ">= 3.5" +python-versions = ">=3.7" [[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">= 3.8" [[package]] name = "typeguard" -version = "2.13.3" +version = "4.1.5" description = "Run-time type checker for Python" category = "dev" optional = false -python-versions = ">=3.5.3" +python-versions = ">=3.8" + +[package.dependencies] +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.7.0", markers = "python_version < \"3.12\""} [package.extras] -doc = ["sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["pytest", "typing-extensions", "mypy"] +doc = ["packaging", "Sphinx (>=7)", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=7)", "pytest (>=7)", "mypy (>=1.2.0)"] [[package]] name = "typing-extensions" -version = "4.2.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [[package]] name = "urllib3" -version = "1.26.9" +version = "2.1.0" 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 = ">=3.8" [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"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.14.1" +version = "20.24.7" description = "Virtual Python Environment builder" -category = "dev" +category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx-argparse (>=0.4)", "sphinx (>=7.1.2)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage-enable-subprocess (>=1)", "coverage (>=7.2.7)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "pytest (>=7.4)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "xdoctest" -version = "1.0.0" +version = "1.1.2" description = "A rewrite of the builtin doctest module" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] colorama = {version = "*", optional = true, markers = "platform_system == \"Windows\" and extra == \"colors\""} Pygments = {version = "*", optional = true, markers = "python_version >= \"3.5.0\" and extra == \"colors\""} -six = "*" [package.extras] -all = ["ipython", "ipython", "pygments", "pygments", "attrs", "cmake", "codecov", "colorama", "debugpy", "ipykernel", "ipykernel", "jedi", "jinja2", "jupyter-client", "jupyter-client", "jupyter-core", "nbconvert", "ninja", "pybind11", "pytest-cov", "pytest-cov", "pytest-cov", "pytest-cov", "pytest", "pytest", "pytest", "pytest", "pytest", "pytest", "scikit-build", "six", "typing"] -jupyter = ["ipython", "ipython", "attrs", "debugpy", "ipykernel", "ipykernel", "jedi", "jinja2", "jupyter-client", "jupyter-client", "jupyter-core", "nbconvert"] -optional = ["ipython", "ipython", "pygments", "pygments", "attrs", "colorama", "debugpy", "ipykernel", "ipykernel", "jedi", "jinja2", "jupyter-client", "jupyter-client", "jupyter-core", "nbconvert"] -colors = ["pygments", "pygments", "colorama"] -tests = ["cmake", "codecov", "ninja", "pybind11", "pytest-cov", "pytest-cov", "pytest-cov", "pytest-cov", "pytest", "pytest", "pytest", "pytest", "pytest", "pytest", "scikit-build", "typing"] +all = ["pyflakes (>=2.2.0)", "colorama (>=0.4.1)", "debugpy (>=1.3.0)", "pytest (>=4.6.0)", "tomli (>=0.2.0)", "ipykernel (>=6.0.0)", "Pygments (>=2.0.0)", "jupyter-client (>=6.1.5)", "IPython (>=7.10.0)", "debugpy (>=1.0.0)", "ipykernel (>=5.2.0)", "pytest (>=4.6.0)", "nbconvert (>=6.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "ipykernel (>=6.11.0)", "typing (>=3.7.4)", "debugpy (>=1.6.0)", "pytest (>=6.2.5)", "Pygments (>=2.4.1)", "attrs (>=19.2.0)", "jedi (>=0.16)", "jupyter-core (>=4.7.0)", "ipython-genutils (>=0.2.0)", "jinja2 (>=3.0.0)", "pytest-cov (>=3.0.0)", "jupyter-client (>=7.0.0)", "IPython (>=7.23.1)", "nbconvert (>=6.1.0)"] +all-strict = ["pyflakes (==2.2.0)", "colorama (==0.4.1)", "debugpy (==1.3.0)", "pytest (==4.6.0)", "tomli (==0.2.0)", "ipykernel (==6.0.0)", "Pygments (==2.0.0)", "jupyter-client (==6.1.5)", "IPython (==7.10.0)", "debugpy (==1.0.0)", "ipykernel (==5.2.0)", "pytest (==4.6.0)", "nbconvert (==6.0.0)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "ipykernel (==6.11.0)", "typing (==3.7.4)", "debugpy (==1.6.0)", "pytest (==6.2.5)", "Pygments (==2.4.1)", "attrs (==19.2.0)", "jedi (==0.16)", "jupyter-core (==4.7.0)", "ipython-genutils (==0.2.0)", "jinja2 (==3.0.0)", "pytest-cov (==3.0.0)", "jupyter-client (==7.0.0)", "IPython (==7.23.1)", "nbconvert (==6.1.0)"] +colors = ["colorama", "pygments", "pygments"] +jupyter = ["debugpy", "ipykernel", "jupyter-client", "ipython", "debugpy", "ipykernel", "nbconvert", "debugpy", "debugpy", "ipykernel", "debugpy", "attrs", "jedi", "jupyter-core", "ipython-genutils", "jinja2", "jupyter-client", "ipython", "nbconvert"] +optional = ["pyflakes (>=2.2.0)", "colorama (>=0.4.1)", "debugpy (>=1.3.0)", "tomli (>=0.2.0)", "ipykernel (>=6.0.0)", "Pygments (>=2.0.0)", "jupyter-client (>=6.1.5)", "IPython (>=7.10.0)", "debugpy (>=1.0.0)", "ipykernel (>=5.2.0)", "nbconvert (>=6.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "ipykernel (>=6.11.0)", "debugpy (>=1.6.0)", "Pygments (>=2.4.1)", "attrs (>=19.2.0)", "jedi (>=0.16)", "jupyter-core (>=4.7.0)", "ipython-genutils (>=0.2.0)", "jinja2 (>=3.0.0)", "jupyter-client (>=7.0.0)", "IPython (>=7.23.1)", "nbconvert (>=6.1.0)"] +optional-strict = ["pyflakes (==2.2.0)", "colorama (==0.4.1)", "debugpy (==1.3.0)", "tomli (==0.2.0)", "ipykernel (==6.0.0)", "Pygments (==2.0.0)", "jupyter-client (==6.1.5)", "IPython (==7.10.0)", "debugpy (==1.0.0)", "ipykernel (==5.2.0)", "nbconvert (==6.0.0)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "ipykernel (==6.11.0)", "debugpy (==1.6.0)", "Pygments (==2.4.1)", "attrs (==19.2.0)", "jedi (==0.16)", "jupyter-core (==4.7.0)", "ipython-genutils (==0.2.0)", "jinja2 (==3.0.0)", "jupyter-client (==7.0.0)", "IPython (==7.23.1)", "nbconvert (==6.1.0)"] +tests-binary-strict = ["cmake (==3.21.2)", "ninja (==1.10.2)", "pybind11 (==2.7.1)", "scikit-build (==0.11.1)", "cmake (==3.25.0)", "ninja (==1.11.1)", "pybind11 (==2.10.3)", "scikit-build (==0.16.1)"] +tests-binary = ["cmake", "ninja", "pybind11", "scikit-build", "cmake", "ninja", "pybind11", "scikit-build"] +tests-strict = ["pytest (==4.6.0)", "pytest (==4.6.0)", "typing (==3.7.4)", "pytest (==6.2.5)", "pytest-cov (==3.0.0)"] +tests = ["pytest (>=4.6.0)", "pytest (>=4.6.0)", "typing (>=3.7.4)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)"] [[package]] name = "zipp" -version = "3.8.0" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" +category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=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 (>=0.9.1)"] +docs = ["sphinx (>=3.5)", "sphinx (<7.2.5)", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ruff", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-ignore-flaky", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" -python-versions = "^3.7" -content-hash = "1900b973776618b00b3a495afaf7e3577de250e6c7d5068674585f37f4ab5896" +python-versions = "^3.9" +content-hash = "7b25301f76583cb2eab4c52b803087e5307849c4ca10779013bc3cff85a7fcaf" [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"}, -] -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"}, -] -babel = [ - {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, - {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, -] -bandit = [ - {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, - {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] -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"}, -] -certifi = [ - {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"}, - {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -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"}, -] -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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -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"}, -] -darglint = [ - {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"}, - {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, -] -dparse = [ - {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"}, - {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"}, -] -filelock = [ - {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, - {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, -] -flake8 = [ - {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, - {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, -] -flake8-bandit = [ - {file = "flake8_bandit-3.0.0-py2.py3-none-any.whl", hash = "sha256:61b617f4f7cdaa0e2b1e6bf7b68afb2b619a227bb3e3ae00dd36c213bd17900a"}, - {file = "flake8_bandit-3.0.0.tar.gz", hash = "sha256:54d19427e6a8d50322a7b02e1841c0a7c22d856975f3459803320e0e18e2d6a1"}, -] -flake8-bugbear = [ - {file = "flake8-bugbear-22.4.25.tar.gz", hash = "sha256:f7c080563fca75ee6b205d06b181ecba22b802babb96b0b084cc7743d6908a55"}, - {file = "flake8_bugbear-22.4.25-py3-none-any.whl", hash = "sha256:ec374101cddf65bd7a96d393847d74e58d3b98669dbf9768344c39b6290e8bd6"}, -] -flake8-docstrings = [ - {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"}, - {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"}, -] -flake8-polyfill = [ - {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"}, - {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"}, -] -flake8-rst-docstrings = [ - {file = "flake8-rst-docstrings-0.2.5.tar.gz", hash = "sha256:4fe93f997dea45d9d3c8bd220f12f0b6c359948fb943b5b48021a3f927edd816"}, - {file = "flake8_rst_docstrings-0.2.5-py3-none-any.whl", hash = "sha256:b99d9041b769b857efe45a448dc8c71b1bb311f9cacbdac5de82f96498105082"}, -] -furo = [ - {file = "furo-2022.4.7-py3-none-any.whl", hash = "sha256:7f3e3d2fb977483590f8ecb2c2cd511bd82661b79c18efb24de9558bc9cdf2d7"}, - {file = "furo-2022.4.7.tar.gz", hash = "sha256:96204ab7cd047e4b6c523996e0279c4c629a8fc31f4f109b2efd470c17f49c80"}, -] -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.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, -] -identify = [ - {file = "identify-2.5.1-py2.py3-none-any.whl", hash = "sha256:0dca2ea3e4381c435ef9c33ba100a78a9b40c0bab11189c7cf121f75815efeaa"}, - {file = "identify-2.5.1.tar.gz", hash = "sha256:3d11b16f3fe19f52039fb7e39c9c884b21cb1b586988114fbe42671f03de3e82"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -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"}, -] -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"}, -] -livereload = [ - {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, -] -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.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mdit-py-plugins = [ - {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, - {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, -] -mdurl = [ - {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, - {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, -] -mypy = [ - {file = "mypy-0.960-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3a3e525cd76c2c4f90f1449fd034ba21fcca68050ff7c8397bb7dd25dd8b8248"}, - {file = "mypy-0.960-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7a76dc4f91e92db119b1be293892df8379b08fd31795bb44e0ff84256d34c251"}, - {file = "mypy-0.960-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffdad80a92c100d1b0fe3d3cf1a4724136029a29afe8566404c0146747114382"}, - {file = "mypy-0.960-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7d390248ec07fa344b9f365e6ed9d205bd0205e485c555bed37c4235c868e9d5"}, - {file = "mypy-0.960-cp310-cp310-win_amd64.whl", hash = "sha256:925aa84369a07846b7f3b8556ccade1f371aa554f2bd4fb31cb97a24b73b036e"}, - {file = "mypy-0.960-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:239d6b2242d6c7f5822163ee082ef7a28ee02e7ac86c35593ef923796826a385"}, - {file = "mypy-0.960-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f1ba54d440d4feee49d8768ea952137316d454b15301c44403db3f2cb51af024"}, - {file = "mypy-0.960-cp36-cp36m-win_amd64.whl", hash = "sha256:cb7752b24528c118a7403ee955b6a578bfcf5879d5ee91790667c8ea511d2085"}, - {file = "mypy-0.960-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:826a2917c275e2ee05b7c7b736c1e6549a35b7ea5a198ca457f8c2ebea2cbecf"}, - {file = "mypy-0.960-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3eabcbd2525f295da322dff8175258f3fc4c3eb53f6d1929644ef4d99b92e72d"}, - {file = "mypy-0.960-cp37-cp37m-win_amd64.whl", hash = "sha256:f47322796c412271f5aea48381a528a613f33e0a115452d03ae35d673e6064f8"}, - {file = "mypy-0.960-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2c7f8bb9619290836a4e167e2ef1f2cf14d70e0bc36c04441e41487456561409"}, - {file = "mypy-0.960-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbfb873cf2b8d8c3c513367febde932e061a5f73f762896826ba06391d932b2a"}, - {file = "mypy-0.960-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc537885891382e08129d9862553b3d00d4be3eb15b8cae9e2466452f52b0117"}, - {file = "mypy-0.960-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:481f98c6b24383188c928f33dd2f0776690807e12e9989dd0419edd5c74aa53b"}, - {file = "mypy-0.960-cp38-cp38-win_amd64.whl", hash = "sha256:29dc94d9215c3eb80ac3c2ad29d0c22628accfb060348fd23d73abe3ace6c10d"}, - {file = "mypy-0.960-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:33d53a232bb79057f33332dbbb6393e68acbcb776d2f571ba4b1d50a2c8ba873"}, - {file = "mypy-0.960-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d645e9e7f7a5da3ec3bbcc314ebb9bb22c7ce39e70367830eb3c08d0140b9ce"}, - {file = "mypy-0.960-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:85cf2b14d32b61db24ade8ac9ae7691bdfc572a403e3cb8537da936e74713275"}, - {file = "mypy-0.960-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a85a20b43fa69efc0b955eba1db435e2ffecb1ca695fe359768e0503b91ea89f"}, - {file = "mypy-0.960-cp39-cp39-win_amd64.whl", hash = "sha256:0ebfb3f414204b98c06791af37a3a96772203da60636e2897408517fcfeee7a8"}, - {file = "mypy-0.960-py3-none-any.whl", hash = "sha256:bfd4f6536bd384c27c392a8b8f790fd0ed5c0cf2f63fc2fed7bce56751d53026"}, - {file = "mypy-0.960.tar.gz", hash = "sha256:d4fccf04c1acf750babd74252e0f2db6bd2ac3aa8fe960797d9f3ef41cf2bfd4"}, -] -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"}, -] -myst-parser = [ - {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"}, - {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"}, -] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] -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.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -pbr = [ - {file = "pbr-5.9.0-py2.py3-none-any.whl", hash = "sha256:e547125940bcc052856ded43be8e101f63828c2d94239ffbe2b327ba3d5ccf0a"}, - {file = "pbr-5.9.0.tar.gz", hash = "sha256:e8dca2f4b43560edef58813969f52a56cef023146cbb8931626db80e6c1c4308"}, -] -pep8-naming = [ - {file = "pep8-naming-0.13.0.tar.gz", hash = "sha256:9f38e6dcf867a1fb7ad47f5ff72c0ddae544a6cf64eb9f7600b7b3c0bb5980b5"}, - {file = "pep8_naming-0.13.0-py3-none-any.whl", hash = "sha256:069ea20e97f073b3e6d4f789af2a57816f281ca64b86210c7d471117a4b6bfd0"}, -] -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"}, -] -pre-commit = [ - {file = "pre_commit-2.19.0-py2.py3-none-any.whl", hash = "sha256:10c62741aa5704faea2ad69cb550ca78082efe5697d6f04e5710c3c229afdd10"}, - {file = "pre_commit-2.19.0.tar.gz", hash = "sha256:4233a1e38621c87d9dda9808c6606d7e7ba0e087cd56d3fe03202a01d2919615"}, -] -pre-commit-hooks = [ - {file = "pre_commit_hooks-4.2.0-py2.py3-none-any.whl", hash = "sha256:b3a3066c5ecd5fdda9abdc932bd064bd21785ea041659676403e6fc5d964afed"}, - {file = "pre_commit_hooks-4.2.0.tar.gz", hash = "sha256:9726420c7a071e8cb233a066d36bc074b593a40f0b1b491d1b75aafa55390703"}, -] -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.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, - {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, -] -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.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, - {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, -] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] -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.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] -pyupgrade = [ - {file = "pyupgrade-2.32.1-py2.py3-none-any.whl", hash = "sha256:d874f34870abadd7536c89678f9811076d5df93c13620f90a125355a2d31fa91"}, - {file = "pyupgrade-2.32.1.tar.gz", hash = "sha256:11e2c3e4e2e53a61b2d8852ed154ea5683887b6ac42561622ca8d89c94fd951a"}, -] -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-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"}, -] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] -restructuredtext-lint = [ - {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, -] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.17.17-py3-none-any.whl", hash = "sha256:9af3ec5d7f8065582f3aa841305465025d0afd26c5fb54e15b964e11838fc74f"}, - {file = "ruamel.yaml-0.17.17.tar.gz", hash = "sha256:9751de4cbb57d4bfbf8fc394e125ed4a2f170fbff3dc3d78abf50be85924f8be"}, -] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, - {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, -] -safety = [ - {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"}, - {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -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"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] -sphinx = [ - {file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"}, - {file = "Sphinx-4.3.2.tar.gz", hash = "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c"}, -] -sphinx-autobuild = [ - {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"}, - {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, -] -sphinx-click = [ - {file = "sphinx-click-4.1.0.tar.gz", hash = "sha256:fedebd39991243ec5cfa1c9e483db7ea2621b3df2012315c89c6f1f3722f192b"}, - {file = "sphinx_click-4.1.0-py3-none-any.whl", hash = "sha256:60d6507bf623e20e9cbab732d19fc4890cc36a394c82ba8e2320f9f9fdc4571e"}, -] -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.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"}, - {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"}, -] -tokenize-rt = [ - {file = "tokenize_rt-4.2.1-py2.py3-none-any.whl", hash = "sha256:08a27fa032a81cf45e8858d0ac706004fcd523e8463415ddf1442be38e204ea8"}, - {file = "tokenize_rt-4.2.1.tar.gz", hash = "sha256:0d4f69026fed520f8a1e0103aa36c406ef4661417f20ca643f913e33531b3b94"}, -] -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"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -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"}, -] -typeguard = [ - {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, - {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, -] -typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, -] -virtualenv = [ - {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"}, - {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"}, -] -xdoctest = [ - {file = "xdoctest-1.0.0-py2-none-any.whl", hash = "sha256:0b0b5958e0ac0a28c5496f96b7f0adbeb0ea7e0c0a227de1ce3bc79ddb1a4f00"}, - {file = "xdoctest-1.0.0-py3-none-any.whl", hash = "sha256:76f44dc74515ff4bdf3cc3e91a2e408cf5699cfa03367634efaadf138c7b132d"}, - {file = "xdoctest-1.0.0.tar.gz", hash = "sha256:7ebba7e71457e6e7cf86c463699575e52b1c9cc32ee2ee5e72256d6cd3aaeb2d"}, -] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] +alabaster = [] +argcomplete = [] +attrs = [] +babel = [] +bandit = [] +beautifulsoup4 = [] +black = [] +certifi = [] +cfgv = [] +charset-normalizer = [] +click = [] +colorama = [] +colorlog = [] +coverage = [] +darglint = [] +distlib = [] +docutils = [] +dparse = [] +exceptiongroup = [] +filelock = [] +flake8 = [] +flake8-bandit = [] +flake8-bugbear = [] +flake8-docstrings = [] +flake8-rst-docstrings = [] +furo = [] +gitdb = [] +gitpython = [] +identify = [] +idna = [] +imagesize = [] +importlib-metadata = [] +iniconfig = [] +isort = [] +jinja2 = [] +livereload = [] +markdown-it-py = [] +markupsafe = [] +mccabe = [] +mdit-py-plugins = [] +mdurl = [] +mypy = [] +mypy-extensions = [] +myst-parser = [] +nodeenv = [] +nox = [] +nox-poetry = [] +packaging = [] +pathspec = [] +pbr = [] +pep8-naming = [] +platformdirs = [] +pluggy = [] +pre-commit = [] +pre-commit-hooks = [] +pycodestyle = [] +pydocstyle = [] +pyflakes = [] +pygments = [] +pytest = [] +pyupgrade = [] +pyyaml = [] +requests = [] +restructuredtext-lint = [] +rich = [] +"ruamel.yaml" = [] +"ruamel.yaml.clib" = [] +safety = [] +six = [] +smmap = [] +snowballstemmer = [] +soupsieve = [] +sphinx = [] +sphinx-autobuild = [] +sphinx-basic-ng = [] +sphinx-click = [] +sphinxcontrib-applehelp = [] +sphinxcontrib-devhelp = [] +sphinxcontrib-htmlhelp = [] +sphinxcontrib-jsmath = [] +sphinxcontrib-qthelp = [] +sphinxcontrib-serializinghtml = [] +stevedore = [] +tokenize-rt = [] +tomli = [] +tomlkit = [] +tornado = [] +typeguard = [] +typing-extensions = [] +urllib3 = [] +virtualenv = [] +xdoctest = [] +zipp = [] diff --git a/pyproject.toml b/pyproject.toml index a0c535e..48044be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,8 +16,10 @@ classifiers = [ Changelog = "https://github.com/piskunow/kpm-tools/releases" [tool.poetry.dependencies] -python = "^3.7" +python = "^3.9" click = ">=8.0.1" +tornado = ">=6.3.3" +nox-poetry = "^1.0.3" [tool.poetry.dev-dependencies] Pygments = ">=2.10.0" From 7318078d399bb64dd67b5a60c29e205b3b85f20f Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Wed, 22 Nov 2023 11:44:01 +0100 Subject: [PATCH 02/24] Feature/add nbsphinx (#21) * install nbsphinx * fix license * use nbsphinx in building the docs * add test tutorial docs * only test on PRs --- .cookiecutter.json | 2 +- docs/conf.py | 1 + docs/index.md | 1 + docs/tutorials.md | 9 ++ noxfile.py | 10 +- poetry.lock | 394 +++++++++++++++++++++++++++++++++++++++++---- pyproject.toml | 3 +- 7 files changed, 390 insertions(+), 30 deletions(-) create mode 100644 docs/tutorials.md diff --git a/.cookiecutter.json b/.cookiecutter.json index e68897d..9fe54d7 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -9,7 +9,7 @@ "email": "kpm@piskunow.com", "friendly_name": "KPM Tools", "github_user": "piskunow", - "license": "MIT", + "license": "BSD 2-Clause", "package_name": "kpm_tools", "project_name": "kpm-tools", "version": "0.0.0" diff --git a/docs/conf.py b/docs/conf.py index 930a42b..302747b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -7,6 +7,7 @@ "sphinx.ext.napoleon", "sphinx_click", "myst_parser", + "nbsphinx", ] autodoc_typehints = "description" html_theme = "furo" diff --git a/docs/index.md b/docs/index.md index 7f9747b..bca2b31 100644 --- a/docs/index.md +++ b/docs/index.md @@ -14,6 +14,7 @@ hidden: maxdepth: 1 --- +Tutorials usage reference contributing diff --git a/docs/tutorials.md b/docs/tutorials.md new file mode 100644 index 0000000..57a349e --- /dev/null +++ b/docs/tutorials.md @@ -0,0 +1,9 @@ +# 📘 Tutorials + +```{toctree} +--- +maxdepth: 1 +--- + +tutorial_01_test +``` diff --git a/noxfile.py b/noxfile.py index e639112..a418552 100644 --- a/noxfile.py +++ b/noxfile.py @@ -227,7 +227,15 @@ def docs(session: Session) -> None: """Build and serve the documentation with live reloading on file changes.""" args = session.posargs or ["--open-browser", "docs", "docs/_build"] session.install(".") - session.install("sphinx", "sphinx-autobuild", "sphinx-click", "furo", "myst-parser") + session.install( + "sphinx", + "sphinx-autobuild", + "sphinx-click", + "furo", + "myst-parser", + "nbsphinx", + "pandoc", + ) build_dir = Path("docs", "_build") if build_dir.exists(): diff --git a/poetry.lock b/poetry.lock index ff5c7a9..0542606 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,7 +2,7 @@ name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -21,7 +21,7 @@ test = ["coverage", "pexpect", "wheel", "ruff", "mypy"] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -36,7 +36,7 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.13.1" description = "Internationalization utilities" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -67,7 +67,7 @@ yaml = ["pyyaml"] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "dev" +category = "main" optional = false python-versions = ">=3.6.0" @@ -101,14 +101,40 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + [[package]] name = "certifi" version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" +category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +pycparser = "*" + [[package]] name = "cfgv" version = "3.4.0" @@ -121,7 +147,7 @@ python-versions = ">=3.8" name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" +category = "main" optional = false python-versions = ">=3.7.0" @@ -180,6 +206,14 @@ category = "dev" optional = false python-versions = ">=3.6,<4.0" +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + [[package]] name = "distlib" version = "0.3.7" @@ -192,7 +226,7 @@ python-versions = "*" name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -223,6 +257,17 @@ python-versions = ">=3.7" [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fastjsonschema" +version = "2.19.0" +description = "Fastest Python implementation of JSON schema" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "filelock" version = "3.13.1" @@ -358,7 +403,7 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" +category = "main" optional = false python-versions = ">=3.5" @@ -366,7 +411,7 @@ python-versions = ">=3.5" name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -374,7 +419,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -412,7 +457,7 @@ plugins = ["setuptools"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -422,6 +467,80 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jsonschema" +version = "4.20.0" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.11.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinx (>=4)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.5.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "livereload" version = "2.6.3" @@ -459,7 +578,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -495,6 +614,14 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "mypy" version = "1.7.0" @@ -545,6 +672,94 @@ rtd = ["ipython", "sphinx-book-theme (==1.0.0rc2)", "pydata-sphinx-theme (==v0.1 testing = ["beautifulsoup4", "coverage", "pytest (>=7,<8)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)", "sphinx-pytest"] testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] +[[package]] +name = "nbclient" +version = "0.9.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "main" +optional = false +python-versions = ">=3.8.0" + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient", "sphinx-book-theme", "sphinx (>=1.7)", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "pytest (>=7.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.11.0" +description = "Converting Jupyter Notebooks" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["nbconvert"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.9.2" +description = "The Jupyter Notebook format" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nbsphinx" +version = "0.9.3" +description = "Jupyter Notebook Tools for Sphinx" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +docutils = "*" +jinja2 = "*" +nbconvert = "!=5.4" +nbformat = "*" +sphinx = ">=1.8" +traitlets = ">=5" + [[package]] name = "nodeenv" version = "1.8.0" @@ -591,6 +806,14 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pathspec" version = "0.11.2" @@ -677,6 +900,14 @@ category = "dev" optional = false python-versions = ">=3.8" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pydocstyle" version = "6.3.0" @@ -703,7 +934,7 @@ python-versions = ">=3.8" name = "pygments" version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -730,6 +961,17 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + [[package]] name = "pyupgrade" version = "3.15.0" @@ -741,6 +983,14 @@ python-versions = ">=3.8.1" [package.dependencies] tokenize-rt = ">=5.2.0" +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "pyyaml" version = "6.0.1" @@ -749,11 +999,34 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "pyzmq" +version = "25.1.1" +description = "Python bindings for 0MQ" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.31.0" +description = "JSON Referencing + Python" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -793,6 +1066,14 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rpds-py" +version = "0.13.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +category = "main" +optional = false +python-versions = ">=3.8" + [[package]] name = "ruamel.yaml" version = "0.18.5" @@ -839,7 +1120,7 @@ gitlab = ["python-gitlab (>=1.3.0)"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" @@ -855,7 +1136,7 @@ python-versions = ">=3.7" name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" +category = "main" optional = false python-versions = "*" @@ -863,7 +1144,7 @@ python-versions = "*" name = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -871,7 +1152,7 @@ python-versions = ">=3.8" name = "sphinx" version = "7.2.6" description = "Python documentation generator" -category = "dev" +category = "main" optional = false python-versions = ">=3.9" @@ -946,7 +1227,7 @@ sphinx = ">=2.0" name = "sphinxcontrib-applehelp" version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" +category = "main" optional = false python-versions = ">=3.9" @@ -961,7 +1242,7 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.5" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -category = "dev" +category = "main" optional = false python-versions = ">=3.9" @@ -976,7 +1257,7 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" +category = "main" optional = false python-versions = ">=3.9" @@ -991,7 +1272,7 @@ test = ["pytest", "html5lib"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" +category = "main" optional = false python-versions = ">=3.5" @@ -1002,7 +1283,7 @@ test = ["pytest", "flake8", "mypy"] name = "sphinxcontrib-qthelp" version = "1.0.6" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -category = "dev" +category = "main" optional = false python-versions = ">=3.9" @@ -1017,7 +1298,7 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.9" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -category = "dev" +category = "main" optional = false python-versions = ">=3.9" @@ -1039,6 +1320,21 @@ python-versions = ">=3.8" [package.dependencies] pbr = ">=2.0.0,<2.1.0 || >2.1.0" +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "isort", "flake8"] + [[package]] name = "tokenize-rt" version = "5.2.0" @@ -1071,6 +1367,18 @@ category = "main" optional = false python-versions = ">= 3.8" +[[package]] +name = "traitlets" +version = "5.13.0" +description = "Traitlets Python configuration system" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest-mock", "pytest-mypy-testing", "pytest (>=7.0,<7.5)"] + [[package]] name = "typeguard" version = "4.1.5" @@ -1099,7 +1407,7 @@ python-versions = ">=3.8" name = "urllib3" version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -1125,6 +1433,14 @@ platformdirs = ">=3.9.1,<5" docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx-argparse (>=0.4)", "sphinx (>=7.1.2)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage-enable-subprocess (>=1)", "coverage (>=7.2.7)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "pytest (>=7.4)", "setuptools (>=68)", "time-machine (>=2.10)"] +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "xdoctest" version = "1.1.2" @@ -1153,7 +1469,7 @@ tests = ["pytest (>=4.6.0)", "pytest (>=4.6.0)", "typing (>=3.7.4)", "pytest (>= name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -1164,7 +1480,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "7b25301f76583cb2eab4c52b803087e5307849c4ca10779013bc3cff85a7fcaf" +content-hash = "b546e2af0182f7cd8c1e1ac1d2cf9878c42d467f7b1039cf04e6c260042c8661" [metadata.files] alabaster = [] @@ -1174,7 +1490,9 @@ babel = [] bandit = [] beautifulsoup4 = [] black = [] +bleach = [] certifi = [] +cffi = [] cfgv = [] charset-normalizer = [] click = [] @@ -1182,10 +1500,12 @@ colorama = [] colorlog = [] coverage = [] darglint = [] +defusedxml = [] distlib = [] docutils = [] dparse = [] exceptiongroup = [] +fastjsonschema = [] filelock = [] flake8 = [] flake8-bandit = [] @@ -1202,19 +1522,30 @@ importlib-metadata = [] iniconfig = [] isort = [] jinja2 = [] +jsonschema = [] +jsonschema-specifications = [] +jupyter-client = [] +jupyter-core = [] +jupyterlab-pygments = [] livereload = [] markdown-it-py = [] markupsafe = [] mccabe = [] mdit-py-plugins = [] mdurl = [] +mistune = [] mypy = [] mypy-extensions = [] myst-parser = [] +nbclient = [] +nbconvert = [] +nbformat = [] +nbsphinx = [] nodeenv = [] nox = [] nox-poetry = [] packaging = [] +pandocfilters = [] pathspec = [] pbr = [] pep8-naming = [] @@ -1223,15 +1554,21 @@ pluggy = [] pre-commit = [] pre-commit-hooks = [] pycodestyle = [] +pycparser = [] pydocstyle = [] pyflakes = [] pygments = [] pytest = [] +python-dateutil = [] pyupgrade = [] +pywin32 = [] pyyaml = [] +pyzmq = [] +referencing = [] requests = [] restructuredtext-lint = [] rich = [] +rpds-py = [] "ruamel.yaml" = [] "ruamel.yaml.clib" = [] safety = [] @@ -1250,13 +1587,16 @@ sphinxcontrib-jsmath = [] sphinxcontrib-qthelp = [] sphinxcontrib-serializinghtml = [] stevedore = [] +tinycss2 = [] tokenize-rt = [] tomli = [] tomlkit = [] tornado = [] +traitlets = [] typeguard = [] typing-extensions = [] urllib3 = [] virtualenv = [] +webencodings = [] xdoctest = [] zipp = [] diff --git a/pyproject.toml b/pyproject.toml index 48044be..7c7b3aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "kpm-tools" version = "0.0.0" description = "KPM Tools" authors = ["Pablo Piskunow "] -license = "MIT" +license = "BSD 2-Clause" readme = "README.md" homepage = "https://github.com/piskunow/kpm-tools" repository = "https://github.com/piskunow/kpm-tools" @@ -18,6 +18,7 @@ Changelog = "https://github.com/piskunow/kpm-tools/releases" [tool.poetry.dependencies] python = "^3.9" click = ">=8.0.1" +nbsphinx = "^0.9.3" tornado = ">=6.3.3" nox-poetry = "^1.0.3" From b37767df3a5d10b934ac3f5187b80f570be6b53c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:47:14 +0100 Subject: [PATCH 03/24] Bump sphinx-click from 4.1.0 to 5.1.0 in /docs (#1) Bumps [sphinx-click](https://github.com/click-contrib/sphinx-click) from 4.1.0 to 5.1.0. - [Release notes](https://github.com/click-contrib/sphinx-click/releases) - [Commits](https://github.com/click-contrib/sphinx-click/compare/4.1.0...5.1.0) --- updated-dependencies: - dependency-name: sphinx-click dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 6ed18d9..3602474 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ furo==2022.4.7 sphinx==4.5.0 -sphinx-click==4.1.0 +sphinx-click==5.1.0 myst_parser==0.17.2 From eef981f097e18c57b31c280d3829b37e0bf4bc41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:47:55 +0100 Subject: [PATCH 04/24] Bump crazy-max/ghaction-github-labeler from 4.0.0 to 5.0.0 (#2) Bumps [crazy-max/ghaction-github-labeler](https://github.com/crazy-max/ghaction-github-labeler) from 4.0.0 to 5.0.0. - [Release notes](https://github.com/crazy-max/ghaction-github-labeler/releases) - [Commits](https://github.com/crazy-max/ghaction-github-labeler/compare/v4.0.0...v5.0.0) --- updated-dependencies: - dependency-name: crazy-max/ghaction-github-labeler dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 9da4ff4..e92f178 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -14,6 +14,6 @@ jobs: uses: actions/checkout@v3 - name: Run Labeler - uses: crazy-max/ghaction-github-labeler@v4.0.0 + uses: crazy-max/ghaction-github-labeler@v5.0.0 with: skip-delete: true From 4c08564468a00bce76301dde633690dfdca5e835 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:48:51 +0100 Subject: [PATCH 05/24] Bump release-drafter/release-drafter from 5.20.0 to 5.25.0 (#4) Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5.20.0 to 5.25.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/v5.20.0...v5.25.0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fb467ab..119bee0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -71,7 +71,7 @@ jobs: repository_url: https://test.pypi.org/legacy/ - name: Publish the release notes - uses: release-drafter/release-drafter@v5.20.0 + uses: release-drafter/release-drafter@v5.25.0 with: publish: ${{ steps.check-version.outputs.tag != '' }} tag: ${{ steps.check-version.outputs.tag }} From f9060a7716138ab68a3c91c69ef49c796f89013f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:49:12 +0100 Subject: [PATCH 06/24] Bump salsify/action-detect-and-tag-new-version from 2.0.1 to 2.0.3 (#7) Bumps [salsify/action-detect-and-tag-new-version](https://github.com/salsify/action-detect-and-tag-new-version) from 2.0.1 to 2.0.3. - [Release notes](https://github.com/salsify/action-detect-and-tag-new-version/releases) - [Commits](https://github.com/salsify/action-detect-and-tag-new-version/compare/v2.0.1...v2.0.3) --- updated-dependencies: - dependency-name: salsify/action-detect-and-tag-new-version dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 119bee0..806f8a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,7 @@ jobs: - name: Detect and tag new version id: check-version if: steps.check-parent-commit.outputs.sha - uses: salsify/action-detect-and-tag-new-version@v2.0.1 + uses: salsify/action-detect-and-tag-new-version@v2.0.3 with: version-command: | bash -o pipefail -c "poetry version | awk '{ print \$2 }'" From d667d2a1e653881384fd2167c534517c59e8edca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:49:37 +0100 Subject: [PATCH 07/24] Bump pypa/gh-action-pypi-publish from 1.5.0 to 1.8.10 (#9) Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.5.0 to 1.8.10. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.5.0...v1.8.10) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 806f8a4..6e42767 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,14 +57,14 @@ jobs: - name: Publish package on PyPI if: steps.check-version.outputs.tag - uses: pypa/gh-action-pypi-publish@v1.5.0 + uses: pypa/gh-action-pypi-publish@v1.8.10 with: user: __token__ password: ${{ secrets.PYPI_TOKEN }} - name: Publish package on TestPyPI if: "! steps.check-version.outputs.tag" - uses: pypa/gh-action-pypi-publish@v1.5.0 + uses: pypa/gh-action-pypi-publish@v1.8.10 with: user: __token__ password: ${{ secrets.TEST_PYPI_TOKEN }} From a1d9a4e2d531d2d5ed1a5f4eeb0ee44d07731efc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:49:47 +0100 Subject: [PATCH 08/24] Bump codecov/codecov-action from 3.1.0 to 3.1.4 (#10) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.0 to 3.1.4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.0...v3.1.4) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 98a47b1..08ace61 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -146,4 +146,4 @@ jobs: nox --session=coverage -- xml - name: Upload coverage report - uses: codecov/codecov-action@v3.1.0 + uses: codecov/codecov-action@v3.1.4 From b1fe891c8acab2131d5170bbcfc6fa63c2c83bbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:51:06 +0100 Subject: [PATCH 09/24] Bump virtualenv from 20.14.1 to 20.24.7 in /.github/workflows (#12) Bumps [virtualenv](https://github.com/pypa/virtualenv) from 20.14.1 to 20.24.7. - [Release notes](https://github.com/pypa/virtualenv/releases) - [Changelog](https://github.com/pypa/virtualenv/blob/20.24.7/docs/changelog.rst) - [Commits](https://github.com/pypa/virtualenv/compare/20.14.1...20.24.7) --- updated-dependencies: - dependency-name: virtualenv dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index d5064b6..c12e50b 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -2,4 +2,4 @@ pip==22.1.2 nox==2022.1.7 nox-poetry==1.0.0 poetry==1.1.13 -virtualenv==20.14.1 +virtualenv==20.24.7 From f1344b0e04df9635e675430c91ad46ca26314198 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:51:27 +0100 Subject: [PATCH 10/24] Bump nox from 2022.1.7 to 2023.4.22 in /.github/workflows (#17) Bumps [nox](https://github.com/wntrblm/nox) from 2022.1.7 to 2023.4.22. - [Release notes](https://github.com/wntrblm/nox/releases) - [Changelog](https://github.com/wntrblm/nox/blob/main/CHANGELOG.md) - [Commits](https://github.com/wntrblm/nox/compare/2022.1.7...2023.04.22) --- updated-dependencies: - dependency-name: nox dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index c12e50b..3d21ca6 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -1,5 +1,5 @@ pip==22.1.2 -nox==2022.1.7 +nox==2023.4.22 nox-poetry==1.0.0 poetry==1.1.13 virtualenv==20.24.7 From df411509c57604d9c3ad4789cd62b9a6cb038eca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:53:07 +0100 Subject: [PATCH 11/24] Bump sphinx from 4.5.0 to 7.2.6 in /docs (#3) Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 4.5.0 to 7.2.6. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v4.5.0...v7.2.6) --- updated-dependencies: - dependency-name: sphinx dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 3602474..bd34b7c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ furo==2022.4.7 -sphinx==4.5.0 +sphinx==7.2.6 sphinx-click==5.1.0 myst_parser==0.17.2 From 87719b61f00994d6a8e6ae5cc33d42b411a51d71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:54:37 +0100 Subject: [PATCH 12/24] Bump myst-parser from 0.17.2 to 2.0.0 in /docs (#8) Bumps [myst-parser](https://github.com/executablebooks/MyST-Parser) from 0.17.2 to 2.0.0. - [Release notes](https://github.com/executablebooks/MyST-Parser/releases) - [Changelog](https://github.com/executablebooks/MyST-Parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/executablebooks/MyST-Parser/compare/v0.17.2...v2.0.0) --- updated-dependencies: - dependency-name: myst-parser dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index bd34b7c..60f192c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ furo==2022.4.7 sphinx==7.2.6 sphinx-click==5.1.0 -myst_parser==0.17.2 +myst_parser==2.0.0 From 2e9e9d0db7571e14b9c833f5c15c2570c692da09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:55:26 +0100 Subject: [PATCH 13/24] Bump actions/checkout from 3 to 4 (#6) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/labeler.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/tests.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index e92f178..173926f 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Run Labeler uses: crazy-max/ghaction-github-labeler@v5.0.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6e42767..c93669c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 2 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 08ace61..0750627 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Check out the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v3 @@ -109,7 +109,7 @@ jobs: needs: tests steps: - name: Check out the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v3 From 0c7a3b0640cfa55785151f3b19fdf59ea3e02d02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:55:40 +0100 Subject: [PATCH 14/24] Bump poetry from 1.1.13 to 1.7.1 in /.github/workflows (#15) Bumps [poetry](https://github.com/python-poetry/poetry) from 1.1.13 to 1.7.1. - [Release notes](https://github.com/python-poetry/poetry/releases) - [Changelog](https://github.com/python-poetry/poetry/blob/master/CHANGELOG.md) - [Commits](https://github.com/python-poetry/poetry/compare/1.1.13...1.7.1) --- updated-dependencies: - dependency-name: poetry dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index 3d21ca6..8d5706e 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -1,5 +1,5 @@ pip==22.1.2 nox==2023.4.22 nox-poetry==1.0.0 -poetry==1.1.13 +poetry==1.7.1 virtualenv==20.24.7 From 30d75b1241729ce571582f118df7a0da052c509c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:56:59 +0100 Subject: [PATCH 15/24] Bump pip from 22.1.2 to 23.3.1 in /.github/workflows (#14) Bumps [pip](https://github.com/pypa/pip) from 22.1.2 to 23.3.1. - [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/pip/compare/22.1.2...23.3.1) --- updated-dependencies: - dependency-name: pip dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index 8d5706e..cf03c06 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -1,4 +1,4 @@ -pip==22.1.2 +pip==23.3.1 nox==2023.4.22 nox-poetry==1.0.0 poetry==1.7.1 From e467100d6214ef6dd5131b93496c9755b5c32777 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:57:45 +0100 Subject: [PATCH 16/24] Bump furo from 2022.4.7 to 2023.9.10 in /docs (#5) Bumps [furo](https://github.com/pradyunsg/furo) from 2022.4.7 to 2023.9.10. - [Release notes](https://github.com/pradyunsg/furo/releases) - [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md) - [Commits](https://github.com/pradyunsg/furo/compare/2022.04.07...2023.09.10) --- updated-dependencies: - dependency-name: furo dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 60f192c..0f00919 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ -furo==2022.4.7 +furo==2023.9.10 sphinx==7.2.6 sphinx-click==5.1.0 myst_parser==2.0.0 From 8a626f71ebc301d920bc2d5c0e760dde95a18dbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:58:16 +0100 Subject: [PATCH 17/24] Bump nox-poetry from 1.0.0 to 1.0.3 in /.github/workflows (#13) Bumps [nox-poetry](https://github.com/cjolowicz/nox-poetry) from 1.0.0 to 1.0.3. - [Release notes](https://github.com/cjolowicz/nox-poetry/releases) - [Commits](https://github.com/cjolowicz/nox-poetry/compare/v1.0.0...v1.0.3) --- updated-dependencies: - dependency-name: nox-poetry dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index cf03c06..791bf6a 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -1,5 +1,5 @@ pip==23.3.1 nox==2023.4.22 -nox-poetry==1.0.0 +nox-poetry==1.0.3 poetry==1.7.1 virtualenv==20.24.7 From d1f6ef40268961a7659ce0713f246d27ac09794f Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Wed, 22 Nov 2023 12:13:21 +0100 Subject: [PATCH 18/24] bump poetry lock (#23) --- poetry.lock | 1458 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 1153 insertions(+), 305 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0542606..412a756 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,55 +1,75 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "main" optional = false 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 = "argcomplete" version = "3.1.6" description = "Bash tab completion for argparse" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "argcomplete-3.1.6-py3-none-any.whl", hash = "sha256:71f4683bc9e6b0be85f2b2c1224c47680f210903e23512cfebfe5a41edfd883a"}, + {file = "argcomplete-3.1.6.tar.gz", hash = "sha256:3b1f07d133332547a53c79437527c00be48cca3807b1d4ca5cab1b26313386a6"}, +] [package.extras] -test = ["coverage", "pexpect", "wheel", "ruff", "mypy"] +test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -cov = ["attrs", "coverage[toml] (>=5.3)"] -dev = ["attrs", "pre-commit"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest-mypy-plugins", "pytest-xdist", "pytest (>=4.3.0)"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" version = "2.13.1" description = "Internationalization utilities" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, +] + +[package.dependencies] +setuptools = {version = "*", markers = "python_version >= \"3.12\""} [package.extras] -dev = ["pytest (>=6.0)", "pytest-cov", "freezegun (>=1.0,<2.0)"] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "bandit" version = "1.7.5" description = "Security oriented static analyser for python code." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} @@ -59,17 +79,20 @@ rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "beautifulsoup4 (>=4.8.0)", "pylint (==1.9.4)", "tomli (>=1.1.0)"] +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)", "tomli (>=1.1.0)"] toml = ["tomli (>=1.1.0)"] -yaml = ["pyyaml"] +yaml = ["PyYAML"] [[package]] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] [package.dependencies] soupsieve = ">1.2" @@ -82,9 +105,28 @@ lxml = ["lxml"] name = "black" version = "23.11.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, + {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, + {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, + {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, + {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, + {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, + {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, + {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, + {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, + {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, + {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, + {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, + {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, + {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, + {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, + {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, + {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, + {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, +] [package.dependencies] click = ">=8.0.0" @@ -105,9 +147,12 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] [package.dependencies] six = ">=1.9.0" @@ -120,17 +165,73 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] name = "certifi" version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] [[package]] name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] [package.dependencies] pycparser = "*" @@ -139,25 +240,122 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] [[package]] name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -166,17 +364,23 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "colorlog" version = "6.7.0" description = "Add colours to the output of Python's logging module." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "colorlog-6.7.0-py2.py3-none-any.whl", hash = "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662"}, + {file = "colorlog-6.7.0.tar.gz", hash = "sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"}, +] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} @@ -188,9 +392,62 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] name = "coverage" version = "7.3.2" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -202,41 +459,56 @@ toml = ["tomli"] name = "darglint" version = "1.8.1" description = "A utility for ensuring Google-style docstrings stay up to date with the source code." -category = "dev" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"}, + {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, +] [[package]] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] [[package]] name = "distlib" version = "0.3.7" description = "Distribution utilities" -category = "main" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] [[package]] name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] [[package]] name = "dparse" version = "0.6.3" description = "A parser for Python dependency files" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "dparse-0.6.3-py3-none-any.whl", hash = "sha256:0d8fe18714056ca632d98b24fbfc4e9791d4e47065285ab486182288813a5318"}, + {file = "dparse-0.6.3.tar.gz", hash = "sha256:27bb8b4bcaefec3997697ba3f6e06b2447200ba273c0b085c3d012a04571b528"}, +] [package.dependencies] packaging = "*" @@ -250,9 +522,12 @@ pipenv = ["pipenv (<=2022.12.19)"] name = "exceptiongroup" version = "1.2.0" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] [package.extras] test = ["pytest (>=6)"] @@ -261,33 +536,42 @@ test = ["pytest (>=6)"] name = "fastjsonschema" version = "2.19.0" description = "Fastest Python implementation of JSON schema" -category = "main" optional = false python-versions = "*" +files = [ + {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, + {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, +] [package.extras] -devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] name = "filelock" version = "3.13.1" description = "A platform independent file lock." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx-autodoc-typehints (>=1.24)", "sphinx (>=7.2.6)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "pytest (>=7.4.3)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] name = "flake8" version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" optional = false python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" @@ -298,9 +582,12 @@ pyflakes = ">=3.1.0,<3.2.0" name = "flake8-bandit" version = "4.1.1" description = "Automated security testing with bandit and flake8." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d"}, + {file = "flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e"}, +] [package.dependencies] bandit = ">=1.7.3" @@ -310,24 +597,30 @@ flake8 = ">=5.0.0" name = "flake8-bugbear" version = "23.9.16" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -category = "dev" optional = false python-versions = ">=3.8.1" +files = [ + {file = "flake8-bugbear-23.9.16.tar.gz", hash = "sha256:90cf04b19ca02a682feb5aac67cae8de742af70538590509941ab10ae8351f71"}, + {file = "flake8_bugbear-23.9.16-py3-none-any.whl", hash = "sha256:b182cf96ea8f7a8595b2f87321d7d9b28728f4d9c3318012d896543d19742cb5"}, +] [package.dependencies] attrs = ">=19.2.0" flake8 = ">=6.0.0" [package.extras] -dev = ["tox", "coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest"] +dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] [[package]] name = "flake8-docstrings" version = "1.7.0" description = "Extension for flake8 which uses pydocstyle to check docstrings" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"}, + {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"}, +] [package.dependencies] flake8 = ">=3" @@ -337,9 +630,12 @@ pydocstyle = ">=2.1" name = "flake8-rst-docstrings" version = "0.3.0" description = "Python docstring reStructuredText (RST) validator for flake8" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4"}, + {file = "flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c"}, +] [package.dependencies] flake8 = ">=3" @@ -353,9 +649,12 @@ develop = ["build", "twine"] name = "furo" version = "2023.9.10" description = "A clean customisable Sphinx documentation theme." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "furo-2023.9.10-py3-none-any.whl", hash = "sha256:513092538537dc5c596691da06e3c370714ec99bc438680edc1debffb73e5bfc"}, + {file = "furo-2023.9.10.tar.gz", hash = "sha256:5707530a476d2a63b8cad83b4f961f3739a69f4b058bcf38a03a39fa537195b2"}, +] [package.dependencies] beautifulsoup4 = "*" @@ -367,9 +666,12 @@ sphinx-basic-ng = "*" name = "gitdb" version = "4.0.11" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] [package.dependencies] smmap = ">=3.0.1,<6" @@ -378,23 +680,29 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.40" 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.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, + {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar", "mock"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] [[package]] name = "identify" version = "2.5.32" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"}, + {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"}, +] [package.extras] license = ["ukkonen"] @@ -403,63 +711,81 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" 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" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "main" 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" version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ruff", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] [package.extras] colors = ["colorama (>=0.4.3)"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" 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" @@ -471,9 +797,12 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "4.20.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, + {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, +] [package.dependencies] attrs = ">=22.2.0" @@ -489,9 +818,12 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.11.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.11.1-py3-none-any.whl", hash = "sha256:f596778ab612b3fd29f72ea0d990393d0540a5aab18bf0407a46632eab540779"}, + {file = "jsonschema_specifications-2023.11.1.tar.gz", hash = "sha256:c9b234904ffe02f079bf91b14d79987faa685fd4b39c377a0996954c0090b9ca"}, +] [package.dependencies] referencing = ">=0.31.0" @@ -500,29 +832,35 @@ referencing = ">=0.31.0" name = "jupyter-client" version = "8.6.0" description = "Jupyter protocol implementation and client libraries" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" traitlets = ">=5.3" [package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinx (>=4)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" version = "5.5.0" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, +] [package.dependencies] platformdirs = ">=2.5" @@ -537,17 +875,23 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] [[package]] name = "livereload" version = "2.6.3" description = "Python LiveReload is an awesome tool for web developers" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, + {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, +] [package.dependencies] six = "*" @@ -557,52 +901,122 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code_style = ["pre-commit (>=3.0,<4.0)"] +code-style = ["pre-commit (>=3.0,<4.0)"] compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme", "jupyter-sphinx"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] [[package]] name = "mccabe" version = "0.7.0" 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 = "mdit-py-plugins" version = "0.4.0" description = "Collection of plugins for markdown-it-py" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] [package.dependencies] markdown-it-py = ">=1.0.0,<4.0.0" [package.extras] -code_style = ["pre-commit"] +code-style = ["pre-commit"] rtd = ["myst-parser", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] @@ -610,25 +1024,59 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "mistune" version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] [[package]] name = "mypy" version = "1.7.0" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "mypy-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5da84d7bf257fd8f66b4f759a904fd2c5a765f70d8b52dde62b521972a0a2357"}, + {file = "mypy-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a3637c03f4025f6405737570d6cbfa4f1400eb3c649317634d273687a09ffc2f"}, + {file = "mypy-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b633f188fc5ae1b6edca39dae566974d7ef4e9aaaae00bc36efe1f855e5173ac"}, + {file = "mypy-1.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed9a3997b90c6f891138e3f83fb8f475c74db4ccaa942a1c7bf99e83a989a1"}, + {file = "mypy-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fe46e96ae319df21359c8db77e1aecac8e5949da4773c0274c0ef3d8d1268a9"}, + {file = "mypy-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:df67fbeb666ee8828f675fee724cc2cbd2e4828cc3df56703e02fe6a421b7401"}, + {file = "mypy-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a79cdc12a02eb526d808a32a934c6fe6df07b05f3573d210e41808020aed8b5d"}, + {file = "mypy-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f65f385a6f43211effe8c682e8ec3f55d79391f70a201575def73d08db68ead1"}, + {file = "mypy-1.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e81ffd120ee24959b449b647c4b2fbfcf8acf3465e082b8d58fd6c4c2b27e46"}, + {file = "mypy-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:f29386804c3577c83d76520abf18cfcd7d68264c7e431c5907d250ab502658ee"}, + {file = "mypy-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:87c076c174e2c7ef8ab416c4e252d94c08cd4980a10967754f91571070bf5fbe"}, + {file = "mypy-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cb8d5f6d0fcd9e708bb190b224089e45902cacef6f6915481806b0c77f7786d"}, + {file = "mypy-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93e76c2256aa50d9c82a88e2f569232e9862c9982095f6d54e13509f01222fc"}, + {file = "mypy-1.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cddee95dea7990e2215576fae95f6b78a8c12f4c089d7e4367564704e99118d3"}, + {file = "mypy-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d01921dbd691c4061a3e2ecdbfbfad029410c5c2b1ee88946bf45c62c6c91210"}, + {file = "mypy-1.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:185cff9b9a7fec1f9f7d8352dff8a4c713b2e3eea9c6c4b5ff7f0edf46b91e41"}, + {file = "mypy-1.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7b1e399c47b18feb6f8ad4a3eef3813e28c1e871ea7d4ea5d444b2ac03c418"}, + {file = "mypy-1.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9fe455ad58a20ec68599139ed1113b21f977b536a91b42bef3ffed5cce7391"}, + {file = "mypy-1.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d0fa29919d2e720c8dbaf07d5578f93d7b313c3e9954c8ec05b6d83da592e5d9"}, + {file = "mypy-1.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b53655a295c1ed1af9e96b462a736bf083adba7b314ae775563e3fb4e6795f5"}, + {file = "mypy-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1b06b4b109e342f7dccc9efda965fc3970a604db70f8560ddfdee7ef19afb05"}, + {file = "mypy-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf7a2f0a6907f231d5e41adba1a82d7d88cf1f61a70335889412dec99feeb0f8"}, + {file = "mypy-1.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551d4a0cdcbd1d2cccdcc7cb516bb4ae888794929f5b040bb51aae1846062901"}, + {file = "mypy-1.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55d28d7963bef00c330cb6461db80b0b72afe2f3c4e2963c99517cf06454e665"}, + {file = "mypy-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:870bd1ffc8a5862e593185a4c169804f2744112b4a7c55b93eb50f48e7a77010"}, + {file = "mypy-1.7.0-py3-none-any.whl", hash = "sha256:96650d9a4c651bc2a4991cf46f100973f656d69edc7faf91844e87fe627f7e96"}, + {file = "mypy-1.7.0.tar.gz", hash = "sha256:1e280b5697202efa698372d2f39e9a6713a0395a756b1c6bd48995f8d72690dc"}, +] [package.dependencies] mypy-extensions = ">=1.0.0" @@ -645,17 +1093,23 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false 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 = "myst-parser" version = "2.0.0" description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, + {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, +] [package.dependencies] docutils = ">=0.16,<0.21" @@ -666,38 +1120,44 @@ pyyaml = "*" sphinx = ">=6,<8" [package.extras] -code_style = ["pre-commit (>=3.0,<4.0)"] +code-style = ["pre-commit (>=3.0,<4.0)"] linkify = ["linkify-it-py (>=2.0,<3.0)"] -rtd = ["ipython", "sphinx-book-theme (==1.0.0rc2)", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-design2", "sphinx-copybutton", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-togglebutton"] -testing = ["beautifulsoup4", "coverage", "pytest (>=7,<8)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)", "sphinx-pytest"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "nbclient" version = "0.9.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "main" optional = false python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, +] [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient", "sphinx-book-theme", "sphinx (>=1.7)", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "pytest (>=7.0)", "testpath", "xmltodict"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" version = "7.11.0" description = "Converting Jupyter Notebooks" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, + {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, +] [package.dependencies] beautifulsoup4 = "*" @@ -718,9 +1178,9 @@ tinycss2 = "*" traitlets = ">=5.1" [package.extras] -all = ["nbconvert"] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["nbconvert"] +qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] @@ -730,9 +1190,12 @@ webpdf = ["playwright"] name = "nbformat" version = "5.9.2" description = "The Jupyter Notebook format" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] [package.dependencies] fastjsonschema = "*" @@ -748,9 +1211,12 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nbsphinx" version = "0.9.3" description = "Jupyter Notebook Tools for Sphinx" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "nbsphinx-0.9.3-py3-none-any.whl", hash = "sha256:6e805e9627f4a358bd5720d5cbf8bf48853989c79af557afd91a5f22e163029f"}, + {file = "nbsphinx-0.9.3.tar.gz", hash = "sha256:ec339c8691b688f8676104a367a4b8cf3ea01fd089dc28d24dec22d563b11562"}, +] [package.dependencies] docutils = "*" @@ -764,17 +1230,26 @@ traitlets = ">=5" name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" [[package]] name = "nox" version = "2023.4.22" description = "Flexible test automation." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "nox-2023.4.22-py3-none-any.whl", hash = "sha256:0b1adc619c58ab4fa57d6ab2e7823fe47a32e70202f287d78474adcc7bda1891"}, + {file = "nox-2023.4.22.tar.gz", hash = "sha256:46c0560b0dc609d7d967dc99e22cb463d3c4caf54a5fda735d6c11b5177e3a9f"}, +] [package.dependencies] argcomplete = ">=1.9.4,<4.0" @@ -783,15 +1258,18 @@ packaging = ">=20.9" virtualenv = ">=14" [package.extras] -tox_to_nox = ["jinja2", "tox (<4)"] +tox-to-nox = ["jinja2", "tox (<4)"] [[package]] name = "nox-poetry" version = "1.0.3" description = "nox-poetry" -category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "nox_poetry-1.0.3-py3-none-any.whl", hash = "sha256:a2fffeb70ae81840479e68287afe1c772bf376f70f1e92f99832a20b3c64d064"}, + {file = "nox_poetry-1.0.3.tar.gz", hash = "sha256:dc7ecbbd812a333a0c0b558f57e5b37f7c12926cddbcecaf2264957fd373824e"}, +] [package.dependencies] nox = ">=2020.8.22" @@ -802,41 +1280,56 @@ tomlkit = ">=0.7" name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] [[package]] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] [[package]] name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] [[package]] name = "pbr" version = "6.0.0" description = "Python Build Reasonableness" -category = "dev" optional = false python-versions = ">=2.6" +files = [ + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, +] [[package]] name = "pep8-naming" version = "0.13.3" description = "Check PEP-8 naming conventions, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, + {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, +] [package.dependencies] flake8 = ">=5.0.0" @@ -845,21 +1338,27 @@ flake8 = ">=5.0.0" name = "platformdirs" version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, +] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.24)", "sphinx (>=7.1.1)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest (>=7.4)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -869,9 +1368,12 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "3.5.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, + {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, +] [package.dependencies] cfgv = ">=2.0.0" @@ -884,9 +1386,12 @@ virtualenv = ">=20.10.0" name = "pre-commit-hooks" version = "4.5.0" description = "Some out-of-the-box hooks for pre-commit." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pre_commit_hooks-4.5.0-py2.py3-none-any.whl", hash = "sha256:b779d5c44ede9b1fda48e2d96b08e9aa5b1d2fdb8903ca09f0dbaca22d529edb"}, + {file = "pre_commit_hooks-4.5.0.tar.gz", hash = "sha256:ffbe2af1c85ac9a7695866955680b4dee98822638b748a6f3debefad79748c8a"}, +] [package.dependencies] "ruamel.yaml" = ">=0.15" @@ -896,25 +1401,34 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} name = "pycodestyle" version = "2.11.1" description = "Python style guide checker" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" 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 = "pydocstyle" 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 = ">=2.2.0" @@ -926,17 +1440,23 @@ toml = ["tomli (>=1.2.3)"] name = "pyflakes" version = "3.1.0" description = "passive checker of Python programs" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] [[package]] name = "pygments" version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] [package.extras] plugins = ["importlib-metadata"] @@ -946,9 +1466,12 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pytest" version = "7.4.3" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, +] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} @@ -965,9 +1488,12 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -976,9 +1502,12 @@ six = ">=1.5" name = "pyupgrade" version = "3.15.0" description = "A tool to automatically upgrade syntax for newer versions." -category = "dev" optional = false python-versions = ">=3.8.1" +files = [ + {file = "pyupgrade-3.15.0-py2.py3-none-any.whl", hash = "sha256:8dc8ebfaed43566e2c65994162795017c7db11f531558a74bc8aa077907bc305"}, + {file = "pyupgrade-3.15.0.tar.gz", hash = "sha256:a7fde381060d7c224f55aef7a30fae5ac93bbc428367d27e70a603bc2acd4f00"}, +] [package.dependencies] tokenize-rt = ">=5.2.0" @@ -987,25 +1516,185 @@ tokenize-rt = ">=5.2.0" name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "pyzmq" version = "25.1.1" description = "Python bindings for 0MQ" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, +] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} @@ -1014,9 +1703,12 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "referencing" version = "0.31.0" description = "JSON Referencing + Python" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "referencing-0.31.0-py3-none-any.whl", hash = "sha256:381b11e53dd93babb55696c71cf42aef2d36b8a150c49bf0bc301e36d536c882"}, + {file = "referencing-0.31.0.tar.gz", hash = "sha256:cc28f2c88fbe7b961a7817a0abc034c09a1e36358f82fedb4ffdf29a25398863"}, +] [package.dependencies] attrs = ">=22.2.0" @@ -1026,9 +1718,12 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -1038,15 +1733,17 @@ urllib3 = ">=1.21.1,<3" [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 = "restructuredtext-lint" version = "1.4.0" description = "reStructuredText linter" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, +] [package.dependencies] docutils = ">=0.11,<1.0" @@ -1055,9 +1752,12 @@ docutils = ">=0.11,<1.0" name = "rich" version = "13.7.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, +] [package.dependencies] markdown-it-py = ">=2.2.0" @@ -1070,40 +1770,197 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.13.1" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "main" optional = false python-versions = ">=3.8" - -[[package]] -name = "ruamel.yaml" +files = [ + {file = "rpds_py-0.13.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:83feb0f682d75a09ddc11aa37ba5c07dd9b824b22915207f6176ea458474ff75"}, + {file = "rpds_py-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa84bbe22ffa108f91631935c28a623001e335d66e393438258501e618fb0dde"}, + {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04f8c76b8d5c70695b4e8f1d0b391d8ef91df00ef488c6c1ffb910176459bc6"}, + {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:032c242a595629aacace44128f9795110513ad27217b091e834edec2fb09e800"}, + {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91276caef95556faeb4b8f09fe4439670d3d6206fee78d47ddb6e6de837f0b4d"}, + {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d22f2cb82e0b40e427a74a93c9a4231335bbc548aed79955dde0b64ea7f88146"}, + {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c9e2794329ef070844ff9bfc012004aeddc0468dc26970953709723f76c8a5"}, + {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c797ea56f36c6f248656f0223b11307fdf4a1886f3555eba371f34152b07677f"}, + {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82dbcd6463e580bcfb7561cece35046aaabeac5a9ddb775020160b14e6c58a5d"}, + {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:736817dbbbd030a69a1faf5413a319976c9c8ba8cdcfa98c022d3b6b2e01eca6"}, + {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1f36a1e80ef4ed1996445698fd91e0d3e54738bf597c9995118b92da537d7a28"}, + {file = "rpds_py-0.13.1-cp310-none-win32.whl", hash = "sha256:4f13d3f6585bd07657a603780e99beda96a36c86acaba841f131e81393958336"}, + {file = "rpds_py-0.13.1-cp310-none-win_amd64.whl", hash = "sha256:545e94c84575057d3d5c62634611858dac859702b1519b6ffc58eca7fb1adfcf"}, + {file = "rpds_py-0.13.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:6bfe72b249264cc1ff2f3629be240d7d2fdc778d9d298087cdec8524c91cd11f"}, + {file = "rpds_py-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edc91c50e17f5cd945d821f0f1af830522dba0c10267c3aab186dc3dbaab8def"}, + {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eca04a365be380ca1f8fa48b334462e19e3382c0bb7386444d8ca43aa01c481"}, + {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e3ac5b602fea378243f993d8b707189f9061e55ebb4e56cb9fdef8166060f28"}, + {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfb5d2ab183c0efe5e7b8917e4eaa2e837aacafad8a69b89aa6bc81550eed857"}, + {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9793d46d3e6522ae58e9321032827c9c0df1e56cbe5d3de965facb311aed6aa"}, + {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cd935c0220d012a27c20135c140f9cdcbc6249d5954345c81bfb714071b985c"}, + {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37b08df45f02ff1866043b95096cbe91ac99de05936dd09d6611987a82a3306a"}, + {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad666a904212aa9a6c77da7dce9d5170008cda76b7776e6731928b3f8a0d40fa"}, + {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8a6ad8429340e0a4de89353447c6441329def3632e7b2293a7d6e873217d3c2b"}, + {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c40851b659d958c5245c1236e34f0d065cc53dca8d978b49a032c8e0adfda6e"}, + {file = "rpds_py-0.13.1-cp311-none-win32.whl", hash = "sha256:4145172ab59b6c27695db6d78d040795f635cba732cead19c78cede74800949a"}, + {file = "rpds_py-0.13.1-cp311-none-win_amd64.whl", hash = "sha256:46a07a258bda12270de02b34c4884f200f864bba3dcd6e3a37fef36a168b859d"}, + {file = "rpds_py-0.13.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:ba4432301ad7eeb1b00848cf46fae0e5fecfd18a8cb5fdcf856c67985f79ecc7"}, + {file = "rpds_py-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d22e0660de24bd8e9ac82f4230a22a5fe4e397265709289d61d5fb333839ba50"}, + {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76a8374b294e4ccb39ccaf11d39a0537ed107534139c00b4393ca3b542cc66e5"}, + {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d152ec7bb431040af2500e01436c9aa0d993f243346f0594a15755016bf0be1"}, + {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a2044b870df7c9360bb3ce7e12f9ddf8e72e49cd3a353a1528cbf166ad2383"}, + {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:960e7e460fda2d0af18c75585bbe0c99f90b8f09963844618a621b804f8c3abe"}, + {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37f79f4f1f06cc96151f4a187528c3fd4a7e1065538a4af9eb68c642365957f7"}, + {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd4ea56c9542ad0091dfdef3e8572ae7a746e1e91eb56c9e08b8d0808b40f1d1"}, + {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0290712eb5603a725769b5d857f7cf15cf6ca93dda3128065bbafe6fdb709beb"}, + {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0b70c1f800059c92479dc94dda41288fd6607f741f9b1b8f89a21a86428f6383"}, + {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3dd5fb7737224e1497c886fb3ca681c15d9c00c76171f53b3c3cc8d16ccfa7fb"}, + {file = "rpds_py-0.13.1-cp312-none-win32.whl", hash = "sha256:74be3b215a5695690a0f1a9f68b1d1c93f8caad52e23242fcb8ba56aaf060281"}, + {file = "rpds_py-0.13.1-cp312-none-win_amd64.whl", hash = "sha256:f47eef55297799956464efc00c74ae55c48a7b68236856d56183fe1ddf866205"}, + {file = "rpds_py-0.13.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e4a45ba34f904062c63049a760790c6a2fa7a4cc4bd160d8af243b12371aaa05"}, + {file = "rpds_py-0.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20147996376be452cd82cd6c17701daba69a849dc143270fa10fe067bb34562a"}, + {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b9535aa22ab023704cfc6533e968f7e420affe802d85e956d8a7b4c0b0b5ea"}, + {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4fa1eeb9bea6d9b64ac91ec51ee94cc4fc744955df5be393e1c923c920db2b0"}, + {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b2415d5a7b7ee96aa3a54d4775c1fec140476a17ee12353806297e900eaeddc"}, + {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:577d40a72550eac1386b77b43836151cb61ff6700adacda2ad4d883ca5a0b6f2"}, + {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af2d1648eb625a460eee07d3e1ea3a4a6e84a1fb3a107f6a8e95ac19f7dcce67"}, + {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5b769396eb358d6b55dbf78f3f7ca631ca1b2fe02136faad5af74f0111b4b6b7"}, + {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:249c8e0055ca597707d71c5ad85fd2a1c8fdb99386a8c6c257e1b47b67a9bec1"}, + {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:fe30ef31172bdcf946502a945faad110e8fff88c32c4bec9a593df0280e64d8a"}, + {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2647192facf63be9ed2d7a49ceb07efe01dc6cfb083bd2cc53c418437400cb99"}, + {file = "rpds_py-0.13.1-cp38-none-win32.whl", hash = "sha256:4011d5c854aa804c833331d38a2b6f6f2fe58a90c9f615afdb7aa7cf9d31f721"}, + {file = "rpds_py-0.13.1-cp38-none-win_amd64.whl", hash = "sha256:7cfae77da92a20f56cf89739a557b76e5c6edc094f6ad5c090b9e15fbbfcd1a4"}, + {file = "rpds_py-0.13.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:e9be1f7c5f9673616f875299339984da9447a40e3aea927750c843d6e5e2e029"}, + {file = "rpds_py-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:839676475ac2ccd1532d36af3d10d290a2ca149b702ed464131e450a767550df"}, + {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90031658805c63fe488f8e9e7a88b260ea121ba3ee9cdabcece9c9ddb50da39"}, + {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ba9fbc5d6e36bfeb5292530321cc56c4ef3f98048647fabd8f57543c34174ec"}, + {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08832078767545c5ee12561ce980714e1e4c6619b5b1e9a10248de60cddfa1fd"}, + {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19f5aa7f5078d35ed8e344bcba40f35bc95f9176dddb33fc4f2084e04289fa63"}, + {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80080972e1d000ad0341c7cc58b6855c80bd887675f92871221451d13a975072"}, + {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ee352691c4434eb1c01802e9daa5edcc1007ff15023a320e2693fed6a661b"}, + {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d20da6b4c7aa9ee75ad0730beaba15d65157f5beeaca54a038bb968f92bf3ce3"}, + {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:faa12a9f34671a30ea6bb027f04ec4e1fb8fa3fb3ed030893e729d4d0f3a9791"}, + {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7cf241dbb50ea71c2e628ab2a32b5bfcd36e199152fc44e5c1edb0b773f1583e"}, + {file = "rpds_py-0.13.1-cp39-none-win32.whl", hash = "sha256:dab979662da1c9fbb464e310c0b06cb5f1d174d09a462553af78f0bfb3e01920"}, + {file = "rpds_py-0.13.1-cp39-none-win_amd64.whl", hash = "sha256:a2b3c79586636f1fa69a7bd59c87c15fca80c0d34b5c003d57f2f326e5276575"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5967fa631d0ed9f8511dede08bc943a9727c949d05d1efac4ac82b2938024fb7"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8308a8d49d1354278d5c068c888a58d7158a419b2e4d87c7839ed3641498790c"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0580faeb9def6d0beb7aa666294d5604e569c4e24111ada423cf9936768d95c"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2da81c1492291c1a90987d76a47c7b2d310661bf7c93a9de0511e27b796a8b46"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c9a1dc5e898ce30e2f9c0aa57181cddd4532b22b7780549441d6429d22d3b58"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4ae6f423cb7d1c6256b7482025ace2825728f53b7ac58bcd574de6ee9d242c2"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3179e0815827cf963e634095ae5715ee73a5af61defbc8d6ca79f1bdae1d1d"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9f8930092558fd15c9e07198625efb698f7cc00b3dc311c83eeec2540226a8"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1d388d2f5f5a6065cf83c54dd12112b7389095669ff395e632003ae8999c6b8"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:08b335fb0c45f0a9e2478a9ece6a1bfb00b6f4c4780f9be3cf36479c5d8dd374"}, + {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d11afdc5992bbd7af60ed5eb519873690d921425299f51d80aa3099ed49f2bcc"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8c1f6c8df23be165eb0cb78f305483d00c6827a191e3a38394c658d5b9c80bbd"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:528e2afaa56d815d2601b857644aeb395afe7e59212ab0659906dc29ae68d9a6"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df2af1180b8eeececf4f819d22cc0668bfadadfd038b19a90bd2fb2ee419ec6f"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88956c993a20201744282362e3fd30962a9d86dc4f1dcf2bdb31fab27821b61f"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee70ee5f4144a45a9e6169000b5b525d82673d5dab9f7587eccc92794814e7ac"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5fd099acaee2325f01281a130a39da08d885e4dedf01b84bf156ec2737d78fe"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9656a09653b18b80764647d585750df2dff8928e03a706763ab40ec8c4872acc"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ba239bb37663b2b4cd08e703e79e13321512dccd8e5f0e9451d9e53a6b8509a"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3f55ae773abd96b1de25fc5c3fb356f491bd19116f8f854ba705beffc1ddc3c5"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f4b15a163448ec79241fb2f1bc5a8ae1a4a304f7a48d948d208a2935b26bf8a5"}, + {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1a3b2583c86bbfbf417304eeb13400ce7f8725376dc7d3efbf35dc5d7052ad48"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f1059ca9a51c936c9a8d46fbc2c9a6b4c15ab3f13a97f1ad32f024b39666ba85"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f55601fb58f92e4f4f1d05d80c24cb77505dc42103ddfd63ddfdc51d3da46fa2"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcfd5f91b882eedf8d9601bd21261d6ce0e61a8c66a7152d1f5df08d3f643ab1"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6574f619e8734140d96c59bfa8a6a6e7a3336820ccd1bfd95ffa610673b650a2"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4b9d3f5c48bbe8d9e3758e498b3c34863f2c9b1ac57a4e6310183740e59c980"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdd6f8738e1f1d9df5b1603bb03cb30e442710e5672262b95d0f9fcb4edb0dab"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c2bf286e5d755a075e5e97ba56b3de08cccdad6b323ab0b21cc98875176b03"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d4b390ee70ca9263b331ccfaf9819ee20e90dfd0201a295e23eb64a005dbef"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:db8d0f0ad92f74feb61c4e4a71f1d573ef37c22ef4dc19cab93e501bfdad8cbd"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2abd669a39be69cdfe145927c7eb53a875b157740bf1e2d49e9619fc6f43362e"}, + {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c173f529666bab8e3f948b74c6d91afa22ea147e6ebae49a48229d9020a47c4"}, + {file = "rpds_py-0.13.1.tar.gz", hash = "sha256:264f3a5906c62b9df3a00ad35f6da1987d321a053895bd85f9d5c708de5c0fbf"}, +] + +[[package]] +name = "ruamel-yaml" version = "0.18.5" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.5-py3-none-any.whl", hash = "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"}, + {file = "ruamel.yaml-0.18.5.tar.gz", hash = "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e"}, +] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] -docs = ["ryd", "mercurial (>5.7)"] +docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] -name = "ruamel.yaml.clib" +name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] [[package]] name = "safety" version = "2.3.4" description = "Checks installed dependencies for known vulnerabilities and licenses." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "safety-2.3.4-py3-none-any.whl", hash = "sha256:6224dcd9b20986a2b2c5e7acfdfba6bca42bb11b2783b24ed04f32317e5167ea"}, + {file = "safety-2.3.4.tar.gz", hash = "sha256:b9e74e794e82f54d11f4091c5d820c4d2d81de9f953bf0b4f33ac8bc402ae72c"}, +] [package.dependencies] Click = ">=8.0.2" @@ -1111,50 +1968,82 @@ dparse = ">=0.6.2" packaging = ">=21.0" requests = "*" "ruamel.yaml" = ">=0.17.21" +setuptools = ">=19.3" [package.extras] -github = ["pygithub (>=1.43.3)", "jinja2 (>=3.1.0)"] +github = ["jinja2 (>=3.1.0)", "pygithub (>=1.43.3)"] gitlab = ["python-gitlab (>=1.3.0)"] +[[package]] +name = "setuptools" +version = "69.0.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "main" 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 = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] [[package]] name = "sphinx" version = "7.2.6" description = "Python documentation generator" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -1177,16 +2066,19 @@ sphinxcontrib-serializinghtml = ">=1.1.9" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-simplify", "isort", "ruff", "mypy (>=0.990)", "sphinx-lint", "docutils-stubs", "types-requests"] -test = ["pytest (>=4.6)", "html5lib", "cython (>=3.0)", "setuptools (>=67.0)", "filelock"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] [[package]] name = "sphinx-autobuild" version = "2021.3.14" description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"}, + {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, +] [package.dependencies] colorama = "*" @@ -1200,23 +2092,29 @@ test = ["pytest", "pytest-cov"] name = "sphinx-basic-ng" version = "1.0.0b2" description = "A modern skeleton for Sphinx themes." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, + {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, +] [package.dependencies] sphinx = ">=4.0" [package.extras] -docs = ["furo", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs", "ipython"] +docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] [[package]] name = "sphinx-click" version = "5.1.0" description = "Sphinx extension that automatically documents click applications" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "sphinx-click-5.1.0.tar.gz", hash = "sha256:6812c2db62d3fae71a4addbe5a8a0a16c97eb491f3cd63fe34b4ed7e07236f33"}, + {file = "sphinx_click-5.1.0-py3-none-any.whl", hash = "sha256:ae97557a4e9ec646045089326c3b90e026c58a45e083b8f35f17d5d6558d08a0"}, +] [package.dependencies] click = ">=7.0" @@ -1227,95 +2125,116 @@ sphinx = ">=2.0" name = "sphinxcontrib-applehelp" version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, + {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, +] [package.dependencies] Sphinx = ">=5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" version = "1.0.5" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, + {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, +] [package.dependencies] Sphinx = ">=5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, + {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, +] [package.dependencies] Sphinx = ">=5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "main" 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 = ["pytest", "flake8", "mypy"] +test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" version = "1.0.6" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, + {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, +] [package.dependencies] Sphinx = ">=5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" version = "1.1.9" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, +] [package.dependencies] Sphinx = ">=5" [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "stevedore" version = "5.1.0" description = "Manage dynamic plugins for Python applications" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, +] [package.dependencies] pbr = ">=2.0.0,<2.1.0 || >2.1.0" @@ -1324,92 +2243,128 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] [package.dependencies] webencodings = ">=0.4" [package.extras] -doc = ["sphinx", "sphinx-rtd-theme"] -test = ["pytest", "isort", "flake8"] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] [[package]] name = "tokenize-rt" version = "5.2.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, + {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, +] [[package]] name = "tomli" version = "2.0.1" 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 = "tomlkit" version = "0.12.3" description = "Style preserving TOML library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, +] [[package]] name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] [[package]] name = "traitlets" version = "5.13.0" description = "Traitlets Python configuration system" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, +] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest-mock", "pytest-mypy-testing", "pytest (>=7.0,<7.5)"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typeguard" version = "4.1.5" description = "Run-time type checker for Python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "typeguard-4.1.5-py3-none-any.whl", hash = "sha256:8923e55f8873caec136c892c3bed1f676eae7be57cdb94819281b3d3bc9c0953"}, + {file = "typeguard-4.1.5.tar.gz", hash = "sha256:ea0a113bbc111bcffc90789ebb215625c963411f7096a7e9062d4e4630c155fd"}, +] [package.dependencies] importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} typing-extensions = {version = ">=4.7.0", markers = "python_version < \"3.12\""} [package.extras] -doc = ["packaging", "Sphinx (>=7)", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=7)", "pytest (>=7)", "mypy (>=1.2.0)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] [[package]] name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] [[package]] name = "urllib3" version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] @@ -1420,9 +2375,12 @@ zstd = ["zstandard (>=0.18.0)"] name = "virtualenv" version = "20.24.7" description = "Virtual Python Environment builder" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.7-py3-none-any.whl", hash = "sha256:a18b3fd0314ca59a2e9f4b556819ed07183b3e9a3702ecfe213f593d44f7b3fd"}, + {file = "virtualenv-20.24.7.tar.gz", hash = "sha256:69050ffb42419c91f6c1284a7b24e0475d793447e35929b488bf6a0aade39353"}, +] [package.dependencies] distlib = ">=0.3.7,<1" @@ -1430,173 +2388,63 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx-argparse (>=0.4)", "sphinx (>=7.1.2)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage-enable-subprocess (>=1)", "coverage (>=7.2.7)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "pytest (>=7.4)", "setuptools (>=68)", "time-machine (>=2.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "xdoctest" version = "1.1.2" description = "A rewrite of the builtin doctest module" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "xdoctest-1.1.2-py3-none-any.whl", hash = "sha256:ebe133222534f09597cbe461f97cc5f95ad7b36e5d31f3437caffb9baaddbddb"}, + {file = "xdoctest-1.1.2.tar.gz", hash = "sha256:267d3d4e362547fa917d3deabaf6888232bbf43c8d30298faeb957dbfa7e0ba3"}, +] [package.dependencies] colorama = {version = "*", optional = true, markers = "platform_system == \"Windows\" and extra == \"colors\""} Pygments = {version = "*", optional = true, markers = "python_version >= \"3.5.0\" and extra == \"colors\""} [package.extras] -all = ["pyflakes (>=2.2.0)", "colorama (>=0.4.1)", "debugpy (>=1.3.0)", "pytest (>=4.6.0)", "tomli (>=0.2.0)", "ipykernel (>=6.0.0)", "Pygments (>=2.0.0)", "jupyter-client (>=6.1.5)", "IPython (>=7.10.0)", "debugpy (>=1.0.0)", "ipykernel (>=5.2.0)", "pytest (>=4.6.0)", "nbconvert (>=6.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "ipykernel (>=6.11.0)", "typing (>=3.7.4)", "debugpy (>=1.6.0)", "pytest (>=6.2.5)", "Pygments (>=2.4.1)", "attrs (>=19.2.0)", "jedi (>=0.16)", "jupyter-core (>=4.7.0)", "ipython-genutils (>=0.2.0)", "jinja2 (>=3.0.0)", "pytest-cov (>=3.0.0)", "jupyter-client (>=7.0.0)", "IPython (>=7.23.1)", "nbconvert (>=6.1.0)"] -all-strict = ["pyflakes (==2.2.0)", "colorama (==0.4.1)", "debugpy (==1.3.0)", "pytest (==4.6.0)", "tomli (==0.2.0)", "ipykernel (==6.0.0)", "Pygments (==2.0.0)", "jupyter-client (==6.1.5)", "IPython (==7.10.0)", "debugpy (==1.0.0)", "ipykernel (==5.2.0)", "pytest (==4.6.0)", "nbconvert (==6.0.0)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "ipykernel (==6.11.0)", "typing (==3.7.4)", "debugpy (==1.6.0)", "pytest (==6.2.5)", "Pygments (==2.4.1)", "attrs (==19.2.0)", "jedi (==0.16)", "jupyter-core (==4.7.0)", "ipython-genutils (==0.2.0)", "jinja2 (==3.0.0)", "pytest-cov (==3.0.0)", "jupyter-client (==7.0.0)", "IPython (==7.23.1)", "nbconvert (==6.1.0)"] -colors = ["colorama", "pygments", "pygments"] -jupyter = ["debugpy", "ipykernel", "jupyter-client", "ipython", "debugpy", "ipykernel", "nbconvert", "debugpy", "debugpy", "ipykernel", "debugpy", "attrs", "jedi", "jupyter-core", "ipython-genutils", "jinja2", "jupyter-client", "ipython", "nbconvert"] -optional = ["pyflakes (>=2.2.0)", "colorama (>=0.4.1)", "debugpy (>=1.3.0)", "tomli (>=0.2.0)", "ipykernel (>=6.0.0)", "Pygments (>=2.0.0)", "jupyter-client (>=6.1.5)", "IPython (>=7.10.0)", "debugpy (>=1.0.0)", "ipykernel (>=5.2.0)", "nbconvert (>=6.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "ipykernel (>=6.11.0)", "debugpy (>=1.6.0)", "Pygments (>=2.4.1)", "attrs (>=19.2.0)", "jedi (>=0.16)", "jupyter-core (>=4.7.0)", "ipython-genutils (>=0.2.0)", "jinja2 (>=3.0.0)", "jupyter-client (>=7.0.0)", "IPython (>=7.23.1)", "nbconvert (>=6.1.0)"] -optional-strict = ["pyflakes (==2.2.0)", "colorama (==0.4.1)", "debugpy (==1.3.0)", "tomli (==0.2.0)", "ipykernel (==6.0.0)", "Pygments (==2.0.0)", "jupyter-client (==6.1.5)", "IPython (==7.10.0)", "debugpy (==1.0.0)", "ipykernel (==5.2.0)", "nbconvert (==6.0.0)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "ipykernel (==6.11.0)", "debugpy (==1.6.0)", "Pygments (==2.4.1)", "attrs (==19.2.0)", "jedi (==0.16)", "jupyter-core (==4.7.0)", "ipython-genutils (==0.2.0)", "jinja2 (==3.0.0)", "jupyter-client (==7.0.0)", "IPython (==7.23.1)", "nbconvert (==6.1.0)"] -tests-binary-strict = ["cmake (==3.21.2)", "ninja (==1.10.2)", "pybind11 (==2.7.1)", "scikit-build (==0.11.1)", "cmake (==3.25.0)", "ninja (==1.11.1)", "pybind11 (==2.10.3)", "scikit-build (==0.16.1)"] -tests-binary = ["cmake", "ninja", "pybind11", "scikit-build", "cmake", "ninja", "pybind11", "scikit-build"] -tests-strict = ["pytest (==4.6.0)", "pytest (==4.6.0)", "typing (==3.7.4)", "pytest (==6.2.5)", "pytest-cov (==3.0.0)"] -tests = ["pytest (>=4.6.0)", "pytest (>=4.6.0)", "typing (>=3.7.4)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)"] +all = ["IPython (>=7.10.0)", "IPython (>=7.23.1)", "Pygments (>=2.0.0)", "Pygments (>=2.4.1)", "attrs (>=19.2.0)", "colorama (>=0.4.1)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.3.0)", "debugpy (>=1.6.0)", "ipykernel (>=5.2.0)", "ipykernel (>=6.0.0)", "ipykernel (>=6.11.0)", "ipython-genutils (>=0.2.0)", "jedi (>=0.16)", "jinja2 (>=3.0.0)", "jupyter-client (>=6.1.5)", "jupyter-client (>=7.0.0)", "jupyter-core (>=4.7.0)", "nbconvert (>=6.0.0)", "nbconvert (>=6.1.0)", "pyflakes (>=2.2.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)", "tomli (>=0.2.0)", "typing (>=3.7.4)"] +all-strict = ["IPython (==7.10.0)", "IPython (==7.23.1)", "Pygments (==2.0.0)", "Pygments (==2.4.1)", "attrs (==19.2.0)", "colorama (==0.4.1)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "debugpy (==1.3.0)", "debugpy (==1.6.0)", "ipykernel (==5.2.0)", "ipykernel (==6.0.0)", "ipykernel (==6.11.0)", "ipython-genutils (==0.2.0)", "jedi (==0.16)", "jinja2 (==3.0.0)", "jupyter-client (==6.1.5)", "jupyter-client (==7.0.0)", "jupyter-core (==4.7.0)", "nbconvert (==6.0.0)", "nbconvert (==6.1.0)", "pyflakes (==2.2.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==3.0.0)", "tomli (==0.2.0)", "typing (==3.7.4)"] +colors = ["Pygments", "Pygments", "colorama"] +jupyter = ["IPython", "IPython", "attrs", "debugpy", "debugpy", "debugpy", "debugpy", "debugpy", "ipykernel", "ipykernel", "ipykernel", "ipython-genutils", "jedi", "jinja2", "jupyter-client", "jupyter-client", "jupyter-core", "nbconvert", "nbconvert"] +optional = ["IPython (>=7.10.0)", "IPython (>=7.23.1)", "Pygments (>=2.0.0)", "Pygments (>=2.4.1)", "attrs (>=19.2.0)", "colorama (>=0.4.1)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.0.0)", "debugpy (>=1.3.0)", "debugpy (>=1.6.0)", "ipykernel (>=5.2.0)", "ipykernel (>=6.0.0)", "ipykernel (>=6.11.0)", "ipython-genutils (>=0.2.0)", "jedi (>=0.16)", "jinja2 (>=3.0.0)", "jupyter-client (>=6.1.5)", "jupyter-client (>=7.0.0)", "jupyter-core (>=4.7.0)", "nbconvert (>=6.0.0)", "nbconvert (>=6.1.0)", "pyflakes (>=2.2.0)", "tomli (>=0.2.0)"] +optional-strict = ["IPython (==7.10.0)", "IPython (==7.23.1)", "Pygments (==2.0.0)", "Pygments (==2.4.1)", "attrs (==19.2.0)", "colorama (==0.4.1)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "debugpy (==1.0.0)", "debugpy (==1.3.0)", "debugpy (==1.6.0)", "ipykernel (==5.2.0)", "ipykernel (==6.0.0)", "ipykernel (==6.11.0)", "ipython-genutils (==0.2.0)", "jedi (==0.16)", "jinja2 (==3.0.0)", "jupyter-client (==6.1.5)", "jupyter-client (==7.0.0)", "jupyter-core (==4.7.0)", "nbconvert (==6.0.0)", "nbconvert (==6.1.0)", "pyflakes (==2.2.0)", "tomli (==0.2.0)"] +tests = ["pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)", "typing (>=3.7.4)"] +tests-binary = ["cmake", "cmake", "ninja", "ninja", "pybind11", "pybind11", "scikit-build", "scikit-build"] +tests-binary-strict = ["cmake (==3.21.2)", "cmake (==3.25.0)", "ninja (==1.10.2)", "ninja (==1.11.1)", "pybind11 (==2.10.3)", "pybind11 (==2.7.1)", "scikit-build (==0.11.1)", "scikit-build (==0.16.1)"] +tests-strict = ["pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==3.0.0)", "typing (==3.7.4)"] [[package]] name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "sphinx (<7.2.5)", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ruff", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-ignore-flaky", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.9" content-hash = "b546e2af0182f7cd8c1e1ac1d2cf9878c42d467f7b1039cf04e6c260042c8661" - -[metadata.files] -alabaster = [] -argcomplete = [] -attrs = [] -babel = [] -bandit = [] -beautifulsoup4 = [] -black = [] -bleach = [] -certifi = [] -cffi = [] -cfgv = [] -charset-normalizer = [] -click = [] -colorama = [] -colorlog = [] -coverage = [] -darglint = [] -defusedxml = [] -distlib = [] -docutils = [] -dparse = [] -exceptiongroup = [] -fastjsonschema = [] -filelock = [] -flake8 = [] -flake8-bandit = [] -flake8-bugbear = [] -flake8-docstrings = [] -flake8-rst-docstrings = [] -furo = [] -gitdb = [] -gitpython = [] -identify = [] -idna = [] -imagesize = [] -importlib-metadata = [] -iniconfig = [] -isort = [] -jinja2 = [] -jsonschema = [] -jsonschema-specifications = [] -jupyter-client = [] -jupyter-core = [] -jupyterlab-pygments = [] -livereload = [] -markdown-it-py = [] -markupsafe = [] -mccabe = [] -mdit-py-plugins = [] -mdurl = [] -mistune = [] -mypy = [] -mypy-extensions = [] -myst-parser = [] -nbclient = [] -nbconvert = [] -nbformat = [] -nbsphinx = [] -nodeenv = [] -nox = [] -nox-poetry = [] -packaging = [] -pandocfilters = [] -pathspec = [] -pbr = [] -pep8-naming = [] -platformdirs = [] -pluggy = [] -pre-commit = [] -pre-commit-hooks = [] -pycodestyle = [] -pycparser = [] -pydocstyle = [] -pyflakes = [] -pygments = [] -pytest = [] -python-dateutil = [] -pyupgrade = [] -pywin32 = [] -pyyaml = [] -pyzmq = [] -referencing = [] -requests = [] -restructuredtext-lint = [] -rich = [] -rpds-py = [] -"ruamel.yaml" = [] -"ruamel.yaml.clib" = [] -safety = [] -six = [] -smmap = [] -snowballstemmer = [] -soupsieve = [] -sphinx = [] -sphinx-autobuild = [] -sphinx-basic-ng = [] -sphinx-click = [] -sphinxcontrib-applehelp = [] -sphinxcontrib-devhelp = [] -sphinxcontrib-htmlhelp = [] -sphinxcontrib-jsmath = [] -sphinxcontrib-qthelp = [] -sphinxcontrib-serializinghtml = [] -stevedore = [] -tinycss2 = [] -tokenize-rt = [] -tomli = [] -tomlkit = [] -tornado = [] -traitlets = [] -typeguard = [] -typing-extensions = [] -urllib3 = [] -virtualenv = [] -webencodings = [] -xdoctest = [] -zipp = [] From b543b808b77020bf7c595d6e73af3552d6368773 Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Wed, 22 Nov 2023 20:57:46 +0100 Subject: [PATCH 19/24] Feature/add kpm tools (#24) * install kwant and deps * add sympy * add many modules in bulk * list kwant after other tools * add nox session to build kwant from source * switch strategy around kwant: remove from poetry install globally * differentiate between install and build * try installing kwant from pip in GH actions * install kwant for ubuntu * ignor darglint missing argument * add mypy to pre-commit --- .darglint | 1 + .flake8 | 3 +- .github/workflows/tests.yml | 6 + .pre-commit-config.yaml | 9 + noxfile.py | 40 ++ poetry.lock | 559 ++++++++++++++++++++- pyproject.toml | 8 + src/kpm_tools/common.py | 131 +++++ src/kpm_tools/evolution.py | 197 ++++++++ src/kpm_tools/kpm_funcs.py | 378 ++++++++++++++ src/kpm_tools/kpm_generator.py | 877 +++++++++++++++++++++++++++++++++ src/kpm_tools/plotting.py | 319 ++++++++++++ 12 files changed, 2525 insertions(+), 3 deletions(-) create mode 100644 src/kpm_tools/common.py create mode 100644 src/kpm_tools/evolution.py create mode 100644 src/kpm_tools/kpm_funcs.py create mode 100644 src/kpm_tools/kpm_generator.py create mode 100644 src/kpm_tools/plotting.py diff --git a/.darglint b/.darglint index 72ccc6c..6ef6631 100644 --- a/.darglint +++ b/.darglint @@ -1,2 +1,3 @@ [darglint] strictness = long +ignore=DAR101 diff --git a/.flake8 b/.flake8 index 0f46431..7a3e779 100644 --- a/.flake8 +++ b/.flake8 @@ -1,8 +1,7 @@ [flake8] select = B,B9,C,D,DAR,E,F,N,RST,S,W -ignore = E203,E501,RST201,RST203,RST301,W503 +ignore = E203,E501,RST201,RST203,RST301,W503,C901 max-line-length = 80 -max-complexity = 10 docstring-convention = google per-file-ignores = tests/*:S101 rst-roles = class,const,func,meth,mod,ref diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0750627..adbc69c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -42,6 +42,12 @@ jobs: pip install --constraint=.github/workflows/constraints.txt pip pip --version + - name: Install Kwant + run: | + sudo apt-add-repository -s ppa:kwant-project/ppa + sudo apt-get update + sudo apt-get install python3-kwant + - name: Upgrade pip in virtual environments shell: python run: | diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c95d78a..657c618 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -60,6 +60,15 @@ repos: language: system types: [text] stages: [commit, push, manual] + - id: mypy + name: mypy + entry: mypy + args: ["--ignore-missing-imports", "src", "tests"] + language: python + types: [python] + pass_filenames: false + target: ["src"] + - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.6.0 hooks: diff --git a/noxfile.py b/noxfile.py index a418552..48b8ab9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -110,6 +110,45 @@ def activate_virtualenv_in_precommit_hooks(session: Session) -> None: break +@nox.session(python=python_versions) +def install_kwant(session: Session): + """Install kwant from source.""" + session.install("cython", "numpy", "scipy", "sympy", "tinyarray", "kwant") + + +@nox.session(python=python_versions) +def build_kwant(session: Session): + """Build and install kwant from source.""" + session.install("cython", "numpy", "scipy", "sympy", "tinyarray") + + # temp folder + kwant_dir = os.path.join(session.create_tmp(), "kwant") + + need_to_build = False + # Check if kwant directory exists + if os.path.exists(kwant_dir): + # If exists, pull the latest changes + session.run("git", "-C", kwant_dir, "pull", external=True) + else: + need_to_build = True + # If not, clone the repository + session.run( + "git", + "clone", + "https://github.com/kwant-project/kwant.git", + kwant_dir, + external=True, + ) + + # Navigate to the cloned directory + session.cd(kwant_dir) + + # Install kwant from source + if need_to_build: + session.run("python", "setup.py", "build") + session.run("python", "setup.py", "install") + + @session(name="pre-commit", python=python_versions[0]) def precommit(session: Session) -> None: """Lint using pre-commit.""" @@ -226,6 +265,7 @@ def docs_build(session: Session) -> None: def docs(session: Session) -> None: """Build and serve the documentation with live reloading on file changes.""" args = session.posargs or ["--open-browser", "docs", "docs/_build"] + session.install(".") session.install( "sphinx", diff --git a/poetry.lock b/poetry.lock index 412a756..f1954e6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -388,6 +388,69 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] development = ["black", "flake8", "mypy", "pytest", "types-colorama"] +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + [[package]] name = "coverage" version = "7.3.2" @@ -455,6 +518,21 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "darglint" version = "1.8.1" @@ -645,6 +723,71 @@ restructuredtext-lint = "*" [package.extras] develop = ["build", "twine"] +[[package]] +name = "fonttools" +version = "4.45.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18138744540413eb2ebeff6ce8b9d617926f1ed08da5d1676f99f1966988264e"}, + {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3d240933045b9dbbe6e8c1e28ffe89be72c9be927b6e572e55be5e2b2604f7"}, + {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5853263505f407b69c0d1cbf3ed1c30f985b9505523989b20aa18a5231d4a08a"}, + {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c21f306f1e71146cf7587916d6de5e9c4bf26057aad602a6c7fad4b6e05bf1f"}, + {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1bb4f01018b9f4e2d7b07c2bf79e2ef498acb6f99321b72b5c44b1333481f569"}, + {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d0e6603c3b00604574d84fabbcf9dee81efa7c89d38ed4dcbf4e6c654e1ebb99"}, + {file = "fonttools-4.45.0-cp310-cp310-win32.whl", hash = "sha256:c3e676e50a0713c9a1e46185b806967d3c012643d1936ca814eb9ab62027c090"}, + {file = "fonttools-4.45.0-cp310-cp310-win_amd64.whl", hash = "sha256:e819f14d315024750b1ad2842da605051444b944cd983ea987359ace5213bcb9"}, + {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a6d68b97b967a3361e0ddf14425e4fe030c9f19462b445ce0b190c4a6834eb46"}, + {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619227c7b9088add4d4e5959bf0fa3c29a71c191baa8b989bf532645876b2168"}, + {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cafe001811ad1ac2a5d357fc99c490357d758569f69511d14da0311c02814e15"}, + {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:756c6f4324fd4bb4d7517462d7237ff65e45da7a002f9e6e08a48c25a11bf073"}, + {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ecc97628be1bf7fa93463e1e791915da66de51df8e655a5a6c846fd9b8ceaa98"}, + {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:636177ffc4479bc824a356c00a3c9a74a2ce591fa6057109321e0a0ffd126e40"}, + {file = "fonttools-4.45.0-cp311-cp311-win32.whl", hash = "sha256:cac462dbd9058778c89bc608ac29ba93ab3fbc37f305d260aa2d771cfb0fa694"}, + {file = "fonttools-4.45.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bd3f33a5d5630cc20cf3f8631074cac6eafdb2aa3ac8745966c3b4bf93656b4"}, + {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5b3da7791a58c97763d1704c2b76a9d654b8f2ef233e64248960bd2c6e669fe4"}, + {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fbc3d8acb578ba0932fcabc01a962f23b0dd254ab103dd0606128fff0175095"}, + {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f69e07ebfd89d96485349dc10bd81a027fc0e927f988fa31bd9cd06359e06ed"}, + {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b122fe802839bfc8f9603233e5fcbdc98b5e27876f7945b426adfea983918a7b"}, + {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8f8736e885700ae22970519b8f5c7f4c2f29c6e9459d05c649c4e99012c20b23"}, + {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:70f047ba37c6aac3d331b71bb784373e251bd86678da72526edc8585e79418e1"}, + {file = "fonttools-4.45.0-cp312-cp312-win32.whl", hash = "sha256:fdb43f68bce545f494fed1bfb60d2c32b53f410758919112923c2d600cb9a24c"}, + {file = "fonttools-4.45.0-cp312-cp312-win_amd64.whl", hash = "sha256:102a7ca8700a078265c002c29d2ae498edeb14b636375ceec2425b561ce08037"}, + {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4b154cbf93515e4eb477f5cf99de79b46c17229781f321907940bdbabbd64708"}, + {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f546a1b676622638a12c721d89cfb513ad7189548eadac885cdd555e35021557"}, + {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c5a0612049e0d06b467c3a0837d9efe37934acab64ba922f00e1d07c1555a7"}, + {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27166d00e0cd3ea49461b053f55e75676f1109e5483170a14d70c397d082a4c"}, + {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:980ba4e673439db22a00501fac087957ce0731351b042816f6c02df81cadc612"}, + {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83b70b99f3f55b046cb51ca20fc15702567710233b2cd757a79e1916c25a25f8"}, + {file = "fonttools-4.45.0-cp38-cp38-win32.whl", hash = "sha256:fe8ad943f62bf16273154ebcdf855c44a3b46eac36abea338c209209439b4eb6"}, + {file = "fonttools-4.45.0-cp38-cp38-win_amd64.whl", hash = "sha256:6fb1fdcee2b36e012283805ef0380e4508dbb504950b1c94d0343f8dbbad7d7e"}, + {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5bbcb75ffcea64543ab8203e132e2019b226f59a4a6958637e78c21f9ca560ff"}, + {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ade07953b35ebf66c445a5e02f28ecd038ea588dc7673c555afe319b6e3c5168"}, + {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54ac8be3f693062fc08550213edd40db8f4fe1dd095a1246ed18e887fc254d76"}, + {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc991712aaea9d545b13ec480aaf2ebd12ccdea180fce864dd9863f5134f5a06"}, + {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:420139743e21d832de230757fb7b0c285d8024d602af8064d9506fa055bb62ae"}, + {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:58da830a52c05f18a7cc8a279a8bdddf2e45cdc685b360699653fb3405557459"}, + {file = "fonttools-4.45.0-cp39-cp39-win32.whl", hash = "sha256:715e18f67f0587a16476c7f62b8ff9a165ddceb8c2a262fb08df9f71c7790f0e"}, + {file = "fonttools-4.45.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd26fda8c879558216458a801c1dba52f35dca0e96640fd9c75e86b6574cf1c3"}, + {file = "fonttools-4.45.0-py3-none-any.whl", hash = "sha256:835cf5d0e1b37bbed1d64c286611cc4da9ff19df952400f191ba9142b3cb97f6"}, + {file = "fonttools-4.45.0.tar.gz", hash = "sha256:c1c79d7d4093396892575115c214b24f09e68997cb5c0ab2d99bfdaff74c64b6"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + [[package]] name = "furo" version = "2023.9.10" @@ -748,6 +891,24 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -882,6 +1043,119 @@ files = [ {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, ] +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + [[package]] name = "livereload" version = "2.6.3" @@ -990,6 +1264,55 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "matplotlib" +version = "3.8.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, + {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, + {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, + {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, + {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, + {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, + {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, + {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, + {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, + {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + [[package]] name = "mccabe" version = "0.7.0" @@ -1042,6 +1365,23 @@ files = [ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + [[package]] name = "mypy" version = "1.7.0" @@ -1276,6 +1616,51 @@ nox = ">=2020.8.22" packaging = ">=20.9" tomlkit = ">=0.7" +[[package]] +name = "numpy" +version = "1.26.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, +] + [[package]] name = "packaging" version = "23.2" @@ -1334,6 +1719,84 @@ files = [ [package.dependencies] flake8 = ">=5.0.0" +[[package]] +name = "pillow" +version = "10.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pip" +version = "23.3.1" +description = "The PyPA recommended tool for installing Python packages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-23.3.1-py3-none-any.whl", hash = "sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b"}, + {file = "pip-23.3.1.tar.gz", hash = "sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174"}, +] + [[package]] name = "platformdirs" version = "4.0.0" @@ -1462,6 +1925,20 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" version = "7.4.3" @@ -1974,6 +2451,48 @@ setuptools = ">=19.3" github = ["jinja2 (>=3.1.0)", "pygithub (>=1.43.3)"] gitlab = ["python-gitlab (>=1.3.0)"] +[[package]] +name = "scipy" +version = "1.11.4" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "setuptools" version = "69.0.2" @@ -2239,6 +2758,30 @@ files = [ [package.dependencies] pbr = ">=2.0.0,<2.1.0 || >2.1.0" +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tinyarray" +version = "1.2.4" +description = "Arrays of numbers for Python, optimized for small sizes" +optional = false +python-versions = "*" +files = [ + {file = "tinyarray-1.2.4.tar.gz", hash = "sha256:ecd3428fd8a48b61fc5f0a413ede03e27db3a1dd53fcd49e24a36d11a8a29aba"}, +] + [[package]] name = "tinycss2" version = "1.2.1" @@ -2402,6 +2945,20 @@ files = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +[[package]] +name = "wheel" +version = "0.41.3" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.41.3-py3-none-any.whl", hash = "sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942"}, + {file = "wheel-0.41.3.tar.gz", hash = "sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + [[package]] name = "xdoctest" version = "1.1.2" @@ -2447,4 +3004,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "b546e2af0182f7cd8c1e1ac1d2cf9878c42d467f7b1039cf04e6c260042c8661" +content-hash = "db7029138a7b6afb21c6c1fbae67bdaa75cce6a73c679b5ae94609a39c8c1f4d" diff --git a/pyproject.toml b/pyproject.toml index 7c7b3aa..b13595d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,14 @@ click = ">=8.0.1" nbsphinx = "^0.9.3" tornado = ">=6.3.3" nox-poetry = "^1.0.3" +numpy = "^1.26.2" +scipy = "^1.11.4" +matplotlib = "^3.8.2" +tinyarray = "^1.2.4" +sympy = "^1.12" +setuptools = "^69.0.2" +wheel = "^0.41.3" +pip = "^23.3.1" [tool.poetry.dev-dependencies] Pygments = ">=2.10.0" diff --git a/src/kpm_tools/common.py b/src/kpm_tools/common.py new file mode 100644 index 0000000..32784be --- /dev/null +++ b/src/kpm_tools/common.py @@ -0,0 +1,131 @@ +"""Utils.""" + +from collections import OrderedDict + +import kwant +import numpy as np +from matplotlib.colors import ListedColormap +from matplotlib.pylab import cm +from scipy.sparse import diags + + +def identity_operator(x): + """Return argument.""" + return x + + +def position_operator(syst, pos_transform=None): + """Return a list of position operators as 'csr' matrices.""" + operators = [] + norbs = syst.sites[0].family.norbs + if pos_transform is None: + pos = np.array([s.pos for s in syst.sites]) + else: + pos = np.array([pos_transform(s.pos) for s in syst.sites]) + + for i in range(pos.shape[1]): + operators.append(diags(np.repeat(pos[:, i], norbs), format="csr")) + return operators + + +def trace_orbs(array, norbs=4, axis=-1): + """Return the trace per unit-cell. + + 'array' has a length 'num_sites * norbs' over the 'axis', + and the return array has a length 'num_sites' over the + same axis. + """ + array = np.asarray(array) + if array.shape[axis] % norbs != 0: + raise ValueError(f"The shape along axis {axis} must have shape {norbs}.") + + slices = [[slice(None) for i in range(array.ndim)] for i in range(norbs)] + for n in range(norbs): + slices[n][axis] = slice(n, None, norbs) + slices[n] = tuple(slices[n]) + return sum([array[slices[n]] for n in range(norbs)]) + + +def trace_unit_cell(sites, array): + """Trace the array assuming it has the values per orbital per site. + + If + value_per_orbital_per_site + """ + norbs = sites[0].family.norbs + value_per_site = trace_orbs(array, norbs, axis=0) + norbs = sites[0].family.norbs + + trace = OrderedDict() + for s, value in zip(sites, value_per_site, strict=True): + _previous_value = trace.get(s.tag, 0) + trace[s.tag] = _previous_value + value + value_per_uc = np.array(list(trace.values())) + + return value_per_uc + + +def transparent_cmap(cmap=None, alpha="linear"): + """Add transparency to a matplotlib ListedColormap. + + Parameters + ---------- + cmap : instance of `matplotlib.pylab.cm`, optional + The colormap to use. + alpha : 'linear', float or array of floats + If 'alpha' is a `float` or array of floats, this will be + the transparency value. If it is 'linear' the transparency + will decrease from '1' to '0'. + + """ + # Choose colormap + if cmap is None: + cmap = cm.viridis + + # Get the colormap colors + my_cmap = cmap(np.arange(cmap.N)) + + # Set alpha + if alpha == "linear": + my_cmap[:, -1] = np.arange(cmap.N) / cmap.N + elif isinstance(alpha, float): + my_cmap[:, -1] = np.ones(cmap.N) * alpha + else: + my_cmap[:, -1] = alpha + + # Create new colormap + return ListedColormap(my_cmap) + + +# Disorder distributions +def standard_gaussian(label, salt, s1, s2=None): + """Return a gaussian distribution.""" + return kwant.digest.gauss(str(hash((s1, s2))), salt=salt + label) + + +def uniform(label, salt, s1, s2=None): + """Return a uniform distribution in the interval '[-0.5, 0.5)'.""" + return kwant.digest.uniform(str(hash((s1, s2))), salt=salt + label) - 0.5 + + +def expectation_value(vectors, operator): + """Braket 'operator' with 'vectors'. + + 'vectors' must have t1he last axis as the dimension to be multiplied + by 'operator' + """ + dim = vectors.shape[-1] + new_shape = vectors.shape[:-1] + vecs = vectors.reshape(-1, dim) + output = np.empty(new_shape, dtype=complex).flatten() + for i, vec in enumerate(vecs): + output[i] = np.dot(vec.conj(), operator.dot(vec)) + + output = output.reshape(new_shape) + return output + + +def local_expectation_value(vector, operator, norbs=2): + """Trace over sites.""" + output = np.multiply(vector.conj(), operator.dot(vector.ravel())) + return np.real_if_close(trace_orbs(output, norbs=norbs)) diff --git a/src/kpm_tools/evolution.py b/src/kpm_tools/evolution.py new file mode 100644 index 0000000..1bad153 --- /dev/null +++ b/src/kpm_tools/evolution.py @@ -0,0 +1,197 @@ +"""Evolution in time with a KPM expansion. (c) Pablo Piskunow 2021. + +Evolve an initial vector to arbitrary chosen points in time +(not necessarily small intervals), and compute expectation values of +observables. + + +""" + +from functools import partial + +import numpy as np +from scipy.special import jv + +from .kpm_generator import GeneralVectorExpansion +from .kpm_generator import SpectralDensityIterator +from .kpm_generator import _BaseKPM + + +def coef_evo(m, e, ab, delta_time): + """Return the coefficients of the time evolution operator. + + The 'delta_time' parameter must be the real time, and will be rescaled + with respect to the bounds of the spectrum. + + The parameter 'e' is to conform with the signatures, but it is a + dummy parameter, as the time evolution of a vector only depends on + the Hamiltonian and the vector. + """ + a, b = ab + m_array = np.arange(m) + num_e = len(np.atleast_1d(e).flatten()) + coef = jv(m_array, a * delta_time) + coef = 2 * coef * ((-1j) ** m_array) + coef[0] /= 2 + coef *= np.exp(-1j * b * delta_time) + return np.array([coef for _ in range(num_e)]).T + + +def _max_num_moments(dt, accuracy): + if dt == 0: + return 1 + + def func(dt, a, b, c, d, accu): + return int(a * np.log(1 / accu) * (dt) ** b + c * dt + d * np.log(1 / accu) + 1) + + if accuracy < 1e-16: + accu = 1e-32 # actual accuracy goal + p = [0.33944873, 0.3304045, 1.0063549, 0.07014769, accu] + elif accuracy < 1e-8: + accu = 1e-16 # actual accuracy goal + p = [0.27909421, 0.32633684, 1.02264908, 0.08207106, accu] + elif accuracy < 1e-4: + accu = 1e-8 # actual accuracy goal + p = [0.23109766, 0.31671058, 1.0528007, 0.08506937, accu] + else: + raise ValueError( + "This 'accuracy' is not very accurate, " "must be 'accuracy < 1e-4'." + ) + + return func(dt, *p) + + +def evolve_vectors(syst, vectors, dt=0, accuracy=1e-16, **kwargs): + """Evolve vectors in time, according to a Hamiltonian. + + Parameters + ---------- + syst : `~kwant.system` or Hamiltonian matrix + Hamiltonian of the system. + vectors : iterable of arrays + Vectors to be passed to `~SpectralDensityIterator`. + dt : float + Time in units of E/hbar, where E is the units + of energy of the Hamiltonian. + accuracy : float, default to '1e-16' + Accuracy goal for the Chebyshev expansion. + kwargs : dict + Extra keyword arguments to pass to `~SpectralDensityIterator`. + """ + + def identity(x): + return x + + kwargs["kernel"] = identity + kwargs["vector_factory"] = vectors + num_vectors = len(vectors) + kwargs["num_vectors"] = num_vectors + + bounds = kwargs.get("bounds", None) + a = np.ptp(bounds) / 2 + # bound for the minimum number of moments + rescaled_time = a * dt + num_moments = _max_num_moments(rescaled_time, accuracy) + kwargs["num_moments"] = num_moments + + gvec = GeneralVectorExpansion( + syst, coef_function=partial(coef_evo, delta_time=dt), **kwargs + ) + + return gvec(0).squeeze(0) + + +def evolve_vectors_time_steps( + syst, time_steps, vectors, save_vectors=True, accuracy=1e-16, **kwargs +): + """Evolve vectors in time using time steps. + + Parameters + ---------- + syst : `~kwant.system` or Hamiltonian matrix + Hamiltonian of the system, where the vectors will evolve. + time_steps : sequence of floats + Discrete time steps that will be used to evolve the vectors. + vectors : ndarray + Initial sequence of vectors that belong to the system. + save_vectors : bool, default to 'True' + Whether to save the vectors at intermediate steps, and return them. + accuracy : float, default to '1e-16' + Precission of each time-evolution step. + kwargs : dict + Key-word arguments to be passed to 'evolve_vectors' + """ + params = kwargs.get("params", dict()) + bounds = kwargs.get("bounds", None) + if bounds is None: + base = _BaseKPM(syst, params=params, num_moments=2, num_vectors=1) + bounds = base.bounds + + dts = np.ediff1d(time_steps) + v_t = vectors + + final_v = [v_t] + for dt in dts: + v_t = evolve_vectors( + syst, vectors=v_t, dt=dt, accuracy=accuracy, bounds=bounds, params=params + ) + if save_vectors: + final_v.append(v_t) + if not save_vectors: + final_v = v_t + return np.array(final_v) + + +def evolve_observable( + syst, + time_steps, + operator=None, + vectors=None, + accuracy=1e-16, + save_intermediate=True, + **kwargs +): + """Evolve an observable in time using time steps. + + Parameters + ---------- + syst : `~kwant.system` or Hamiltonian matrix + Hamiltonian of the system, where the vectors will evolve. + time_steps : sequence of floats + Discrete time steps that will be used to evolve the vectors. + vectors : ndarray + Initial sequence of vectors that belong to the system. + operator : callable, ndarray, or sparse matrix, optional + Any operator that can be accepted by `SpectralDensityIterator`. + accuracy : float, default to '1e-16' + Precission of each time-evolution step. + save_intermediate: bool, default to True + Save intermediate vectors. + kwargs : dict + Key-word arguments to be passed to 'evolve_vectors' + """ + kwargs["operator"] = operator + kwargs.pop("vector_factory", None) + + # parameters to pass to the time evolution KPM expansion + tkwargs = dict(bounds=kwargs.get("bounds"), params=kwargs.get("params")) + + dts = np.ediff1d(time_steps) + v_t = vectors + densities_t = [] + + if save_intermediate: + spectrum = SpectralDensityIterator(syst, vector_factory=v_t, **kwargs) + densities_t.append(spectrum.densities) + + for dt in dts: + v_t = evolve_vectors(syst, v_t, dt=dt, accuracy=accuracy, **tkwargs) + if save_intermediate: + spectrum = SpectralDensityIterator(syst, vector_factory=v_t, **kwargs) + densities_t.append(spectrum.densities) + + if not save_intermediate: + spectrum = SpectralDensityIterator(syst, vector_factory=v_t, **kwargs) + densities_t.append(spectrum.densities) + + return densities_t diff --git a/src/kpm_tools/kpm_funcs.py b/src/kpm_tools/kpm_funcs.py new file mode 100644 index 0000000..440452a --- /dev/null +++ b/src/kpm_tools/kpm_funcs.py @@ -0,0 +1,378 @@ +"""Pre-built common functions using the KPM generators.""" +import numpy as np + +from .common import identity_operator +from .common import position_operator +from .kpm_generator import concatenator +from .kpm_generator import general_function + + +def greens_function(syst, params, **kwargs): + """Build a Green's function operator using KPM. + + Returns a function that takes an energy or a list of energies, and returns + the Green's function with that energy acting on `vectors`. + + Parameters + ---------- + syst : kwant.System or ndarray + Finalized kwant system or dense or sparse ndarray of the + Hamiltonian with shape `(N, N)`. + params : dict, optional + Parameters for the kwant system. + kpm_params : dict, optional + Dictionary containing the parameters to pass to the `~kwant.kpm` + module. 'num_vectors' will be overwritten to match the number + of vectors, and 'operator' key will be deleted. + precalculate_moments: bool, default False + Whether to precalculate and store all the KPM moments of `vectors`. + This is useful if the Green's function is evaluated at a large + number of energies, but uses a large amount of memory. + If False, the KPM expansion is performed every time the Green's + function is called, which minimizes memory use. + + Returns + ------- + green_expansion : callable + Takes an energy or array of energies and returns the Greens function + acting on the vectors, for those energies. + + """ + return general_function(syst, params, coef_function=coef_greens_function, **kwargs) + + +def delta_function(syst, params, **kwargs): + """Build a projector over the occupied energies. + + Returns a function that takes a Fermi energy, and returns the + projection of the `vectors` over the occupied energies of the + Hamiltonian. + + Parameters + ---------- + syst : kwant.System or ndarray + Finalized kwant system or dense or sparse ndarray of the + Hamiltonian with shape `(N, N)`. + params : dict, optional + Parameters for the kwant system. + kpm_params : dict, optional + Dictionary containing the parameters to pass to the `~kwant.kpm` + module. 'num_vectors' will be overwritten to match the number + of vectors, and 'operator' key will be deleted. + precalculate_moments: bool, default False + Whether to precalculate and store all the KPM moments of `vectors`. + This is useful if the Green's function is evaluated at a large + number of energies, but uses a large amount of memory. + If False, the KPM expansion is performed every time the Green's + function is called, which minimizes memory use. + + + Returns + ------- + projector : callable + Takes an energy or array of energies and returns the projection + onto the occupied states of the vectors, for those energies. + + """ + return general_function(syst, params, coef_function=coef_delta_function, **kwargs) + + +def projector_operator(syst, params, **kwargs): + """Build a projector over the occupied energies. + + Returns a function that takes a Fermi energy, and returns the + projection of the `vectors` over the occupied energies of the + Hamiltonian. + + Parameters + ---------- + syst : kwant.System or ndarray + Finalized kwant system or dense or sparse ndarray of the + Hamiltonian with shape `(N, N)`. + params : dict, optional + Parameters for the kwant system. + kpm_params : dict, optional + Dictionary containing the parameters to pass to the `~kwant.kpm` + module. 'num_vectors' will be overwritten to match the number + of vectors, and 'operator' key will be deleted. + precalculate_moments: bool, default False + Whether to precalculate and store all the KPM moments of `vectors`. + This is useful if the Green's function is evaluated at a large + number of energies, but uses a large amount of memory. + If False, the KPM expansion is performed every time the Green's + function is called, which minimizes memory use. + + + Returns + ------- + projector : callable + Takes an energy or array of energies and returns the projection + onto the occupied states of the vectors, for those energies. + + """ + return general_function( + syst, params, coef_function=coef_projector_function, **kwargs + ) + + +def coef_greens_function(m, e, sign=-1, ab=(1, 0)): + """Generate Green's functions coefficients.""" + a, b = ab + e_rescaled = (np.atleast_1d(e) - b) / a + prefactor = -2j * sign / (np.sqrt((1 - e_rescaled) * (1 + e_rescaled)) * a) + phi_e = np.arccos(e_rescaled) + + m_array = np.arange(m) + + coef = np.exp(1j * sign * np.outer(m_array, phi_e)) + + coef[0] = coef[0] / 2 + + return prefactor * coef + + +def coef_greens_function_r(m, e, ab=(1, 0)): + """Generate the retarded Green's functions coefficients.""" + return coef_greens_function(m, e, ab=ab, sign=-1) + + +def coef_greens_function_a(m, e, ab=(1, 0)): + """Generate the advanced Green's functions coefficients.""" + return coef_greens_function(m, e, ab=ab, sign=1) + + +def coef_greens_function_prime(m, e, sign=-1, ab=(1, 0)): + """Generate the prime Green's functions coefficients.""" + a, b = ab + e_rescaled = (np.atleast_1d(e) - b) / a + one_e2 = (1 - e_rescaled) * (1 + e_rescaled) + sqrt_e = np.sqrt(one_e2) + prefactor = -2j * sign / (one_e2 * a**2) + phi_e = np.arccos(e_rescaled) + + m_array = np.arange(m) + + coef = -1j * sign * m_array[:, np.newaxis] + coef = coef + (e_rescaled / sqrt_e)[np.newaxis, :] + coef = coef * np.exp(1j * sign * np.outer(m_array, phi_e)) + + coef[0] = coef[0] / 2 + + return prefactor * coef + + +def coef_greens_function_prime_r(m, e, ab=(1, 0)): + """Generate the prime retarded Green's functions coefficients.""" + return coef_greens_function_prime(m, e, ab=ab, sign=-1) + + +def coef_greens_function_prime_a(m, e, ab=(1, 0)): + """Generate the prime advanced Green's functions coefficients.""" + return coef_greens_function_prime(m, e, ab=ab, sign=1) + + +def coef_projector_function(m, e, ab=(1, 0)): + """Projector over occupied states below the Fermi energy.""" + a, b = ab + e_rescaled = (np.atleast_1d(e) - b) / a + m_array = np.arange(m) + m_array[0] = 1 + phi_e = np.arccos(e_rescaled) + coef = -2 / np.pi * np.sin(np.outer(phi_e, m_array)) / m_array + coef[:, 0] = 1 - phi_e / np.pi + return coef.T + + +def coef_projector_function_unoccupied(m, e, ab=(1, 0)): + """Projector over unoccupied states below the Fermi energy.""" + a, b = ab + e_rescaled = (np.atleast_1d(e) - b) / a + m_array = np.arange(m) + m_array[0] = 1 + phi_e = np.arccos(e_rescaled) + coef = 2 / np.pi * np.sin(np.outer(phi_e, m_array)) / m_array + coef[:, 0] = phi_e / np.pi + return coef.T + + +def coef_delta_function(m, e, ab=(1, 0)): + """Generate the delta function coefficients.""" + coef = 2 * chebysev_polynomial_series(m, e, ab=ab) + a, b = ab + e_rescaled = (np.atleast_1d(e) - b) / a + g_e = (np.pi * np.sqrt(1 - e_rescaled) * np.sqrt(1 + e_rescaled)) * a + + return coef / g_e + + +def chebysev_polynomial_series(m, e, ab=(1, 0)): + """Generate the Chebyshev polynomial series.""" + # the first coefficient is halved + a, b = ab + e_rescaled = (np.atleast_1d(e) - b) / a + e2 = 2 * e_rescaled + coef = np.ndarray((m, e_rescaled.shape[0])) + + coef[0] = np.ones_like(e_rescaled) + if m > 1: + coef[1] = e_rescaled + for i in range(2, m): + coef[i] = coef[i - 1] * e2 - coef[i - 2] + + coef[0] = coef[0] / 2 + return coef + + +def chern_number(syst, x=None, y=None, **kwargs): + """Compute the Chern number in real space. + + Parameters + ---------- + syst : kwant system or Hamiltonian matrix + The system to compute the Chern number. + x : callable, optional + First (second) position operator. If provided, it + must be the '.dot' method of an ndarray. If not + provided, the 'x' and 'y' canonical coordinates + extraxted from 'syst' will be used. In this case, + 'syst' must be a kwant system. + y : callable, optional + Same as `x`. + kwargs : dict + The remaining keyword arguments are passed to + `~kpm_generator.concatenator`. + + """ + # make x and y callables + if x is None and y is None: + x_op, y_op = position_operator(syst) + x = x_op.dot + y = y_op.dot + elif x is None: + x_op, y_op = position_operator(syst) + x = x_op.dot + elif y is None: + x_op, y_op = position_operator(syst) + y = y_op.dot + + chern = concatenator( + syst, + operator_array=[None, x, y, None], + coef_array=[coef_projector_function] * 3, + first_transpose=False, + ouroboros=True, + **kwargs + ) + + return lambda e: 4 * np.pi * chern(e).imag + + +def chern_number_pbc(syst, **kwargs): + """Generate the Chern number for periodic boundary conditions.""" + x_op, y_op = position_operator(syst) + + chern_1 = concatenator( + syst, + operator_array=[None, x_op.dot, y_op.dot, None], + coef_array=[ + coef_projector_function, + coef_projector_function_unoccupied, + coef_projector_function, + ], + first_transpose=False, + ouroboros=True, + **kwargs + ) + + chern_2 = concatenator( + syst, + operator_array=[None, y_op.dot, x_op.dot, None], + coef_array=[ + coef_projector_function, + coef_projector_function_unoccupied, + coef_projector_function, + ], + first_transpose=False, + ouroboros=True, + **kwargs + ) + + return lambda e: 2j * np.pi * (chern_1(e) - chern_2(e)) + + +def conductivity(syst, op_a="x", op_b="y", **kwargs): + """Compute the Kubo-Bastin conductivity kernel. + + The result must be normalized with the area per site, + and integrated up to the Fermi energy to obtain the Kubo-Bastin + conductivity. + """ + from kwant.kpm import _velocity + + params = kwargs.get("params", None) + positions = kwargs.get("positions", None) + + v_a = _velocity(syst, params, op_a, positions=positions) + v_b = _velocity(syst, params, op_b, positions=positions) + + kb_1 = concatenator( + syst, + operator_array=[v_a.dot, v_b.dot, identity_operator], + coef_array=[coef_delta_function, coef_greens_function_prime_a], + first_transpose=True, + ouroboros=False, + **kwargs + ) + + kb_2 = concatenator( + syst, + operator_array=[v_a.dot, v_b.dot, identity_operator], + coef_array=[coef_greens_function_prime_r, coef_delta_function], + first_transpose=True, + ouroboros=False, + **kwargs + ) + + return lambda e: 2 * np.pi * np.real(1j * (kb_1(e) - kb_2(e))) + + +def longitudinal_conductivity(syst, direction="x", **kwargs): + """Compute the Kubo-Greenwood conductivity. + + The result must be normalized with the area per site. + The Kubo-Greenwood KPM expansion uses of the velocity operator. + This operator can be either provided or computed inside this function, + check the 'direction' parameter. + + Parameters + ---------- + syst: ndarray or a Kwant system + System for which the velocity operator is calculated. + params : dict + Parametres of the system + direction: str, matrix or operator + If 'direction' is a `str` in {'x', 'y', 'z'}, the velocity operator + is calculated using the 'syst' and 'positions', else + if 'direction' is an operator or a matrix, then that is the velocity + operator. + positions : ndarray of shape '(N, dim)', optional + Positions of each orbital. This parameter is not used if + 'syst' is a Kwant system. + """ + from kwant.kpm import _velocity + + params = kwargs.get("params", None) + positions = kwargs.get("positions", None) + + v_a = _velocity(syst, params, direction, positions=positions) + + kg = concatenator( + syst, + operator_array=[v_a.dot, v_a.dot, identity_operator], + coef_array=[coef_delta_function, coef_delta_function], + first_transpose=True, + ouroboros=False, + **kwargs + ) + + return kg diff --git a/src/kpm_tools/kpm_generator.py b/src/kpm_tools/kpm_generator.py new file mode 100644 index 0000000..de5da43 --- /dev/null +++ b/src/kpm_tools/kpm_generator.py @@ -0,0 +1,877 @@ +"""Main module containing iterables and generators of KPM vectors.""" + +from collections.abc import Iterable +from concurrent.futures import ProcessPoolExecutor +from concurrent.futures import ThreadPoolExecutor +from math import ceil +from multiprocessing import Pool + +import kwant +import numpy as np +from common import identity_operator +from kwant.operator import _LocalOperator +from scipy.sparse import csr_matrix +from scipy.sparse import identity +from scipy.sparse.linalg import eigsh + + +DEFAULT_MOMENTS = 100 + + +class IteratorKPM: + r"""Iterator of KPM vectors. + + This iterator yields vectors as + .. math:: + T_n(H) \\rvert v \\langle + + for vectors :math:`\\rvert v \\langle` in ``vectors``, + for 'n' in '[0, max_moments]'. + + + + + Notes + ----- + Returns a sequence of expanded vectors of shape ``(M, N)``. + If the input is a vector then ``M=1``. + + """ + + def __init__(self, ham, vectors, max_moments=None, operator=None, num_threads=None): + """Initialize the iterator. + + Parameters + ---------- + ham : 2D array + Hamiltonian, dense or sparse array with shape '(N, N)'. + vectors : 1D or 2D array + Vector of length 'N' or array of vectors with shape '(M, N)'. + max_moments : int, optional + Number of moments to stop the iteration. If not defined, the + iterator has no end. + operator : callable, optioinal + Operator to act on the expanded vectors. The iterator will yield + 'operator(v_n)', where `v_n = T_n(H) | v >`. If omited, the + identity operator is assumed. + num_threads : int, optional + Number of threads to use in matrix vector multiplications. + If not provided, the maximum number of threads are used. + + """ + self.num_threads = num_threads + self.alpha0 = np.array(np.atleast_2d(vectors).T, dtype=complex) + self.len = max_moments if max_moments is not None else np.inf + self.ham = ham + self.n = 0 + self._operator = operator + self.alpha_prev = None + self.alpha = None + + def operator(self, vector): + """Normalize operator.""" + if self._operator is None: + return vector + return self._operator(vector) + + def __len__( + self, + ): + """Maximum number of moments and vectors to yield.""" + return self.len + + def add_moments(self, num_moments=0): + """Increase the maximum number of moments returned. + + The iterator can now return `num_moments` new expanded vectors. + Note that it will continue after the last vector, and not start from + the beggining. + """ + if num_moments >= 0 and num_moments == int(num_moments): + self.len = self.len + num_moments + else: + raise ValueError("'num_moments' must be a positive integer.") + + def __iter__( + self, + ): + """Return instance to iterate.""" + return self + + def __next__( + self, + ): + """Yield the next vector.""" + if self.n >= self.len: + raise StopIteration("Exhausted vectors.") + if self.n == 0: + self.alpha_prev = np.copy(self.alpha0) + self.n = 1 + self.alpha = self.ham @ self.alpha_prev + return self.operator(self.alpha_prev).T + if self.n == 1: + self.n = 2 + return self.operator(self.alpha).T + if self.n >= 2: + self.n = self.n + 1 + temp = self.alpha.copy() + self.alpha = 2 * self.ham @ self.alpha - self.alpha_prev + self.alpha_prev = temp + + return self.operator(self.alpha).T + + # TODO : add __getitem__ method to simplify calls in other modules, + # specially `Correlator` + + def save(self): + """Save internal state, except the 'ham'.""" + keys = ["n", "len", "alpha0", "alpha_prev", "alpha", "_operator"] + return {k: self.__dict__[k] for k in keys} + + def load(self, d): + """Load internal state.""" + self.__dict__.update(d) + + +def thread_update(spectrum, num_moments, executor=None, shutdown=True): + """Update thread.""" + if executor is None: + executor = ThreadPoolExecutor() + + all_moments = list( + executor.map( + spectrum._update_one_vector, + np.arange(spectrum.num_vectors), + [spectrum.num_moments + num_moments] * spectrum.num_vectors, + ) + ) + executor.shutdown() + + for r in range(spectrum.num_vectors): + spectrum._moments_list[r] = all_moments[r][0] + spectrum._iterators[r].load(all_moments[r][1]) + + spectrum.num_moments += num_moments + + spectrum._update_densities() + + +def process_update(spectrum, num_moments): + """Update process.""" + with ProcessPoolExecutor() as executor: + all_moments = list( + executor.map( + spectrum._update_one_vector, + np.arange(spectrum.num_vectors), + [spectrum.num_moments + num_moments] * spectrum.num_vectors, + ) + ) + + for r in range(spectrum.num_vectors): + spectrum._moments_list[r] = all_moments[r][0] + spectrum._iterators[r].load(all_moments[r][1]) + spectrum.num_moments = spectrum.num_moments + num_moments + + spectrum._update_densities() + + +def multiprocess_update(spectrum, num_moments): + """Update multiprocess.""" + with Pool() as executor: + all_moments = list( + executor.starmap( + spectrum._update_one_vector, + [ + (r, spectrum.num_moments + num_moments) + for r in range(spectrum.num_vectors) + ], + ) + ) + + for r in range(spectrum.num_vectors): + spectrum._moments_list[r] = all_moments[r][0] + spectrum._iterators[r].load(all_moments[r][1]) + spectrum.num_moments += num_moments + + spectrum._update_densities() + + +def _normalize_num_moments(num_moments=None, energy_resolution=None, a=1): + if (num_moments is not None) and (energy_resolution is not None): + raise TypeError( + "either 'num_moments' or 'energy_resolution' " "must be provided." + ) + if energy_resolution is not None: + if energy_resolution <= 0: + raise ValueError("'energy resolution' must be positive") + num_moments = ceil((1.6 * a) / energy_resolution) + elif num_moments is None: + num_moments = DEFAULT_MOMENTS + + if num_moments <= 0 or num_moments != int(num_moments): + raise ValueError("'num_moments' must be a positive integer") + + return num_moments + + +class _BaseKPM: + def __init__( + self, + hamiltonian, + params=None, + operator=None, + num_vectors=10, + num_moments=None, + energy_resolution=None, + vector_factory=None, + bounds=None, + eps=0.05, + rng=None, + kernel=None, + mean=True, + accumulate_vectors=True, + num_threads=1, + ): + self.num_threads = num_threads + + # Normalize the format of 'ham' + if isinstance(hamiltonian, kwant.system.System): + hamiltonian = hamiltonian.hamiltonian_submatrix(params=params, sparse=True) + try: + hamiltonian = csr_matrix(hamiltonian) + except Exception as err: + raise ValueError( + "'hamiltonian' is neither a matrix " "nor a Kwant system." + ) from err + + # Normalize 'operator' to a common format. + self.operator = _normalize_operator(operator, params) + + self.mean = mean + rng0 = kwant._common.ensure_rng(rng) + + _v0 = None + if bounds is None: + # create this vector for reproducibility + _v0 = np.exp(2j * np.pi * rng0.random_sample(hamiltonian.shape[0])) + + if eps <= 0: + raise ValueError("'eps' must be positive") + + # Hamiltonian rescaled as in Eq. (24) + self.hamiltonian, (self._a, self._b) = _rescale( + hamiltonian, eps=eps, v0=_v0, bounds=bounds + ) + self.bounds = (self._b - self._a, self._b + self._a) + + if vector_factory is None: + self._vector_factory = kwant.kpm._VectorFactory( + kwant.kpm.RandomVectors(hamiltonian, rng=rng), + num_vectors=num_vectors, + accumulate=accumulate_vectors, + ) + else: + if not isinstance(vector_factory, Iterable): + raise TypeError("vector_factory must be iterable") + try: + len(vector_factory) + except TypeError as err: + if num_vectors is None: + raise ValueError( + "num_vectors must be provided if" + "vector_factory has no length." + ) from err + self._vector_factory = kwant.kpm._VectorFactory( + vector_factory, num_vectors=num_vectors, accumulate=accumulate_vectors + ) + + self._moments_list = [] + # sets self.num_vectors = 0 + self._iterators = [] + + # set kernel before calling moments + self.kernel = kernel if kernel is not None else kwant.kpm.jackson_kernel + + self.num_moments = _normalize_num_moments( + num_moments, energy_resolution, self._a + ) + + @property + def num_vectors(self): + return len(self._iterators) + + def add_vectors(self, num_vectors=None): + """Increase the number of vectors. + + If called with no arguments, or with 'num_vectors=None', then the + vector factory is initialized and iterated to produce the vectors. + + Parameters + ---------- + num_vectors: positive int, optional + The number of vectors to add. + + """ + if num_vectors is None: + num_vectors = self._vector_factory.num_vectors + current_vectors = self.num_vectors + total_vectors = current_vectors + num_vectors + new_vectors_factory = total_vectors - self._vector_factory.num_vectors + if new_vectors_factory > 0: + self._vector_factory.add_vectors(new_vectors_factory) + new_vectors = self._vector_factory.num_vectors - current_vectors + + if new_vectors <= 0 or new_vectors != int(new_vectors): + raise ValueError("'num_vectors' must be a positive integer") + + self._iterators.extend([None] * new_vectors) + + for r in range(current_vectors, total_vectors): + self._iterators[r] = IteratorKPM( + self.hamiltonian, self._vector_factory[r], num_threads=self.num_threads + ) + + def save(self): + """Save state.""" + exclude = ["hamiltonian", "_iterators"] + d = {key: self.__dict__[key] for key in self.__dict__ if key not in exclude} + + iterators_data = [ite.save() for ite in self._iterators] + d["iterators_data"] = iterators_data + return d + + def load(self, d): + """Load previous state.""" + if "iterators_data" in d: + iterators = [] + iterators_data = d.pop("iterators_data") + for data in iterators_data: + ite = IteratorKPM(self.hamiltonian, data["alpha0"]) + ite.load(data) + iterators.append(ite) + d["_iterators"] = iterators + + self.__dict__.update(d) + + +class SpectralDensityIterator(_BaseKPM, kwant.kpm.SpectralDensity): + """Inherit from ~`_BaseKPM` and ~`kwant.kpm.SpectralDensity`.""" + + def __init__(self, *args, **kwargs): + """Initialize Spectral Density Iterator. + + See ~`kwant.kpm.SpectralDensity`. + """ + super().__init__(*args, **kwargs) + + self.add_vectors() + self._update_moments_list(self.num_moments) + self._update_densities() + + def _update_densities(self): + moments = self._moments() + self.densities, self._gammas = kwant.kpm._calc_fft_moments(moments) + + def add_moments(self, num_moments=None, *, energy_resolution=None): + """Increase the number of Chebyshev moments. + + Parameters + ---------- + num_moments: positive int + The number of Chebyshev moments to add. Mutually + exclusive with ``energy_resolution``. + energy_resolution: positive float, optional + Features wider than this resolution are visible + in the spectral density. Mutually exclusive with + ``num_moments``. + + """ + new_moments = _normalize_num_moments(num_moments, energy_resolution, self._a) + + self._update_moments_list(self.num_moments + new_moments) + self.num_moments += new_moments + + # recalculate quantities derived from the moments + self._update_densities() + + def add_vectors(self, num_vectors=None): + """Increase the number of vectors. + + Parameters + ---------- + num_vectors: positive int, optional + The number of vectors to add. + + """ + current_vectors = self.num_vectors + super().add_vectors(num_vectors=num_vectors) + new_vectors = self.num_vectors - current_vectors + + self._moments_list.extend([[]] * new_vectors) + + for r in range(current_vectors, self.num_vectors): + one_moment, _ = self._update_one_vector(r, self.num_moments) + self._moments_list[r] = one_moment[:] + + self._update_densities() + + def _update_moments_list(self, n_moments): + for r in range(self.num_vectors): + one_moment, _ = self._update_one_vector(r, n_moments) + self._moments_list[r] = one_moment[:] + + def _update_one_vector(self, r, n_moments): + this_iterator = self._iterators[r] + one_moment = [None] * n_moments + one_moment[0 : this_iterator.n] = self._moments_list[r] + + for n in range(this_iterator.n, n_moments): + alpha_next = next(this_iterator) + one_moment[n] = np.dot( + this_iterator.alpha0.conj().T, self.operator(alpha_next.T) + ).squeeze() + return one_moment, this_iterator.save() + + +class GeneralVectorExpansion(_BaseKPM): + """Inherit from ~`_BaseKPM`.""" + + def __init__(self, *args, coef_function=None, **kwargs): + """Initialize general vector expansion.""" + super().__init__(*args, **kwargs) + self._ab = (self._a, self._b) + self.gs = self.kernel(np.ones(self.num_moments)) + + if coef_function is None: + raise NotImplementedError + else: + self.coef_function = coef_function + + self.add_vectors() + + def _initialize_iterators( + self, + ): + for ite in self._iterators: + ite.n = 0 + + def __call__(self, e): + """Return the general function spectrum for energy `e`.""" + iterator = self.vector_iterator(e) + # vecs.shape = (num_vecs, dim) + return sum(c[:, None, None] * vecs[None, :, :] for c, vecs in iterator) + + def vector_iterator(self, e): + """Return vector iterator.""" + self._initialize_iterators() + + e = np.atleast_1d(e).flatten() + + # coef_array is finite and makes the zip iterator to stop + coef_array = self.coef_function(self.num_moments, e, ab=self._ab) + coef_array = self.gs[:, None] * coef_array + + for c in coef_array: + vectors = [] + for r in range(self.num_vectors): + vec = next(self._iterators[r]) + # vec.shape = (num_vecs_ite, dim) + # where num_vecs_ite == 1 + vectors.append(vec.squeeze(0)) + yield c, np.array(vectors) + + def add_moments(self, num_moments=None, *, energy_resolution=None): + """Increase the number of Chebyshev moments. + + Parameters + ---------- + num_moments: positive int + The number of Chebyshev moments to add. Mutually + exclusive with ``energy_resolution``. + energy_resolution: positive float, optional + Features wider than this resolution are visible + in the spectral density. Mutually exclusive with + ``num_moments``. + + """ + new_moments = _normalize_num_moments(num_moments, energy_resolution, self._a) + self.num_moments += new_moments + for ite in self._iterators: + ite.len += new_moments + + +def general_function(*args, **kwargs): + """Build a general function operator using KPM. + + Returns a function that takes an energy or a list of energies, and returns + the general function with that energy acting on `vectors`. + + Parameters + ---------- + syst : kwant.System or ndarray + Finalized kwant system or dense or sparse ndarray of the + Hamiltonian with shape `(N, N)`. + params : dict, optional + Parameters for the kwant system. + kpm_params : dict, optional + Dictionary containing the parameters to pass to the `~kwant.kpm` + module. 'num_vectors' will be overwritten to match the number + of vectors, and 'operator' key will be deleted. + precalculate_moments: bool, default False + Whether to precalculate and store all the KPM moments of `vectors`. + This is useful if the Green's function is evaluated at a large + number of energies, but uses a large amount of memory. + If False, the KPM expansion is performed every time the Green's + function is called, which minimizes memory use. + coef_function : callable, optional + A function that takes a number of moments sequence of rescaled + energies (to the interval '(-1, 1)'), and returns the coeficients + of the expansion of the function. + + Returns + ------- + f : callable + Takes an energy or array of energies and returns the general function + acting on the vectors, for those energies. + + """ + kpm_expansion = GeneralVectorExpansion(*args, **kwargs) + init_vectors = np.array(kpm_expansion._vector_factory.saved_vectors) + + def f(e): + """Return the function evaluated at 'e' applied to the vectors. + + The ndarray returned has initial dimensions '(N_E, M, N)', + where 'N_E' is the number of energies passed, 'M' is the + number of vectors, and 'N' is the dimension of the vectors. + """ + vecs_in_energy = kpm_expansion(e) + densities = np.einsum( + "ijk,jk->ji", # shape = (num_vectors, num_e) + vecs_in_energy, + init_vectors.conj(), + ) + + if kpm_expansion.mean: + return np.mean(densities, axis=0) + return densities + + return f + + +def concatenator( + hamiltonian, + params=None, + operator_array=None, + coef_array=None, + return_expansion=False, + first_transpose=False, + ouroboros=False, + logging=False, + **kwargs +): + """Expand a concatenation of functions and matrix operators. + + Take 'n' functions [f_i] and 'n+1' operators [O_j] and + expand ``. + + 'O_j' is an operator acting on vectors, and [f_i] are functions + defined by their coefficients on a KPM expansion. + + The instance created is a function. When called + it returns the expectation value for a single energy. + (maybe an array of energies too) + + Parameters + ---------- + hamiltonian: ndarray or `kwant.system` + Hamiltonian or system defining a Hamiltonian matrix. + params: dict + Parameters of the Hamiltonian or `kwant.system`. + operator_array : iterable of operators + The operators are normalized to an equivalent of a 'dot' + function. If one of the elements in the iterable is 'None', then + the identity operator is assumed. This identity is compatible + with 'first_transpose'. + coef_array: iterable of floats + Array of coefficients for the expansion. + return_expansion: bool, default to 'False' + Return the expansion. + first_transpose : bool, default to 'False' + If there are more than one set of coefficients, then the first operator + and set of coefficients are used to expand the vectors to the left. + This means that the coefficients will be cojugated, and the that + operator will be conjugate-transposed. This is achieved by different + means, depending on the operator type. If the operator is a matrix, the + conjugate-transpose of the matrix is taken. If it is a + `~kwant.operator`, then this must be Hermitian. If it is a callable, + then it must be a method from a numpy ndarray, or a scipy sparse + matrix. In this case, the `__self__` attribute is attempted to + retrieve, and the conjugate-transpose is taken. + Mutually exclusive with 'ourorboros', in which case the saved expanded + vectors to the right are the conjugate of the first expanded vectors to + the left. + ouroboros : bool, default to 'False' + The first and last operators are equal, and the first and last + functions defined by their KPM coefficients are also equal. + Mutually exclusive with 'first_transpose'. Note that the operators and + coefficients must nonetheless be passed, or at least place-holders. + logging: bool, default to 'False' + Use logging. + Note + ---- + The first operator in the operator array must be a matrix that can be + transposed. + + """ + if first_transpose and ouroboros: + raise ValueError("Only one of 'first_transpose' or 'ouroboros' can be True.") + if len(coef_array) + 1 != len(operator_array): + raise ValueError( + "The length of the coefficients array must be the length of " + "the operators minus one." + ) + if (len(coef_array) == 1) and first_transpose: + raise ValueError( + "'first_transpose' cannot be true if only one operator " "is defined." + ) + # Normalize 'operator_array' to functions that take and return + # a vector. + if logging: + debug = ["First transpose is " + str(first_transpose)] + operator_list = [ + _normalize_operator(operator_array[0], params, dagger=first_transpose) + ] + operator_list.extend( + [_normalize_operator(op, params, dagger=False) for op in operator_array[1:]] + ) + kwargs.pop("operator", None) # no operators needed in kwargs + + # check that we accumulate the vectors from the factory + if not kwargs.get("accumulate_vectors", True): + raise ValueError("'accumulate_vectors' must be 'True'") + kwargs["accumulate_vectors"] = True + + _temp = _BaseKPM(hamiltonian, params=params, **kwargs) + _temp.add_vectors() + # remove vector factory, since later is replaced with iterables of vectors + kwargs.pop("vector_factory", None) + + vectors_left = np.array(_temp._vector_factory.saved_vectors) + vectors_right = [operator_list[-1](vec) for vec in vectors_left] + if logging: + debug.append("vecs_right_0 = Op[-1](vecs)") + + if first_transpose: + # first operator in the list is already dagger + vectors_left = [operator_list[0](vec) for vec in vectors_left] + if logging: + debug.append("vecs_left_0 = vecs_right_0") + + # catch mean, and set it to False for the expansions + mean = kwargs.get("mean", True) + kwargs["mean"] = False + + if kwargs.get("bounds", None) is None: + kwargs["bounds"] = _temp.bounds + + _psi = GeneralVectorExpansion( + hamiltonian, + params=params, + coef_function=coef_array[-1], + vector_factory=vectors_right, + **kwargs + ) + if logging: + debug.append("vecs_right_1 = expand(coef[-1], vecs_right_0)") + + if len(coef_array) == 1: + + def f(e): + e = np.atleast_1d(e) + vecs_in_energy = _psi(e) + # shape = (num_vectors, num_e) + densities = np.einsum("ijk,jk->ji", vecs_in_energy, vectors_left.conj()) + + if mean: + densities = np.mean(densities, axis=0) + + if return_expansion: + return densities, vectors_left, vecs_in_energy + return densities + + elif len(coef_array) > 1: + if first_transpose: + _omega = GeneralVectorExpansion( + hamiltonian, + params=params, + coef_function=_dagger(coef_array[0]), + vector_factory=vectors_left, + **kwargs + ) + if logging: + debug.append("vecs_left_1 = expand(coef[0].conj(), " "vecs_left_0)") + remaining_coefs = coef_array[1:-1] + remaining_operators = operator_list[1:-2] + elif ouroboros: + remaining_coefs = coef_array[1:-1] + remaining_operators = operator_list[1:-2] + if logging: + debug.append("vecs_left_1 = vecs_right_1") + else: + remaining_coefs = coef_array[:-1] + remaining_operators = operator_list[:-2] + _vectors_left = vectors_left[np.newaxis].copy() + + if logging: + # place-holders for next operations + debug.extend([None, None, None]) + + def f(e): + e = np.atleast_1d(e) + + psi = _psi(e) + + if first_transpose: + vectors_left = _omega(e) + elif ouroboros: + vectors_left = psi.copy() + else: + vectors_left = _vectors_left + + densities = [] + vecs_e_right = [] + for this_e, this_psi in zip(e, psi, strict=True): + this_vecs_e_right = [operator_list[-2](vec) for vec in this_psi] + if logging: + debug[-3] = "vecs_right_2 = Op[-2](vecs_right_1)" + # flipping the order also flips which idx are included/excluded + for coefs, op in zip( + remaining_coefs[::-1], remaining_operators[::-1], strict=True + ): + _temp_expansion = GeneralVectorExpansion( + hamiltonian, + params=params, + coef_function=coefs, + vector_factory=this_vecs_e_right, + **kwargs + ) + # shape=(num_e, num_vecs,dim) + _temp_vectors = _temp_expansion(this_e)[0] + if logging: + debug[-2] = "vecs_right_3 = expand(coef[-2], " "vecs_right_2)" + this_vecs_e_right = [op(vec) for vec in _temp_vectors] + + if logging: + debug[-1] = "vecs_right_4 = Op[-3](vecs_right_3)" + + vecs_e_right.append(this_vecs_e_right) + + vecs_e_right = np.array(vecs_e_right) + + # shape=(num_vectors, num_e) + densities = np.einsum("ijk,ijk->ji", vecs_e_right, vectors_left.conj()) + if mean: + densities = np.mean(densities, axis=0) + + if logging: + return densities, debug + + if return_expansion: + return densities, vectors_left, vecs_e_right + return densities + + return f + + +def _dagger(f): + def dag(*args, **kwargs): + return f(*args, **kwargs).conj() + + return dag + + +def _rescale(hamiltonian, eps, v0, bounds): + """Rescale a Hamiltonian and return a LinearOperator. + + Parameters + ---------- + hamiltonian : 2D array + Hamiltonian of the system. + eps : scalar + Ensures that the bounds are strict. + v0 : random vector, or None + Used as the initial residual vector for the algorithm that + finds the lowest and highest eigenvalues. + bounds : tuple, or None + Boundaries of the spectrum. If not provided the maximum and + minimum eigenvalues are calculated. + + """ + # Relative tolerance to which to calculate eigenvalues. Because after + # rescaling we will add eps / 2 to the spectral bounds, we don't need + # to know the bounds more accurately than eps / 2. + tol = eps / 2 + + if bounds: + lmin, lmax = bounds + else: + lmax = float( + eigsh( + hamiltonian, k=1, which="LA", return_eigenvectors=False, tol=tol, v0=v0 + ) + ) + lmin = float( + eigsh( + hamiltonian, k=1, which="SA", return_eigenvectors=False, tol=tol, v0=v0 + ) + ) + + a = np.abs(lmax - lmin) / (2.0 - eps) + b = (lmax + lmin) / 2.0 + + if lmax - lmin <= abs(lmax + lmin) * tol / 2: + raise ValueError( + "The Hamiltonian has a single eigenvalue, it is not possible to " + "obtain a spectral density." + ) + + id = identity(hamiltonian.shape[0], format="csr") + rescaled_ham = (hamiltonian - b * id) / a + return rescaled_ham, (a, b) + + +def _normalize_operator(op, params, dagger=False): + """Normalize 'op' to a function that takes and returns a vector.""" + if op is None: + r_op = identity_operator + elif isinstance(op, _LocalOperator): + if dagger: + if not op.check_hermiticity: + raise ValueError( + "Cannot ensure that this operator is " + "Hermitian. Create this operator with " + "'check_hermiticity=True'" + ) + op = op.bind(params=params) + r_op = op.act + elif callable(op): + if dagger: + try: + r_op = op.__self__.T.conj().dot + except Exception as err: + raise ValueError( + "Cannot ensure that this operator is " "Hermitian." + ) from err + r_op = op + elif hasattr(op, "dot"): + op = csr_matrix(op) + if dagger: + r_op = op.T.conj().dot + else: + r_op = op.dot + else: + raise TypeError( + "The operators must have a '.dot' " "attribute or must be callable." + ) + return r_op diff --git a/src/kpm_tools/plotting.py b/src/kpm_tools/plotting.py new file mode 100644 index 0000000..8afa7ef --- /dev/null +++ b/src/kpm_tools/plotting.py @@ -0,0 +1,319 @@ +"""Plotting functions and others.""" + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.patches import FancyArrowPatch +from mpl_toolkits.mplot3d import proj3d + +from .common import trace_unit_cell + + +def plot_kwant( + sites, + site_color=None, + linewidths=0.2, + site_size=10, + edgecolor="k", + cmap="Blues", + depth=False, + elev=None, + azim=None, + ax=None, + show=False, + unit_cell=False, + pos_transform=None, + colorbar=True, + **kwargs +): + """Plot a list of kwant system sites with site colors and colorbar.""" + if site_color is None: + site_color = np.ones(len(sites)) + if unit_cell: + family_name = sites[0].family.name + sites = [s for s in sites if s.family.name == family_name] + site_color = trace_unit_cell(sites, site_color) + # traces norbs and sublattices + else: + sites = sites + site_color = site_color + if len(sites) != site_color.shape[0]: + raise ValueError( + "The number of sites (orbitals) to plot must match " "the 'array' length" + ) + + dim = sites[0].family.dim + + fig = plt.gcf() + + if pos_transform is None: + + def pos_transform(x): + return x + + positions = np.array([pos_transform(s.pos) for s in sites]).T + + if site_color is None: + site_color = np.ones(positions.shape[1]) + + return_artists = True + if ax is None: + return_artists = False + if dim == 3: + ax = fig.add_subplot(111, projection="3d") + else: + ax = fig.add_subplot(111) + + # TODO: check *positions warning + if dim == 3: + art = ax.scatter3D( + *positions, + c=site_color, + cmap=cmap, + linewidths=linewidths, + s=site_size, + edgecolor=edgecolor, + depthshade=depth, + **kwargs + ) + + ax.view_init(elev=elev, azim=azim) + else: + art = ax.scatter( + *positions, + c=site_color, + cmap=cmap, + linewidths=linewidths, + s=site_size, + edgecolor=edgecolor, + **kwargs + ) + + if colorbar: + fig.colorbar(art, ax=ax) + + if show: + fig.show() + + if return_artists: + return art + return fig + + +def plot_neighbors( + syst, + lat=None, + neighs=None, + show=False, + more_sites=False, + init_tags=((0, 0)), + ax=None, + scatter_kwargs=None, + arrow_kwargs=None, +): + """Plot arrows between the neighbors.""" + if scatter_kwargs is None: + scatter_kwargs = {} + if arrow_kwargs is None: + arrow_kwargs = {} + plot_kwargs = dict( + color="k", arrowstyle="simple", mutation_scale=15, lw=0, alpha=0.5 + ) + plot_kwargs.update(arrow_kwargs) + dim = lat.sublattices[0].dim + if neighs is None: + if lat is None: + try: + lat = syst.sites[0].family + except Exception: + lat = list(syst.sites())[0].family + neighs = [] + for sublat in lat.sublattices: + neighs.extend(sublat.neighbors()) + + if ax is None: + ax = plt.gca() + + for init_tag in init_tags: + for nei in neighs: + site_a = nei.family_a(*init_tag) + second_tag = np.array(init_tag) - np.array(nei.delta) + site_b = nei.family_b(*(second_tag)) + delta_pos = site_b.pos - site_a.pos + + if dim == 2: + ax.arrow( + x=site_a.pos[0], + y=site_a.pos[1], + dx=delta_pos[0], + dy=delta_pos[1], + head_width=0.05, + head_length=0.1, + fc="k", + ec="k", + ) + elif dim == 3: + rs = np.array([site_a.pos, site_a.pos + delta_pos]).T + arrow = Arrow3D(*rs, **plot_kwargs) + ax.add_artist(arrow) + + ax.scatter(*site_a.pos, **scatter_kwargs) + ax.scatter(*site_b.pos, **scatter_kwargs) + + if more_sites: + site_a = nei.family_a(*second_tag) + second_tag = second_tag - np.array(nei.delta) + site_b = nei.family_b(*(second_tag)) + delta_pos = site_b.pos - site_a.pos + + if dim == 2: + ax.arrow( + x=site_a.pos[0], + y=site_a.pos[1], + dx=delta_pos[0], + dy=delta_pos[1], + head_width=0.05, + head_length=0.1, + fc="k", + ec="k", + ) + elif dim == 3: + rs = np.array([site_a.pos, site_a.pos + delta_pos]).T + arrow = Arrow3D(*rs, **plot_kwargs) + ax.add_artist(arrow) + ax.scatter(*site_a.pos, **scatter_kwargs) + ax.scatter(*site_b.pos, **scatter_kwargs) + if show: + plt.show() + return ax + + +def plot_vectors( + vectors, + ax=None, + hl=0.1, # head_length + head_width=0.05, + color="k", # can be overridden, + show=False, + fig_size=None, + resize_ax=False, + margin=0.2, + **kwargs +): + """Plot vectors. + + Args: + vectors (_type_): _description_ + ax (_type_, optional): _description_. Defaults to None. + hl (float, optional): _description_. Defaults to 0.1. + color (str, optional): _description_. Defaults to "k". + show (bool, optional): _description_. Defaults to False. + fig_size (_type_, optional): _description_. Defaults to None. + resize_ax (bool, optional): _description_. Defaults to False. + margin (float, optional): _description_. Defaults to 0.2. + + Returns: + _type_: _description_ + """ + fig = plt.gcf() + if fig_size is not None: + fig.set_size_inches(fig_size) + if ax is None: + ax = plt.gca() + + directions = [] + for vector in vectors: + _ec = vector.get("color", color) + _fc = vector.get("color", color) + _hl = vector.get("hl", hl) + _hw = vector.get("head_width", head_width) + origin = vector.get("origin", (0, 0)) + direction = vector.get("direction", (1, 1)) + directions.append(direction) + + ax.arrow( + x=origin[0], + y=origin[1], + dx=direction[0], + dy=direction[1], + head_width=_hw, + head_length=_hl, + fc=_fc, + ec=_ec, + **kwargs + ) + + directions = np.array(directions) + + if resize_ax: + ptp = np.ptp(directions, axis=0) * margin # % margin + lower_bound = np.min(directions, axis=0) + upper_bound = np.max(directions, axis=0) + + ax.set_xlim(lower_bound[0] - ptp[0], upper_bound[0] + ptp[0]) + ax.set_ylim(lower_bound[1] - ptp[1], upper_bound[1] + ptp[1]) + if show: + plt.show() + return fig + + +class Arrow3D(FancyArrowPatch): + """Patch fancy arrow. + + Args: + FancyArrowPatch (_type_): _description_ + """ + + def __init__(self, xs, ys, zs, *args, **kwargs): + """Initialize. + + Args: + xs (_type_): _description_ + ys (_type_): _description_ + zs (_type_): _description_ + """ + FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs) + self._verts3d = xs, ys, zs + + def draw(self, renderer): + """Draw. + + Args: + renderer (_type_): _description_ + """ + xs3d, ys3d, zs3d = self._verts3d + xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) + self.set_positions((xs[0], ys[0]), (xs[1], ys[1])) + FancyArrowPatch.draw(self, renderer) + + +def plot_arrows3d(start=None, arrow=None, ax=None, show=False, **kwargs): + """Plot 3d arrows. + + Args: + start (_type_, optional): _description_. Defaults to None. + arrow (_type_, optional): _description_. Defaults to None. + ax (_type_, optional): _description_. Defaults to None. + show (bool, optional): _description_. Defaults to False. + + Returns: + _type_: _description_ + """ + fig = plt.gcf() + if ax is None: + ax = fig.add_subplot(111, projection="3d") + + plot_kwargs = dict(mutation_scale=5, lw=3, arrowstyle="-|>", color="b", alpha=0.5) + plot_kwargs.update(kwargs) + + for i in range(len(start)): + a = Arrow3D( + [start[i, 0], start[i, 0] + arrow[i, 0]], + [start[i, 1], start[i, 1] + arrow[i, 1]], + [start[i, 2], start[i, 2] + arrow[i, 2]], + **plot_kwargs + ) + ax.add_artist(a) + + if show: + plt.show() + return fig From 6a2db07cb750086fdb39eeef4ceabe1ae7827a02 Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Wed, 22 Nov 2023 21:50:39 +0100 Subject: [PATCH 20/24] remove type checks and tests for macos and windows (#26) * remove type checks and tests for macos and windows * remove mypy from pre-commit * remove coverage check --- .github/workflows/tests.yml | 4 ---- .pre-commit-config.yaml | 8 -------- codecov.yml | 4 ++-- pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index adbc69c..a894ace 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,12 +13,8 @@ jobs: include: - { python: "3.10", os: "ubuntu-latest", session: "pre-commit" } - { python: "3.10", os: "ubuntu-latest", session: "safety" } - - { python: "3.10", os: "ubuntu-latest", session: "mypy" } - - { python: "3.9", os: "ubuntu-latest", session: "mypy" } - { python: "3.10", os: "ubuntu-latest", session: "tests" } - { python: "3.9", os: "ubuntu-latest", session: "tests" } - - { python: "3.10", os: "windows-latest", session: "tests" } - - { python: "3.10", os: "macos-latest", session: "tests" } - { python: "3.10", os: "ubuntu-latest", session: "typeguard" } - { python: "3.10", os: "ubuntu-latest", session: "xdoctest" } - { python: "3.10", os: "ubuntu-latest", session: "docs-build" } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 657c618..8d1e986 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -60,14 +60,6 @@ repos: language: system types: [text] stages: [commit, push, manual] - - id: mypy - name: mypy - entry: mypy - args: ["--ignore-missing-imports", "src", "tests"] - language: python - types: [python] - pass_filenames: false - target: ["src"] - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.6.0 diff --git a/codecov.yml b/codecov.yml index 9ac2650..928920b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -3,7 +3,7 @@ coverage: status: project: default: - target: "100" + target: "0" patch: default: - target: "100" + target: "0" diff --git a/pyproject.toml b/pyproject.toml index b13595d..a053882 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ source = ["kpm_tools", "tests"] [tool.coverage.report] show_missing = true -fail_under = 100 +fail_under = 0 [tool.isort] profile = "black" From b6b8c41f8948c31516f9a70162354ce671e6ead6 Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Thu, 23 Nov 2023 07:06:27 +0100 Subject: [PATCH 21/24] add example hamiltonians and bloch module (#27) --- src/kpm_tools/bloch.py | 438 ++++++++++++++++++++++++++++++++++ src/kpm_tools/hamiltonians.py | 125 ++++++++++ 2 files changed, 563 insertions(+) create mode 100644 src/kpm_tools/bloch.py create mode 100644 src/kpm_tools/hamiltonians.py diff --git a/src/kpm_tools/bloch.py b/src/kpm_tools/bloch.py new file mode 100644 index 0000000..7614e95 --- /dev/null +++ b/src/kpm_tools/bloch.py @@ -0,0 +1,438 @@ +"""Handle systems with periodic boundary conditions. + +'wraparound_by_parts' is reworked from `~kwant.wraparound`, specially MR !363. +""" +import cmath +import collections +import inspect +import warnings + +import kwant +import numpy as np +import tinyarray as ta + + +if kwant.__version__ <= "1.4.2": + raise ImportError("This module does not work with versions of Kwant " "<= 1.4.2.") +from kwant._common import get_parameters +from kwant._common import memoize +from kwant.builder import Builder +from kwant.builder import SiteArray +from kwant.builder import herm_conj +from kwant.lattice import TranslationalSymmetry +from kwant.wraparound import WrappedBuilder +from kwant.wraparound import _callable_herm_conj +from kwant.wraparound import _set_signature +from kwant.wraparound import wraparound + + +def wraparound_by_parts( + builder, keep=None, *, coordinate_names="xyz", separate_sites=False +): + """Replace translational symmetries by momentum parameters. + + A new Builder instance is returned. By default, each symmetry is replaced + by one scalar momentum parameter that is appended to the already existing + arguments of the system. Optionally, one symmetry may be kept by using the + `keep` argument. The momentum parameters will have names like 'k_n' where + the 'n' are specified by 'coordinate_names'. + + Parameters + ---------- + builder : `~kwant.builder.Builder` + Kwant builder with translational symmetries. + keep : int, optional + Which (if any) translational symmetry to keep. + coordinate_names : sequence of strings, default: 'xyz' + The names of the coordinates along the symmetry + directions of 'builder'. + separate_sites : bool, default to 'False' + Wheather to construct a new system without the hoppings that cross + the fundamental domain of the translational symmetry. If 'True' + return the system contained inside the fundamental domain, a + dictionary of wrapped sites and a dictionary of wrapped hoppings. + + Notes + ----- + Wraparound is stop-gap functionality until Kwant 2.x which will include + support for higher-dimension translational symmetry in the low-level system + format. It will be deprecated in the 2.0 release of Kwant. + + """ + + @memoize + def bind_site(val): + def f(*args): + a, *args = args + return val(a, *args[:mnp]) + + if not callable(val): + raise ValueError("Value function should be a Callable.") + _set_signature(f, get_parameters(val) + momenta) + return f + + @memoize + def bind_hopping_as_site(elem, val): + def f(*args): + a, *args = args + phase = cmath.exp(1j * ta.dot(elem, args[mnp:])) + v = val(a, sym.act(elem, a), *args[:mnp]) if callable(val) else val + pv = phase * v + return pv + herm_conj(pv) + + params = ("_site0",) + if callable(val): + params += get_parameters(val)[2:] # cut off both site parameters + _set_signature(f, params + momenta) + return f + + @memoize + def bind_hopping(elem, val): + def f(*args): + a, b, *args = args + phase = cmath.exp(1j * ta.dot(elem, args[mnp:])) + v = val(a, sym.act(elem, b), *args[:mnp]) if callable(val) else val + return phase * v + + params = ("_site0", "_site1") + if callable(val): + params += get_parameters(val)[2:] # cut off site parameters + _set_signature(f, params + momenta) + return f + + @memoize + def bind_sum(num_sites, *vals): + """Construct joint signature for all 'vals'.""" + + def f(*in_args): + acc = 0 + for val, selection in val_selection_pairs: + if selection: # Otherwise: reuse previous out_args. + out_args = tuple(in_args[i] for i in selection) + if callable(val): + acc = acc + val(*out_args) + else: + acc = acc + val + return acc + + params = collections.OrderedDict() + + # Add the leading one or two 'site' parameters. + site_params = [f"_site{i}" for i in range(num_sites)] + for name in site_params: + params[name] = inspect.Parameter(name, inspect.Parameter.POSITIONAL_ONLY) + + # Add all the other parameters (except for the momenta). Setup the + # 'selections'. + selections = [] + for val in vals: + if not callable(val): + selections.append(()) + continue + val_params = get_parameters(val)[num_sites:] + if val_params[mnp:] != momenta: + raise ValueError("Shapes don't match.") + val_params = val_params[:mnp] + selections.append((*site_params, *val_params)) + for p in val_params: + # Skip parameters that exist in previously added functions. + if p in params: + continue + params[p] = inspect.Parameter(p, inspect.Parameter.POSITIONAL_ONLY) + + # Sort values such that ones with the same arguments are bunched. + # Prepare 'val_selection_pairs' that is used in the function 'f' above. + params_keys = list(params.keys()) + val_selection_pairs = [] + prev_selection = None + argsort = sorted(range(len(selections)), key=selections.__getitem__) + momenta_sel = tuple(range(mnp, 0, 1)) + for i in argsort: + selection = selections[i] + if selection and selection != prev_selection: + prev_selection = selection = ( + tuple(params_keys.index(s) for s in selection) + momenta_sel + ) + else: + selection = () + val_selection_pairs.append((vals[i], selection)) + + # Finally, add the momenta. + for k in momenta: + params[k] = inspect.Parameter(k, inspect.Parameter.POSITIONAL_ONLY) + + f.__signature__ = inspect.Signature(params.values()) + return f + + try: + momenta = [ + f"k_{coordinate_names[i]}" for i in range(len(builder.symmetry.periods)) + ] + except IndexError as err: + raise ValueError( + "All symmetry directions must have a name specified " "in coordinate_names" + ) from err + + if keep is None: + ret = WrappedBuilder() + sym = builder.symmetry + else: + periods = list(builder.symmetry.periods) + ret = WrappedBuilder(TranslationalSymmetry(periods.pop(keep))) + sym = TranslationalSymmetry(*periods) + momenta.pop(keep) + momenta = tuple(momenta) + mnp = -len(momenta) # Used by the bound functions above. + + # Store the names of the momentum parameters and the symmetry of the + # old Builder (this will be needed for band structure plotting) + ret._momentum_names = momenta + ret._wrapped_symmetry = builder.symmetry + + # Wrapped around system retains conservation law and chiral symmetry. + # We use 'bind_site' to add the momenta arguments if required. + cons = builder.conservation_law + ret.conservation_law = bind_site(cons) if callable(cons) else cons + chiral = builder.chiral + ret.chiral = bind_site(chiral) if callable(chiral) else chiral + + if builder.particle_hole is not None or builder.time_reversal is not None: + warnings.warn( + "`particle_hole` and `time_reversal` symmetries are set " + "on the input builder. However they are ignored for the " + "wrapped system, since Kwant lacks a way to express the " + "existence (or not) of a symmetry at k != 0.", + RuntimeWarning, + stacklevel=2, + ) + ret.particle_hole = None + ret.time_reversal = None + + ret.vectorize = builder.vectorize + + sites = {} + hops = collections.defaultdict(list) + + # Store lists of values, so that multiple values can be assigned to the + # same site or hopping. + for site, val in builder.site_value_pairs(): + # Every 'site' is in the FD of the original symmetry. + # Move the sites to the FD of the remaining symmetry, this guarantees that + # every site in the new system is an image of an original FD site translated + # purely by the remaining symmetry. + sites[ret.symmetry.to_fd(site)] = [val] # a list to append wrapped hoppings + + for hop, val in builder.hopping_value_pairs(): + a, b = hop + # 'a' is in the FD of original symmetry. + # Get translation from FD of original symmetry to 'b', + # this is different from 'b_dom = sym.which(b)'. + b_dom = builder.symmetry.which(b) + # Throw away part that is in the remaining translation direction, so we get + # an element of 'sym' which is being wrapped + b_dom = ta.array([t for i, t in enumerate(b_dom) if i != keep]) + # Pull back using the remainder, which is purely in the wrapped directions. + # This guarantees that 'b_wa' is an image of an original FD site translated + # purely by the remaining symmetry. + b_wa = sym.act(-b_dom, b) + # Move the hopping to the FD of the remaining symmetry + a, b_wa = ret.symmetry.to_fd(a, b_wa) + + if a == b_wa: + # The hopping gets wrapped-around into an onsite Hamiltonian. + # Since site `a` already exists in the system, we can simply append. + sites[a].append(bind_hopping_as_site(b_dom, val)) + else: + # The hopping remains a hopping. + if any(b_dom): + # The hopping got wrapped-around. + val = bind_hopping(b_dom, val) + + # Make sure that there is only one entry for each hopping + # pointing in one direction, modulo the remaining translations. + b_wa_r, a_r = ret.symmetry.to_fd(b_wa, a) + if (b_wa_r, a_r) in hops: + if (a, b_wa) in hops: + raise ValueError("More than one entry per hopping.") + + if callable(val): + val = _callable_herm_conj(val) + else: + val = herm_conj(val) + + hops[b_wa_r, a_r].append((val, b_dom)) + else: + hops[a, b_wa].append((val, b_dom)) + + # Copy stuff into result builder, converting lists of more than one element + # into summing functions. + + # Optionally, store the wrapped sites and hoppings, and return them + # together with the builder stripped of these sites. + + wrapped_sites = {} + wrapped_hoppings = {} + for site, vals in sites.items(): + if len(vals) == 1: + # no need to bind onsites without extra wrapped hoppings + ret[site] = vals[0] + else: + if separate_sites: + ret[site] = vals[0] # add the site without the wrapped part + # conjugate is included by 'bind_sum' + wrapped_sites[site] = bind_sum(1, *vals[1:]) + else: + val = vals[0] + vals[0] = bind_site(val) if callable(val) else val + ret[site] = bind_sum(1, *vals) + + for hop, vals_doms in hops.items(): + if len(vals_doms) == 1: + # no need to bind hoppings that are not already bound + val, b_dom = vals_doms[0] + + # check if this hoppings is purely from wrapped translational symm. + if any(b_dom) and separate_sites: + wrapped_hoppings[hop] = val + else: + ret[hop] = val + else: + new_vals = [ + bind_hopping(b_dom, val) + if callable(val) and not any(b_dom) # skip hoppings already bound + else val + for val, b_dom in vals_doms + ] + if separate_sites: + # add the hoppings that are not wrapped + vals_in_fd = [val for val, b_dom in vals_doms if not any(b_dom)] + if len(vals_in_fd) != 1: + raise ValueError("There should be only one hopping.") + ret[hop] = vals_in_fd[0] + + vals_out_fd = [ + val for val, b_dom in vals_doms if any(b_dom) + ] # vals are already bound + + wrapped_hoppings[hop] = bind_sum(2, *vals_out_fd) + else: + ret[hop] = bind_sum(2, *new_vals) + + if separate_sites: + return ret, wrapped_sites, wrapped_hoppings + return ret + + +def separate_bloch_components(builder): + """Construct two systems: the supercell onsite and supercell hopping.""" + # get wrapped sites and hoppings separately + syst_superonsite, w_sites, w_hoppings = wraparound_by_parts( + builder, separate_sites=True + ) + fsyst_bloch_superonsite = syst_superonsite.finalized() + + bloch_builder = Builder(symmetry=builder.symmetry) + + # the sites that are in the builder but not in the wrapped sites + # should be added with zero value + for s in builder.sites(): + norbs = s.family.norbs + bloch_builder[s] = w_sites.get(s, np.zeros((norbs, norbs))) # val or 0 + for hop, val in w_hoppings.items(): + bloch_builder[hop] = val + fsyst_bloch_superhopping = wraparound(bloch_builder).finalized() + + return fsyst_bloch_superonsite, fsyst_bloch_superhopping + + +def _hopping_distance(site1, site2, direction): + norbs = site1.family.norbs + if norbs != site2.family.norbs: + raise NotImplementedError( + "Only hopppings between sites of equal number of orbitals is implemented." + ) + + if isinstance(site1, SiteArray): + pos1 = site1.positions().transpose() + pos2 = site2.positions().transpose() + d = np.dot(direction, (pos1 - pos2))[:, np.newaxis, np.newaxis] + else: + pos1 = site1.pos + pos2 = site2.pos + d = np.dot(direction, (pos1 - pos2)) + + # return an imaginary number so that the matrix is antisymmetric + # but hermitian + return 1j * d * np.identity(norbs) + + +def wrap_velocity(builder): + """Construct velocity operators with translational symmetries. + + The system has an extra parameter 'direction' that should be a unit + lenght vector in real space, of the dimensions of the site positions. + + The method 'hamiltonian_submatrix' produces the velocity operator matrix + in the 'direction' specified. + + Note that this matrix depends on the value that takes the + Hamiltonian of the original system, the 'builder'. + """ + direction = ("direction",) + dnp = -len(direction) + + @memoize + def bind_velocity_hopping(val): + def f(*args): + a, b, *args = args # first two args are sites + d = _hopping_distance(a, b, *args[dnp:]) + # d is a diagonal of size norbs times a constant + v = val(a, b, *args[:dnp]) if callable(val) else val + v = np.atleast_1d(v) # shape scalars + return v @ d.swapaxes(-1, -2) # transpose last two axes + + params = ("_site0", "_site1") + if callable(val): + params += get_parameters(val)[2:] # cut off site parameters + _set_signature(f, params + direction) + return f + + velocity_builder = Builder(builder.symmetry, vectorize=builder.vectorize) + + for s in builder.sites(): + norbs = s.family.norbs + velocity_builder[s] = np.zeros((norbs, norbs)) + + for hop, val in builder.hopping_value_pairs(): + velocity_builder[hop] = bind_velocity_hopping(val) + + fsyst_velocity = wraparound(velocity_builder).finalized() + + return fsyst_velocity + + +def wrap_distance(builder): + """Construct distance operators with translational symmetries. + + The system has a single parameter 'direction' that should be a unit + lenght vector in real space, of the dimensions of the site positions. + + The method 'hamiltonian_submatrix' produces the distance operator matrix + in the 'direction' specified. + + Note that this matrix is independent of the value that takes the + Hamiltonian of the original system, and does not depends on the + paramters of the original system, the 'builder'. + """ + distance_builder = Builder(builder.symmetry, vectorize=builder.vectorize) + + for s in builder.sites(): + norbs = s.family.norbs + distance_builder[s] = np.zeros((norbs, norbs)) + + for hop, _ in builder.hopping_value_pairs(): + distance_builder[hop] = _hopping_distance + + fsyst_distance = wraparound(distance_builder).finalized() + + return fsyst_distance diff --git a/src/kpm_tools/hamiltonians.py b/src/kpm_tools/hamiltonians.py new file mode 100644 index 0000000..421ca71 --- /dev/null +++ b/src/kpm_tools/hamiltonians.py @@ -0,0 +1,125 @@ +"""Quick reference of topological systems. + +Defined both with open boundary and periodic boundary conditions. +""" +from itertools import product + +import kwant +import numpy as np +from kwant import HoppingKind + + +# neighbors for honeycomb lattice +honeycomb = kwant.lattice.honeycomb(1, norbs=1, name=["a", "b"]) +honeycomb_a, honeycomb_b = honeycomb.sublattices + +first_neighbors = [ + HoppingKind((0, 1), honeycomb_a, honeycomb_b), + HoppingKind((0, 0), honeycomb_a, honeycomb_b), + HoppingKind((-1, 1), honeycomb_a, honeycomb_b), +] + +second_neighbors_a = [ + HoppingKind((0, 1), honeycomb_a, honeycomb_a), + HoppingKind((1, -1), honeycomb_a, honeycomb_a), + HoppingKind((-1, 0), honeycomb_a, honeycomb_a), +] + +second_neighbors_b = [ + HoppingKind((1, 0), honeycomb_b, honeycomb_b), + HoppingKind((0, -1), honeycomb_b, honeycomb_b), + HoppingKind((-1, 1), honeycomb_b, honeycomb_b), +] + + +def haldane_pbc(trans_symm=((1, 0), (0, 1)), e_0=0, t=1, t2=0.5, return_builder=False): + """Build a Haldane system with periodic boundary conditions.""" + periods = np.dot(trans_symm, honeycomb.prim_vecs) + syst = kwant.builder.Builder(kwant.lattice.TranslationalSymmetry(*periods)) + + syst[honeycomb.shape(lambda s: True, (0, 0))] = e_0 + syst[first_neighbors] = t + syst[second_neighbors_a] = 1j * t2 + syst[second_neighbors_b] = 1j * t2 + + if return_builder: + return honeycomb, syst + return honeycomb, kwant.wraparound.wraparound(syst).finalized() + + +def haldane_obc(trans_symm=((1, 0), (0, 1)), e_0=0, t=1, t2=0.5): + """Build a Haldane system with open boundary conditions.""" + trans_symm = np.array(trans_symm, dtype=int) + indices_left = trans_symm[1] - trans_symm[0] + sign = np.sign(indices_left) + + syst = kwant.builder.Builder() + + for i, j in product( + range(0, indices_left[0], sign[0]), range(0, indices_left[1], sign[1]) + ): + tag = trans_symm[0] + np.array([i, j], dtype=int) + site_a = honeycomb_a(*tag) + site_b = honeycomb_b(*tag) + syst[site_a] = e_0 + syst[site_b] = e_0 + + syst[first_neighbors] = t + syst[second_neighbors_a] = 1j * t2 + syst[second_neighbors_b] = 1j * t2 + + return honeycomb, syst.finalized() + + +params_qhe = dict(mu=-4, t=-1, B=np.pi / 7) + + +def qhe_obc(length=50, width=10, init_pos=(0, 0)): + """Build a quantum Hall system with open boundary conditions.""" + + def bar(pos): + x = pos[0] - init_pos[0] + y = pos[1] - init_pos[1] + return (x >= 0 and x < length) and (y >= 0 and y < width) + + # Onsite and hoppings + def onsite(site, t, mu): + return 4 * t - mu + + def hopping_ax(site1, site2, t, B): # noqa: N803 + xt, yt = site1.pos + xs, ys = site2.pos + return -t * np.exp(-0.5j * B * (xt + xs) * (yt - ys)) + + # Building system + lat = kwant.lattice.square(norbs=1) + syst = kwant.builder.Builder() + + syst[lat.shape(bar, init_pos)] = onsite + syst[lat.neighbors()] = hopping_ax + + return syst.finalized() + + +def qhe_pbc(trans_symm=((1, 0), (0, 1)), init_pos=(0, 0), return_builder=False): + """Build a quantum Hall system with periodic boundary conditions.""" + # Building system + lat = kwant.lattice.square(norbs=1) + periods = np.dot(trans_symm, lat.prim_vecs) + syst = kwant.builder.Builder(kwant.lattice.TranslationalSymmetry(*periods)) + + # Onsite and hoppings + def onsite(site, t, mu): + return 4 * t - mu + + def hopping_ax(site1, site2, t, B): # noqa: N803 + xt, yt = site1.pos + xs, ys = site2.pos + return -t * np.exp(-0.5j * B * (xt + xs) * (yt - ys)) + + syst[lat.shape(lambda pos: True, init_pos)] = onsite + syst[lat.neighbors()] = hopping_ax + + if return_builder: + return syst + return kwant.wraparound.wraparound(syst).finalized() From 11f43faf8585d968e6a57f380727a6a81c0b6a10 Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Thu, 23 Nov 2023 11:07:32 +0100 Subject: [PATCH 22/24] Feature/build kwant master (#28) * build kwant master in GH action * build kwant master in nox * split steps to install deps * add cython * remove cython leave g++ * remove commas * remove build if exists * try with ubuntu libraries * rollback and reorder steps * ensure pip uses same env * use poetry shell * roll back using poetry shell * print pip version * fix CFLAG * try with distribution libraries for python deps * skip cflags * do not test kwant installation * isort and check for development version of kwant * remove comments * fix isort --- .github/workflows/tests.yml | 29 ++++++++++++++++------------- noxfile.py | 3 +++ pytest.ini | 2 ++ src/kpm_tools/bloch.py | 5 +++-- src/kpm_tools/common.py | 3 ++- src/kpm_tools/hamiltonians.py | 3 ++- src/kpm_tools/kpm_generator.py | 5 +++-- 7 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 pytest.ini diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a894ace..d36e48d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -38,25 +38,28 @@ jobs: pip install --constraint=.github/workflows/constraints.txt pip pip --version - - name: Install Kwant + - name: Install Poetry run: | - sudo apt-add-repository -s ppa:kwant-project/ppa - sudo apt-get update - sudo apt-get install python3-kwant + pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry + poetry --version - - name: Upgrade pip in virtual environments - shell: python + - name: Install System Dependencies (Ubuntu) + if: startsWith(matrix.os, 'ubuntu') run: | - import os - import pip + sudo apt-get update + sudo apt-get install -y python3-dev python3-setuptools python3-scipy python3-matplotlib python3-pytest python3-sympy g++ build-essential gfortran libopenblas-dev liblapack-dev libmumps-scotch-dev - with open(os.environ["GITHUB_ENV"], mode="a") as io: - print(f"VIRTUALENV_PIP={pip.__version__}", file=io) + - name: Install Python dependencies (Ubuntu) + if: startsWith(matrix.os, 'ubuntu') + run: | + python -m pip install cython tinyarray - - name: Install Poetry + - name: Clone and Install kwant (Ubuntu) + if: startsWith(matrix.os, 'ubuntu') run: | - pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry - poetry --version + git clone https://github.com/kwant-project/kwant.git + cd kwant + git checkout master - name: Install Nox run: | diff --git a/noxfile.py b/noxfile.py index 48b8ab9..004076d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -143,6 +143,9 @@ def build_kwant(session: Session): # Navigate to the cloned directory session.cd(kwant_dir) + # Checkout the master branch + session.run("git", "checkout", "master", external=True) + # Install kwant from source if need_to_build: session.run("python", "setup.py", "build") diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..0923ed1 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +norecursedirs = kwant diff --git a/src/kpm_tools/bloch.py b/src/kpm_tools/bloch.py index 7614e95..52d50f4 100644 --- a/src/kpm_tools/bloch.py +++ b/src/kpm_tools/bloch.py @@ -7,12 +7,13 @@ import inspect import warnings -import kwant import numpy as np import tinyarray as ta +import kwant + -if kwant.__version__ <= "1.4.2": +if kwant.__version__ < "1.5": raise ImportError("This module does not work with versions of Kwant " "<= 1.4.2.") from kwant._common import get_parameters from kwant._common import memoize diff --git a/src/kpm_tools/common.py b/src/kpm_tools/common.py index 32784be..0b6c6bd 100644 --- a/src/kpm_tools/common.py +++ b/src/kpm_tools/common.py @@ -2,12 +2,13 @@ from collections import OrderedDict -import kwant import numpy as np from matplotlib.colors import ListedColormap from matplotlib.pylab import cm from scipy.sparse import diags +import kwant + def identity_operator(x): """Return argument.""" diff --git a/src/kpm_tools/hamiltonians.py b/src/kpm_tools/hamiltonians.py index 421ca71..9bb61d4 100644 --- a/src/kpm_tools/hamiltonians.py +++ b/src/kpm_tools/hamiltonians.py @@ -4,8 +4,9 @@ """ from itertools import product -import kwant import numpy as np + +import kwant from kwant import HoppingKind diff --git a/src/kpm_tools/kpm_generator.py b/src/kpm_tools/kpm_generator.py index de5da43..a89787c 100644 --- a/src/kpm_tools/kpm_generator.py +++ b/src/kpm_tools/kpm_generator.py @@ -6,14 +6,15 @@ from math import ceil from multiprocessing import Pool -import kwant import numpy as np from common import identity_operator -from kwant.operator import _LocalOperator from scipy.sparse import csr_matrix from scipy.sparse import identity from scipy.sparse.linalg import eigsh +import kwant +from kwant.operator import _LocalOperator + DEFAULT_MOMENTS = 100 From 3b9e4c1140a5fb21e0cefbdb1f5c2ff5b44212ca Mon Sep 17 00:00:00 2001 From: Pablo Perez Piskunow Date: Thu, 23 Nov 2023 14:56:54 +0100 Subject: [PATCH 23/24] Feature/add tutorials (#29) * install ipykernell * allow errors in notebooks * update to latest version of kwant-master * add download link * add Bloch tutorial * clean main dependencies * fix import * skip line too long * add nbsphinx as docs requirement * install nbsphinx when building docs * exclude patterns * add pandoc * add pandoc as dev dependency and as docs requirements * add pandoc as global dep * selectively install pandoc as system dep * selectively install kwant --- .github/workflows/tests.yml | 11 +- docs/conf.py | 25 + docs/requirements.txt | 2 + docs/tutorials.md | 2 +- docs/tutorials/tutorial_bloch.ipynb | 1107 +++++++++++++++++++ noxfile.py | 4 +- poetry.lock | 1562 +++++++++++++++++++++++++-- pyproject.toml | 13 +- src/kpm_tools/bloch.py | 2 +- 9 files changed, 2625 insertions(+), 103 deletions(-) create mode 100644 docs/tutorials/tutorial_bloch.ipynb diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d36e48d..6f1ace1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -44,18 +44,18 @@ jobs: poetry --version - name: Install System Dependencies (Ubuntu) - if: startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'ubuntu') && (matrix.session 'tests' | matrix.session == 'pre-commit') run: | sudo apt-get update sudo apt-get install -y python3-dev python3-setuptools python3-scipy python3-matplotlib python3-pytest python3-sympy g++ build-essential gfortran libopenblas-dev liblapack-dev libmumps-scotch-dev - name: Install Python dependencies (Ubuntu) - if: startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'ubuntu') && (matrix.session 'tests' | matrix.session == 'pre-commit') run: | python -m pip install cython tinyarray - name: Clone and Install kwant (Ubuntu) - if: startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'ubuntu') && (matrix.session 'tests' | matrix.session == 'pre-commit') run: | git clone https://github.com/kwant-project/kwant.git cd kwant @@ -91,6 +91,11 @@ jobs: restore-keys: | ${{ steps.pre-commit-cache.outputs.result }}- + # Add this step to install Pandoc + - name: Install pandoc + if: matrix.session == 'docs-build' + run: sudo apt-get install pandoc + - name: Run Nox run: | nox --python=${{ matrix.python }} diff --git a/docs/conf.py b/docs/conf.py index 302747b..8fd1051 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -9,5 +9,30 @@ "myst_parser", "nbsphinx", ] +nbsphinx_allow_errors = True autodoc_typehints = "description" html_theme = "furo" +exclude_patterns = ["_build", "**.ipynb_checkpoints"] +nbsphinx_prolog = r""" +.. raw:: html + +
+

Tip

+

Run this Jupyter Notebook locally: + + Download Notebook + +

+
+ + + + + """ # noqa: B950 diff --git a/docs/requirements.txt b/docs/requirements.txt index 0f00919..abe019a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,5 @@ furo==2023.9.10 sphinx==7.2.6 sphinx-click==5.1.0 myst_parser==2.0.0 +nbsphinx==0.9.3 +pandoc==2.3 diff --git a/docs/tutorials.md b/docs/tutorials.md index 57a349e..37ceb84 100644 --- a/docs/tutorials.md +++ b/docs/tutorials.md @@ -5,5 +5,5 @@ maxdepth: 1 --- -tutorial_01_test +tutorials/tutorial_bloch ``` diff --git a/docs/tutorials/tutorial_bloch.ipynb b/docs/tutorials/tutorial_bloch.ipynb new file mode 100644 index 0000000..8e8da06 --- /dev/null +++ b/docs/tutorials/tutorial_bloch.ipynb @@ -0,0 +1,1107 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "35713c19-d300-4237-9657-24108082f791", + "metadata": {}, + "source": [ + "# Tutorial `kpm_tools.bloch`\n", + "\n", + "When computing the Kubo-Bastin conductivity with `kwant.kpm.conductivity`, the boundary effects are important. Actually, for any open boundary system, the (overall) Hall conductivity will be zero within all gaps, topological and trivial ones.\n", + "\n", + "A workaround is to compute the conductivity at the bulk of the sample, to avoid boundary effects. This implies extra care on defining the KPM vectors, and the need for a larger system such that boundaries are far enough from the 'bulk' where the conductivity is computed.\n", + "\n", + "To address these issues, we can define a system with periodic boundary conditions, in which case we also need periodic velocity operators. The exact shape of the periodic operators depends on the details of the system and on the edges that are wrapped around with `kwant.wraparound`.\n", + "The module `kpm_tools.bloch` takes care of correctly defining periodic velocity operators for any wrapped around system.\n", + "\n", + "Here we will demonstrate the `bloch` module using a system with periodic boundary conditions to get the periodic velocity operators.\n", + "If we would use the non-periodic velocity operators the results would be inconsistent.\n", + "\n", + "This is evident when comparing the Kubo-Bastin longitudinal and Hall conductivity for a small topological system." + ] + }, + { + "cell_type": "markdown", + "id": "8f4c2028-ea1b-42aa-aef4-6e2e0f72ff9a", + "metadata": {}, + "source": [ + "### First some basic imports and plotting functions" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7927d616-b5eb-4495-952d-e4741a43d829", + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + " var py_version = '3.3.1'.replace('rc', '-rc.').replace('.dev', '-dev.');\n", + " var reloading = false;\n", + " var Bokeh = root.Bokeh;\n", + "\n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks;\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + " if (js_modules == null) js_modules = [];\n", + " if (js_exports == null) js_exports = {};\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + "\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " if (!reloading) {\n", + " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " }\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + " window._bokeh_on_load = on_load\n", + "\n", + " function on_error() {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " var skip = [];\n", + " if (window.requirejs) {\n", + " window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n", + " require([\"jspanel\"], function(jsPanel) {\n", + "\twindow.jsPanel = jsPanel\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-modal\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-tooltip\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-hint\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-layout\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-contextmenu\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-dock\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"gridstack\"], function(GridStack) {\n", + "\twindow.GridStack = GridStack\n", + "\ton_load()\n", + " })\n", + " require([\"notyf\"], function() {\n", + "\ton_load()\n", + " })\n", + " root._bokeh_is_loading = css_urls.length + 9;\n", + " } else {\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", + " }\n", + "\n", + " var existing_stylesheets = []\n", + " var links = document.getElementsByTagName('link')\n", + " for (var i = 0; i < links.length; i++) {\n", + " var link = links[i]\n", + " if (link.href != null) {\n", + "\texisting_stylesheets.push(link.href)\n", + " }\n", + " }\n", + " for (var i = 0; i < css_urls.length; i++) {\n", + " var url = css_urls[i];\n", + " if (existing_stylesheets.indexOf(url) !== -1) {\n", + "\ton_load()\n", + "\tcontinue;\n", + " }\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n", + " var urls = ['https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n", + " for (var i = 0; i < urls.length; i++) {\n", + " skip.push(urls[i])\n", + " }\n", + " } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n", + " var urls = ['https://cdn.holoviz.org/panel/1.3.2/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n", + " for (var i = 0; i < urls.length; i++) {\n", + " skip.push(urls[i])\n", + " }\n", + " } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n", + " var urls = ['https://cdn.holoviz.org/panel/1.3.2/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n", + " for (var i = 0; i < urls.length; i++) {\n", + " skip.push(urls[i])\n", + " }\n", + " } var existing_scripts = []\n", + " var scripts = document.getElementsByTagName('script')\n", + " for (var i = 0; i < scripts.length; i++) {\n", + " var script = scripts[i]\n", + " if (script.src != null) {\n", + "\texisting_scripts.push(script.src)\n", + " }\n", + " }\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " for (var i = 0; i < js_modules.length; i++) {\n", + " var url = js_modules[i];\n", + " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " element.type = \"module\";\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " for (const name in js_exports) {\n", + " var url = js_exports[name];\n", + " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.type = \"module\";\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " element.textContent = `\n", + " import ${name} from \"${url}\"\n", + " window.${name} = ${name}\n", + " window._bokeh_on_load()\n", + " `\n", + " document.head.appendChild(element);\n", + " }\n", + " if (!js_urls.length && !js_modules.length) {\n", + " on_load()\n", + " }\n", + " };\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.1.min.js\", \"https://cdn.holoviz.org/panel/1.3.2/dist/panel.min.js\"];\n", + " var js_modules = [];\n", + " var js_exports = {};\n", + " var css_urls = [];\n", + " var inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {} // ensure no trailing comma for IE\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + "\ttry {\n", + " inline_js[i].call(root, root.Bokeh);\n", + "\t} catch(e) {\n", + "\t if (!reloading) {\n", + "\t throw e;\n", + "\t }\n", + "\t}\n", + " }\n", + " // Cache old bokeh versions\n", + " if (Bokeh != undefined && !reloading) {\n", + "\tvar NewBokeh = root.Bokeh;\n", + "\tif (Bokeh.versions === undefined) {\n", + "\t Bokeh.versions = new Map();\n", + "\t}\n", + "\tif (NewBokeh.version !== Bokeh.version) {\n", + "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", + "\t}\n", + "\troot.Bokeh = Bokeh;\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " }\n", + " root._bokeh_is_initializing = false\n", + " }\n", + "\n", + " function load_or_wait() {\n", + " // Implement a backoff loop that tries to ensure we do not load multiple\n", + " // versions of Bokeh and its dependencies at the same time.\n", + " // In recent versions we use the root._bokeh_is_initializing flag\n", + " // to determine whether there is an ongoing attempt to initialize\n", + " // bokeh, however for backward compatibility we also try to ensure\n", + " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", + " // before older versions are fully initialized.\n", + " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", + " root._bokeh_is_initializing = false;\n", + " root._bokeh_onload_callbacks = undefined;\n", + " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", + " load_or_wait();\n", + " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", + " setTimeout(load_or_wait, 100);\n", + " } else {\n", + " root._bokeh_is_initializing = true\n", + " root._bokeh_onload_callbacks = []\n", + " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", + " if (!reloading && !bokeh_loaded) {\n", + "\troot.Bokeh = undefined;\n", + " }\n", + " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", + "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + "\trun_inline_js();\n", + " });\n", + " }\n", + " }\n", + " // Give older versions of the autoload script a head-start to ensure\n", + " // they initialize before we start loading newer version.\n", + " setTimeout(load_or_wait, 100)\n", + "}(window));" + ], + "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.3.1'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = false;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.3.2/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.2/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.2/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.1.min.js\", \"https://cdn.holoviz.org/panel/1.3.2/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", + " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", + "}\n", + "\n", + "\n", + " function JupyterCommManager() {\n", + " }\n", + "\n", + " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", + " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " comm_manager.register_target(comm_id, function(comm) {\n", + " comm.on_msg(msg_handler);\n", + " });\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", + " comm.onMsg = msg_handler;\n", + " });\n", + " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", + " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", + " var messages = comm.messages[Symbol.asyncIterator]();\n", + " function processIteratorResult(result) {\n", + " var message = result.value;\n", + " console.log(message)\n", + " var content = {data: message.data, comm_id};\n", + " var buffers = []\n", + " for (var buffer of message.buffers || []) {\n", + " buffers.push(new DataView(buffer))\n", + " }\n", + " var metadata = message.metadata || {};\n", + " var msg = {content, buffers, metadata}\n", + " msg_handler(msg);\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " return messages.next().then(processIteratorResult);\n", + " })\n", + " }\n", + " }\n", + "\n", + " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", + " if (comm_id in window.PyViz.comms) {\n", + " return window.PyViz.comms[comm_id];\n", + " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", + " if (msg_handler) {\n", + " comm.on_msg(msg_handler);\n", + " }\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", + " comm.open();\n", + " if (msg_handler) {\n", + " comm.onMsg = msg_handler;\n", + " }\n", + " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", + " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", + " comm_promise.then((comm) => {\n", + " window.PyViz.comms[comm_id] = comm;\n", + " if (msg_handler) {\n", + " var messages = comm.messages[Symbol.asyncIterator]();\n", + " function processIteratorResult(result) {\n", + " var message = result.value;\n", + " var content = {data: message.data};\n", + " var metadata = message.metadata || {comm_id};\n", + " var msg = {content, metadata}\n", + " msg_handler(msg);\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " }) \n", + " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", + " return comm_promise.then((comm) => {\n", + " comm.send(data, metadata, buffers, disposeOnDone);\n", + " });\n", + " };\n", + " var comm = {\n", + " send: sendClosure\n", + " };\n", + " }\n", + " window.PyViz.comms[comm_id] = comm;\n", + " return comm;\n", + " }\n", + " window.PyViz.comm_manager = new JupyterCommManager();\n", + " \n", + "\n", + "\n", + "var JS_MIME_TYPE = 'application/javascript';\n", + "var HTML_MIME_TYPE = 'text/html';\n", + "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", + "var CLASS_NAME = 'output';\n", + "\n", + "/**\n", + " * Render data to the DOM node\n", + " */\n", + "function render(props, node) {\n", + " var div = document.createElement(\"div\");\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(div);\n", + " node.appendChild(script);\n", + "}\n", + "\n", + "/**\n", + " * Handle when a new output is added\n", + " */\n", + "function handle_add_output(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + " if (id !== undefined) {\n", + " var nchildren = toinsert.length;\n", + " var html_node = toinsert[nchildren-1].children[0];\n", + " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var scripts = [];\n", + " var nodelist = html_node.querySelectorAll(\"script\");\n", + " for (var i in nodelist) {\n", + " if (nodelist.hasOwnProperty(i)) {\n", + " scripts.push(nodelist[i])\n", + " }\n", + " }\n", + "\n", + " scripts.forEach( function (oldScript) {\n", + " var newScript = document.createElement(\"script\");\n", + " var attrs = [];\n", + " var nodemap = oldScript.attributes;\n", + " for (var j in nodemap) {\n", + " if (nodemap.hasOwnProperty(j)) {\n", + " attrs.push(nodemap[j])\n", + " }\n", + " }\n", + " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", + " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", + " oldScript.parentNode.replaceChild(newScript, oldScript);\n", + " });\n", + " if (JS_MIME_TYPE in output.data) {\n", + " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", + " }\n", + " output_area._hv_plot_id = id;\n", + " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", + " window.PyViz.plot_index[id] = Bokeh.index[id];\n", + " } else {\n", + " window.PyViz.plot_index[id] = null;\n", + " }\n", + " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + "function handle_clear_output(event, handle) {\n", + " var id = handle.cell.output_area._hv_plot_id;\n", + " var server_id = handle.cell.output_area._bokeh_server_id;\n", + " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", + " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", + " if (server_id !== null) {\n", + " comm.send({event_type: 'server_delete', 'id': server_id});\n", + " return;\n", + " } else if (comm !== null) {\n", + " comm.send({event_type: 'delete', 'id': id});\n", + " }\n", + " delete PyViz.plot_index[id];\n", + " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", + " var doc = window.Bokeh.index[id].model.document\n", + " doc.clear();\n", + " const i = window.Bokeh.documents.indexOf(doc);\n", + " if (i > -1) {\n", + " window.Bokeh.documents.splice(i, 1);\n", + " }\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle kernel restart event\n", + " */\n", + "function handle_kernel_cleanup(event, handle) {\n", + " delete PyViz.comms[\"hv-extension-comm\"];\n", + " window.PyViz.plot_index = {}\n", + "}\n", + "\n", + "/**\n", + " * Handle update_display_data messages\n", + " */\n", + "function handle_update_output(event, handle) {\n", + " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", + " handle_add_output(event, handle)\n", + "}\n", + "\n", + "function register_renderer(events, OutputArea) {\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[0]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " events.on('output_added.OutputArea', handle_add_output);\n", + " events.on('output_updated.OutputArea', handle_update_output);\n", + " events.on('clear_output.CodeCell', handle_clear_output);\n", + " events.on('delete.Cell', handle_clear_output);\n", + " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", + "\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " safe: true,\n", + " index: 0\n", + " });\n", + "}\n", + "\n", + "if (window.Jupyter !== undefined) {\n", + " try {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " } catch(err) {\n", + " }\n", + "}\n" + ], + "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ] + }, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1002" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import kwant\n", + "from kpm_tools import bloch\n", + "from kpm_tools.bloch import wrap_velocity\n", + "from kpm_tools.hamiltonians import haldane_pbc\n", + "\n", + "# plotting\n", + "import matplotlib.pyplot, matplotlib.backends\n", + "import matplotlib.pyplot as plt\n", + "import holoviews as hv\n", + "hv.notebook_extension()\n", + "\n", + "\n", + "def plot_dos_and_curves(dos, labels_to_data, ylabel=\"DoS [a.u.]\"):\n", + " plt.figure(figsize=(5,4))\n", + " plt.fill_between(dos[0], dos[1], label=\"DoS [a.u.]\",\n", + " alpha=0.5, color='gray')\n", + " for label, (x, y) in labels_to_data:\n", + " plt.plot(x, y, label=label, linewidth=2)\n", + " plt.legend(framealpha=0.5)\n", + " plt.xlabel(\"energy [t]\")\n", + " plt.ylabel(ylabel)\n", + "\n", + " plt.ylim(-2, 4)\n" + ] + }, + { + "cell_type": "markdown", + "id": "4c825b40-6858-415d-b71c-753c016aef3d", + "metadata": {}, + "source": [ + "## Define a periodic Haldane topological system" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f39e1dfe-0e99-4b4f-8019-48c2d4bc52c8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "lx = 10\n", + "ly = 10\n", + "trans_symm = [(lx, 0), (0, ly)]\n", + "lat, syst = haldane_pbc(trans_symm, return_builder=True)\n", + "\n", + "\n", + "fsyst = kwant.wraparound.wraparound(syst).finalized()\n", + "\n", + "norbs = fsyst.sites[0].family.norbs\n", + "bounds = (-3.1, 3.1)\n", + "\n", + "\n", + "params = dict(zip(fsyst._momentum_names, (0, 0)))\n", + "\n", + "\n", + "kwant.plot(fsyst);\n" + ] + }, + { + "cell_type": "markdown", + "id": "7c340197-a9e9-495a-9d35-c1fc2d3fa9ce", + "metadata": {}, + "source": [ + "### Define periodic velocity operators on the periodic system" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "forward-island", + "metadata": {}, + "outputs": [], + "source": [ + "velocity_builder = wrap_velocity(syst)\n", + "vx = velocity_builder.hamiltonian_submatrix(params=dict(k_x=0, k_y=0, direction=[1, 0]), sparse=True)\n", + "vy = velocity_builder.hamiltonian_submatrix(params=dict(k_x=0, k_y=0, direction=[0, 1]), sparse=True)\n" + ] + }, + { + "cell_type": "markdown", + "id": "binding-belly", + "metadata": {}, + "source": [ + "## Use periodic velocity operators\n", + "(in a periodic system)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "hazardous-invalid", + "metadata": {}, + "outputs": [], + "source": [ + "s_factory = kwant.kpm.LocalVectors(fsyst, where=None)\n", + "vectors = list(s_factory)\n", + "num_vectors = len(vectors)\n", + "\n", + "# number of sites per vector\n", + "norm_v = np.linalg.norm(vectors[0]) ** 2\n", + "\n", + "cond_xx = kwant.kpm.conductivity(\n", + " fsyst, params=params,\n", + " bounds=bounds,\n", + " alpha=vx,\n", + " beta=vx,\n", + " mean=False,\n", + " num_vectors=num_vectors,\n", + " vector_factory=vectors)\n", + "\n", + "cond_xy = kwant.kpm.conductivity(\n", + " fsyst, params=params,\n", + " alpha=vx,\n", + " beta=vy,\n", + " mean=False,\n", + " num_vectors=num_vectors,\n", + " vector_factory=vectors\n", + ")\n", + "\n", + "energies = cond_xx.energies\n", + "cond_array_xx = np.array([cond_xx(e, temperature=0.0) for e in energies]).real\n", + "cond_array_xy = np.array([cond_xy(e, temperature=0.0) for e in energies]).real\n", + "\n", + "# area of the unit cell per site\n", + "area_per_site = np.abs(np.cross(*lat.prim_vecs)) / len(lat.sublattices)\n", + "cond_array_xx /= area_per_site\n", + "cond_array_xy /= area_per_site\n", + "\n", + "cond_array_xx = cond_array_xx / norm_v\n", + "cond_array_xy = cond_array_xy / norm_v\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "intensive-benchmark", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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8MEHH2DGjBl4/vnn8fLLL+PMM88EoAjt0KFDe2ycAFBaWgqHwwG3242amhrTY5SXl2P27Nl49dVXtbG8/vrrGDBgAE4//fS4/RMd89JLL8XSpUtxySWXAABefvll1NbWYtasWQnHf+ONN+Kiiy7Cww8/DAAYP348fvzjH2PdunX44Q9/mNbvgiCI9CDxzARvE9B5INejsMTpp5+Op59+WrdtzZo1+MlPfqK93r59O+68806sWbMGLS0tmsW5d+/ejMRz27ZtCIVCmpiw1NfXIxKJYObMmdo2u92OadOmYdu2bbp9J06cqHs9aNAgNDU1ob6+HuFwGNOnT9feq6iowNixY3tsnOlw2WWX4ZprrsEf//hHOJ1OvPLKK/iv//ov8Lx1x84111yDqVOnYv/+/RgyZAiWLVuG+fPng+M40/0PHTqETz75BKtX6x+mCgsLE36GIIieg8QzE4qq+8x5CwsLMWbMGN22hoYG3es5c+Zg+PDheO6557T43YQJExAOhzMapsvlyuhzRowZrRzHpeVK5nkesizrtkUiEe3nnhrnnDlzIMsyVqxYgalTp+Ljjz/Go48+mtYxJk+ejEmTJuGll17COeecg61bt2LFihUJ91+3bh0kScKkSZPitk+ZMkV7PXPmTDzyyCOYPn06FixYgAkTJmDWrFm4/fbb8e677wIAli9fjhUrVuDZZ59Na8wEcSRD4pkJabpO85nDhw+jrq4Ozz33HE499VQAwCeffNKtYx511FFwuVz44IMPcPXVV+veGz16NBwOBz799FMMHz4cgCJoa9eutbwWcvTo0bDb7VizZg1qa2sBAG1tbfj2229x2mmnaftVVVWhsbFRe+3xeLBr1y5L41RxOBxxbm4jBQUFuOiii/DKK69gx44dGDt2LE444YSE+yc65tVXX43HHnsM+/fvx1lnnRUXX2VRHyJ8Ph+Ki4sBAJs2bcJHH32E++67T9vvjjvuwAMPPIBTTz0VPM/jl7/8JaLRKL7++msAQDQaxT333IN//vOfSb8jQRB6SDyPcMrLy1FZWYlnn30WgwYNwt69e3H77bd365gFBQX41a9+hdtuuw0OhwMzZ85Ec3Mztm7digULFuC6667DrbfeioqKCtTW1uKhhx6C3+/HggULLB2/qKgICxYswK233orKykpUV1fjN7/5TZyb9IwzzsCyZcswZ84clJWV4c4774QgCJbHCSgZu2vWrMHu3btRVFSUcNnJZZddhvPPPx9bt27VucTNMDsmz/O49NJLccstt+C5557DSy+9lPQY06dPh8vlwq233orf/OY3qK+vx8KFC7Fw4UKcdNJJ2n7nnXcefvOb32DFihVYuXIlAMBms2HYsGHYvXs3/vWvf+F73/seBg0alPR8BEHoIfE8wuF5Hn/9619x4403YsKECRg7diyeeOKJpIkqVrjjjjtgs9lw55134sCBAxg0aBCuvfZaAMADDzwASZJw+eWXo7OzE1OmTMG7776L8vJyy8f/3e9+B6/Xizlz5qC4uBg333wzOjo6dPssXrwYu3btwvnnn4/S0lLce++9Ossz1TgB4JZbbsG8efMwfvx4BAKBuM+rnHHGGaioqEBdXR0uvfTSpGM3O+aIESNQWlqKiy++GCtWrMAFF1yQ9BhVVVX4+9//jptvvhkTJ05EbW0trr/+eixatEi339q1a9Ha2orhw4fr3ODTpk3Dhx9+iKeffhqfffZZ0nMRBBEPJxuDQkcgHo8HpaWl6OjoiEvvj0QiaG5uRlVVVVpVZQgiE84880wce+yxeOKJJ7p9rP379+O73/0u3nrrLVx88cV46aWXtASwV199FTfccAPuueceLFy4sNvnIvTQfaNvkkwLjNA6T4LIA9ra2vDmm29i1apVPSJmgUAAl1xyCZ588kmMHDkSixcvxr333qu9f/TRR6OyshI/+9nPun0ugjgSIbctQeQBkydPRltbGx588MG0l9yY4XK5dO7YSy65RFtDCgB//OMf8bvf/Q42G90CCCITaOYQRB6we/furJynvr4e3/3ud3HOOedg7ty5WTknQfRHSDwJ4ghi9OjRqKury/UwCKLPQzFPgiAIgkgTEk+CIAiCSBMST4IgCIJIExJPgiAIgkgTEk+LUC0JgiCsQveL/g+JZwrUeqmpioMTBEGoqB2J2FrKRP+ClqqkgOd5OBwOeDweCIJAvRIJgkiILMsIh8PweDxwu91p9XQl+hYkningOA5lZWVobm5GS0tLrodDEEQfwO12o7S0NNfDIHoREk8L2Gw21NTUIBqN5nooBEHkOYIgkMV5BEDiaRGO46g7AkEQBAGgjycM7d69GwsWLMDIkSPhcrkwevRo3HXXXVqwniAIgiB6gz5teX7zzTeQJAnPPPMMxowZgy1btuCaa66Bz+fDww8/nOvhEQRBEP2UftcM+3e/+x2efvpp7Ny50/Jn0mmAShAEQfRP0tGCPm15mtHR0YGKioqk+4RCIYRCId1nAOUXRxAEQRyZqBpgyaaU+xHbt2+XS0pK5GeffTbpfnfddZcMgP7RP/pH/+gf/Yv7t2/fvpR6k5du29tvvx0PPvhg0n22bduGcePGaa/379+P0047DbNmzcKf//znpJ81Wp6SJKG1tRWVlZU9WgTB4/Fg2LBh2LdvX791B9N37B8cCd8RODK+J33HzJFlGZ2dnRg8eHDK5UZ5KZ7Nzc04fPhw0n1GjRoFh8MBADhw4ABmzZqFk046CcuWLcubNVZHQiyVvmP/4Ej4jsCR8T3pO2aHvIx5VlVVoaqqytK++/fvx+mnn44TTzwRS5cuzRvhJAiCIPoveSmeVtm/fz9mzZqF4cOH4+GHH0Zzc7P2Xk1NTQ5HRhAEQfRn+rR4vv/++9ixYwd27NiBoUOH6t7LB2+00+nEXXfdBafTmeuh9Br0HfsHR8J3BI6M70nfMTvkZcyTIAiCIPIZChASBEEQRJqQeBIEQRBEmpB4EgRBEESakHgSBEEQRJqQeGaJ73//+6itrUVBQQEGDRqEyy+/HAcOHMj1sHqMI6U93P3334+TTz4ZbrcbZWVluR5Oj/GHP/wBI0aMQEFBAaZPn44vvvgi10PqUT766CPMmTMHgwcPBsdxeOutt3I9pB5nyZIlmDp1KoqLi1FdXY0LLrgAdXV1uR5Wj/L0009j4sSJKCkpQUlJCWbMmIF33nknJ2Mh8cwSp59+Ov7+97+jrq4Ob7zxBurr6/GDH/wg18PqMdj2cFu3bsWjjz6KP/3pT/j1r3+d66H1KOFwGJdccgmuu+66XA+lx/jb3/6GRYsW4a677sL69esxadIknHvuuWhqasr10HoMn8+HSZMm4Q9/+EOuh9JrrF69GgsXLsTnn3+O999/H5FIBOeccw58Pl+uh9ZjDB06FA888ADWrVuHL7/8EmeccQbmzp2LrVu3Zn8w3S3GTmTG8uXLZY7j5HA4nOuh9BoPPfSQPHLkyFwPo1dYunSpXFpamuth9AjTpk2TFy5cqL0WRVEePHiwvGTJkhyOqvcAIL/55pu5Hkav09TUJAOQV69eneuh9Crl5eXyn//856yflyzPHNDa2opXXnkFJ598Mux2e66H02tYaQ9H5JZwOIx169bhrLPO0rbxPI+zzjoL//nPf3I4MqK7qK0W++scFEURf/3rX+Hz+TBjxoysn5/EM4v86le/QmFhISorK7F3714sX74810PqNXbs2IEnn3wSP/vZz3I9FCIJLS0tEEURAwcO1G0fOHAgDh48mKNREd1FkiTcdNNNmDlzJiZMmJDr4fQomzdvRlFREZxOJ6699lq8+eabGD9+fNbHQeLZDW6//XZwHJf03zfffKPtf+utt+Krr77Ce++9B0EQcMUVV+RFGcFkpPsdAaXm8HnnnYdLLrkE11xzTY5Gbp1MviNB5DMLFy7Eli1b8Ne//jXXQ+lxxo4diw0bNmDNmjW47rrrMG/ePHz99ddZHweV5+sG6bZOY2loaMCwYcPw2Wef5cTlYJX+0h4uGZn8HZctW4abbroJ7e3tvTy63iUcDsPtduP111/HBRdcoG2fN28e2tvb+6V3hOM4vPnmm7rv25+4/vrrsXz5cnz00UcYOXJkrofT65x11lkYPXo0nnnmmayet08Xhs816bROMyJJEgDomnLnI0dCe7ju/B37Og6HAyeeeCI++OADTUwkScIHH3yA66+/PreDI9JClmXccMMNePPNN7Fq1aojQjgB5XrNxX2UxDMLrFmzBmvXrsUpp5yC8vJy1NfX44477sDo0aPz2upMhyOlPdzevXvR2tqKvXv3QhRFbNiwAQAwZswYFBUV5XZwGbJo0SLMmzcPU6ZMwbRp0/DYY4/B5/PhyiuvzPXQegyv14sdO3Zor3ft2oUNGzagoqICtbW1ORxZz7Fw4UK8+uqrWL58OYqLi7WYdWlpKVwuV45H1zMsXrwYs2fPRm1tLTo7O/Hqq69i1apVePfdd7M/mKzn9x6BbNq0ST799NPliooK2el0yiNGjJCvvfZauaGhIddD6zGWLl0qAzD915+YN2+e6Xf88MMPcz20bvHkk0/KtbW1ssPhkKdNmyZ//vnnuR5Sj/Lhhx+a/t3mzZuX66H1GInm39KlS3M9tB7jqquukocPHy47HA65qqpKPvPMM+X33nsvJ2OhmCdBEARBpEnfCEoRBEEQRB5B4kkQBEEQaULiSRAEQRBpQuJJEARBEGlC4kkQBEEQaULiSRAEQRBpQuJJEARBEGlC4kkQBEEQaULiSRBEr6B2pCkrK0u574gRI7T9+3qxfeLIgMSTIIheY+nSpfj222+117/97W9x/PHHx+23du1avPHGG1kcGUF0DxJPgjiCiUQivXr8srIyVFdXp9yvqqoKFRUVvToWguhJSDwJIg+QJAlLlizByJEj4XK5MGnSJLz++uva+6tWrQLHcfjggw8wZcoUuN1unHzyyairq9MdZ/ny5TjhhBNQUFCAUaNG4e6770Y0GtXe5zgOTz/9NL7//e+jsLAQ999/PwDgvvvuQ3V1NYqLi3H11Vfj9ttv1yzEjz76CHa7XevSoXLTTTfh1FNPtfwdly1bhrvvvhsbN27UXLTLli1L8zdFEHlCTsrREwSh47777pPHjRsnr1y5Uq6vr5eXLl0qO51OedWqVbIsx7qCTJ8+XV61apW8detW+dRTT5VPPvlk7RgfffSRXFJSIi9btkyur6+X33vvPXnEiBHyb3/7W20fAHJ1dbX8wgsvyPX19fKePXvkl19+WS4oKJBfeOEFua6uTr777rvlkpISedKkSdrnjj76aPmhhx7SXofDYXnAgAHyCy+8kPA7AZDffPNN7bXf75dvvvlm+dhjj5UbGxvlxsZG2e/3a++r37Gtra0bv0mCyA4kngSRY4LBoOx2u+XPPvtMt33BggXyj3/8Y1mWY8Lyf//3f9r7K1askAHIgUBAlmVZPvPMM+X//u//1h3jL3/5izxo0CDtNQD5pptu0u0zffp0eeHChbptM2fO1Inngw8+KB9zzDHa6zfeeEMuKiqSvV5vwu9lFE9ZluW77rpLd1wWEk+iL0FuW4LIMTt27IDf78fZZ5+NoqIi7d9LL72E+vp63b4TJ07Ufh40aBAAoKmpCQCwceNG3HPPPbpjXHPNNWhsbITf79c+N2XKFN0x6+rqMG3aNN024+v58+djx44d+PzzzwEoLtgf/vCHKCws7Oa3J4i+iS3XAyCIIx2v1wsAWLFiBYYMGaJ7z+l06l7b7XbtZ47jACjxUvU4d999Ny666KK4cxQUFGg/ZyJ41dXVmDNnDpYuXYqRI0finXfewapVq9I+DkH0F0g8CSLHjB8/Hk6nE3v37sVpp52W8XFOOOEE1NXVYcyYMWl9buzYsVi7di2uuOIKbdvatWvj9rv66qvx4x//GEOHDsXo0aMxc+bMtMfocDggimLanyOIfIPEkyByTHFxMW655Rb88pe/hCRJOOWUU9DR0YFPP/0UJSUlmDdvnqXj3HnnnTj//PNRW1uLH/zgB+B5Hhs3bsSWLVtw3333JfzcDTfcgGuuuQZTpkzBySefjL/97W/YtGkTRo0apdvv3HPPRUlJCe677z7cc889GX3XESNGYNeuXdiwYQOGDh2K4uLiOOuaIPoCFPMkiDzg3nvvxR133IElS5bgmGOOwXnnnYcVK1Zg5MiRlo9x7rnn4p///Cfee+89TJ06FSeddBIeffRRDB8+POnnLrvsMixevBi33HILTjjhBOzatQvz58/XuXoBgOd5zJ8/H6Io6qzUdLj44otx3nnn4fTTT0dVVRVee+21jI5DELmGk2VZzvUgCILIL84++2zU1NTgL3/5i277ggUL0NzcjLfffjvlMTiOw5tvvokLLrjA0jlXrVqF008/HW1tbZZK+hFELiG3LUEc4fj9fvzpT3/CueeeC0EQ8Nprr+H//u//8P7772v7dHR0YPPmzXj11VctCafKj3/8Y1RWVqKhoSHpfsceeyx27tyZ8XcgiGxD4kkQRzgcx+Ff//oX7r//fgSDQYwdOxZvvPEGzjrrLG2fuXPn4osvvsC1116Ls88+29Jxt2/fDgAQBCHlvv/617+0UoElJSUZfAuCyC7ktiUIgiCINKGEIYIgCIJIExJPgiAIgkgTEk+CIAiCSBMST4IgCIJIExJPgiAIgkgTEk+CIAiCSBMST4IgCIJIExJPgiAIgkiT/w/EZhky2cUsXQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "spectrum = kwant.kpm.SpectralDensity(fsyst, params=params)\n", + "\n", + "plot_dos_and_curves(\n", + " (spectrum.energies, spectrum.densities.real / (lx * ly / 3)),\n", + " [\n", + " (r'Longitudinal conductivity $\\sigma_{xx}/L_x$',\n", + " (spectrum.energies, cond_array_xx.mean(1) / (lx))),\n", + " (r'Hall conductivity $\\sigma_{xy}$',\n", + " (spectrum.energies, cond_array_xy.mean(1)))],\n", + " ylabel=r'$\\sigma [e^2/h]$'\n", + ");\n" + ] + }, + { + "cell_type": "markdown", + "id": "a3a5d7c4-8b9d-46b9-8594-d2b9af1d189c", + "metadata": {}, + "source": [ + "## Use open boundary velocity operators\n", + "(in a periodic system..! don't expect correct results)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2ec4d5a7-7014-4ae2-b6c9-3161f36ba643", + "metadata": {}, + "outputs": [], + "source": [ + "s_factory = kwant.kpm.LocalVectors(fsyst, where=None)\n", + "vectors = list(s_factory)\n", + "num_vectors = len(vectors)\n", + "\n", + "# number of sites per vector\n", + "norm_v = np.linalg.norm(vectors[0]) ** 2\n", + "\n", + "cond_xx = kwant.kpm.conductivity(\n", + " fsyst, params=params,\n", + " bounds=bounds,\n", + " alpha='x',\n", + " beta='x',\n", + " mean=False,\n", + " num_vectors=num_vectors,\n", + " vector_factory=vectors)\n", + "\n", + "cond_xy = kwant.kpm.conductivity(\n", + " fsyst, params=params,\n", + " alpha='x',\n", + " beta='y',\n", + " mean=False, \n", + " num_vectors=num_vectors,\n", + " vector_factory=vectors\n", + ")\n", + "\n", + "energies = cond_xx.energies\n", + "cond_array_xx = np.array([cond_xx(e, temperature=0.0) for e in energies]).real\n", + "cond_array_xy = np.array([cond_xy(e, temperature=0.0) for e in energies]).real\n", + "\n", + "# area of the unit cell per site\n", + "area_per_site = np.abs(np.cross(*lat.prim_vecs)) / len(lat.sublattices)\n", + "cond_array_xx /= area_per_site\n", + "cond_array_xy /= area_per_site\n", + "\n", + "cond_array_xx = cond_array_xx / norm_v\n", + "cond_array_xy = cond_array_xy / norm_v" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2d3e0895-cb28-488b-ab37-cf1a1eb2ee3d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "spectrum = kwant.kpm.SpectralDensity(fsyst, params=params)\n", + "\n", + "plot_dos_and_curves(\n", + " (spectrum.energies, spectrum.densities.real / (lx * ly / 3)),\n", + " [\n", + " (r'Longitudinal conductivity $\\sigma_{xx} / L_x$',\n", + " (spectrum.energies, cond_array_xx.mean(1) / (lx))),\n", + " (r'Hall conductivity $\\sigma_{xy}$',\n", + " (spectrum.energies, cond_array_xy.mean(1)))],\n", + " ylabel=r'$\\sigma [e^2/h]$'\n", + ");" + ] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md", + "text_representation": { + "extension": ".md", + "format_name": "markdown", + "format_version": "1.2", + "jupytext_version": "1.9.1" + } + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/noxfile.py b/noxfile.py index 004076d..d6726fb 100644 --- a/noxfile.py +++ b/noxfile.py @@ -255,7 +255,9 @@ def docs_build(session: Session) -> None: args.insert(0, "--color") session.install(".") - session.install("sphinx", "sphinx-click", "furo", "myst-parser") + session.install( + "sphinx", "sphinx-click", "nbsphinx", "pandoc", "furo", "myst-parser" + ) build_dir = Path("docs", "_build") if build_dir.exists(): diff --git a/poetry.lock b/poetry.lock index f1954e6..c060ef9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,38 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] +[[package]] +name = "anyio" +version = "4.1.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"}, + {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + [[package]] name = "argcomplete" version = "3.1.6" @@ -25,6 +57,114 @@ files = [ [package.extras] test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "attrs" version = "23.1.0" @@ -161,6 +301,28 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.3)"] +[[package]] +name = "bokeh" +version = "3.3.1" +description = "Interactive plots and applications in the browser from Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bokeh-3.3.1-py3-none-any.whl", hash = "sha256:783fb503d80306fb1e3c06e9c775d98675bf9e07514a776d7109178798e85683"}, + {file = "bokeh-3.3.1.tar.gz", hash = "sha256:2a7b3702d7e9f03ef4cd801b02b7380196c70cff2773859bcb84fa565218955c"}, +] + +[package.dependencies] +contourpy = ">=1" +Jinja2 = ">=2.9" +numpy = ">=1.16" +packaging = ">=16.8" +pandas = ">=1.2" +pillow = ">=7.1.0" +PyYAML = ">=3.10" +tornado = ">=5.1" +xyzservices = ">=2021.09.1" + [[package]] name = "certifi" version = "2023.11.17" @@ -371,6 +533,28 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "colorcet" +version = "3.0.1" +description = "Collection of perceptually uniform colormaps" +optional = false +python-versions = ">=2.7" +files = [ + {file = "colorcet-3.0.1-py2.py3-none-any.whl", hash = "sha256:8daff01824ee9935fdf762d15c444a67d3e361ad4f8b738ad59ac9bf38f30600"}, + {file = "colorcet-3.0.1.tar.gz", hash = "sha256:51455a20353d12fac91f953772d8409f2474e6a0db1af3fa4f7005f405a2480b"}, +] + +[package.dependencies] +pyct = ">=0.4.4" + +[package.extras] +all = ["bokeh", "flake8", "holoviews", "matplotlib", "nbsite (>=0.7.2rc10)", "nbsmoke (>=0.2.6)", "numpy", "pyct (>=0.4.4)", "pydata-sphinx-theme (<0.9.0)", "pytest (>=2.8.5)", "pytest-cov", "pytest-mpl", "setuptools (>=30.3.0)", "sphinx-copybutton", "wheel"] +build = ["pyct (>=0.4.4)", "setuptools (>=30.3.0)", "wheel"] +doc = ["bokeh", "holoviews", "matplotlib", "nbsite (>=0.7.2rc10)", "numpy", "pydata-sphinx-theme (<0.9.0)", "sphinx-copybutton"] +examples = ["bokeh", "holoviews", "matplotlib", "numpy"] +tests = ["flake8", "nbsmoke (>=0.2.6)", "pytest (>=2.8.5)", "pytest-cov"] +tests-extra = ["flake8", "nbsmoke (>=0.2.6)", "pytest (>=2.8.5)", "pytest-cov", "pytest-mpl"] + [[package]] name = "colorlog" version = "6.7.0" @@ -388,6 +572,23 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] development = ["black", "flake8", "mypy", "pytest", "types-colorama"] +[[package]] +name = "comm" +version = "0.2.0" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, + {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + [[package]] name = "contourpy" version = "1.2.0" @@ -544,6 +745,44 @@ files = [ {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, ] +[[package]] +name = "debugpy" +version = "1.8.0" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "defusedxml" version = "0.7.1" @@ -610,6 +849,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + [[package]] name = "fastjsonschema" version = "2.19.0" @@ -725,53 +978,53 @@ develop = ["build", "twine"] [[package]] name = "fonttools" -version = "4.45.0" +version = "4.45.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18138744540413eb2ebeff6ce8b9d617926f1ed08da5d1676f99f1966988264e"}, - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3d240933045b9dbbe6e8c1e28ffe89be72c9be927b6e572e55be5e2b2604f7"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5853263505f407b69c0d1cbf3ed1c30f985b9505523989b20aa18a5231d4a08a"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c21f306f1e71146cf7587916d6de5e9c4bf26057aad602a6c7fad4b6e05bf1f"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1bb4f01018b9f4e2d7b07c2bf79e2ef498acb6f99321b72b5c44b1333481f569"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d0e6603c3b00604574d84fabbcf9dee81efa7c89d38ed4dcbf4e6c654e1ebb99"}, - {file = "fonttools-4.45.0-cp310-cp310-win32.whl", hash = "sha256:c3e676e50a0713c9a1e46185b806967d3c012643d1936ca814eb9ab62027c090"}, - {file = "fonttools-4.45.0-cp310-cp310-win_amd64.whl", hash = "sha256:e819f14d315024750b1ad2842da605051444b944cd983ea987359ace5213bcb9"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a6d68b97b967a3361e0ddf14425e4fe030c9f19462b445ce0b190c4a6834eb46"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619227c7b9088add4d4e5959bf0fa3c29a71c191baa8b989bf532645876b2168"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cafe001811ad1ac2a5d357fc99c490357d758569f69511d14da0311c02814e15"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:756c6f4324fd4bb4d7517462d7237ff65e45da7a002f9e6e08a48c25a11bf073"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ecc97628be1bf7fa93463e1e791915da66de51df8e655a5a6c846fd9b8ceaa98"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:636177ffc4479bc824a356c00a3c9a74a2ce591fa6057109321e0a0ffd126e40"}, - {file = "fonttools-4.45.0-cp311-cp311-win32.whl", hash = "sha256:cac462dbd9058778c89bc608ac29ba93ab3fbc37f305d260aa2d771cfb0fa694"}, - {file = "fonttools-4.45.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bd3f33a5d5630cc20cf3f8631074cac6eafdb2aa3ac8745966c3b4bf93656b4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5b3da7791a58c97763d1704c2b76a9d654b8f2ef233e64248960bd2c6e669fe4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fbc3d8acb578ba0932fcabc01a962f23b0dd254ab103dd0606128fff0175095"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f69e07ebfd89d96485349dc10bd81a027fc0e927f988fa31bd9cd06359e06ed"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b122fe802839bfc8f9603233e5fcbdc98b5e27876f7945b426adfea983918a7b"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8f8736e885700ae22970519b8f5c7f4c2f29c6e9459d05c649c4e99012c20b23"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:70f047ba37c6aac3d331b71bb784373e251bd86678da72526edc8585e79418e1"}, - {file = "fonttools-4.45.0-cp312-cp312-win32.whl", hash = "sha256:fdb43f68bce545f494fed1bfb60d2c32b53f410758919112923c2d600cb9a24c"}, - {file = "fonttools-4.45.0-cp312-cp312-win_amd64.whl", hash = "sha256:102a7ca8700a078265c002c29d2ae498edeb14b636375ceec2425b561ce08037"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4b154cbf93515e4eb477f5cf99de79b46c17229781f321907940bdbabbd64708"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f546a1b676622638a12c721d89cfb513ad7189548eadac885cdd555e35021557"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c5a0612049e0d06b467c3a0837d9efe37934acab64ba922f00e1d07c1555a7"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27166d00e0cd3ea49461b053f55e75676f1109e5483170a14d70c397d082a4c"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:980ba4e673439db22a00501fac087957ce0731351b042816f6c02df81cadc612"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83b70b99f3f55b046cb51ca20fc15702567710233b2cd757a79e1916c25a25f8"}, - {file = "fonttools-4.45.0-cp38-cp38-win32.whl", hash = "sha256:fe8ad943f62bf16273154ebcdf855c44a3b46eac36abea338c209209439b4eb6"}, - {file = "fonttools-4.45.0-cp38-cp38-win_amd64.whl", hash = "sha256:6fb1fdcee2b36e012283805ef0380e4508dbb504950b1c94d0343f8dbbad7d7e"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5bbcb75ffcea64543ab8203e132e2019b226f59a4a6958637e78c21f9ca560ff"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ade07953b35ebf66c445a5e02f28ecd038ea588dc7673c555afe319b6e3c5168"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54ac8be3f693062fc08550213edd40db8f4fe1dd095a1246ed18e887fc254d76"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc991712aaea9d545b13ec480aaf2ebd12ccdea180fce864dd9863f5134f5a06"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:420139743e21d832de230757fb7b0c285d8024d602af8064d9506fa055bb62ae"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:58da830a52c05f18a7cc8a279a8bdddf2e45cdc685b360699653fb3405557459"}, - {file = "fonttools-4.45.0-cp39-cp39-win32.whl", hash = "sha256:715e18f67f0587a16476c7f62b8ff9a165ddceb8c2a262fb08df9f71c7790f0e"}, - {file = "fonttools-4.45.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd26fda8c879558216458a801c1dba52f35dca0e96640fd9c75e86b6574cf1c3"}, - {file = "fonttools-4.45.0-py3-none-any.whl", hash = "sha256:835cf5d0e1b37bbed1d64c286611cc4da9ff19df952400f191ba9142b3cb97f6"}, - {file = "fonttools-4.45.0.tar.gz", hash = "sha256:c1c79d7d4093396892575115c214b24f09e68997cb5c0ab2d99bfdaff74c64b6"}, + {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53"}, + {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356"}, + {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010"}, + {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2"}, + {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b"}, + {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58"}, + {file = "fonttools-4.45.1-cp310-cp310-win32.whl", hash = "sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0"}, + {file = "fonttools-4.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2"}, + {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd"}, + {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f"}, + {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23"}, + {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab"}, + {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19"}, + {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d"}, + {file = "fonttools-4.45.1-cp311-cp311-win32.whl", hash = "sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a"}, + {file = "fonttools-4.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e"}, + {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8"}, + {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9"}, + {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891"}, + {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff"}, + {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79"}, + {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043"}, + {file = "fonttools-4.45.1-cp312-cp312-win32.whl", hash = "sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb"}, + {file = "fonttools-4.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc"}, + {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0"}, + {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c"}, + {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6"}, + {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47"}, + {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7"}, + {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f"}, + {file = "fonttools-4.45.1-cp38-cp38-win32.whl", hash = "sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589"}, + {file = "fonttools-4.45.1-cp38-cp38-win_amd64.whl", hash = "sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345"}, + {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2"}, + {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57"}, + {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6"}, + {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472"}, + {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f"}, + {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a"}, + {file = "fonttools-4.45.1-cp39-cp39-win32.whl", hash = "sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f"}, + {file = "fonttools-4.45.1-cp39-cp39-win_amd64.whl", hash = "sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0"}, + {file = "fonttools-4.45.1-py3-none-any.whl", hash = "sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3"}, + {file = "fonttools-4.45.1.tar.gz", hash = "sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2"}, ] [package.extras] @@ -788,6 +1041,17 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + [[package]] name = "furo" version = "2023.9.10" @@ -836,6 +1100,43 @@ gitdb = ">=4.0.1,<5" [package.extras] test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] +[[package]] +name = "holoviews" +version = "1.18.1" +description = "Stop plotting your data - annotate your data and let it visualize itself." +optional = false +python-versions = ">=3.9" +files = [ + {file = "holoviews-1.18.1-py2.py3-none-any.whl", hash = "sha256:b1bf6cd9aa72a2e103e8a7e0e57c8c8171a3fc3ebd5b943fe49bf98b6c64367b"}, + {file = "holoviews-1.18.1.tar.gz", hash = "sha256:805c7353ae52e97753e7f0668b051a086410e2d2c13c8fe294ebb4cdd02b2324"}, +] + +[package.dependencies] +colorcet = "*" +numpy = ">=1.0" +packaging = "*" +pandas = ">=0.20.0" +panel = ">=1.0" +param = ">=1.12.0,<3.0" +pyviz-comms = ">=0.7.4" + +[package.extras] +all = ["bokeh (>=3.1)", "cftime", "codecov", "contourpy", "cudf", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "graphviz", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "nbsite (>=0.8.2,<0.9.0)", "nbval", "netcdf4", "networkx", "notebook", "pillow", "playwright", "plotly (>=4.0)", "pooch", "pre-commit", "pyarrow", "pytest", "pytest-cov", "pytest-github-actions-annotate-failures", "pytest-playwright", "pytest-xdist", "ruff", "scikit-image", "scipy", "selenium", "shapely", "spatialpandas", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +build = ["param (>=1.7.0)", "pyct (>=0.4.4)", "setuptools (>=30.3.0)"] +doc = ["bokeh (>=3.1)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "graphviz", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbsite (>=0.8.2,<0.9.0)", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pyarrow", "scikit-image", "scipy", "selenium", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +examples = ["bokeh (>=3.1)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "ipython (>=5.4.0)", "matplotlib (>=3)", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pyarrow", "scikit-image", "scipy", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +examples-tests = ["bokeh (>=3.1)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbval", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pyarrow", "scikit-image", "scipy", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +lint = ["pre-commit", "ruff"] +notebook = ["ipython (>=5.4.0)", "notebook"] +recommended = ["bokeh (>=3.1)", "ipython (>=5.4.0)", "matplotlib (>=3)", "notebook"] +tests = ["bokeh (>=3.1)", "cftime", "contourpy", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "networkx", "pillow", "plotly (>=4.0)", "pytest", "pytest-cov", "pytest-xdist", "scipy", "selenium", "shapely", "spatialpandas", "xarray (>=0.10.4)"] +tests-ci = ["codecov", "pytest-github-actions-annotate-failures"] +tests-core = ["bokeh (>=3.1)", "contourpy", "flaky", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "pillow", "plotly (>=4.0)", "pytest", "pytest-cov", "pytest-xdist"] +tests-gpu = ["bokeh (>=3.1)", "cftime", "contourpy", "cudf", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "networkx", "pillow", "plotly (>=4.0)", "pytest", "pytest-cov", "pytest-xdist", "scipy", "selenium", "shapely", "spatialpandas", "xarray (>=0.10.4)"] +tests-nb = ["nbval"] +ui = ["playwright", "pytest-playwright"] +unit-tests = ["bokeh (>=3.1)", "cftime", "contourpy", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pre-commit", "pyarrow", "pytest", "pytest-cov", "pytest-xdist", "ruff", "scikit-image", "scipy", "selenium", "shapely", "spatialpandas", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] + [[package]] name = "identify" version = "2.5.32" @@ -920,6 +1221,112 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "ipykernel" +version = "6.27.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.27.0-py3-none-any.whl", hash = "sha256:4388caa3c2cba0a381e20d289545e88a8aef1fe57a884d4c018718ec8c23c121"}, + {file = "ipykernel-6.27.0.tar.gz", hash = "sha256:7f4986f606581be73bfb32dc7a1ac9fa0e804c9be50ddf1c7a119413e982693f"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.17.2" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, + {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + +[[package]] +name = "ipywidgets" +version = "8.1.1" +description = "Jupyter interactive widgets" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, + {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, +] + +[package.dependencies] +comm = ">=0.1.3" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0.9,<3.1.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0.9,<4.1.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + [[package]] name = "isort" version = "5.12.0" @@ -937,6 +1344,25 @@ pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib" plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jinja2" version = "3.1.2" @@ -954,6 +1380,31 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "json5" +version = "0.9.14" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = "*" +files = [ + {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, + {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, +] + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + [[package]] name = "jsonschema" version = "4.20.0" @@ -967,9 +1418,17 @@ files = [ [package.dependencies] attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} jsonschema-specifications = ">=2023.03.6" referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -989,6 +1448,26 @@ files = [ [package.dependencies] referencing = ">=0.31.0" +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +optional = false +python-versions = "*" +files = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + [[package]] name = "jupyter-client" version = "8.6.0" @@ -1012,6 +1491,30 @@ traitlets = ">=5.3" docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +[[package]] +name = "jupyter-console" +version = "6.6.3" +description = "Jupyter terminal console" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[package.dependencies] +ipykernel = ">=6.14" +ipython = "*" +jupyter-client = ">=7.0.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +prompt-toolkit = ">=3.0.30" +pygments = "*" +pyzmq = ">=17" +traitlets = ">=5.4" + +[package.extras] +test = ["flaky", "pexpect", "pytest"] + [[package]] name = "jupyter-core" version = "5.5.0" @@ -1032,15 +1535,179 @@ traitlets = ">=5.3" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "jupyter-events" +version = "0.9.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, + {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.0" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.0.tar.gz", hash = "sha256:8ebbcb533adb41e5d635eb8fe82956b0aafbf0fd443b6c4bfa906edeeb8635a1"}, + {file = "jupyter_lsp-2.2.0-py3-none-any.whl", hash = "sha256:9e06b8b4f7dd50300b70dd1a78c0c3b0c3d8fa68e0f2d8a5d1fbab62072aca3f"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.10.1" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.10.1-py3-none-any.whl", hash = "sha256:20519e355d951fc5e1b6ac5952854fe7620d0cfb56588fa4efe362a758977ed3"}, + {file = "jupyter_server-2.10.1.tar.gz", hash = "sha256:e6da2657a954a7879eed28cc08e0817b01ffd81d7eab8634660397b55f926472"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = "*" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = "*" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = "*" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.4.4" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"}, + {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.0.9" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.0.9-py3-none-any.whl", hash = "sha256:9f6f8e36d543fdbcc3df961a1d6a3f524b4a4001be0327a398f68fa4e534107c"}, + {file = "jupyterlab-4.0.9.tar.gz", hash = "sha256:9ebada41d52651f623c0c9f069ddb8a21d6848e4c887d8e5ddc0613166ed5c0b"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +ipykernel = "*" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.19.0,<3" +notebook-shim = ">=0.2" +packaging = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["black[jupyter] (==23.10.1)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.4)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] + [[package]] name = "jupyterlab-pygments" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.25.2" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.25.2-py3-none-any.whl", hash = "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf"}, + {file = "jupyterlab_server-2.25.2.tar.gz", hash = "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63"}, +] + +[package.dependencies] +babel = ">=2.10" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.9" +description = "Jupyter interactive widgets for JupyterLab" +optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, + {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, ] [[package]] @@ -1156,6 +1823,26 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "linkify-it-py" +version = "2.0.2" +description = "Links recognition library with FULL unicode support." +optional = false +python-versions = ">=3.7" +files = [ + {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, + {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, +] + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + [[package]] name = "livereload" version = "2.6.3" @@ -1171,6 +1858,24 @@ files = [ six = "*" tornado = {version = "*", markers = "python_version > \"2.7\""} +[[package]] +name = "markdown" +version = "3.5.1" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1313,6 +2018,20 @@ pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "mccabe" version = "0.7.0" @@ -1365,23 +2084,6 @@ files = [ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] -[[package]] -name = "mpmath" -version = "1.3.0" -description = "Python library for arbitrary-precision floating-point arithmetic" -optional = false -python-versions = "*" -files = [ - {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, - {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, -] - -[package.extras] -develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] -docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] -tests = ["pytest (>=4.6)"] - [[package]] name = "mypy" version = "1.7.0" @@ -1566,6 +2268,17 @@ nbformat = "*" sphinx = ">=1.8" traitlets = ">=5" +[[package]] +name = "nest-asyncio" +version = "1.5.8" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, +] + [[package]] name = "nodeenv" version = "1.8.0" @@ -1580,6 +2293,46 @@ files = [ [package.dependencies] setuptools = "*" +[[package]] +name = "notebook" +version = "7.0.6" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "notebook-7.0.6-py3-none-any.whl", hash = "sha256:0fe8f67102fea3744fedf652e4c15339390902ca70c5a31c4f547fa23da697cc"}, + {file = "notebook-7.0.6.tar.gz", hash = "sha256:ec6113b06529019f7f287819af06c97a2baf7a95ac21a8f6e32192898e9f9a58"}, +] + +[package.dependencies] +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.0.2,<5" +jupyterlab-server = ">=2.22.1,<3" +notebook-shim = ">=0.2,<0.3" +tornado = ">=6.2.0" + +[package.extras] +dev = ["hatch", "pre-commit"] +docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] + +[[package]] +name = "notebook-shim" +version = "0.2.3" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, + {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + [[package]] name = "nox" version = "2023.4.22" @@ -1661,6 +2414,17 @@ files = [ {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, ] +[[package]] +name = "overrides" +version = "7.4.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, + {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, +] + [[package]] name = "packaging" version = "23.2" @@ -1672,6 +2436,88 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "pandas" +version = "2.1.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acf08a73b5022b479c1be155d4988b72f3020f308f7a87c527702c5f8966d34f"}, + {file = "pandas-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cc4469ff0cf9aa3a005870cb49ab8969942b7156e0a46cc3f5abd6b11051dfb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35172bff95f598cc5866c047f43c7f4df2c893acd8e10e6653a4b792ed7f19bb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dfe0e65a2f3988e940224e2a70932edc964df79f3356e5f2997c7d63e758b4"}, + {file = "pandas-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0296a66200dee556850d99b24c54c7dfa53a3264b1ca6f440e42bad424caea03"}, + {file = "pandas-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:465571472267a2d6e00657900afadbe6097c8e1dc43746917db4dfc862e8863e"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04d4c58e1f112a74689da707be31cf689db086949c71828ef5da86727cfe3f82"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fa2ad4ff196768ae63a33f8062e6838efed3a319cf938fdf8b95e956c813042"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441ac94a2a2613e3982e502ccec3bdedefe871e8cea54b8775992485c5660ef"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ded6ff28abbf0ea7689f251754d3789e1edb0c4d0d91028f0b980598418a58"}, + {file = "pandas-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca5680368a5139d4920ae3dc993eb5106d49f814ff24018b64d8850a52c6ed2"}, + {file = "pandas-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:de21e12bf1511190fc1e9ebc067f14ca09fccfb189a813b38d63211d54832f5f"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5d53c725832e5f1645e7674989f4c106e4b7249c1d57549023ed5462d73b140"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cf4cf26042476e39394f1f86868d25b265ff787c9b2f0d367280f11afbdee6d"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72c84ec1b1d8e5efcbff5312abe92bfb9d5b558f11e0cf077f5496c4f4a3c99e"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f539e113739a3e0cc15176bf1231a553db0239bfa47a2c870283fd93ba4f683"}, + {file = "pandas-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc77309da3b55732059e484a1efc0897f6149183c522390772d3561f9bf96c00"}, + {file = "pandas-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:08637041279b8981a062899da0ef47828df52a1838204d2b3761fbd3e9fcb549"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b99c4e51ef2ed98f69099c72c75ec904dd610eb41a32847c4fcbc1a975f2d2b8"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7ea8ae8004de0381a2376662c0505bb0a4f679f4c61fbfd122aa3d1b0e5f09d"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd76d67ca2d48f56e2db45833cf9d58f548f97f61eecd3fdc74268417632b8a"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1329dbe93a880a3d7893149979caa82d6ba64a25e471682637f846d9dbc10dd2"}, + {file = "pandas-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:321ecdb117bf0f16c339cc6d5c9a06063854f12d4d9bc422a84bb2ed3207380a"}, + {file = "pandas-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:11a771450f36cebf2a4c9dbd3a19dfa8c46c4b905a3ea09dc8e556626060fe71"}, + {file = "pandas-2.1.3.tar.gz", hash = "sha256:22929f84bca106921917eb73c1521317ddd0a4c71b395bcf767a106e3494209f"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + +[[package]] +name = "pandoc" +version = "2.3" +description = "Pandoc Documents for Python" +optional = false +python-versions = "*" +files = [ + {file = "pandoc-2.3.tar.gz", hash = "sha256:e772c2c6d871146894579828dbaf1efd538eb64fc7e71d4a6b3a11a18baef90d"}, +] + +[package.dependencies] +plumbum = "*" +ply = "*" + [[package]] name = "pandocfilters" version = "1.5.0" @@ -1683,6 +2529,79 @@ files = [ {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, ] +[[package]] +name = "panel" +version = "1.3.2" +description = "The powerful data exploration & web app framework for Python." +optional = false +python-versions = ">=3.9" +files = [ + {file = "panel-1.3.2-py2.py3-none-any.whl", hash = "sha256:da1e6c8c41e88c728a89b8119da03ac13870e32759e401c2ecc0a7ba47ea74c3"}, + {file = "panel-1.3.2.tar.gz", hash = "sha256:0b8907726ffaee97e2f0c89f047519ab511266cdbaeef1574d5eb5b327b0a30d"}, +] + +[package.dependencies] +bleach = "*" +bokeh = ">=3.2.0,<3.4.0" +linkify-it-py = "*" +markdown = "*" +markdown-it-py = "*" +mdit-py-plugins = "*" +pandas = ">=1.2" +param = ">=2.0.0,<3.0" +pyviz-comms = ">=2.0.0" +requests = "*" +tqdm = ">=4.48.0" +typing-extensions = "*" +xyzservices = ">=2021.09.1" + +[package.extras] +all = ["aiohttp", "altair", "anywidget", "channels", "croniter", "datashader", "diskcache", "django (<4)", "fastparquet", "flake8", "folium", "graphviz", "holoviews (>=1.16.0)", "hvplot", "ipyleaflet", "ipympl", "ipython (>=7.0)", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.7)", "jupyter-server", "jupyterlab", "lxml", "matplotlib", "myst-nb (>=0.17,<1)", "nbsite (>=0.8.2)", "nbval", "networkx (>=2.5)", "numba (<0.58)", "numpy", "pandas (<2.1.0)", "pandas (>=1.3)", "parameterized", "pillow", "playwright", "plotly", "plotly (>=4.0)", "pre-commit", "psutil", "pydeck", "pygraphviz", "pyinstrument (>=4.0)", "pytest", "pytest-asyncio (<0.22)", "pytest-cov", "pytest-playwright", "pytest-rerunfailures", "pytest-xdist", "python-graphviz", "pyvista", "reacton", "scikit-image", "scikit-learn", "scipy", "seaborn", "streamz", "twine", "vega-datasets", "vtk", "xarray", "xgboost"] +all-pip = ["aiohttp", "altair", "anywidget", "channels", "croniter", "datashader", "diskcache", "django (<4)", "fastparquet", "flake8", "folium", "graphviz", "holoviews (>=1.16.0)", "hvplot", "ipyleaflet", "ipympl", "ipython (>=7.0)", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.7)", "jupyter-server", "jupyterlab", "lxml", "matplotlib", "myst-nb (>=0.17,<1)", "nbsite (>=0.8.2)", "nbval", "networkx (>=2.5)", "numba (<0.58)", "numpy", "pandas (<2.1.0)", "pandas (>=1.3)", "parameterized", "pillow", "playwright", "plotly", "plotly (>=4.0)", "pre-commit", "psutil", "pydeck", "pyinstrument (>=4.0)", "pytest", "pytest-asyncio (<0.22)", "pytest-cov", "pytest-playwright", "pytest-rerunfailures", "pytest-xdist", "pyvista", "reacton", "scikit-image", "scikit-learn", "scipy", "seaborn", "streamz", "twine", "vega-datasets", "vtk", "xarray", "xgboost"] +build = ["bleach", "bokeh (>=3.3.0,<3.4.0)", "cryptography (<39)", "markdown", "packaging", "param (>=2.0.0)", "pyviz-comms (>=2.0.0)", "requests", "setuptools (>=42)", "tqdm (>=4.48.0)", "urllib3 (<2.0)"] +doc = ["holoviews (>=1.16.0)", "jupyterlab", "lxml", "matplotlib", "myst-nb (>=0.17,<1)", "nbsite (>=0.8.2)", "pandas (<2.1.0)", "pillow", "plotly"] +examples = ["aiohttp", "altair", "channels", "croniter", "datashader", "django (<4)", "fastparquet", "folium", "graphviz", "holoviews (>=1.16.0)", "hvplot", "ipyleaflet", "ipympl", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.7)", "networkx (>=2.5)", "plotly (>=4.0)", "pydeck", "pygraphviz", "pyinstrument (>=4.0)", "python-graphviz", "pyvista", "reacton", "scikit-image", "scikit-learn", "seaborn", "streamz", "vega-datasets", "vtk", "xarray", "xgboost"] +recommended = ["holoviews (>=1.16.0)", "jupyterlab", "matplotlib", "pillow", "plotly"] +tests = ["altair", "anywidget", "diskcache", "flake8", "folium", "holoviews (>=1.16.0)", "ipympl", "ipython (>=7.0)", "ipyvuetify", "ipywidgets-bokeh", "nbval", "numba (<0.58)", "numpy", "pandas (>=1.3)", "parameterized", "pre-commit", "psutil", "pytest", "pytest-asyncio (<0.22)", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "reacton", "scipy", "twine"] +tests-core = ["altair", "anywidget", "diskcache", "flake8", "folium", "holoviews (>=1.16.0)", "ipython (>=7.0)", "nbval", "numpy", "pandas (>=1.3)", "parameterized", "pre-commit", "psutil", "pytest", "pytest-asyncio (<0.22)", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "scipy"] +ui = ["jupyter-server", "playwright", "pytest-playwright"] + +[[package]] +name = "param" +version = "2.0.1" +description = "Make your Python code clearer and more reliable by declaring Parameters." +optional = false +python-versions = ">=3.8" +files = [ + {file = "param-2.0.1-py3-none-any.whl", hash = "sha256:4bfc94c0e4127626fa833e30c71c91ea73e7675b80c26dbdd4a6e5a8f6dc46db"}, + {file = "param-2.0.1.tar.gz", hash = "sha256:7943a04607822efd46e96e1827dc5fa929a2fc3b1fe9fc7b7dca7d17a8031a5b"}, +] + +[package.extras] +all = ["param[doc]", "param[lint]", "param[tests-full]"] +doc = ["nbsite (==0.8.2)", "param[examples]", "sphinx-remove-toctrees"] +examples = ["aiohttp", "pandas", "panel"] +lint = ["flake8", "pre-commit"] +tests = ["coverage[toml]", "pytest", "pytest-asyncio"] +tests-deser = ["odfpy", "openpyxl", "pyarrow", "tables", "xlrd"] +tests-examples = ["nbval", "param[examples]", "pytest", "pytest-asyncio", "pytest-xdist"] +tests-full = ["cloudpickle", "gmpy", "ipython", "jsonschema", "nest-asyncio", "numpy", "pandas", "param[tests-deser]", "param[tests-examples]", "param[tests]"] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + [[package]] name = "pathspec" version = "0.11.2" @@ -1710,14 +2629,28 @@ name = "pep8-naming" version = "0.13.3" description = "Check PEP-8 naming conventions, plugin for flake8" optional = false -python-versions = ">=3.7" +python-versions = ">=3.7" +files = [ + {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, + {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, +] + +[package.dependencies] +flake8 = ">=5.0.0" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" files = [ - {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, - {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] [package.dependencies] -flake8 = ">=5.0.0" +ptyprocess = ">=0.5" [[package]] name = "pillow" @@ -1786,17 +2719,6 @@ files = [ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -[[package]] -name = "pip" -version = "23.3.1" -description = "The PyPA recommended tool for installing Python packages." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pip-23.3.1-py3-none-any.whl", hash = "sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b"}, - {file = "pip-23.3.1.tar.gz", hash = "sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174"}, -] - [[package]] name = "platformdirs" version = "4.0.0" @@ -1812,6 +2734,21 @@ files = [ docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +[[package]] +name = "plotly" +version = "5.18.0" +description = "An open-source, interactive data visualization library for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "plotly-5.18.0-py3-none-any.whl", hash = "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de"}, + {file = "plotly-5.18.0.tar.gz", hash = "sha256:360a31e6fbb49d12b007036eb6929521343d6bee2236f8459915821baefa2cbb"}, +] + +[package.dependencies] +packaging = "*" +tenacity = ">=6.2.0" + [[package]] name = "pluggy" version = "1.3.0" @@ -1827,6 +2764,36 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "plumbum" +version = "1.8.2" +description = "Plumbum: shell combinators library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "plumbum-1.8.2-py3-none-any.whl", hash = "sha256:3ad9e5f56c6ec98f6f7988f7ea8b52159662ea9e915868d369dbccbfca0e367e"}, + {file = "plumbum-1.8.2.tar.gz", hash = "sha256:9e6dc032f4af952665f32f3206567bc23b7858b1413611afe603a3f8ad9bfd75"}, +] + +[package.dependencies] +pywin32 = {version = "*", markers = "platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""} + +[package.extras] +dev = ["paramiko", "psutil", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "pytest-timeout"] +docs = ["sphinx (>=4.0.0)", "sphinx-rtd-theme (>=1.0.0)"] +ssh = ["paramiko"] + +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +optional = false +python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + [[package]] name = "pre-commit" version = "3.5.0" @@ -1860,6 +2827,87 @@ files = [ "ruamel.yaml" = ">=0.15" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +[[package]] +name = "prometheus-client" +version = "0.19.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, + {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.41" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.6" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "pycodestyle" version = "2.11.1" @@ -1882,6 +2930,26 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] +[[package]] +name = "pyct" +version = "0.5.0" +description = "Python package common tasks for users (e.g. copy examples, fetch data, ...)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyct-0.5.0-py2.py3-none-any.whl", hash = "sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c"}, + {file = "pyct-0.5.0.tar.gz", hash = "sha256:dd9f4ac5cbd8e37c352c04036062d3c5f67efec76d404761ef16b0cbf26aa6a0"}, +] + +[package.dependencies] +param = ">=1.7.0" + +[package.extras] +build = ["param (>=1.7.0)", "setuptools"] +cmd = ["pyyaml", "requests"] +doc = ["nbsite", "sphinx-ioam-theme"] +tests = ["flake8", "pytest"] + [[package]] name = "pydocstyle" version = "6.3.0" @@ -1975,6 +3043,28 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + [[package]] name = "pyupgrade" version = "3.15.0" @@ -1989,6 +3079,25 @@ files = [ [package.dependencies] tokenize-rt = ">=5.2.0" +[[package]] +name = "pyviz-comms" +version = "3.0.0" +description = "A JupyterLab extension for rendering HoloViz content." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyviz_comms-3.0.0-py3-none-any.whl", hash = "sha256:91c967151b1e4d436c458c147a31991a42fbe7567e49176e4eb5b8dc8e20f1ff"}, + {file = "pyviz_comms-3.0.0.tar.gz", hash = "sha256:f4ca91e4157a64e3abed7cc249e60b9a8d2532f8832f1cb075914d19337d2ba6"}, +] + +[package.dependencies] +param = "*" + +[package.extras] +all = ["pyviz-comms[build]", "pyviz-comms[tests]"] +build = ["jupyterlab (>=4.0,<5.0)", "keyring", "rfc3986", "setuptools (>=40.8.0)", "twine"] +tests = ["flake8", "pytest"] + [[package]] name = "pywin32" version = "306" @@ -2012,6 +3121,21 @@ files = [ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] +[[package]] +name = "pywinpty" +version = "2.0.12" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, + {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, + {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, + {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, + {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, + {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -2176,6 +3300,48 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} +[[package]] +name = "qtconsole" +version = "5.5.1" +description = "Jupyter Qt console" +optional = false +python-versions = ">= 3.8" +files = [ + {file = "qtconsole-5.5.1-py3-none-any.whl", hash = "sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b"}, + {file = "qtconsole-5.5.1.tar.gz", hash = "sha256:a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc"}, +] + +[package.dependencies] +ipykernel = ">=4.1" +jupyter-client = ">=4.1" +jupyter-core = "*" +packaging = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = ">=2.4.0" +traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "qtpy" +version = "2.4.1" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +optional = false +python-versions = ">=3.7" +files = [ + {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, + {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] + [[package]] name = "referencing" version = "0.31.0" @@ -2225,6 +3391,31 @@ files = [ [package.dependencies] docutils = ">=0.11,<1.0" +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + [[package]] name = "rich" version = "13.7.0" @@ -2493,6 +3684,22 @@ dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyl doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "send2trash" +version = "1.8.2" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, + {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + [[package]] name = "setuptools" version = "69.0.2" @@ -2531,6 +3738,17 @@ files = [ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + [[package]] name = "snowballstemmer" version = "2.2.0" @@ -2744,6 +3962,25 @@ Sphinx = ">=5" lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "stevedore" version = "5.1.0" @@ -2759,18 +3996,39 @@ files = [ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] -name = "sympy" -version = "1.12" -description = "Computer algebra system (CAS) in Python" +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "terminado" +version = "0.18.0" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, + {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, + {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, ] [package.dependencies] -mpmath = ">=0.19" +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "tinyarray" @@ -2853,6 +4111,26 @@ files = [ {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traitlets" version = "5.13.0" @@ -2887,6 +4165,17 @@ typing-extensions = {version = ">=4.7.0", markers = "python_version < \"3.12\""} doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] +[[package]] +name = "types-python-dateutil" +version = "2.8.19.14" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = "*" +files = [ + {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, + {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, +] + [[package]] name = "typing-extensions" version = "4.8.0" @@ -2898,6 +4187,45 @@ files = [ {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.2" +description = "Micro subset of unicode data files for linkify-it-py projects." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, + {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, +] + +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + [[package]] name = "urllib3" version = "2.1.0" @@ -2934,6 +4262,32 @@ platformdirs = ">=3.9.1,<5" docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +[[package]] +name = "wcwidth" +version = "0.2.12" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, +] + +[[package]] +name = "webcolors" +version = "1.13" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.7" +files = [ + {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, + {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["pytest", "pytest-cov"] + [[package]] name = "webencodings" version = "0.5.1" @@ -2946,18 +4300,31 @@ files = [ ] [[package]] -name = "wheel" -version = "0.41.3" -description = "A built-package format for Python" +name = "websocket-client" +version = "1.6.4" +description = "WebSocket client for Python with low level API options" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wheel-0.41.3-py3-none-any.whl", hash = "sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942"}, - {file = "wheel-0.41.3.tar.gz", hash = "sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841"}, + {file = "websocket-client-1.6.4.tar.gz", hash = "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df"}, + {file = "websocket_client-1.6.4-py3-none-any.whl", hash = "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24"}, ] [package.extras] -test = ["pytest (>=6.0.0)", "setuptools (>=65)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.9" +description = "Jupyter interactive widgets for Jupyter Notebook" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, + {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, +] [[package]] name = "xdoctest" @@ -2986,6 +4353,17 @@ tests-binary = ["cmake", "cmake", "ninja", "ninja", "pybind11", "pybind11", "sci tests-binary-strict = ["cmake (==3.21.2)", "cmake (==3.25.0)", "ninja (==1.10.2)", "ninja (==1.11.1)", "pybind11 (==2.10.3)", "pybind11 (==2.7.1)", "scikit-build (==0.11.1)", "scikit-build (==0.16.1)"] tests-strict = ["pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==3.0.0)", "typing (==3.7.4)"] +[[package]] +name = "xyzservices" +version = "2023.10.1" +description = "Source of XYZ tiles providers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "xyzservices-2023.10.1-py3-none-any.whl", hash = "sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68"}, + {file = "xyzservices-2023.10.1.tar.gz", hash = "sha256:091229269043bc8258042edbedad4fcb44684b0473ede027b5672ad40dc9fa02"}, +] + [[package]] name = "zipp" version = "3.17.0" @@ -3004,4 +4382,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "db7029138a7b6afb21c6c1fbae67bdaa75cce6a73c679b5ae94609a39c8c1f4d" +content-hash = "a4869a711e84f5a81ea008859a2bca5c051404d2f0c1ff3206dd0a0c2998d439" diff --git a/pyproject.toml b/pyproject.toml index a053882..adfd476 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,17 +18,13 @@ Changelog = "https://github.com/piskunow/kpm-tools/releases" [tool.poetry.dependencies] python = "^3.9" click = ">=8.0.1" -nbsphinx = "^0.9.3" tornado = ">=6.3.3" nox-poetry = "^1.0.3" numpy = "^1.26.2" scipy = "^1.11.4" matplotlib = "^3.8.2" tinyarray = "^1.2.4" -sympy = "^1.12" -setuptools = "^69.0.2" -wheel = "^0.41.3" -pip = "^23.3.1" +pandoc = "^2.3" [tool.poetry.dev-dependencies] Pygments = ">=2.10.0" @@ -59,6 +55,13 @@ myst-parser = {version = ">=0.16.1"} [tool.poetry.scripts] kpm-tools = "kpm_tools.__main__:main" +[tool.poetry.group.dev.dependencies] +holoviews = "^1.18.1" +nbsphinx = "^0.9.3" +jupyter = "^1.0.0" +plotly = "^5.18.0" +pandoc = "^2.3" + [tool.coverage.paths] source = ["src", "*/site-packages"] tests = ["tests", "*/tests"] diff --git a/src/kpm_tools/bloch.py b/src/kpm_tools/bloch.py index 52d50f4..11cf440 100644 --- a/src/kpm_tools/bloch.py +++ b/src/kpm_tools/bloch.py @@ -18,9 +18,9 @@ from kwant._common import get_parameters from kwant._common import memoize from kwant.builder import Builder -from kwant.builder import SiteArray from kwant.builder import herm_conj from kwant.lattice import TranslationalSymmetry +from kwant.system import SiteArray from kwant.wraparound import WrappedBuilder from kwant.wraparound import _callable_herm_conj from kwant.wraparound import _set_signature From 7b73af13b1477fec7722431f63eea89dacd6ddf7 Mon Sep 17 00:00:00 2001 From: Pablo Piskunow Date: Thu, 23 Nov 2023 14:59:17 +0100 Subject: [PATCH 24/24] bump patch version --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index adfd476..6f9d322 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "kpm-tools" -version = "0.0.0" +version = "0.0.1" description = "KPM Tools" authors = ["Pablo Piskunow "] license = "BSD 2-Clause" @@ -9,7 +9,7 @@ homepage = "https://github.com/piskunow/kpm-tools" repository = "https://github.com/piskunow/kpm-tools" documentation = "https://kpm-tools.readthedocs.io" classifiers = [ - "Development Status :: 3 - Alpha", + "Development Status :: 4 - Beta", ] [tool.poetry.urls]