From d10d80f1e0c15ad68b5fd2e6d55e468d34fee039 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Fri, 29 Sep 2023 21:49:06 +0100 Subject: [PATCH 1/9] Setting up readthedocs and sphinx --- docs/conf.py | 7 +- docs/requirements.in | 5 ++ docs/requirements.txt | 29 +++++++- poetry.lock | 165 +++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 11 ++- 5 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 docs/requirements.in diff --git a/docs/conf.py b/docs/conf.py index be527bc..cb62e07 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,7 +15,7 @@ import os import sys -sys.path.insert(0, os.path.abspath("..")) +# sys.path.insert(0, os.path.abspath("..")) project = 'nuropb' copyright = '2023, Robert Betts' @@ -26,6 +26,7 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ + "myst_parser", "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx.ext.autodoc", @@ -35,6 +36,10 @@ templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} # -- Options for HTML output ------------------------------------------------- diff --git a/docs/requirements.in b/docs/requirements.in new file mode 100644 index 0000000..4d5f83a --- /dev/null +++ b/docs/requirements.in @@ -0,0 +1,5 @@ +sphinx==7.2.6 +sphinx-rtd-theme==1.3.0 +readthedocs-sphinx-search==0.3.1 +myst-parser==2.0.0 +sphinx-autobuild==2021.3.14 diff --git a/docs/requirements.txt b/docs/requirements.txt index faa2d5d..44b267d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -12,8 +12,11 @@ certifi==2023.7.22 # via requests charset-normalizer==3.2.0 # via requests +colorama==0.4.6 + # via sphinx-autobuild docutils==0.18.1 # via + # myst-parser # sphinx # sphinx-rtd-theme idna==3.4 @@ -21,22 +24,42 @@ idna==3.4 imagesize==1.4.1 # via sphinx jinja2==3.1.2 - # via sphinx + # via + # myst-parser + # sphinx +livereload==2.6.3 + # via sphinx-autobuild +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # myst-parser markupsafe==2.1.3 # via jinja2 +mdit-py-plugins==0.4.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +myst-parser==2.0.0 + # via -r requirements.in packaging==23.1 # via sphinx pygments==2.16.1 # via sphinx +pyyaml==6.0.1 + # via myst-parser readthedocs-sphinx-search==0.3.1 # via -r requirements.in requests==2.31.0 # via sphinx +six==1.16.0 + # via livereload snowballstemmer==2.2.0 # via sphinx sphinx==7.2.6 # via # -r requirements.in + # myst-parser + # sphinx-autobuild # sphinx-rtd-theme # sphinxcontrib-applehelp # sphinxcontrib-devhelp @@ -44,6 +67,8 @@ sphinx==7.2.6 # sphinxcontrib-jquery # sphinxcontrib-qthelp # sphinxcontrib-serializinghtml +sphinx-autobuild==2021.3.14 + # via -r requirements.in sphinx-rtd-theme==1.3.0 # via -r requirements.in sphinxcontrib-applehelp==1.0.7 @@ -60,5 +85,7 @@ sphinxcontrib-qthelp==1.0.6 # via sphinx sphinxcontrib-serializinghtml==1.1.9 # via sphinx +tornado==6.3.3 + # via livereload urllib3==2.0.5 # via requests diff --git a/poetry.lock b/poetry.lock index 238e91f..a604830 100644 --- a/poetry.lock +++ b/poetry.lock @@ -956,6 +956,45 @@ completion = ["shtab"] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +[[package]] +name = "livereload" +version = "2.6.3" +description = "Python LiveReload is an awesome tool for web developers" +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 = "*" +tornado = {version = "*", markers = "python_version > \"2.7\""} + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +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)"] +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 = ["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" @@ -1015,6 +1054,36 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +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"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "more-itertools" version = "10.1.0" @@ -1231,6 +1300,32 @@ files = [ {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," +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" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" +pyyaml = "*" +sphinx = ">=6,<8" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +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 = "packaging" version = "23.1" @@ -1574,6 +1669,55 @@ files = [ {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, ] +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +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-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-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {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-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-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 = "rapidfuzz" version = "2.15.1" @@ -1838,6 +1982,25 @@ docs = ["sphinxcontrib-websupport"] 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." +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 = "*" +livereload = "*" +sphinx = "*" + +[package.extras] +test = ["pytest", "pytest-cov"] + [[package]] name = "sphinx-rtd-theme" version = "1.3.0" @@ -2290,4 +2453,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "895894580ceb5dcc28d3da27e2b093a10c2806a2905e18c136a55e08c2b084f9" +content-hash = "286c22ee073ec6648de4b1974df459947a7eeca1f2601d4530bcc10b94b61211" diff --git a/pyproject.toml b/pyproject.toml index 3896262..d93ede1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,10 +37,19 @@ pytest-dotenv = "^0.5.2" black = "^23.3.0" mypy = "^1.4.1" pytest-asyncio = "^0.21.1" -sphinx = "^7.2.6" setuptools = "^68.2.2" + +[tool.poetry.group.docs] +optional = true + +[tool.poetry.group.docs.dependencies] +myst-parser = "^2.0.0" +sphinx = "^7.2.6" sphinx-rtd-theme = "^1.3.0" readthedocs-sphinx-search = "^0.3.1" +sphinx-autobuild = "^2021.3.14" + + [build-system] requires = ["poetry-core"] From 37e2e9d8e3bb9ca182b5dff693384436afbbe1d4 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Fri, 29 Sep 2023 23:23:22 +0100 Subject: [PATCH 2/9] Setting up readthedocs and sphinx --- .readthedocs.yaml | 14 +++++++------- docs/conf.py | 2 +- pyproject.toml | 3 +++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 5c25a0b..17535e4 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -7,9 +7,9 @@ version: 2 # Set the OS, Python version and other tools you might need build: -os: ubuntu-22.04 -tools: -python: "3.11.4" + os: ubuntu-22.04 + tools: + python: "3.11.4" # You can also specify other tool versions: # nodejs: "19" # rust: "1.64" @@ -17,7 +17,7 @@ python: "3.11.4" # Build documentation in the "docs/" directory with Sphinx sphinx: -configuration: docs/conf.py + configuration: docs/conf.py # Optionally build your docs in additional formats such as PDF and ePub # formats: @@ -27,6 +27,6 @@ configuration: docs/conf.py # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -#python: -# install: -# - requirements: docs/requirements.txt \ No newline at end of file +python: + install: + - requirements: docs/requirements.txt \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index cb62e07..faf76d6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,7 +15,7 @@ import os import sys -# sys.path.insert(0, os.path.abspath("..")) +sys.path.insert(0, os.path.abspath("..")) project = 'nuropb' copyright = '2023, Robert Betts' diff --git a/pyproject.toml b/pyproject.toml index 34f86ed..eb184f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,9 @@ packages = [ {include = "nuropb", from = "src"} ] +[tool.poetry.extras] +docs = ["sphinx", "sphinx_rtd_theme"] + [tool.poetry.dependencies] python = ">=3.9,<3.12" python-dotenv = "^1.0.0" From b0d30c4bcb90a4f19809c1ceb8bc8fcd3475e471 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Fri, 29 Sep 2023 23:24:37 +0100 Subject: [PATCH 3/9] Setting up readthedocs and sphinx --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 17535e4..db10100 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.11.4" + python: "3.11" # You can also specify other tool versions: # nodejs: "19" # rust: "1.64" From 39b4d08bbd4b93fac77eb871d6f5e432e9151f3b Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Sat, 30 Sep 2023 00:46:40 +0100 Subject: [PATCH 4/9] Setting up readthedocs and sphinx --- .readthedocs.yaml | 13 +- docs/conf.py | 30 ++- docs/index.rst | 20 -- docs/requirements.in | 3 + docs/requirements.txt | 91 -------- poetry.lock | 485 +++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 7 +- src/__init__.py | 0 8 files changed, 526 insertions(+), 123 deletions(-) delete mode 100644 docs/index.rst delete mode 100644 docs/requirements.txt delete mode 100644 src/__init__.py diff --git a/.readthedocs.yaml b/.readthedocs.yaml index db10100..4d8c431 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -15,12 +15,19 @@ build: # rust: "1.64" # golang: "1.19" +jobs: + post_create_environment: + - pip install poetry + - poetry config virtualenvs.create false + post_install: + - poetry install --with docs + # Build documentation in the "docs/" directory with Sphinx sphinx: - configuration: docs/conf.py + configuration: ./docs/conf.py # Optionally build your docs in additional formats such as PDF and ePub -# formats: +formats: all # - pdf # - epub @@ -29,4 +36,4 @@ sphinx: # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - - requirements: docs/requirements.txt \ No newline at end of file + - requirements: ./docs/requirements.txt \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index faf76d6..1653dbd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,8 +3,10 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information +import os +import sys +import datetime +from pathlib import Path # -- Path setup -------------------------------------------------------------- @@ -12,14 +14,18 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -import os -import sys +# sys.path.insert(0, os.path.abspath("../src")) -sys.path.insert(0, os.path.abspath("..")) + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + + +year = datetime.datetime.now().year project = 'nuropb' -copyright = '2023, Robert Betts' author = 'Robert Betts' +copyright = f'{year}, {author}' release = '0.1.6' # -- General configuration --------------------------------------------------- @@ -31,7 +37,19 @@ "sphinx.ext.viewcode", "sphinx.ext.autodoc", "sphinx_rtd_theme", + "sphinx.ext.autosummary", + # "sphinx.ext.opengraph", + # "sphinxcontrib.spelling", + # "sphinx_copybutton", + "autoapi.extension", + "nbsphinx", ] +spelling_warning = True +spelling_show_suggestions = True + +autoapi_type = "python" +autoapi_dirs = ["../src"] + templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 22e73e2..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. nuropb documentation master file, created by - sphinx-quickstart on Fri Sep 29 20:52:27 2023. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to nuropb's documentation! -================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/requirements.in b/docs/requirements.in index 4d5f83a..c466517 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -3,3 +3,6 @@ sphinx-rtd-theme==1.3.0 readthedocs-sphinx-search==0.3.1 myst-parser==2.0.0 sphinx-autobuild==2021.3.14 +nbsphinx==0.9.3 +sphinx-autoapi==3.0.0 +sphinx-rtd-theme==1.3.0 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 44b267d..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,91 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile requirements.in -# -alabaster==0.7.13 - # via sphinx -babel==2.12.1 - # via sphinx -certifi==2023.7.22 - # via requests -charset-normalizer==3.2.0 - # via requests -colorama==0.4.6 - # via sphinx-autobuild -docutils==0.18.1 - # via - # myst-parser - # sphinx - # sphinx-rtd-theme -idna==3.4 - # via requests -imagesize==1.4.1 - # via sphinx -jinja2==3.1.2 - # via - # myst-parser - # sphinx -livereload==2.6.3 - # via sphinx-autobuild -markdown-it-py==3.0.0 - # via - # mdit-py-plugins - # myst-parser -markupsafe==2.1.3 - # via jinja2 -mdit-py-plugins==0.4.0 - # via myst-parser -mdurl==0.1.2 - # via markdown-it-py -myst-parser==2.0.0 - # via -r requirements.in -packaging==23.1 - # via sphinx -pygments==2.16.1 - # via sphinx -pyyaml==6.0.1 - # via myst-parser -readthedocs-sphinx-search==0.3.1 - # via -r requirements.in -requests==2.31.0 - # via sphinx -six==1.16.0 - # via livereload -snowballstemmer==2.2.0 - # via sphinx -sphinx==7.2.6 - # via - # -r requirements.in - # myst-parser - # sphinx-autobuild - # sphinx-rtd-theme - # sphinxcontrib-applehelp - # sphinxcontrib-devhelp - # sphinxcontrib-htmlhelp - # sphinxcontrib-jquery - # sphinxcontrib-qthelp - # sphinxcontrib-serializinghtml -sphinx-autobuild==2021.3.14 - # via -r requirements.in -sphinx-rtd-theme==1.3.0 - # via -r requirements.in -sphinxcontrib-applehelp==1.0.7 - # via sphinx -sphinxcontrib-devhelp==1.0.5 - # via sphinx -sphinxcontrib-htmlhelp==2.0.4 - # via sphinx -sphinxcontrib-jquery==4.1 - # via sphinx-rtd-theme -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.6 - # via sphinx -sphinxcontrib-serializinghtml==1.1.9 - # via sphinx -tornado==6.3.3 - # via livereload -urllib3==2.0.5 - # via requests diff --git a/poetry.lock b/poetry.lock index 3aa5443..3992e1b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -133,6 +133,31 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] +[[package]] +name = "anyascii" +version = "0.3.2" +description = "Unicode to ASCII transliteration" +optional = false +python-versions = ">=3.3" +files = [ + {file = "anyascii-0.3.2-py3-none-any.whl", hash = "sha256:3b3beef6fc43d9036d3b0529050b0c48bfad8bc960e9e562d7223cfb94fe45d4"}, + {file = "anyascii-0.3.2.tar.gz", hash = "sha256:9d5d32ef844fe225b8bc7cba7f950534fae4da27a9bf3a6bea2cb0ea46ce4730"}, +] + +[[package]] +name = "astroid" +version = "3.0.0" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.0.0-py3-none-any.whl", hash = "sha256:f2510e7fdcd6cfda4ec50014726d4857abf79acfc010084ce8c26091913f1b25"}, + {file = "astroid-3.0.0.tar.gz", hash = "sha256:1defdbca052635dd29657ea674edfc45e4b5be9cd53630c5b084fcfed94344a8"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "async-timeout" version = "4.0.3" @@ -173,6 +198,24 @@ files = [ {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, ] +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +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" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "23.9.1" @@ -219,6 +262,24 @@ 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.0.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] + [[package]] name = "build" version = "0.10.0" @@ -585,6 +646,17 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +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" @@ -715,6 +787,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fastjsonschema" +version = "2.18.0" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, + {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "filelock" version = "3.12.4" @@ -933,6 +1019,60 @@ pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" 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 = "jupyter-client" +version = "8.3.1" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.3.1-py3-none-any.whl", hash = "sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5"}, + {file = "jupyter_client-8.3.1.tar.gz", hash = "sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +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 (>=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.3.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.3.2-py3-none-any.whl", hash = "sha256:a4af53c3fa3f6330cebb0d9f658e148725d15652811d1c32dc0f63bb96f2e6d6"}, + {file = "jupyter_core-5.3.2.tar.gz", hash = "sha256:0c28db6cbe2c37b5b398e1a1a5b22f84fd64cd10afc1f6c05b02fb09481ba45f"}, +] + +[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", "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" +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 = "keyring" version = "24.2.0" @@ -1084,6 +1224,17 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mistune" +version = "3.0.1" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, + {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, +] + [[package]] name = "more-itertools" version = "10.1.0" @@ -1326,6 +1477,106 @@ rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4. 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.8.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, + {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +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[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.8.0" +description = "Converting Jupyter Notebooks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.8.0-py3-none-any.whl", hash = "sha256:aec605e051fa682ccc7934ccc338ba1e8b626cfadbab0db592106b630f63f0f2"}, + {file = "nbconvert-7.8.0.tar.gz", hash = "sha256:f5bc15a1247e14dd41ceef0c0a3bc70020e016576eb0578da62f1c5b4f950479"}, +] + +[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,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.9.2" +description = "The Jupyter Notebook format" +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 = "*" +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" +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 = "*" +jinja2 = "*" +nbconvert = "!=5.4" +nbformat = "*" +sphinx = ">=1.8" +traitlets = ">=5" + [[package]] name = "packaging" version = "23.1" @@ -1337,6 +1588,17 @@ files = [ {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +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" @@ -1644,6 +1906,20 @@ files = [ pytest = ">=5.0.0" python-dotenv = ">=0.9.1" +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" version = "1.0.0" @@ -1658,6 +1934,29 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +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 = "pywin32-ctypes" version = "0.2.2" @@ -1718,6 +2017,111 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "pyzmq" +version = "25.1.1" +description = "Python bindings for 0MQ" +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\""} + [[package]] name = "rapidfuzz" version = "2.15.1" @@ -1947,6 +2351,17 @@ files = [ {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." +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" @@ -1982,6 +2397,27 @@ docs = ["sphinxcontrib-websupport"] 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-autoapi" +version = "3.0.0" +description = "Sphinx API documentation generator" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinx-autoapi-3.0.0.tar.gz", hash = "sha256:09ebd674a32b44467222b0fb8a917b97c89523f20dbf05b52cb8a3f0e15714de"}, + {file = "sphinx_autoapi-3.0.0-py2.py3-none-any.whl", hash = "sha256:ea207793cba1feff7b2ded0e29364f2995a4d157303a98603cee0ce94cea2688"}, +] + +[package.dependencies] +anyascii = "*" +astroid = {version = ">=2.7", markers = "python_version < \"3.12\""} +Jinja2 = "*" +PyYAML = "*" +sphinx = ">=6.1.0" + +[package.extras] +docs = ["furo", "sphinx", "sphinx-design"] + [[package]] name = "sphinx-autobuild" version = "2021.3.14" @@ -2138,6 +2574,24 @@ Sphinx = ">=5" lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +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 = ["flake8", "isort", "pytest"] + [[package]] name = "tomli" version = "2.0.1" @@ -2180,6 +2634,21 @@ files = [ {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] +[[package]] +name = "traitlets" +version = "5.10.1" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.10.1-py3-none-any.whl", hash = "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116"}, + {file = "traitlets-5.10.1.tar.gz", hash = "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "trove-classifiers" version = "2023.9.19" @@ -2264,6 +2733,17 @@ platformdirs = ">=3.9.1,<4" 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" +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 = "xattr" version = "0.10.1" @@ -2450,7 +2930,10 @@ files = [ 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"] +[extras] +docs = [] + [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "286c22ee073ec6648de4b1974df459947a7eeca1f2601d4530bcc10b94b61211" +content-hash = "4c2547f3ee52b18ba02444941b2ecfbb83d0d89e0f148ea1fac13af7d54ac3be" diff --git a/pyproject.toml b/pyproject.toml index eb184f5..23f2e2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,8 +51,9 @@ sphinx = "^7.2.6" sphinx-rtd-theme = "^1.3.0" readthedocs-sphinx-search = "^0.3.1" sphinx-autobuild = "^2021.3.14" - - +nbsphinx = "^0.9.3" +sphinx-autoapi = "^3.0.0" +sphinx-rtd-theme = "^1.3.0" [build-system] requires = ["poetry-core"] @@ -71,12 +72,14 @@ log_cli_date_format = "%d %H:%M:%S" [tool.coverage.run] omit = [".*", "*/site-packages/*"] + [tool.coverage.report] fail_under = 80 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:" ] +show_missing = true [tool.mypy] ignore_missing_imports = true diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 From d6ddbb303863ab1ec68ac798d4f133ab390c1714 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Sat, 30 Sep 2023 00:52:59 +0100 Subject: [PATCH 5/9] Setting up readthedocs and sphinx --- .readthedocs.yaml | 12 +-- docs/index.md | 42 ++++++++++ docs/requirements.txt | 187 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 235 insertions(+), 6 deletions(-) create mode 100644 docs/index.md create mode 100644 docs/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 4d8c431..9d9902a 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -15,12 +15,12 @@ build: # rust: "1.64" # golang: "1.19" -jobs: - post_create_environment: - - pip install poetry - - poetry config virtualenvs.create false - post_install: - - poetry install --with docs +#jobs: +# post_create_environment: +# - pip install poetry +# - poetry config virtualenvs.create false +# post_install: +# - poetry install --with docs # Build documentation in the "docs/" directory with Sphinx sphinx: diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..df98490 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,42 @@ +% nuropb documentation master file, created by +% sphinx-quickstart on Fri Sep 29 20:52:27 2023. +% You can adapt this file completely to your liking, but it should at least +% contain the root `toctree` directive. + +# NuroPb + +## The nervous system and plumbing for an Asynchronous, Distributed, Event Driven, Service Mesh + +[![codecov](https://codecov.io/gh/robertbetts/nuropb/branch/main/graph/badge.svg?token=DVSBZY794D)](https://codecov.io/gh/robertbetts/nuropb) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![CodeFactor](https://www.codefactor.io/repository/github/robertbetts/nuropb/badge)](https://www.codefactor.io/repository/github/robertbetts/nuropb) +[![License: Apache 2.0](https://img.shields.io/pypi/l/giteo)](https://www.apache.org/licenses/LICENSE-2.0.txt) + +Do you have a Python class that you want to make available as a service to consumers or other services, or +* You potentially want to scale a service horizontally many times over, likely at an unknown scale. +* Your service may need to communicate to other services +* There are event driven processes and flows across your service landscape +* You have websocket endpoints that need to integrate seamlessly across a service mesh and event driven architecture +* A growing army of Ml-Ops and Datascience engineers are joining, with the need to to integrate their efforts + across many systems. +* Needing a service proxy that bridges cloud VPNs and on-premise networks + +If any of these are of interest to you, then NuroPb is worth considering. NuroPb It falls into the domain of +tools and frameworks for the abstraction of integration plumbing, enabling software engineers to focus on the +problems they're hired to solve. + +## Where does the name originate from? +NuroPb is a contraction of the term nervous system and the scientific symbol for Lead. Lead +associated with plumbing. So NuroPb is a system's nervous system and plumbing. + + +```{toctree} + :caption: 'Contents' + :maxdepth: 2 +``` + +# Indices and tables + +- {ref}`genindex` +- {ref}`modindex` +- {ref}`search` diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..3f47f3f --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,187 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile requirements.in +# +alabaster==0.7.13 + # via sphinx +anyascii==0.3.2 + # via sphinx-autoapi +astroid==3.0.0 + # via sphinx-autoapi +attrs==23.1.0 + # via + # jsonschema + # referencing +babel==2.12.1 + # via sphinx +beautifulsoup4==4.12.2 + # via nbconvert +bleach==6.0.0 + # via nbconvert +certifi==2023.7.22 + # via requests +charset-normalizer==3.2.0 + # via requests +colorama==0.4.6 + # via sphinx-autobuild +defusedxml==0.7.1 + # via nbconvert +docutils==0.18.1 + # via + # myst-parser + # nbsphinx + # sphinx + # sphinx-rtd-theme +fastjsonschema==2.18.0 + # via nbformat +idna==3.4 + # via requests +imagesize==1.4.1 + # via sphinx +jinja2==3.1.2 + # via + # myst-parser + # nbconvert + # nbsphinx + # sphinx + # sphinx-autoapi +jsonschema==4.19.1 + # via nbformat +jsonschema-specifications==2023.7.1 + # via jsonschema +jupyter-client==8.3.1 + # via nbclient +jupyter-core==5.3.2 + # via + # jupyter-client + # nbclient + # nbconvert + # nbformat +jupyterlab-pygments==0.2.2 + # via nbconvert +livereload==2.6.3 + # via sphinx-autobuild +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # myst-parser +markupsafe==2.1.3 + # via + # jinja2 + # nbconvert +mdit-py-plugins==0.4.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +mistune==3.0.1 + # via nbconvert +myst-parser==2.0.0 + # via -r requirements.in +nbclient==0.8.0 + # via nbconvert +nbconvert==7.8.0 + # via nbsphinx +nbformat==5.9.2 + # via + # nbclient + # nbconvert + # nbsphinx +nbsphinx==0.9.3 + # via -r requirements.in +packaging==23.1 + # via + # nbconvert + # sphinx +pandocfilters==1.5.0 + # via nbconvert +platformdirs==3.10.0 + # via jupyter-core +pygments==2.16.1 + # via + # nbconvert + # sphinx +python-dateutil==2.8.2 + # via jupyter-client +pyyaml==6.0.1 + # via + # myst-parser + # sphinx-autoapi +pyzmq==25.1.1 + # via jupyter-client +readthedocs-sphinx-search==0.3.1 + # via -r requirements.in +referencing==0.30.2 + # via + # jsonschema + # jsonschema-specifications +requests==2.31.0 + # via sphinx +rpds-py==0.10.3 + # via + # jsonschema + # referencing +six==1.16.0 + # via + # bleach + # livereload + # python-dateutil +snowballstemmer==2.2.0 + # via sphinx +soupsieve==2.5 + # via beautifulsoup4 +sphinx==7.2.6 + # via + # -r requirements.in + # myst-parser + # nbsphinx + # sphinx-autoapi + # sphinx-autobuild + # sphinx-rtd-theme + # sphinxcontrib-applehelp + # sphinxcontrib-devhelp + # sphinxcontrib-htmlhelp + # sphinxcontrib-jquery + # sphinxcontrib-qthelp + # sphinxcontrib-serializinghtml +sphinx-autoapi==3.0.0 + # via -r requirements.in +sphinx-autobuild==2021.3.14 + # via -r requirements.in +sphinx-rtd-theme==1.3.0 + # via -r requirements.in +sphinxcontrib-applehelp==1.0.7 + # via sphinx +sphinxcontrib-devhelp==1.0.5 + # via sphinx +sphinxcontrib-htmlhelp==2.0.4 + # via sphinx +sphinxcontrib-jquery==4.1 + # via sphinx-rtd-theme +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.6 + # via sphinx +sphinxcontrib-serializinghtml==1.1.9 + # via sphinx +tinycss2==1.2.1 + # via nbconvert +tornado==6.3.3 + # via + # jupyter-client + # livereload +traitlets==5.10.1 + # via + # jupyter-client + # jupyter-core + # nbclient + # nbconvert + # nbformat + # nbsphinx +urllib3==2.0.5 + # via requests +webencodings==0.5.1 + # via + # bleach + # tinycss2 From 282c794ebb10a28847bc3f900139b696b5ba7597 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Sat, 30 Sep 2023 01:19:31 +0100 Subject: [PATCH 6/9] Setting up readthedocs and sphinx --- docs/conf.py | 4 +-- docs/examples.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ docs/index.md | 36 +------------------- 3 files changed, 92 insertions(+), 37 deletions(-) create mode 100644 docs/examples.md diff --git a/docs/conf.py b/docs/conf.py index 1653dbd..bb9ea5c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -48,7 +48,7 @@ spelling_show_suggestions = True autoapi_type = "python" -autoapi_dirs = ["../src"] +autoapi_dirs = ["../src", '../examples'] templates_path = ['_templates'] @@ -63,5 +63,5 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' html_static_path = ['_static'] diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 0000000..9242255 --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,89 @@ +# Examples using nuroPb as the plumbing for a service mesh, async RPC, etc. + +This code here is as example and to demonstrate the concepts of the nuroPb service mesh library. Its +is also use by the development team for integration testing to validate of some in flight design and +improvements. + +Concepts demonstrated in this example are: +* Using the nuropb module to connect and make rpc calls to a service on the mesh +* Setting up the most basic of service mesh services +* Contexts and context propagation +* Authorisation +* Encryption of request-response payloads +* Using etcd to for service leader election and coordinated configuration for a new service mesh for example + when spinning up a new cluster of services that not every service instance is attempting to concurrently + configure RabbitMQ, or other service infrastructure configurations. +* etcd is disabled by default in the `examples/server.py` example, but can be enabled by setting the + `enable_etcd_usage` variable to `True` +* Various Python asyncio concepts and examples + +## Prerequisites + +Notes: +* Tested and developed on macOS, Windows 10 and various Linux distros +* Standalone or Docker and Kubernetes friendly +* Only infrastructure for RabbitMQ, no database or other required + * Caveat: Optionally, etcd is used for leader election and service mesh configuration + +Package dependencies: +* Python >= 3.10 + * Development and testing on 3.11 +* etcd >= 3.4.0 + * Optional and used for leader election and service mesh configuration +* RabbitMQ >= 3.8.0 + Management Plugin + * Likely work on earlier versions, but not tested +* Python packages: + * Tornado >= 6.3.0 (likely to work of earlier versions of 6.x but not tested) + * Pika >= 1.2.0 + +## Running this example + +Install RabbitMQ in any fashion you like, but the easiest is to use Docker: + +```bash +# Update as needed, Docker external ip address, used for connecting to RabbitMQ or etc containers +export DOCKER_HOST_NAME=localhost + +# RabbitMQ with management plugin +docker run -d --name nuropb-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management + +# OPTIONAL: etcd for leader election and service mesh configuration +docker run -d --name nuropb-etcd \ + -p 2379:2379 \ + -p 2380:2380 \ + --env ALLOW_NONE_AUTHENTICATION=yes \ + --env ETCD_ADVERTISE_CLIENT_URLS=http://${DOCKER_HOST_NAME}:2379 \ + bitnami/etcd:latest +``` + +Clone the repo and install the dependencies: +* note: install poetry if you don't have it already `pip install poetry` +```bash +git clone https://github.com/robertbetts/nuropb.git +cd nuropb +poetry install +``` + +next step, before running the example code is to initialize the service mesh configuration in rabbitmq. +This can be performed either by running the `scripted_mesh_setup.py` or `server.py` examples. +*NOTE* `server_basic.py` does not set up the service mesh configuration. +```bash +poetry run python examples/scripted_mesh_setup.py +# or +poetry run python examples/server.py +``` + +The `examples/server_basic.py` example is for reference mainly, there are no requests from +`examples/client.py`. Add them at your pleasure. + +Finally, run the client example. +```bash +poetry run python examples/client.py +``` + +**`all_in_one.py`** is a single file example of a client and server running in the same python file. It also +demonstrates the use of the `nuropb_context` and `publish_to_mesh` context manager decorators + +And there you are. Let us know what you think! All feedback is welcome. + + diff --git a/docs/index.md b/docs/index.md index df98490..cc87732 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,38 +1,4 @@ -% nuropb documentation master file, created by -% sphinx-quickstart on Fri Sep 29 20:52:27 2023. -% You can adapt this file completely to your liking, but it should at least -% contain the root `toctree` directive. - -# NuroPb - -## The nervous system and plumbing for an Asynchronous, Distributed, Event Driven, Service Mesh - -[![codecov](https://codecov.io/gh/robertbetts/nuropb/branch/main/graph/badge.svg?token=DVSBZY794D)](https://codecov.io/gh/robertbetts/nuropb) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -[![CodeFactor](https://www.codefactor.io/repository/github/robertbetts/nuropb/badge)](https://www.codefactor.io/repository/github/robertbetts/nuropb) -[![License: Apache 2.0](https://img.shields.io/pypi/l/giteo)](https://www.apache.org/licenses/LICENSE-2.0.txt) - -Do you have a Python class that you want to make available as a service to consumers or other services, or -* You potentially want to scale a service horizontally many times over, likely at an unknown scale. -* Your service may need to communicate to other services -* There are event driven processes and flows across your service landscape -* You have websocket endpoints that need to integrate seamlessly across a service mesh and event driven architecture -* A growing army of Ml-Ops and Datascience engineers are joining, with the need to to integrate their efforts - across many systems. -* Needing a service proxy that bridges cloud VPNs and on-premise networks - -If any of these are of interest to you, then NuroPb is worth considering. NuroPb It falls into the domain of -tools and frameworks for the abstraction of integration plumbing, enabling software engineers to focus on the -problems they're hired to solve. - -## Where does the name originate from? -NuroPb is a contraction of the term nervous system and the scientific symbol for Lead. Lead -associated with plumbing. So NuroPb is a system's nervous system and plumbing. - - -```{toctree} - :caption: 'Contents' - :maxdepth: 2 +```{include} ../README.md ``` # Indices and tables From 2ec2aae3cb53dc88d849cc60f4bd5e99420d6ac0 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Sat, 30 Sep 2023 15:13:06 +0100 Subject: [PATCH 7/9] Making good progress on the docs. time to test --- .readthedocs.yaml | 34 +- README.md | 32 +- docs/Makefile | 20 - docs/examples.md | 89 ----- docs/index.md | 8 - docs/make.bat | 35 -- docs/{ => source}/conf.py | 30 +- docs/source/etcd.md | 24 ++ docs/source/examples.md | 3 + docs/source/index.md | 13 + docs/source/installation.md | 1 + docs/{ => source}/requirements.in | 5 +- docs/{ => source}/requirements.txt | 42 ++- examples/README.md | 96 ++--- poetry.lock | 564 ++++++++++++++++++++++++++++- pyproject.toml | 10 +- 16 files changed, 745 insertions(+), 261 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/examples.md delete mode 100644 docs/index.md delete mode 100644 docs/make.bat rename docs/{ => source}/conf.py (86%) create mode 100644 docs/source/etcd.md create mode 100644 docs/source/examples.md create mode 100644 docs/source/index.md create mode 100644 docs/source/installation.md rename docs/{ => source}/requirements.in (60%) rename docs/{ => source}/requirements.txt (80%) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 9d9902a..eab55ab 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,39 +1,17 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required version: 2 -# Set the OS, Python version and other tools you might need build: os: ubuntu-22.04 tools: - python: "3.11" -# You can also specify other tool versions: -# nodejs: "19" -# rust: "1.64" -# golang: "1.19" - -#jobs: -# post_create_environment: -# - pip install poetry -# - poetry config virtualenvs.create false -# post_install: -# - poetry install --with docs + python: "3.10" -# Build documentation in the "docs/" directory with Sphinx sphinx: - configuration: ./docs/conf.py + configuration: ./docs/source/conf.py -# Optionally build your docs in additional formats such as PDF and ePub -formats: all -# - pdf -# - epub +formats: + - pdf + - epub -# Optional but recommended, declare the Python requirements required -# to build your documentation -# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - - requirements: ./docs/requirements.txt \ No newline at end of file + - requirements: ./docs/source/requirements.txt \ No newline at end of file diff --git a/README.md b/README.md index 4e2862d..fdb9e98 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,29 @@ # NuroPb -## The nervous system and plumbing for an Asynchronous, Distributed, Event Driven, Service Mesh +## Plumbing, routing and communications for Distributed, Asynchronous, Event Driven, Services [![codecov](https://codecov.io/gh/robertbetts/nuropb/branch/main/graph/badge.svg?token=DVSBZY794D)](https://codecov.io/gh/robertbetts/nuropb) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![CodeFactor](https://www.codefactor.io/repository/github/robertbetts/nuropb/badge)](https://www.codefactor.io/repository/github/robertbetts/nuropb) [![License: Apache 2.0](https://img.shields.io/pypi/l/giteo)](https://www.apache.org/licenses/LICENSE-2.0.txt) +[![Documentation Status](https://readthedocs.org/projects/nuropb/badge/?version=latest)](https://nuropb.readthedocs.io/en/latest/?badge=latest) -Do you have a Python class that you want to make available as a service to consumers or other services, or -* You potentially want to scale a service horizontally many times over, likely at an unknown scale. -* Your service may need to communicate to other services -* There are event driven processes and flows across your service landscape -* You have websocket endpoints that need to integrate seamlessly across a service mesh and event driven architecture -* A growing army of Ml-Ops and Datascience engineers are joining, with the need to to integrate their efforts - across many systems. -* Needing a service proxy that bridges cloud VPNs and on-premise networks -If any of these are of interest to you, then NuroPb is worth considering. NuroPb It falls into the domain of -tools and frameworks for the abstraction of integration plumbing, enabling software engineers to focus on the -problems they're hired to solve. +If you have code that you want to easily scale, communicate with other services or provide access to consumers, or: +* You'd like to scale a service horizontally, many times over at an unknown scale. +* Your service needs to communicate with other services +* Implement event driven processes and flows +* A need for websocket endpoints that integrate seamlessly to backend services and events +* A proxy for REST Consumers to interact with asynchronous services +* A growing team of Ml-Ops and Datascience engineers who'd like to deploy their models as services +* Require service gateway that bridges cloud VPNs and on-premise networks +* Wrap an existing or legacy service to benefit from any of the above + +**If any of these are of interest to you, NuroPb is worth considering.** ## Where does the name originate from? -NuroPb is a contraction of the term nervous system and the scientific symbol for Lead. Lead -associated with plumbing. So NuroPb is a system's nervous system and plumbing. +NuroPb is a contraction of the term nervous [system] and the scientific symbol for Lead and its +association with plumbing. So then NuroPb, the plumbing, routing and communications for connected services. ## Pattern and Approach NuroPb is a pattern and approach that supports event driven and service mesh engineering requirements. The @@ -166,3 +167,6 @@ if __name__ == "__main__": ``` +NuroPb is available under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html), +this web site including all documentation is licensed under [Creative +Commons 3.0](https://creativecommons.org/licenses/by/3.0/). diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d4bb2cb..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/examples.md b/docs/examples.md deleted file mode 100644 index 9242255..0000000 --- a/docs/examples.md +++ /dev/null @@ -1,89 +0,0 @@ -# Examples using nuroPb as the plumbing for a service mesh, async RPC, etc. - -This code here is as example and to demonstrate the concepts of the nuroPb service mesh library. Its -is also use by the development team for integration testing to validate of some in flight design and -improvements. - -Concepts demonstrated in this example are: -* Using the nuropb module to connect and make rpc calls to a service on the mesh -* Setting up the most basic of service mesh services -* Contexts and context propagation -* Authorisation -* Encryption of request-response payloads -* Using etcd to for service leader election and coordinated configuration for a new service mesh for example - when spinning up a new cluster of services that not every service instance is attempting to concurrently - configure RabbitMQ, or other service infrastructure configurations. -* etcd is disabled by default in the `examples/server.py` example, but can be enabled by setting the - `enable_etcd_usage` variable to `True` -* Various Python asyncio concepts and examples - -## Prerequisites - -Notes: -* Tested and developed on macOS, Windows 10 and various Linux distros -* Standalone or Docker and Kubernetes friendly -* Only infrastructure for RabbitMQ, no database or other required - * Caveat: Optionally, etcd is used for leader election and service mesh configuration - -Package dependencies: -* Python >= 3.10 - * Development and testing on 3.11 -* etcd >= 3.4.0 - * Optional and used for leader election and service mesh configuration -* RabbitMQ >= 3.8.0 + Management Plugin - * Likely work on earlier versions, but not tested -* Python packages: - * Tornado >= 6.3.0 (likely to work of earlier versions of 6.x but not tested) - * Pika >= 1.2.0 - -## Running this example - -Install RabbitMQ in any fashion you like, but the easiest is to use Docker: - -```bash -# Update as needed, Docker external ip address, used for connecting to RabbitMQ or etc containers -export DOCKER_HOST_NAME=localhost - -# RabbitMQ with management plugin -docker run -d --name nuropb-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management - -# OPTIONAL: etcd for leader election and service mesh configuration -docker run -d --name nuropb-etcd \ - -p 2379:2379 \ - -p 2380:2380 \ - --env ALLOW_NONE_AUTHENTICATION=yes \ - --env ETCD_ADVERTISE_CLIENT_URLS=http://${DOCKER_HOST_NAME}:2379 \ - bitnami/etcd:latest -``` - -Clone the repo and install the dependencies: -* note: install poetry if you don't have it already `pip install poetry` -```bash -git clone https://github.com/robertbetts/nuropb.git -cd nuropb -poetry install -``` - -next step, before running the example code is to initialize the service mesh configuration in rabbitmq. -This can be performed either by running the `scripted_mesh_setup.py` or `server.py` examples. -*NOTE* `server_basic.py` does not set up the service mesh configuration. -```bash -poetry run python examples/scripted_mesh_setup.py -# or -poetry run python examples/server.py -``` - -The `examples/server_basic.py` example is for reference mainly, there are no requests from -`examples/client.py`. Add them at your pleasure. - -Finally, run the client example. -```bash -poetry run python examples/client.py -``` - -**`all_in_one.py`** is a single file example of a client and server running in the same python file. It also -demonstrates the use of the `nuropb_context` and `publish_to_mesh` context manager decorators - -And there you are. Let us know what you think! All feedback is welcome. - - diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index cc87732..0000000 --- a/docs/index.md +++ /dev/null @@ -1,8 +0,0 @@ -```{include} ../README.md -``` - -# Indices and tables - -- {ref}`genindex` -- {ref}`modindex` -- {ref}`search` diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 954237b..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/conf.py b/docs/source/conf.py similarity index 86% rename from docs/conf.py rename to docs/source/conf.py index bb9ea5c..6e60199 100644 --- a/docs/conf.py +++ b/docs/source/conf.py @@ -33,27 +33,35 @@ extensions = [ "myst_parser", - "sphinx.ext.todo", + "autodoc2", + "sphinx_rtd_theme", + # "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx.ext.autodoc", - "sphinx_rtd_theme", "sphinx.ext.autosummary", - # "sphinx.ext.opengraph", + # "sphinxext.opengraph", # "sphinxcontrib.spelling", # "sphinx_copybutton", - "autoapi.extension", - "nbsphinx", + # "autoapi.extension", + # "nbsphinx", ] -spelling_warning = True -spelling_show_suggestions = True - -autoapi_type = "python" -autoapi_dirs = ["../src", '../examples'] - templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +ogp_site_url = "https://nuropb.readthedocs.io/en/latest/" + +spelling_warning = True +spelling_show_suggestions = True + +autodoc2_packages = [ + { + "path": "../../nuropb", + "auto_mode": True, + }, +] + source_suffix = { '.rst': 'restructuredtext', '.md': 'markdown', diff --git a/docs/source/etcd.md b/docs/source/etcd.md new file mode 100644 index 0000000..5e7246d --- /dev/null +++ b/docs/source/etcd.md @@ -0,0 +1,24 @@ +# etcd + +* Using etcd to for service leader election and coordinated configuration for a new service mesh for example + when spinning up a new cluster of services that not every service instance is attempting to concurrently + configure RabbitMQ, or other service infrastructure configurations. +* etcd is disabled by default in the `examples/server.py` example, but can be enabled by setting the + `enable_etcd_usage` variable to `True` + +```bash +# Update as needed, the docker ip address which in many cases is `localhost`. this will also be the RabbitMQ +# host address used by the examples. +export DOCKER_HOST_NAME=localhost + +# run RabbitMQ image with management plugin, exposing the amqp and management ports +docker run -d --name nuropb-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management + +# OPTIONAL: etcd for leader election and service mesh configuration +docker run -d --name nuropb-etcd \ + -p 2379:2379 \ + -p 2380:2380 \ + --env ALLOW_NONE_AUTHENTICATION=yes \ + --env ETCD_ADVERTISE_CLIENT_URLS=http://${DOCKER_HOST_NAME}:2379 \ + bitnami/etcd:latest +``` diff --git a/docs/source/examples.md b/docs/source/examples.md new file mode 100644 index 0000000..ccd22dc --- /dev/null +++ b/docs/source/examples.md @@ -0,0 +1,3 @@ + +```{include} ../../examples/README.md +``` \ No newline at end of file diff --git a/docs/source/index.md b/docs/source/index.md new file mode 100644 index 0000000..fc6636c --- /dev/null +++ b/docs/source/index.md @@ -0,0 +1,13 @@ + +```{include} ../../README.md +``` + +```{toctree} +:hidden: +:maxdepth: 2 + +installation.md +examples.md +apidocs/index +``` + diff --git a/docs/source/installation.md b/docs/source/installation.md new file mode 100644 index 0000000..f34d65b --- /dev/null +++ b/docs/source/installation.md @@ -0,0 +1 @@ +# Installation \ No newline at end of file diff --git a/docs/requirements.in b/docs/source/requirements.in similarity index 60% rename from docs/requirements.in rename to docs/source/requirements.in index c466517..4374961 100644 --- a/docs/requirements.in +++ b/docs/source/requirements.in @@ -5,4 +5,7 @@ myst-parser==2.0.0 sphinx-autobuild==2021.3.14 nbsphinx==0.9.3 sphinx-autoapi==3.0.0 -sphinx-rtd-theme==1.3.0 \ No newline at end of file +sphinxext-opengraph==0.8.2 +sphinxcontrib-spelling==8.0.0 +sphinx-copybutton==0.5.2 +sphinx-autodoc2==0.4.2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/source/requirements.txt similarity index 80% rename from docs/requirements.txt rename to docs/source/requirements.txt index 3f47f3f..a685855 100644 --- a/docs/requirements.txt +++ b/docs/source/requirements.txt @@ -9,7 +9,9 @@ alabaster==0.7.13 anyascii==0.3.2 # via sphinx-autoapi astroid==3.0.0 - # via sphinx-autoapi + # via + # sphinx-autoapi + # sphinx-autodoc2 attrs==23.1.0 # via # jsonschema @@ -26,6 +28,10 @@ charset-normalizer==3.2.0 # via requests colorama==0.4.6 # via sphinx-autobuild +contourpy==1.1.1 + # via matplotlib +cycler==0.12.0 + # via matplotlib defusedxml==0.7.1 # via nbconvert docutils==0.18.1 @@ -36,6 +42,8 @@ docutils==0.18.1 # sphinx-rtd-theme fastjsonschema==2.18.0 # via nbformat +fonttools==4.43.0 + # via matplotlib idna==3.4 # via requests imagesize==1.4.1 @@ -61,6 +69,8 @@ jupyter-core==5.3.2 # nbformat jupyterlab-pygments==0.2.2 # via nbconvert +kiwisolver==1.4.5 + # via matplotlib livereload==2.6.3 # via sphinx-autobuild markdown-it-py==3.0.0 @@ -71,6 +81,8 @@ markupsafe==2.1.3 # via # jinja2 # nbconvert +matplotlib==3.8.0 + # via sphinxext-opengraph mdit-py-plugins==0.4.0 # via myst-parser mdurl==0.1.2 @@ -90,20 +102,33 @@ nbformat==5.9.2 # nbsphinx nbsphinx==0.9.3 # via -r requirements.in +numpy==1.26.0 + # via + # contourpy + # matplotlib packaging==23.1 # via + # matplotlib # nbconvert # sphinx pandocfilters==1.5.0 # via nbconvert +pillow==10.0.1 + # via matplotlib platformdirs==3.10.0 # via jupyter-core +pyenchant==3.2.2 + # via sphinxcontrib-spelling pygments==2.16.1 # via # nbconvert # sphinx +pyparsing==3.1.1 + # via matplotlib python-dateutil==2.8.2 - # via jupyter-client + # via + # jupyter-client + # matplotlib pyyaml==6.0.1 # via # myst-parser @@ -138,6 +163,7 @@ sphinx==7.2.6 # nbsphinx # sphinx-autoapi # sphinx-autobuild + # sphinx-copybutton # sphinx-rtd-theme # sphinxcontrib-applehelp # sphinxcontrib-devhelp @@ -145,10 +171,16 @@ sphinx==7.2.6 # sphinxcontrib-jquery # sphinxcontrib-qthelp # sphinxcontrib-serializinghtml + # sphinxcontrib-spelling + # sphinxext-opengraph sphinx-autoapi==3.0.0 # via -r requirements.in sphinx-autobuild==2021.3.14 # via -r requirements.in +sphinx-autodoc2==0.4.2 + # via -r requirements.in +sphinx-copybutton==0.5.2 + # via -r requirements.in sphinx-rtd-theme==1.3.0 # via -r requirements.in sphinxcontrib-applehelp==1.0.7 @@ -165,6 +197,10 @@ sphinxcontrib-qthelp==1.0.6 # via sphinx sphinxcontrib-serializinghtml==1.1.9 # via sphinx +sphinxcontrib-spelling==8.0.0 + # via -r requirements.in +sphinxext-opengraph==0.8.2 + # via -r requirements.in tinycss2==1.2.1 # via nbconvert tornado==6.3.3 @@ -179,6 +215,8 @@ traitlets==5.10.1 # nbconvert # nbformat # nbsphinx +typing-extensions==4.8.0 + # via sphinx-autodoc2 urllib3==2.0.5 # via requests webencodings==0.5.1 diff --git a/examples/README.md b/examples/README.md index 9242255..a4b64a1 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,76 +1,76 @@ -# Examples using nuroPb as the plumbing for a service mesh, async RPC, etc. +# Examples -This code here is as example and to demonstrate the concepts of the nuroPb service mesh library. Its -is also use by the development team for integration testing to validate of some in flight design and +The [example code](https://github.com/robertbetts/nuropb/tree/main/examples) and setup instructions are +intended to help get going quickly and to demonstrate concepts applied by NuroPb. These examples are +also used by the project's developers with integration testing and to validate designs and general improvements. -Concepts demonstrated in this example are: -* Using the nuropb module to connect and make rpc calls to a service on the mesh -* Setting up the most basic of service mesh services -* Contexts and context propagation -* Authorisation -* Encryption of request-response payloads -* Using etcd to for service leader election and coordinated configuration for a new service mesh for example - when spinning up a new cluster of services that not every service instance is attempting to concurrently - configure RabbitMQ, or other service infrastructure configurations. -* etcd is disabled by default in the `examples/server.py` example, but can be enabled by setting the - `enable_etcd_usage` variable to `True` -* Various Python asyncio concepts and examples +## Demonstrated Concepts +* Connecting a service and connect to services for making rpc / request-response calls +* A very basic service with nuropb +* more complexity such as: + * Contexts and context propagation + * Authorisation + * Point-to-point encryption ## Prerequisites - -Notes: -* Tested and developed on macOS, Windows 10 and various Linux distros -* Standalone or Docker and Kubernetes friendly -* Only infrastructure for RabbitMQ, no database or other required - * Caveat: Optionally, etcd is used for leader election and service mesh configuration - -Package dependencies: +```{note} +* Has been tested and developed on macOS, Windows 10 and various Linux distros +* Standalone, VSI, Docker or Kubernetes friendly +* RabbitMQ only, no other database or infrustructure required +``` * Python >= 3.10 * Development and testing on 3.11 -* etcd >= 3.4.0 - * Optional and used for leader election and service mesh configuration * RabbitMQ >= 3.8.0 + Management Plugin - * Likely work on earlier versions, but not tested + * Likely work on earlier versions, not tested * Python packages: - * Tornado >= 6.3.0 (likely to work of earlier versions of 6.x but not tested) + * Tornado >= 6.3.0 (likely to work of earlier versions of 6.x, not tested) * Pika >= 1.2.0 -## Running this example - -Install RabbitMQ in any fashion you like, but the easiest is to use Docker: +## Environment Setup +Install [RabbitMQ](https://www.rabbitmq.com/) in any fashion you like, it's quick and easy using +[Docker](https://www.docker.com/). +Assuming you are able to run a docker container, here is an example of running RabbitMQ. ```bash -# Update as needed, Docker external ip address, used for connecting to RabbitMQ or etc containers +# Update as needed, the docker ip address which in many cases is `localhost`. This will +# also be the RabbitMQ host address used by the examples. export DOCKER_HOST_NAME=localhost -# RabbitMQ with management plugin +# run the RabbitMQ docker image with management plugin, exposing the amqp and management +# ports docker run -d --name nuropb-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management - -# OPTIONAL: etcd for leader election and service mesh configuration -docker run -d --name nuropb-etcd \ - -p 2379:2379 \ - -p 2380:2380 \ - --env ALLOW_NONE_AUTHENTICATION=yes \ - --env ETCD_ADVERTISE_CLIENT_URLS=http://${DOCKER_HOST_NAME}:2379 \ - bitnami/etcd:latest ``` - -Clone the repo and install the dependencies: -* note: install poetry if you don't have it already `pip install poetry` +You can either install nuropb from PYPI, copy the examples from github and run them locally or clone the repo and +setup the repo: +```bash +pip install nuropb +# alternatively, if using poetry +poetry add nuropb +``` +For cloning the repo and running the examples locally, follow these steps: +```{note} +This is where in addition to having Python >= 3.10, you will also require the `poetry` +package manager insatlled. `pip install poetry` +``` ```bash git clone https://github.com/robertbetts/nuropb.git cd nuropb poetry install ``` -next step, before running the example code is to initialize the service mesh configuration in rabbitmq. -This can be performed either by running the `scripted_mesh_setup.py` or `server.py` examples. -*NOTE* `server_basic.py` does not set up the service mesh configuration. +## Running an Example + +The next step is to initialize the nuropb service mesh configuration in RabbitMQ. This can be performed by +running the [scripted_mesh_setup.py](#myst_parser.sphinx_ext.main.setup_sphinx) and is required to be run before trying `server_basic.py`. With the example +`server.py`, the setup of the service mesh configuration is done automatically. + ```bash +# Check that the RabbitMQ container is running and in the code , that the variables `amqp_url` and `rmq_api_url` +# are correct. The default values are `amqp://guest:guest@localhost:5672/nuropb-example` and +# `http://guest:guest@localhost:15672/api/` respectively. + poetry run python examples/scripted_mesh_setup.py -# or -poetry run python examples/server.py ``` The `examples/server_basic.py` example is for reference mainly, there are no requests from diff --git a/poetry.lock b/poetry.lock index 3992e1b..aae697d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -523,6 +523,77 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + [[package]] name = "coverage" version = "7.3.1" @@ -646,6 +717,21 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "cycler" +version = "0.12.0" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.0-py3-none-any.whl", hash = "sha256:7896994252d006771357777d0251f3e34d266f4fa5f2c572247a80ab01440947"}, + {file = "cycler-0.12.0.tar.gz", hash = "sha256:8cc3a7b4861f91b1095157f9916f748549a617046e67eb7619abed9b34d2c94a"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "defusedxml" version = "0.7.1" @@ -817,6 +903,71 @@ docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1 testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] typing = ["typing-extensions (>=4.7.1)"] +[[package]] +name = "fonttools" +version = "4.43.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.43.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef"}, + {file = "fonttools-4.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213"}, + {file = "fonttools-4.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84"}, + {file = "fonttools-4.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3"}, + {file = "fonttools-4.43.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef"}, + {file = "fonttools-4.43.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803"}, + {file = "fonttools-4.43.0-cp310-cp310-win32.whl", hash = "sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1"}, + {file = "fonttools-4.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38"}, + {file = "fonttools-4.43.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465"}, + {file = "fonttools-4.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92"}, + {file = "fonttools-4.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd"}, + {file = "fonttools-4.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64"}, + {file = "fonttools-4.43.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a"}, + {file = "fonttools-4.43.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9"}, + {file = "fonttools-4.43.0-cp311-cp311-win32.whl", hash = "sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e"}, + {file = "fonttools-4.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186"}, + {file = "fonttools-4.43.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3"}, + {file = "fonttools-4.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f"}, + {file = "fonttools-4.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92"}, + {file = "fonttools-4.43.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69"}, + {file = "fonttools-4.43.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7"}, + {file = "fonttools-4.43.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a"}, + {file = "fonttools-4.43.0-cp312-cp312-win32.whl", hash = "sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f"}, + {file = "fonttools-4.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348"}, + {file = "fonttools-4.43.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289"}, + {file = "fonttools-4.43.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3"}, + {file = "fonttools-4.43.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126"}, + {file = "fonttools-4.43.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662"}, + {file = "fonttools-4.43.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe"}, + {file = "fonttools-4.43.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544"}, + {file = "fonttools-4.43.0-cp38-cp38-win32.whl", hash = "sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646"}, + {file = "fonttools-4.43.0-cp38-cp38-win_amd64.whl", hash = "sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836"}, + {file = "fonttools-4.43.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1"}, + {file = "fonttools-4.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da"}, + {file = "fonttools-4.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c"}, + {file = "fonttools-4.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb"}, + {file = "fonttools-4.43.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce"}, + {file = "fonttools-4.43.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e"}, + {file = "fonttools-4.43.0-cp39-cp39-win32.whl", hash = "sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1"}, + {file = "fonttools-4.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f"}, + {file = "fonttools-4.43.0-py3-none-any.whl", hash = "sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384"}, + {file = "fonttools-4.43.0.tar.gz", hash = "sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e"}, +] + +[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.0.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.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + [[package]] name = "frozenlist" version = "1.4.0" @@ -928,6 +1079,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.0" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, + {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, +] + +[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" @@ -1096,6 +1265,119 @@ completion = ["shtab"] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +[[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" @@ -1194,6 +1476,56 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "matplotlib" +version = "3.8.0" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c4940bad88a932ddc69734274f6fb047207e008389489f2b6f77d9ca485f0e7a"}, + {file = "matplotlib-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a33bd3045c7452ca1fa65676d88ba940867880e13e2546abb143035fa9072a9d"}, + {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea6886e93401c22e534bbfd39201ce8931b75502895cfb115cbdbbe2d31f287"}, + {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d670b9348e712ec176de225d425f150dc8e37b13010d85233c539b547da0be39"}, + {file = "matplotlib-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7b37b74f00c4cb6af908cb9a00779d97d294e89fd2145ad43f0cdc23f635760c"}, + {file = "matplotlib-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:0e723f5b96f3cd4aad99103dc93e9e3cdc4f18afdcc76951f4857b46f8e39d2d"}, + {file = "matplotlib-3.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5dc945a9cb2deb7d197ba23eb4c210e591d52d77bf0ba27c35fc82dec9fa78d4"}, + {file = "matplotlib-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b5a1bf27d078453aa7b5b27f52580e16360d02df6d3dc9504f3d2ce11f6309"}, + {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f25ffb6ad972cdffa7df8e5be4b1e3cadd2f8d43fc72085feb1518006178394"}, + {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee482731c8c17d86d9ddb5194d38621f9b0f0d53c99006275a12523ab021732"}, + {file = "matplotlib-3.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36eafe2128772195b373e1242df28d1b7ec6c04c15b090b8d9e335d55a323900"}, + {file = "matplotlib-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:061ee58facb3580cd2d046a6d227fb77e9295599c5ec6ad069f06b5821ad1cfc"}, + {file = "matplotlib-3.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3cc3776836d0f4f22654a7f2d2ec2004618d5cf86b7185318381f73b80fd8a2d"}, + {file = "matplotlib-3.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c49a2bd6981264bddcb8c317b6bd25febcece9e2ebfcbc34e7f4c0c867c09dc"}, + {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ed11654fc83cd6cfdf6170b453e437674a050a452133a064d47f2f1371f8d3"}, + {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae97fdd6996b3a25da8ee43e3fc734fff502f396801063c6b76c20b56683196"}, + {file = "matplotlib-3.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:87df75f528020a6299f76a1d986c0ed4406e3b2bd44bc5e306e46bca7d45e53e"}, + {file = "matplotlib-3.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:90d74a95fe055f73a6cd737beecc1b81c26f2893b7a3751d52b53ff06ca53f36"}, + {file = "matplotlib-3.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c3499c312f5def8f362a2bf761d04fa2d452b333f3a9a3f58805273719bf20d9"}, + {file = "matplotlib-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31e793c8bd4ea268cc5d3a695c27b30650ec35238626961d73085d5e94b6ab68"}, + {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5ee602ef517a89d1f2c508ca189cfc395dd0b4a08284fb1b97a78eec354644"}, + {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5de39dc61ca35342cf409e031f70f18219f2c48380d3886c1cf5ad9f17898e06"}, + {file = "matplotlib-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dd386c80a98b5f51571b9484bf6c6976de383cd2a8cd972b6a9562d85c6d2087"}, + {file = "matplotlib-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f691b4ef47c7384d0936b2e8ebdeb5d526c81d004ad9403dfb9d4c76b9979a93"}, + {file = "matplotlib-3.8.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b11f354aae62a2aa53ec5bb09946f5f06fc41793e351a04ff60223ea9162955"}, + {file = "matplotlib-3.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f54b9fb87ca5acbcdd0f286021bedc162e1425fa5555ebf3b3dfc167b955ad9"}, + {file = "matplotlib-3.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:60a6e04dfd77c0d3bcfee61c3cd335fff1b917c2f303b32524cd1235e194ef99"}, + {file = "matplotlib-3.8.0.tar.gz", hash = "sha256:df8505e1c19d5c2c26aff3497a7cbd3ccfc2e97043d1e4db3e76afa399164b69"}, +] + +[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.0.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" +setuptools_scm = ">=7" + [[package]] name = "mdit-py-plugins" version = "0.4.0" @@ -1577,6 +1909,47 @@ nbformat = "*" sphinx = ">=1.8" traitlets = ">=5" +[[package]] +name = "numpy" +version = "1.26.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "numpy-1.26.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8db2f125746e44dce707dd44d4f4efeea8d7e2b43aace3f8d1f235cfa2733dd"}, + {file = "numpy-1.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0621f7daf973d34d18b4e4bafb210bbaf1ef5e0100b5fa750bd9cde84c7ac292"}, + {file = "numpy-1.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51be5f8c349fdd1a5568e72713a21f518e7d6707bcf8503b528b88d33b57dc68"}, + {file = "numpy-1.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:767254ad364991ccfc4d81b8152912e53e103ec192d1bb4ea6b1f5a7117040be"}, + {file = "numpy-1.26.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:436c8e9a4bdeeee84e3e59614d38c3dbd3235838a877af8c211cfcac8a80b8d3"}, + {file = "numpy-1.26.0-cp310-cp310-win32.whl", hash = "sha256:c2e698cb0c6dda9372ea98a0344245ee65bdc1c9dd939cceed6bb91256837896"}, + {file = "numpy-1.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:09aaee96c2cbdea95de76ecb8a586cb687d281c881f5f17bfc0fb7f5890f6b91"}, + {file = "numpy-1.26.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:637c58b468a69869258b8ae26f4a4c6ff8abffd4a8334c830ffb63e0feefe99a"}, + {file = "numpy-1.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:306545e234503a24fe9ae95ebf84d25cba1fdc27db971aa2d9f1ab6bba19a9dd"}, + {file = "numpy-1.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6adc33561bd1d46f81131d5352348350fc23df4d742bb246cdfca606ea1208"}, + {file = "numpy-1.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e062aa24638bb5018b7841977c360d2f5917268d125c833a686b7cbabbec496c"}, + {file = "numpy-1.26.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:546b7dd7e22f3c6861463bebb000646fa730e55df5ee4a0224408b5694cc6148"}, + {file = "numpy-1.26.0-cp311-cp311-win32.whl", hash = "sha256:c0b45c8b65b79337dee5134d038346d30e109e9e2e9d43464a2970e5c0e93229"}, + {file = "numpy-1.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:eae430ecf5794cb7ae7fa3808740b015aa80747e5266153128ef055975a72b99"}, + {file = "numpy-1.26.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:166b36197e9debc4e384e9c652ba60c0bacc216d0fc89e78f973a9760b503388"}, + {file = "numpy-1.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f042f66d0b4ae6d48e70e28d487376204d3cbf43b84c03bac57e28dac6151581"}, + {file = "numpy-1.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5e18e5b14a7560d8acf1c596688f4dfd19b4f2945b245a71e5af4ddb7422feb"}, + {file = "numpy-1.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6bad22a791226d0a5c7c27a80a20e11cfe09ad5ef9084d4d3fc4a299cca505"}, + {file = "numpy-1.26.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4acc65dd65da28060e206c8f27a573455ed724e6179941edb19f97e58161bb69"}, + {file = "numpy-1.26.0-cp312-cp312-win32.whl", hash = "sha256:bb0d9a1aaf5f1cb7967320e80690a1d7ff69f1d47ebc5a9bea013e3a21faec95"}, + {file = "numpy-1.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ee84ca3c58fe48b8ddafdeb1db87388dce2c3c3f701bf447b05e4cfcc3679112"}, + {file = "numpy-1.26.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a873a8180479bc829313e8d9798d5234dfacfc2e8a7ac188418189bb8eafbd2"}, + {file = "numpy-1.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:914b28d3215e0c721dc75db3ad6d62f51f630cb0c277e6b3bcb39519bed10bd8"}, + {file = "numpy-1.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c78a22e95182fb2e7874712433eaa610478a3caf86f28c621708d35fa4fd6e7f"}, + {file = "numpy-1.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f737708b366c36b76e953c46ba5827d8c27b7a8c9d0f471810728e5a2fe57c"}, + {file = "numpy-1.26.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b44e6a09afc12952a7d2a58ca0a2429ee0d49a4f89d83a0a11052da696440e49"}, + {file = "numpy-1.26.0-cp39-cp39-win32.whl", hash = "sha256:5671338034b820c8d58c81ad1dafc0ed5a00771a82fccc71d6438df00302094b"}, + {file = "numpy-1.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:020cdbee66ed46b671429c7265cf00d8ac91c046901c55684954c3958525dab2"}, + {file = "numpy-1.26.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0792824ce2f7ea0c82ed2e4fecc29bb86bee0567a080dacaf2e0a01fe7654369"}, + {file = "numpy-1.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d484292eaeb3e84a51432a94f53578689ffdea3f90e10c8b203a99be5af57d8"}, + {file = "numpy-1.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:186ba67fad3c60dbe8a3abff3b67a91351100f2661c8e2a80364ae6279720299"}, + {file = "numpy-1.26.0.tar.gz", hash = "sha256:f93fc78fe8bf15afe2b8d6b6499f1c73953169fad1e9a8dd086cdff3190e7fdf"}, +] + [[package]] name = "packaging" version = "23.1" @@ -1640,6 +2013,73 @@ gevent = ["gevent"] tornado = ["tornado"] twisted = ["twisted"] +[[package]] +name = "pillow" +version = "10.0.1" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, + {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, + {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, + {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, + {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, + {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, + {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, +] + +[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 = "pkginfo" version = "1.9.6" @@ -1769,6 +2209,19 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] +[[package]] +name = "pyenchant" +version = "3.2.2" +description = "Python bindings for the Enchant spellchecking system" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyenchant-3.2.2-py3-none-any.whl", hash = "sha256:5facc821ece957208a81423af7d6ec7810dad29697cb0d77aae81e4e11c8e5a6"}, + {file = "pyenchant-3.2.2-py3-none-win32.whl", hash = "sha256:5a636832987eaf26efe971968f4d1b78e81f62bca2bde0a9da210c7de43c3bce"}, + {file = "pyenchant-3.2.2-py3-none-win_amd64.whl", hash = "sha256:6153f521852e23a5add923dbacfbf4bebbb8d70c4e4bad609a8e0f9faeb915d1"}, + {file = "pyenchant-3.2.2.tar.gz", hash = "sha256:1cf830c6614362a78aab78d50eaf7c6c93831369c52e1bb64ffae1df0341e637"}, +] + [[package]] name = "pygments" version = "2.16.1" @@ -1801,6 +2254,20 @@ cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] test = ["flaky", "pretend", "pytest (>=3.0.1)"] +[[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 = "pyproject-hooks" version = "1.0.0" @@ -2318,6 +2785,28 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments 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 = "setuptools-scm" +version = "8.0.3" +description = "the blessed package to manage your versions by scm tags" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-scm-8.0.3.tar.gz", hash = "sha256:0169fd70197efda2f8c4d0b2a7a3d614431b488116f37b79d031e9e7ec884d8c"}, + {file = "setuptools_scm-8.0.3-py3-none-any.whl", hash = "sha256:813822234453438a13c78d05c8af29918fbc06f88efb33d38f065340bbb48c39"}, +] + +[package.dependencies] +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["pytest", "rich", "virtualenv (>20)"] + [[package]] name = "shellingham" version = "1.5.3" @@ -2437,6 +2926,46 @@ sphinx = "*" [package.extras] test = ["pytest", "pytest-cov"] +[[package]] +name = "sphinx-autodoc2" +version = "0.4.2" +description = "Analyse a python project and create documentation for it." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinx-autodoc2-0.4.2.tar.gz", hash = "sha256:06da226a25a4339e173b34bb0e590e0ba9b4570b414796140aee1939d09acb3a"}, + {file = "sphinx_autodoc2-0.4.2-py3-none-any.whl", hash = "sha256:00835ba8c980b9c510ea794c3e2060e5a254a74c6c22badc9bfd3642dc1034b4"}, +] + +[package.dependencies] +astroid = ">=2.7" +tomli = {version = "*", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +cli = ["typer[all]"] +docs = ["furo", "myst-parser", "sphinx (>=4.0.0)"] +sphinx = ["sphinx (>=4.0.0)"] +testing = ["pytest", "pytest-cov", "pytest-regressions", "sphinx (>=4.0.0)"] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +description = "Add a copy button to each of your code cells." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] + [[package]] name = "sphinx-rtd-theme" version = "1.3.0" @@ -2574,6 +3103,39 @@ Sphinx = ">=5" lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] +[[package]] +name = "sphinxcontrib-spelling" +version = "8.0.0" +description = "Sphinx spelling extension" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinxcontrib-spelling-8.0.0.tar.gz", hash = "sha256:199d0a16902ad80c387c2966dc9eb10f565b1fb15ccce17210402db7c2443e5c"}, + {file = "sphinxcontrib_spelling-8.0.0-py3-none-any.whl", hash = "sha256:b27e0a16aef00bcfc888a6490dc3f16651f901dc475446c6882834278c8dc7b3"}, +] + +[package.dependencies] +PyEnchant = ">=3.1.1" +Sphinx = ">=3.0.0" + +[package.extras] +test = ["coverage (>=4.0,!=4.4)", "pytest", "pytest-cov"] + +[[package]] +name = "sphinxext-opengraph" +version = "0.8.2" +description = "Sphinx Extension to enable OGP support" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinxext-opengraph-0.8.2.tar.gz", hash = "sha256:45a693b6704052c426576f0a1f630649c55b4188bc49eb63e9587e24a923db39"}, + {file = "sphinxext_opengraph-0.8.2-py3-none-any.whl", hash = "sha256:6a05bdfe5176d9dd0a1d58a504f17118362ab976631213cd36fb44c4c40544c9"}, +] + +[package.dependencies] +matplotlib = "*" +sphinx = ">=4.0" + [[package]] name = "tinycss2" version = "1.2.1" @@ -2936,4 +3498,4 @@ docs = [] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "4c2547f3ee52b18ba02444941b2ecfbb83d0d89e0f148ea1fac13af7d54ac3be" +content-hash = "f880b271fc172622c18e13506455366457617491100a4594d3854e5cb34dae5d" diff --git a/pyproject.toml b/pyproject.toml index 23f2e2b..d1939a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,6 @@ types-requests = "^2.31.0.2" tornado = "^6.3.3" etcd3-py = "^0.1.6" - [tool.poetry.group.dev.dependencies] poetry = "^1.5.1" pytest = "^7.3.1" @@ -53,7 +52,10 @@ readthedocs-sphinx-search = "^0.3.1" sphinx-autobuild = "^2021.3.14" nbsphinx = "^0.9.3" sphinx-autoapi = "^3.0.0" -sphinx-rtd-theme = "^1.3.0" +sphinxext-opengraph = "^0.8.2" +sphinxcontrib-spelling = "^8.0.0" +sphinx-copybutton = "^0.5.2" +sphinx-autodoc2 = "^0.4.2" [build-system] requires = ["poetry-core"] @@ -89,7 +91,7 @@ mypy_path = "src" namespace_packages = true explicit_package_bases = true show_error_codes = true -strict = true +#strict = true enable_error_code = [ "ignore-without-code", "redundant-expr", @@ -101,4 +103,4 @@ exclude = [ [tool.pylint] #ignore-paths = "tests" -notes = "FIXME,XXX" \ No newline at end of file +notes = "FIXME,XXX,FUTURE" \ No newline at end of file From b5897614f11fefadddb7bd9087f763b1a12c7c79 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Sat, 30 Sep 2023 18:39:02 +0100 Subject: [PATCH 8/9] More documentation --- README.md | 143 -- .../apidocs/examples/examples.all_in_one.md | 121 ++ .../apidocs/examples/examples.client.md | 90 ++ docs/source/apidocs/examples/examples.md | 22 + .../examples/examples.scripted_mesh_setup.md | 122 ++ .../apidocs/examples/examples.server.md | 54 + .../apidocs/examples/examples.server_basic.md | 111 ++ .../examples/examples.service_example.md | 187 +++ docs/source/apidocs/index.rst | 12 + .../nuropb/nuropb.contexts.context_manager.md | 286 ++++ ...ropb.contexts.context_manager_decorator.md | 42 + .../nuropb/nuropb.contexts.describe.md | 89 ++ docs/source/apidocs/nuropb/nuropb.contexts.md | 20 + .../nuropb.contexts.service_handlers.md | 122 ++ .../nuropb/nuropb.encodings.encryption.md | 183 +++ .../nuropb.encodings.json_serialisation.md | 122 ++ .../source/apidocs/nuropb/nuropb.encodings.md | 19 + .../nuropb/nuropb.encodings.serializor.md | 75 + .../source/apidocs/nuropb/nuropb.interface.md | 1390 +++++++++++++++++ docs/source/apidocs/nuropb/nuropb.md | 33 + docs/source/apidocs/nuropb/nuropb.rmq_api.md | 356 +++++ docs/source/apidocs/nuropb/nuropb.rmq_lib.md | 207 +++ .../apidocs/nuropb/nuropb.rmq_transport.md | 871 +++++++++++ .../apidocs/nuropb/nuropb.service_runner.md | 435 ++++++ docs/source/apidocs/nuropb/nuropb.testing.md | 17 + .../apidocs/nuropb/nuropb.testing.stubs.md | 261 ++++ docs/source/apidocs/nuropb/nuropb.utils.md | 31 + docs/source/background.md | 24 + docs/source/conf.py | 14 +- docs/source/contexts.md | 3 + docs/source/encryption.md | 3 + docs/source/etcd.md | 24 - docs/source/index.md | 20 +- docs/source/installation.md | 1 - docs/source/quickstart.md | 123 ++ examples/README.md | 11 +- examples/__init__.py | 0 poetry.lock | 317 +++- pyproject.toml | 1 + src/nuropb/contexts/README.md | 2 +- src/nuropb/contexts/context_manager.py | 16 +- src/nuropb/encodings/README.md | 11 +- src/nuropb/rmq_api.py | 5 +- 43 files changed, 5712 insertions(+), 284 deletions(-) create mode 100644 docs/source/apidocs/examples/examples.all_in_one.md create mode 100644 docs/source/apidocs/examples/examples.client.md create mode 100644 docs/source/apidocs/examples/examples.md create mode 100644 docs/source/apidocs/examples/examples.scripted_mesh_setup.md create mode 100644 docs/source/apidocs/examples/examples.server.md create mode 100644 docs/source/apidocs/examples/examples.server_basic.md create mode 100644 docs/source/apidocs/examples/examples.service_example.md create mode 100644 docs/source/apidocs/index.rst create mode 100644 docs/source/apidocs/nuropb/nuropb.contexts.context_manager.md create mode 100644 docs/source/apidocs/nuropb/nuropb.contexts.context_manager_decorator.md create mode 100644 docs/source/apidocs/nuropb/nuropb.contexts.describe.md create mode 100644 docs/source/apidocs/nuropb/nuropb.contexts.md create mode 100644 docs/source/apidocs/nuropb/nuropb.contexts.service_handlers.md create mode 100644 docs/source/apidocs/nuropb/nuropb.encodings.encryption.md create mode 100644 docs/source/apidocs/nuropb/nuropb.encodings.json_serialisation.md create mode 100644 docs/source/apidocs/nuropb/nuropb.encodings.md create mode 100644 docs/source/apidocs/nuropb/nuropb.encodings.serializor.md create mode 100644 docs/source/apidocs/nuropb/nuropb.interface.md create mode 100644 docs/source/apidocs/nuropb/nuropb.md create mode 100644 docs/source/apidocs/nuropb/nuropb.rmq_api.md create mode 100644 docs/source/apidocs/nuropb/nuropb.rmq_lib.md create mode 100644 docs/source/apidocs/nuropb/nuropb.rmq_transport.md create mode 100644 docs/source/apidocs/nuropb/nuropb.service_runner.md create mode 100644 docs/source/apidocs/nuropb/nuropb.testing.md create mode 100644 docs/source/apidocs/nuropb/nuropb.testing.stubs.md create mode 100644 docs/source/apidocs/nuropb/nuropb.utils.md create mode 100644 docs/source/background.md create mode 100644 docs/source/contexts.md create mode 100644 docs/source/encryption.md delete mode 100644 docs/source/etcd.md delete mode 100644 docs/source/installation.md create mode 100644 docs/source/quickstart.md create mode 100644 examples/__init__.py diff --git a/README.md b/README.md index fdb9e98..effd99b 100644 --- a/README.md +++ b/README.md @@ -21,151 +21,8 @@ If you have code that you want to easily scale, communicate with other services **If any of these are of interest to you, NuroPb is worth considering.** -## Where does the name originate from? -NuroPb is a contraction of the term nervous [system] and the scientific symbol for Lead and its -association with plumbing. So then NuroPb, the plumbing, routing and communications for connected services. -## Pattern and Approach -NuroPb is a pattern and approach that supports event driven and service mesh engineering requirements. The -early roots evolved in the 2000's, and during the 2010's the pattern was used to drive hedge funds, startups, -banks and crypto and blockchain ventures. It's core development is in Python, and the pattern has been used -alongside Java, JavasScript and GoLang, Unfortunately those efforts are copyrighted. Any platform with support -for RabbitMQ should be able to implement the pattern and exist on the same mesh as Python Services. -RabbitMQ is the underlying message broker for the NuroPb service mesh library. Various message brokers and -broker-less tools and approaches have been tried with the nuropb pattern. Some of these are Kafka, MQSeries and -ZeroMQ. RabbitMQ's AMPQ routing capabilities, low maintenance and robustness have proved the test of time. With -RabbitMQ's release of the streams feature, and offering message/logs streaming capabilities, there are new -and interesting opportunities all on a single platform. - -**Why not Kafka**? Kafka is a great tool, but it's not a message broker. It's a distributed log stream and -probably one of the best available. There are many use cases where NuroPb + RabbitMQ would integrate very -nicely alongside Kafka. Especially inter-process rpc and orderless event driven flows that are orchestrated -by NuroPb and ordered log/event streaming over Kafka. Kafka is also been used as to ingest all nuropb traffic -for auditing and tracing. - -## Getting started -The best way to get started is to look at the examples and the `examples/README.md` file. - -As a super quick reference this si what you need to get started: -* Python >= 3.10 -* RabbitMQ >= 3.8.0 + Management Plugin -* `pip install nuropb` - -This code block is an example of a client and server running in the same python file. - -```python -import logging -from typing import Any, Dict -from uuid import uuid4 -import asyncio - -from nuropb.contexts.context_manager import NuropbContextManager -from nuropb.contexts.context_manager_decorator import nuropb_context -from nuropb.contexts.describe import publish_to_mesh -from nuropb.rmq_api import RMQAPI - -logger = logging.getLogger("nuropb-all-in-one") - - -def get_claims_from_token(bearer_token: str) -> Dict[str, Any] | None: - """ This is a stub for the required implementation of validating and decoding the bearer token - """ - _ = bearer_token - return { - "sub": "test_user", - "user_id": "test_user", - "scope": "openid, profile", - "roles": "user, admin", - } - - -class QuickExampleService: - _service_name = "quick-example" - _instance_id = uuid4().hex - - @nuropb_context - @publish_to_mesh(authorize_func=get_claims_from_token) - def test_requires_user_claims(self, ctx, **kwargs: Any) -> str: - logger.info("test_requires_user_claims called") - assert isinstance(ctx, NuropbContextManager) - return f"hello {ctx.user_claims['user_id']}" - - def test_method(self, param1, param2: Dict[str, Any]) -> Dict[str, Any]: - logger.info("test_method called") - _ = self - return { - "param1": param1, - "param2": param2, - "reply": "response from test_method", - } - - -async def main(): - logging.info("All in one example done") - amqp_url = "amqp://guest:guest@localhost:5672/nuropb-example" - service_instance = QuickExampleService() - transport_settings = { - "rpc_bindings": [service_instance._service_name], - } - service_api = RMQAPI( - service_instance=service_instance, - service_name=service_instance._service_name, - instance_id=service_instance._instance_id, - amqp_url=amqp_url, - transport_settings=transport_settings, - ) - await service_api.connect() - logger.info("Service Ready") - - client_api = RMQAPI( - amqp_url=amqp_url, - ) - await client_api.connect() - logger.info("Client connected") - - context = { - "Authorization": "Bearer 1234567890", - } - response = await client_api.request( - service="quick-example", - method="test_requires_user_claims", - params={}, - context=context, - ) - logger.info(f"Response: {response}") - - response = await client_api.request( - service="quick-example", - method="test_method", - params={ - "param1": "value1", - "param2": { - "param2a": "value2a", - } - }, - context={}, - ) - logger.info(f"Response: {response}") - - await client_api.disconnect() - await service_api.disconnect() - - logging.info("All in one example done") - - -if __name__ == "__main__": - log_format = ( - "%(levelname).1s %(asctime)s %(name) -25s %(funcName) " - "-35s %(lineno) -5d: %(message)s" - ) - logging.basicConfig(level=logging.INFO, format=log_format) - logging.getLogger("pika").setLevel(logging.WARNING) - logging.getLogger("etcd3").setLevel(logging.WARNING) - logging.getLogger("urllib3").setLevel(logging.WARNING) - asyncio.run(main()) - -``` NuroPb is available under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html), this web site including all documentation is licensed under [Creative diff --git a/docs/source/apidocs/examples/examples.all_in_one.md b/docs/source/apidocs/examples/examples.all_in_one.md new file mode 100644 index 0000000..9320bb9 --- /dev/null +++ b/docs/source/apidocs/examples/examples.all_in_one.md @@ -0,0 +1,121 @@ +# {py:mod}`examples.all_in_one` + +```{py:module} examples.all_in_one +``` + +```{autodoc2-docstring} examples.all_in_one +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`QuickExampleService ` + - ```{autodoc2-docstring} examples.all_in_one.QuickExampleService + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`get_claims_from_token ` + - ```{autodoc2-docstring} examples.all_in_one.get_claims_from_token + :summary: + ``` +* - {py:obj}`main ` + - ```{autodoc2-docstring} examples.all_in_one.main + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} examples.all_in_one.logger + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: examples.all_in_one.logger +:value: > + None + +```{autodoc2-docstring} examples.all_in_one.logger +``` + +```` + +````{py:function} get_claims_from_token(bearer_token: str) -> typing.Dict[str, typing.Any] | None +:canonical: examples.all_in_one.get_claims_from_token + +```{autodoc2-docstring} examples.all_in_one.get_claims_from_token +``` +```` + +`````{py:class} QuickExampleService +:canonical: examples.all_in_one.QuickExampleService + +```{autodoc2-docstring} examples.all_in_one.QuickExampleService +``` + +````{py:attribute} _service_name +:canonical: examples.all_in_one.QuickExampleService._service_name +:value: > + 'quick-example' + +```{autodoc2-docstring} examples.all_in_one.QuickExampleService._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: examples.all_in_one.QuickExampleService._instance_id +:value: > + None + +```{autodoc2-docstring} examples.all_in_one.QuickExampleService._instance_id +``` + +```` + +````{py:method} test_requires_user_claims(ctx, **kwargs: typing.Any) -> str +:canonical: examples.all_in_one.QuickExampleService.test_requires_user_claims + +```{autodoc2-docstring} examples.all_in_one.QuickExampleService.test_requires_user_claims +``` + +```` + +````{py:method} test_method(param1, param2: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any] +:canonical: examples.all_in_one.QuickExampleService.test_method + +```{autodoc2-docstring} examples.all_in_one.QuickExampleService.test_method +``` + +```` + +````` + +````{py:function} main() +:canonical: examples.all_in_one.main +:async: + +```{autodoc2-docstring} examples.all_in_one.main +``` +```` diff --git a/docs/source/apidocs/examples/examples.client.md b/docs/source/apidocs/examples/examples.client.md new file mode 100644 index 0000000..ce4d4ec --- /dev/null +++ b/docs/source/apidocs/examples/examples.client.md @@ -0,0 +1,90 @@ +# {py:mod}`examples.client` + +```{py:module} examples.client +``` + +```{autodoc2-docstring} examples.client +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`perform_request ` + - ```{autodoc2-docstring} examples.client.perform_request + :summary: + ``` +* - {py:obj}`perform_command ` + - ```{autodoc2-docstring} examples.client.perform_command + :summary: + ``` +* - {py:obj}`publish_event ` + - ```{autodoc2-docstring} examples.client.publish_event + :summary: + ``` +* - {py:obj}`main ` + - ```{autodoc2-docstring} examples.client.main + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} examples.client.logger + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: examples.client.logger +:value: > + None + +```{autodoc2-docstring} examples.client.logger +``` + +```` + +````{py:function} perform_request(api: nuropb.rmq_api.RMQAPI, encryption_test: bool = False) +:canonical: examples.client.perform_request +:async: + +```{autodoc2-docstring} examples.client.perform_request +``` +```` + +````{py:function} perform_command(api: nuropb.rmq_api.RMQAPI) +:canonical: examples.client.perform_command +:async: + +```{autodoc2-docstring} examples.client.perform_command +``` +```` + +````{py:function} publish_event(api: nuropb.rmq_api.RMQAPI) +:canonical: examples.client.publish_event +:async: + +```{autodoc2-docstring} examples.client.publish_event +``` +```` + +````{py:function} main() +:canonical: examples.client.main +:async: + +```{autodoc2-docstring} examples.client.main +``` +```` diff --git a/docs/source/apidocs/examples/examples.md b/docs/source/apidocs/examples/examples.md new file mode 100644 index 0000000..b83c967 --- /dev/null +++ b/docs/source/apidocs/examples/examples.md @@ -0,0 +1,22 @@ +# {py:mod}`examples` + +```{py:module} examples +``` + +```{autodoc2-docstring} examples +:allowtitles: +``` + +## Submodules + +```{toctree} +:titlesonly: +:maxdepth: 1 + +examples.server +examples.service_example +examples.scripted_mesh_setup +examples.all_in_one +examples.client +examples.server_basic +``` diff --git a/docs/source/apidocs/examples/examples.scripted_mesh_setup.md b/docs/source/apidocs/examples/examples.scripted_mesh_setup.md new file mode 100644 index 0000000..3bb12f6 --- /dev/null +++ b/docs/source/apidocs/examples/examples.scripted_mesh_setup.md @@ -0,0 +1,122 @@ +# {py:mod}`examples.scripted_mesh_setup` + +```{py:module} examples.scripted_mesh_setup +``` + +```{autodoc2-docstring} examples.scripted_mesh_setup +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`MeshServiceInstance ` + - ```{autodoc2-docstring} examples.scripted_mesh_setup.MeshServiceInstance + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`main ` + - ```{autodoc2-docstring} examples.scripted_mesh_setup.main + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} examples.scripted_mesh_setup.logger + :summary: + ``` +* - {py:obj}`amqp_url ` + - ```{autodoc2-docstring} examples.scripted_mesh_setup.amqp_url + :summary: + ``` +* - {py:obj}`rmq_api_url ` + - ```{autodoc2-docstring} examples.scripted_mesh_setup.rmq_api_url + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: examples.scripted_mesh_setup.logger +:value: > + None + +```{autodoc2-docstring} examples.scripted_mesh_setup.logger +``` + +```` + +````{py:data} amqp_url +:canonical: examples.scripted_mesh_setup.amqp_url +:value: > + 'amqp://guest:guest@localhost:5672/nuropb-example' + +```{autodoc2-docstring} examples.scripted_mesh_setup.amqp_url +``` + +```` + +````{py:data} rmq_api_url +:canonical: examples.scripted_mesh_setup.rmq_api_url +:value: > + 'http://guest:guest@localhost:15672/api' + +```{autodoc2-docstring} examples.scripted_mesh_setup.rmq_api_url +``` + +```` + +`````{py:class} MeshServiceInstance +:canonical: examples.scripted_mesh_setup.MeshServiceInstance + +```{autodoc2-docstring} examples.scripted_mesh_setup.MeshServiceInstance +``` + +````{py:attribute} _service_name +:canonical: examples.scripted_mesh_setup.MeshServiceInstance._service_name +:value: > + 'mesh-setup' + +```{autodoc2-docstring} examples.scripted_mesh_setup.MeshServiceInstance._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: examples.scripted_mesh_setup.MeshServiceInstance._instance_id +:value: > + None + +```{autodoc2-docstring} examples.scripted_mesh_setup.MeshServiceInstance._instance_id +``` + +```` + +````` + +````{py:function} main() +:canonical: examples.scripted_mesh_setup.main +:async: + +```{autodoc2-docstring} examples.scripted_mesh_setup.main +``` +```` diff --git a/docs/source/apidocs/examples/examples.server.md b/docs/source/apidocs/examples/examples.server.md new file mode 100644 index 0000000..645c931 --- /dev/null +++ b/docs/source/apidocs/examples/examples.server.md @@ -0,0 +1,54 @@ +# {py:mod}`examples.server` + +```{py:module} examples.server +``` + +```{autodoc2-docstring} examples.server +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`main ` + - ```{autodoc2-docstring} examples.server.main + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} examples.server.logger + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: examples.server.logger +:value: > + None + +```{autodoc2-docstring} examples.server.logger +``` + +```` + +````{py:function} main() +:canonical: examples.server.main +:async: + +```{autodoc2-docstring} examples.server.main +``` +```` diff --git a/docs/source/apidocs/examples/examples.server_basic.md b/docs/source/apidocs/examples/examples.server_basic.md new file mode 100644 index 0000000..726d9c7 --- /dev/null +++ b/docs/source/apidocs/examples/examples.server_basic.md @@ -0,0 +1,111 @@ +# {py:mod}`examples.server_basic` + +```{py:module} examples.server_basic +``` + +```{autodoc2-docstring} examples.server_basic +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`BasicExampleService ` + - ```{autodoc2-docstring} examples.server_basic.BasicExampleService + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`main ` + - ```{autodoc2-docstring} examples.server_basic.main + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} examples.server_basic.logger + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: examples.server_basic.logger +:value: > + None + +```{autodoc2-docstring} examples.server_basic.logger +``` + +```` + +`````{py:class} BasicExampleService +:canonical: examples.server_basic.BasicExampleService + +```{autodoc2-docstring} examples.server_basic.BasicExampleService +``` + +````{py:attribute} _service_name +:canonical: examples.server_basic.BasicExampleService._service_name +:value: > + 'basic-example' + +```{autodoc2-docstring} examples.server_basic.BasicExampleService._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: examples.server_basic.BasicExampleService._instance_id +:value: > + None + +```{autodoc2-docstring} examples.server_basic.BasicExampleService._instance_id +``` + +```` + +````{py:method} test_async_method(**params: typing.Any) -> str +:canonical: examples.server_basic.BasicExampleService.test_async_method +:async: + +```{autodoc2-docstring} examples.server_basic.BasicExampleService.test_async_method +``` + +```` + +````{py:method} test_method(param1, param2: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any] +:canonical: examples.server_basic.BasicExampleService.test_method + +```{autodoc2-docstring} examples.server_basic.BasicExampleService.test_method +``` + +```` + +````` + +````{py:function} main() +:canonical: examples.server_basic.main +:async: + +```{autodoc2-docstring} examples.server_basic.main +``` +```` diff --git a/docs/source/apidocs/examples/examples.service_example.md b/docs/source/apidocs/examples/examples.service_example.md new file mode 100644 index 0000000..4c670ff --- /dev/null +++ b/docs/source/apidocs/examples/examples.service_example.md @@ -0,0 +1,187 @@ +# {py:mod}`examples.service_example` + +```{py:module} examples.service_example +``` + +```{autodoc2-docstring} examples.service_example +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`ServiceExample ` + - ```{autodoc2-docstring} examples.service_example.ServiceExample + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} examples.service_example.logger + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: examples.service_example.logger +:value: > + None + +```{autodoc2-docstring} examples.service_example.logger +``` + +```` + +`````{py:class} ServiceExample(service_name: str, instance_id: str, private_key: cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey) +:canonical: examples.service_example.ServiceExample + +```{autodoc2-docstring} examples.service_example.ServiceExample +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} examples.service_example.ServiceExample.__init__ +``` + +````{py:attribute} _service_name +:canonical: examples.service_example.ServiceExample._service_name +:type: str +:value: > + None + +```{autodoc2-docstring} examples.service_example.ServiceExample._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: examples.service_example.ServiceExample._instance_id +:type: str +:value: > + None + +```{autodoc2-docstring} examples.service_example.ServiceExample._instance_id +``` + +```` + +````{py:attribute} _private_key +:canonical: examples.service_example.ServiceExample._private_key +:type: cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey +:value: > + None + +```{autodoc2-docstring} examples.service_example.ServiceExample._private_key +``` + +```` + +````{py:attribute} _method_call_count +:canonical: examples.service_example.ServiceExample._method_call_count +:type: int +:value: > + None + +```{autodoc2-docstring} examples.service_example.ServiceExample._method_call_count +``` + +```` + +````{py:method} _handle_event_(topic: str, event: dict, target: list[str] | None = None, context: dict | None = None, trace_id: str | None = None) -> None +:canonical: examples.service_example.ServiceExample._handle_event_ +:classmethod: + +```{autodoc2-docstring} examples.service_example.ServiceExample._handle_event_ +``` + +```` + +````{py:method} test_method(**kwargs) -> str +:canonical: examples.service_example.ServiceExample.test_method + +```{autodoc2-docstring} examples.service_example.ServiceExample.test_method +``` + +```` + +````{py:method} test_encrypt_method(**kwargs) -> str +:canonical: examples.service_example.ServiceExample.test_encrypt_method + +```{autodoc2-docstring} examples.service_example.ServiceExample.test_encrypt_method +``` + +```` + +````{py:method} test_exception_method(**kwargs) -> str +:canonical: examples.service_example.ServiceExample.test_exception_method + +```{autodoc2-docstring} examples.service_example.ServiceExample.test_exception_method +``` + +```` + +````{py:method} test_async_method(**kwargs) -> str +:canonical: examples.service_example.ServiceExample.test_async_method +:async: + +```{autodoc2-docstring} examples.service_example.ServiceExample.test_async_method +``` + +```` + +````{py:method} async_method(**kwargs) -> int +:canonical: examples.service_example.ServiceExample.async_method +:async: + +```{autodoc2-docstring} examples.service_example.ServiceExample.async_method +``` + +```` + +````{py:method} sync_method(**kwargs) -> int +:canonical: examples.service_example.ServiceExample.sync_method + +```{autodoc2-docstring} examples.service_example.ServiceExample.sync_method +``` + +```` + +````{py:method} method_with_exception(**kwargs) -> None +:canonical: examples.service_example.ServiceExample.method_with_exception + +```{autodoc2-docstring} examples.service_example.ServiceExample.method_with_exception +``` + +```` + +````{py:method} async_method_with_exception(**kwargs) -> None +:canonical: examples.service_example.ServiceExample.async_method_with_exception + +```{autodoc2-docstring} examples.service_example.ServiceExample.async_method_with_exception +``` + +```` + +````{py:method} method_with_nuropb_exception(**kwargs) -> None +:canonical: examples.service_example.ServiceExample.method_with_nuropb_exception + +```{autodoc2-docstring} examples.service_example.ServiceExample.method_with_nuropb_exception +``` + +```` + +````` diff --git a/docs/source/apidocs/index.rst b/docs/source/apidocs/index.rst new file mode 100644 index 0000000..dd952ba --- /dev/null +++ b/docs/source/apidocs/index.rst @@ -0,0 +1,12 @@ +API Reference +============= + +This page contains auto-generated API reference documentation [#f1]_. + +.. toctree:: + :titlesonly: + + examples/examples + nuropb/nuropb + +.. [#f1] Created with `sphinx-autodoc2 `_ diff --git a/docs/source/apidocs/nuropb/nuropb.contexts.context_manager.md b/docs/source/apidocs/nuropb/nuropb.contexts.context_manager.md new file mode 100644 index 0000000..75497a7 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.contexts.context_manager.md @@ -0,0 +1,286 @@ +# {py:mod}`nuropb.contexts.context_manager` + +```{py:module} nuropb.contexts.context_manager +``` + +```{autodoc2-docstring} nuropb.contexts.context_manager +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`NuropbContextManager ` + - ```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.contexts.context_manager.logger + :summary: + ``` +* - {py:obj}`_test_token_cache ` + - ```{autodoc2-docstring} nuropb.contexts.context_manager._test_token_cache + :summary: + ``` +* - {py:obj}`_test_user_id_cache ` + - ```{autodoc2-docstring} nuropb.contexts.context_manager._test_user_id_cache + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.contexts.context_manager.logger +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.logger +``` + +```` + +````{py:data} _test_token_cache +:canonical: nuropb.contexts.context_manager._test_token_cache +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager._test_token_cache +``` + +```` + +````{py:data} _test_user_id_cache +:canonical: nuropb.contexts.context_manager._test_user_id_cache +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager._test_user_id_cache +``` + +```` + +`````{py:class} NuropbContextManager(context: typing.Dict[str, typing.Any], suppress_exceptions: typing.Optional[bool] = True) +:canonical: nuropb.contexts.context_manager.NuropbContextManager + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.__init__ +``` + +````{py:attribute} _suppress_exceptions +:canonical: nuropb.contexts.context_manager.NuropbContextManager._suppress_exceptions +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._suppress_exceptions +``` + +```` + +````{py:attribute} _nuropb_payload +:canonical: nuropb.contexts.context_manager.NuropbContextManager._nuropb_payload +:type: typing.Dict[str, typing.Any] | None +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._nuropb_payload +``` + +```` + +````{py:attribute} _context +:canonical: nuropb.contexts.context_manager.NuropbContextManager._context +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._context +``` + +```` + +````{py:attribute} _user_claims +:canonical: nuropb.contexts.context_manager.NuropbContextManager._user_claims +:type: typing.Dict[str, typing.Any] | None +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._user_claims +``` + +```` + +````{py:attribute} _events +:canonical: nuropb.contexts.context_manager.NuropbContextManager._events +:type: typing.List[typing.Dict[str, typing.Any]] +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._events +``` + +```` + +````{py:attribute} _exc_type +:canonical: nuropb.contexts.context_manager.NuropbContextManager._exc_type +:type: typing.Type[BaseException] | None +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._exc_type +``` + +```` + +````{py:attribute} _exec_value +:canonical: nuropb.contexts.context_manager.NuropbContextManager._exec_value +:type: BaseException | None +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._exec_value +``` + +```` + +````{py:attribute} _exc_tb +:canonical: nuropb.contexts.context_manager.NuropbContextManager._exc_tb +:type: types.TracebackType | None +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._exc_tb +``` + +```` + +````{py:attribute} _started +:canonical: nuropb.contexts.context_manager.NuropbContextManager._started +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._started +``` + +```` + +````{py:attribute} _done +:canonical: nuropb.contexts.context_manager.NuropbContextManager._done +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._done +``` + +```` + +````{py:property} context +:canonical: nuropb.contexts.context_manager.NuropbContextManager.context +:type: typing.Dict[str, typing.Any] + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.context +``` + +```` + +````{py:property} user_claims +:canonical: nuropb.contexts.context_manager.NuropbContextManager.user_claims +:type: typing.Dict[str, typing.Any] | None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.user_claims +``` + +```` + +````{py:property} events +:canonical: nuropb.contexts.context_manager.NuropbContextManager.events +:type: typing.List[typing.Dict[str, typing.Any]] + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.events +``` + +```` + +````{py:property} error +:canonical: nuropb.contexts.context_manager.NuropbContextManager.error +:type: typing.Dict[str, typing.Any] | None + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.error +``` + +```` + +````{py:method} add_event(event: typing.Dict[str, typing.Any]) -> None +:canonical: nuropb.contexts.context_manager.NuropbContextManager.add_event + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.add_event +``` + +```` + +````{py:method} _handle_context_exit(exc_type: typing.Type[BaseException] | None, exc_value: BaseException | None, exc_tb: types.TracebackType | None) -> bool +:canonical: nuropb.contexts.context_manager.NuropbContextManager._handle_context_exit + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager._handle_context_exit +``` + +```` + +````{py:method} __enter__() -> typing.Any +:canonical: nuropb.contexts.context_manager.NuropbContextManager.__enter__ + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.__enter__ +``` + +```` + +````{py:method} __aenter__() -> typing.Any +:canonical: nuropb.contexts.context_manager.NuropbContextManager.__aenter__ +:async: + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.__aenter__ +``` + +```` + +````{py:method} __exit__(exc_type: typing.Type[BaseException] | None, exc_value: BaseException | None, exc_tb: types.TracebackType | None) -> bool | None +:canonical: nuropb.contexts.context_manager.NuropbContextManager.__exit__ + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.__exit__ +``` + +```` + +````{py:method} __aexit__(exc_type: typing.Type[BaseException] | None, exc_value: BaseException | None, exc_tb: types.TracebackType | None) -> bool | None +:canonical: nuropb.contexts.context_manager.NuropbContextManager.__aexit__ +:async: + +```{autodoc2-docstring} nuropb.contexts.context_manager.NuropbContextManager.__aexit__ +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.contexts.context_manager_decorator.md b/docs/source/apidocs/nuropb/nuropb.contexts.context_manager_decorator.md new file mode 100644 index 0000000..e9ceb7f --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.contexts.context_manager_decorator.md @@ -0,0 +1,42 @@ +# {py:mod}`nuropb.contexts.context_manager_decorator` + +```{py:module} nuropb.contexts.context_manager_decorator +``` + +```{autodoc2-docstring} nuropb.contexts.context_manager_decorator +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`method_requires_nuropb_context ` + - ```{autodoc2-docstring} nuropb.contexts.context_manager_decorator.method_requires_nuropb_context + :summary: + ``` +* - {py:obj}`nuropb_context ` + - ```{autodoc2-docstring} nuropb.contexts.context_manager_decorator.nuropb_context + :summary: + ``` +```` + +### API + +````{py:function} method_requires_nuropb_context(method: typing.Callable[..., typing.Any]) -> bool +:canonical: nuropb.contexts.context_manager_decorator.method_requires_nuropb_context + +```{autodoc2-docstring} nuropb.contexts.context_manager_decorator.method_requires_nuropb_context +``` +```` + +````{py:function} nuropb_context(original_method: typing.Optional[typing.Callable[..., typing.Any]] = None, *, context_parameter: str = 'ctx', suppress_exceptions: bool = False) -> typing.Any +:canonical: nuropb.contexts.context_manager_decorator.nuropb_context + +```{autodoc2-docstring} nuropb.contexts.context_manager_decorator.nuropb_context +``` +```` diff --git a/docs/source/apidocs/nuropb/nuropb.contexts.describe.md b/docs/source/apidocs/nuropb/nuropb.contexts.describe.md new file mode 100644 index 0000000..3bfbdff --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.contexts.describe.md @@ -0,0 +1,89 @@ +# {py:mod}`nuropb.contexts.describe` + +```{py:module} nuropb.contexts.describe +``` + +```{autodoc2-docstring} nuropb.contexts.describe +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`method_visible_on_mesh ` + - ```{autodoc2-docstring} nuropb.contexts.describe.method_visible_on_mesh + :summary: + ``` +* - {py:obj}`publish_to_mesh ` + - ```{autodoc2-docstring} nuropb.contexts.describe.publish_to_mesh + :summary: + ``` +* - {py:obj}`describe_service ` + - ```{autodoc2-docstring} nuropb.contexts.describe.describe_service + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.contexts.describe.logger + :summary: + ``` +* - {py:obj}`AuthorizeFunc ` + - ```{autodoc2-docstring} nuropb.contexts.describe.AuthorizeFunc + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.contexts.describe.logger +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.describe.logger +``` + +```` + +````{py:data} AuthorizeFunc +:canonical: nuropb.contexts.describe.AuthorizeFunc +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.describe.AuthorizeFunc +``` + +```` + +````{py:function} method_visible_on_mesh(method: typing.Callable[..., typing.Any]) -> bool +:canonical: nuropb.contexts.describe.method_visible_on_mesh + +```{autodoc2-docstring} nuropb.contexts.describe.method_visible_on_mesh +``` +```` + +````{py:function} publish_to_mesh(original_method: typing.Optional[typing.Callable[..., typing.Any]] = None, *, hide_method: typing.Optional[bool] = False, authorize_func: typing.Optional[nuropb.contexts.describe.AuthorizeFunc] = None, context_token_key: typing.Optional[str] = 'Authorization', requires_encryption: typing.Optional[bool] = False, description: typing.Optional[str] = None) -> typing.Any +:canonical: nuropb.contexts.describe.publish_to_mesh + +```{autodoc2-docstring} nuropb.contexts.describe.publish_to_mesh +``` +```` + +````{py:function} describe_service(class_instance: object) -> typing.Dict[str, typing.Any] | None +:canonical: nuropb.contexts.describe.describe_service + +```{autodoc2-docstring} nuropb.contexts.describe.describe_service +``` +```` diff --git a/docs/source/apidocs/nuropb/nuropb.contexts.md b/docs/source/apidocs/nuropb/nuropb.contexts.md new file mode 100644 index 0000000..ca45b04 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.contexts.md @@ -0,0 +1,20 @@ +# {py:mod}`nuropb.contexts` + +```{py:module} nuropb.contexts +``` + +```{autodoc2-docstring} nuropb.contexts +:allowtitles: +``` + +## Submodules + +```{toctree} +:titlesonly: +:maxdepth: 1 + +nuropb.contexts.describe +nuropb.contexts.context_manager +nuropb.contexts.service_handlers +nuropb.contexts.context_manager_decorator +``` diff --git a/docs/source/apidocs/nuropb/nuropb.contexts.service_handlers.md b/docs/source/apidocs/nuropb/nuropb.contexts.service_handlers.md new file mode 100644 index 0000000..b7d2f46 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.contexts.service_handlers.md @@ -0,0 +1,122 @@ +# {py:mod}`nuropb.contexts.service_handlers` + +```{py:module} nuropb.contexts.service_handlers +``` + +```{autodoc2-docstring} nuropb.contexts.service_handlers +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`verbose ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.verbose + :summary: + ``` +* - {py:obj}`error_dict_from_exception ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.error_dict_from_exception + :summary: + ``` +* - {py:obj}`create_transport_response_from_rmq_decode_exception ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.create_transport_response_from_rmq_decode_exception + :summary: + ``` +* - {py:obj}`create_transport_responses_from_exceptions ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.create_transport_responses_from_exceptions + :summary: + ``` +* - {py:obj}`handle_execution_result ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.handle_execution_result + :summary: + ``` +* - {py:obj}`execute_request ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.execute_request + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers.logger + :summary: + ``` +* - {py:obj}`_verbose ` + - ```{autodoc2-docstring} nuropb.contexts.service_handlers._verbose + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.contexts.service_handlers.logger +:value: > + None + +```{autodoc2-docstring} nuropb.contexts.service_handlers.logger +``` + +```` + +````{py:data} _verbose +:canonical: nuropb.contexts.service_handlers._verbose +:value: > + False + +```{autodoc2-docstring} nuropb.contexts.service_handlers._verbose +``` + +```` + +````{py:function} verbose() -> bool +:canonical: nuropb.contexts.service_handlers.verbose + +```{autodoc2-docstring} nuropb.contexts.service_handlers.verbose +``` +```` + +````{py:function} error_dict_from_exception(exception: Exception | BaseException) -> typing.Dict[str, str] +:canonical: nuropb.contexts.service_handlers.error_dict_from_exception + +```{autodoc2-docstring} nuropb.contexts.service_handlers.error_dict_from_exception +``` +```` + +````{py:function} create_transport_response_from_rmq_decode_exception(exception: Exception | BaseException, basic_deliver: pika.spec.Basic.Deliver, properties: pika.spec.BasicProperties) -> typing.Tuple[nuropb.interface.AcknowledgeAction, list[nuropb.interface.TransportRespondPayload]] +:canonical: nuropb.contexts.service_handlers.create_transport_response_from_rmq_decode_exception + +```{autodoc2-docstring} nuropb.contexts.service_handlers.create_transport_response_from_rmq_decode_exception +``` +```` + +````{py:function} create_transport_responses_from_exceptions(service_message: nuropb.interface.TransportServicePayload, exception: Exception | BaseException) -> typing.Tuple[nuropb.interface.AcknowledgeAction, list[nuropb.interface.TransportRespondPayload]] +:canonical: nuropb.contexts.service_handlers.create_transport_responses_from_exceptions + +```{autodoc2-docstring} nuropb.contexts.service_handlers.create_transport_responses_from_exceptions +``` +```` + +````{py:function} handle_execution_result(service_message: nuropb.interface.TransportServicePayload, result: typing.Any, message_complete_callback: nuropb.interface.MessageCompleteFunction) -> None +:canonical: nuropb.contexts.service_handlers.handle_execution_result + +```{autodoc2-docstring} nuropb.contexts.service_handlers.handle_execution_result +``` +```` + +````{py:function} execute_request(service_instance: object, service_message: nuropb.interface.TransportServicePayload, message_complete_callback: nuropb.interface.MessageCompleteFunction) -> None +:canonical: nuropb.contexts.service_handlers.execute_request + +```{autodoc2-docstring} nuropb.contexts.service_handlers.execute_request +``` +```` diff --git a/docs/source/apidocs/nuropb/nuropb.encodings.encryption.md b/docs/source/apidocs/nuropb/nuropb.encodings.encryption.md new file mode 100644 index 0000000..2ce1226 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.encodings.encryption.md @@ -0,0 +1,183 @@ +# {py:mod}`nuropb.encodings.encryption` + +```{py:module} nuropb.encodings.encryption +``` + +```{autodoc2-docstring} nuropb.encodings.encryption +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`Encryptor ` + - ```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`encrypt_payload ` + - ```{autodoc2-docstring} nuropb.encodings.encryption.encrypt_payload + :summary: + ``` +* - {py:obj}`decrypt_payload ` + - ```{autodoc2-docstring} nuropb.encodings.encryption.decrypt_payload + :summary: + ``` +* - {py:obj}`encrypt_key ` + - ```{autodoc2-docstring} nuropb.encodings.encryption.encrypt_key + :summary: + ``` +* - {py:obj}`decrypt_key ` + - ```{autodoc2-docstring} nuropb.encodings.encryption.decrypt_key + :summary: + ``` +```` + +### API + +````{py:function} encrypt_payload(payload: str | bytes, key: str | bytes) -> bytes +:canonical: nuropb.encodings.encryption.encrypt_payload + +```{autodoc2-docstring} nuropb.encodings.encryption.encrypt_payload +``` +```` + +````{py:function} decrypt_payload(encrypted_payload: str | bytes, key: str | bytes) -> bytes +:canonical: nuropb.encodings.encryption.decrypt_payload + +```{autodoc2-docstring} nuropb.encodings.encryption.decrypt_payload +``` +```` + +````{py:function} encrypt_key(symmetric_key: bytes, public_key: cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey) -> bytes +:canonical: nuropb.encodings.encryption.encrypt_key + +```{autodoc2-docstring} nuropb.encodings.encryption.encrypt_key +``` +```` + +````{py:function} decrypt_key(encrypted_symmetric_key: bytes, private_key: cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey) -> bytes +:canonical: nuropb.encodings.encryption.decrypt_key + +```{autodoc2-docstring} nuropb.encodings.encryption.decrypt_key +``` +```` + +`````{py:class} Encryptor(service_name: typing.Optional[str] = None, private_key: typing.Optional[cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey] = None) +:canonical: nuropb.encodings.encryption.Encryptor + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.__init__ +``` + +````{py:attribute} _service_name +:canonical: nuropb.encodings.encryption.Encryptor._service_name +:type: str | None +:value: > + None + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor._service_name +``` + +```` + +````{py:attribute} _private_key +:canonical: nuropb.encodings.encryption.Encryptor._private_key +:type: cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey | None +:value: > + None + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor._private_key +``` + +```` + +````{py:attribute} _service_public_keys +:canonical: nuropb.encodings.encryption.Encryptor._service_public_keys +:type: typing.Dict[str, cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey] +:value: > + None + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor._service_public_keys +``` + +```` + +````{py:attribute} _correlation_id_symmetric_keys +:canonical: nuropb.encodings.encryption.Encryptor._correlation_id_symmetric_keys +:type: typing.Dict[str, bytes] +:value: > + None + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor._correlation_id_symmetric_keys +``` + +```` + +````{py:method} new_symmetric_key() -> bytes +:canonical: nuropb.encodings.encryption.Encryptor.new_symmetric_key +:classmethod: + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.new_symmetric_key +``` + +```` + +````{py:method} add_public_key(service_name: str, public_key: cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey) -> None +:canonical: nuropb.encodings.encryption.Encryptor.add_public_key + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.add_public_key +``` + +```` + +````{py:method} get_public_key(service_name: str) -> cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey | None +:canonical: nuropb.encodings.encryption.Encryptor.get_public_key + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.get_public_key +``` + +```` + +````{py:method} has_public_key(service_name: str) -> bool +:canonical: nuropb.encodings.encryption.Encryptor.has_public_key + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.has_public_key +``` + +```` + +````{py:method} encrypt_payload(payload: bytes, correlation_id: str, service_name: typing.Optional[str | None] = None) -> bytes +:canonical: nuropb.encodings.encryption.Encryptor.encrypt_payload + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.encrypt_payload +``` + +```` + +````{py:method} decrypt_payload(payload: bytes, correlation_id: str) -> bytes +:canonical: nuropb.encodings.encryption.Encryptor.decrypt_payload + +```{autodoc2-docstring} nuropb.encodings.encryption.Encryptor.decrypt_payload +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.encodings.json_serialisation.md b/docs/source/apidocs/nuropb/nuropb.encodings.json_serialisation.md new file mode 100644 index 0000000..9ba170f --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.encodings.json_serialisation.md @@ -0,0 +1,122 @@ +# {py:mod}`nuropb.encodings.json_serialisation` + +```{py:module} nuropb.encodings.json_serialisation +``` + +```{autodoc2-docstring} nuropb.encodings.json_serialisation +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`NuropbEncoder ` + - ```{autodoc2-docstring} nuropb.encodings.json_serialisation.NuropbEncoder + :summary: + ``` +* - {py:obj}`JsonSerializor ` + - ```{autodoc2-docstring} nuropb.encodings.json_serialisation.JsonSerializor + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`to_json_compatible ` + - ```{autodoc2-docstring} nuropb.encodings.json_serialisation.to_json_compatible + :summary: + ``` +* - {py:obj}`to_json ` + - ```{autodoc2-docstring} nuropb.encodings.json_serialisation.to_json + :summary: + ``` +```` + +### API + +````{py:function} to_json_compatible(obj: typing.Any, recursive: bool = True, max_depth: int = 4) -> typing.Any +:canonical: nuropb.encodings.json_serialisation.to_json_compatible + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.to_json_compatible +``` +```` + +`````{py:class} NuropbEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None) +:canonical: nuropb.encodings.json_serialisation.NuropbEncoder + +Bases: {py:obj}`json.JSONEncoder` + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.NuropbEncoder +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.NuropbEncoder.__init__ +``` + +````{py:method} default(obj: typing.Any) -> typing.Any +:canonical: nuropb.encodings.json_serialisation.NuropbEncoder.default + +```` + +````` + +````{py:function} to_json(obj: typing.Any) -> str +:canonical: nuropb.encodings.json_serialisation.to_json + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.to_json +``` +```` + +`````{py:class} JsonSerializor() +:canonical: nuropb.encodings.json_serialisation.JsonSerializor + +Bases: {py:obj}`object` + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.JsonSerializor +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.JsonSerializor.__init__ +``` + +````{py:attribute} _encryption_keys +:canonical: nuropb.encodings.json_serialisation.JsonSerializor._encryption_keys +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.JsonSerializor._encryption_keys +``` + +```` + +````{py:method} encode(payload: typing.Any) -> str +:canonical: nuropb.encodings.json_serialisation.JsonSerializor.encode + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.JsonSerializor.encode +``` + +```` + +````{py:method} decode(json_payload: str) -> typing.Any +:canonical: nuropb.encodings.json_serialisation.JsonSerializor.decode + +```{autodoc2-docstring} nuropb.encodings.json_serialisation.JsonSerializor.decode +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.encodings.md b/docs/source/apidocs/nuropb/nuropb.encodings.md new file mode 100644 index 0000000..1718338 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.encodings.md @@ -0,0 +1,19 @@ +# {py:mod}`nuropb.encodings` + +```{py:module} nuropb.encodings +``` + +```{autodoc2-docstring} nuropb.encodings +:allowtitles: +``` + +## Submodules + +```{toctree} +:titlesonly: +:maxdepth: 1 + +nuropb.encodings.encryption +nuropb.encodings.json_serialisation +nuropb.encodings.serializor +``` diff --git a/docs/source/apidocs/nuropb/nuropb.encodings.serializor.md b/docs/source/apidocs/nuropb/nuropb.encodings.serializor.md new file mode 100644 index 0000000..69d2b0b --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.encodings.serializor.md @@ -0,0 +1,75 @@ +# {py:mod}`nuropb.encodings.serializor` + +```{py:module} nuropb.encodings.serializor +``` + +```{autodoc2-docstring} nuropb.encodings.serializor +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`get_serializor ` + - ```{autodoc2-docstring} nuropb.encodings.serializor.get_serializor + :summary: + ``` +* - {py:obj}`encode_payload ` + - ```{autodoc2-docstring} nuropb.encodings.serializor.encode_payload + :summary: + ``` +* - {py:obj}`decode_payload ` + - ```{autodoc2-docstring} nuropb.encodings.serializor.decode_payload + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`SerializorTypes ` + - ```{autodoc2-docstring} nuropb.encodings.serializor.SerializorTypes + :summary: + ``` +```` + +### API + +````{py:data} SerializorTypes +:canonical: nuropb.encodings.serializor.SerializorTypes +:value: > + None + +```{autodoc2-docstring} nuropb.encodings.serializor.SerializorTypes +``` + +```` + +````{py:function} get_serializor(payload_type: str = 'json') -> nuropb.encodings.serializor.SerializorTypes +:canonical: nuropb.encodings.serializor.get_serializor + +```{autodoc2-docstring} nuropb.encodings.serializor.get_serializor +``` +```` + +````{py:function} encode_payload(payload: nuropb.interface.PayloadDict, payload_type: str = 'json', public_key: cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey = None) -> bytes +:canonical: nuropb.encodings.serializor.encode_payload + +```{autodoc2-docstring} nuropb.encodings.serializor.encode_payload +``` +```` + +````{py:function} decode_payload(encoded_payload: bytes, payload_type: str = 'json') -> nuropb.interface.PayloadDict +:canonical: nuropb.encodings.serializor.decode_payload + +```{autodoc2-docstring} nuropb.encodings.serializor.decode_payload +``` +```` diff --git a/docs/source/apidocs/nuropb/nuropb.interface.md b/docs/source/apidocs/nuropb/nuropb.interface.md new file mode 100644 index 0000000..dd4f4c5 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.interface.md @@ -0,0 +1,1390 @@ +# {py:mod}`nuropb.interface` + +```{py:module} nuropb.interface +``` + +```{autodoc2-docstring} nuropb.interface +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`ErrorDescriptionType ` + - +* - {py:obj}`EventType ` + - ```{autodoc2-docstring} nuropb.interface.EventType + :summary: + ``` +* - {py:obj}`RequestPayloadDict ` + - ```{autodoc2-docstring} nuropb.interface.RequestPayloadDict + :summary: + ``` +* - {py:obj}`CommandPayloadDict ` + - ```{autodoc2-docstring} nuropb.interface.CommandPayloadDict + :summary: + ``` +* - {py:obj}`EventPayloadDict ` + - ```{autodoc2-docstring} nuropb.interface.EventPayloadDict + :summary: + ``` +* - {py:obj}`ResponsePayloadDict ` + - ```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict + :summary: + ``` +* - {py:obj}`TransportServicePayload ` + - ```{autodoc2-docstring} nuropb.interface.TransportServicePayload + :summary: + ``` +* - {py:obj}`TransportRespondPayload ` + - ```{autodoc2-docstring} nuropb.interface.TransportRespondPayload + :summary: + ``` +* - {py:obj}`NuropbInterface ` + - ```{autodoc2-docstring} nuropb.interface.NuropbInterface + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.interface.logger + :summary: + ``` +* - {py:obj}`NUROPB_VERSION ` + - ```{autodoc2-docstring} nuropb.interface.NUROPB_VERSION + :summary: + ``` +* - {py:obj}`NUROPB_PROTOCOL_VERSION ` + - ```{autodoc2-docstring} nuropb.interface.NUROPB_PROTOCOL_VERSION + :summary: + ``` +* - {py:obj}`NUROPB_PROTOCOL_VERSIONS_SUPPORTED ` + - ```{autodoc2-docstring} nuropb.interface.NUROPB_PROTOCOL_VERSIONS_SUPPORTED + :summary: + ``` +* - {py:obj}`NUROPB_MESSAGE_TYPES ` + - ```{autodoc2-docstring} nuropb.interface.NUROPB_MESSAGE_TYPES + :summary: + ``` +* - {py:obj}`NuropbSerializeType ` + - ```{autodoc2-docstring} nuropb.interface.NuropbSerializeType + :summary: + ``` +* - {py:obj}`NuropbMessageType ` + - ```{autodoc2-docstring} nuropb.interface.NuropbMessageType + :summary: + ``` +* - {py:obj}`NuropbLifecycleState ` + - ```{autodoc2-docstring} nuropb.interface.NuropbLifecycleState + :summary: + ``` +* - {py:obj}`PayloadDict ` + - ```{autodoc2-docstring} nuropb.interface.PayloadDict + :summary: + ``` +* - {py:obj}`ServicePayloadTypes ` + - ```{autodoc2-docstring} nuropb.interface.ServicePayloadTypes + :summary: + ``` +* - {py:obj}`ResponsePayloadTypes ` + - ```{autodoc2-docstring} nuropb.interface.ResponsePayloadTypes + :summary: + ``` +* - {py:obj}`ResultFutureResponsePayload ` + - ```{autodoc2-docstring} nuropb.interface.ResultFutureResponsePayload + :summary: + ``` +* - {py:obj}`ResultFutureAny ` + - ```{autodoc2-docstring} nuropb.interface.ResultFutureAny + :summary: + ``` +* - {py:obj}`AcknowledgeAction ` + - ```{autodoc2-docstring} nuropb.interface.AcknowledgeAction + :summary: + ``` +* - {py:obj}`AcknowledgeCallbackFunction ` + - ```{autodoc2-docstring} nuropb.interface.AcknowledgeCallbackFunction + :summary: + ``` +* - {py:obj}`MessageCompleteFunction ` + - ```{autodoc2-docstring} nuropb.interface.MessageCompleteFunction + :summary: + ``` +* - {py:obj}`MessageCallbackFunction ` + - ```{autodoc2-docstring} nuropb.interface.MessageCallbackFunction + :summary: + ``` +* - {py:obj}`ConnectionCallbackFunction ` + - ```{autodoc2-docstring} nuropb.interface.ConnectionCallbackFunction + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.interface.logger +:value: > + None + +```{autodoc2-docstring} nuropb.interface.logger +``` + +```` + +````{py:data} NUROPB_VERSION +:canonical: nuropb.interface.NUROPB_VERSION +:value: > + '0.1.7' + +```{autodoc2-docstring} nuropb.interface.NUROPB_VERSION +``` + +```` + +````{py:data} NUROPB_PROTOCOL_VERSION +:canonical: nuropb.interface.NUROPB_PROTOCOL_VERSION +:value: > + '0.1.1' + +```{autodoc2-docstring} nuropb.interface.NUROPB_PROTOCOL_VERSION +``` + +```` + +````{py:data} NUROPB_PROTOCOL_VERSIONS_SUPPORTED +:canonical: nuropb.interface.NUROPB_PROTOCOL_VERSIONS_SUPPORTED +:value: > + ('0.1.1',) + +```{autodoc2-docstring} nuropb.interface.NUROPB_PROTOCOL_VERSIONS_SUPPORTED +``` + +```` + +````{py:data} NUROPB_MESSAGE_TYPES +:canonical: nuropb.interface.NUROPB_MESSAGE_TYPES +:value: > + ('request', 'response', 'event', 'command') + +```{autodoc2-docstring} nuropb.interface.NUROPB_MESSAGE_TYPES +``` + +```` + +````{py:data} NuropbSerializeType +:canonical: nuropb.interface.NuropbSerializeType +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbSerializeType +``` + +```` + +````{py:data} NuropbMessageType +:canonical: nuropb.interface.NuropbMessageType +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbMessageType +``` + +```` + +````{py:data} NuropbLifecycleState +:canonical: nuropb.interface.NuropbLifecycleState +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbLifecycleState +``` + +```` + +`````{py:class} ErrorDescriptionType() +:canonical: nuropb.interface.ErrorDescriptionType + +Bases: {py:obj}`typing.TypedDict` + +````{py:attribute} error +:canonical: nuropb.interface.ErrorDescriptionType.error +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ErrorDescriptionType.error +``` + +```` + +````{py:attribute} description +:canonical: nuropb.interface.ErrorDescriptionType.description +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ErrorDescriptionType.description +``` + +```` + +````{py:attribute} context +:canonical: nuropb.interface.ErrorDescriptionType.context +:type: typing.Optional[typing.Dict[str, typing.Any]] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ErrorDescriptionType.context +``` + +```` + +````` + +`````{py:class} EventType() +:canonical: nuropb.interface.EventType + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.EventType +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.EventType.__init__ +``` + +````{py:attribute} topic +:canonical: nuropb.interface.EventType.topic +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventType.topic +``` + +```` + +````{py:attribute} payload +:canonical: nuropb.interface.EventType.payload +:type: typing.Any +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventType.payload +``` + +```` + +````{py:attribute} target +:canonical: nuropb.interface.EventType.target +:type: typing.Optional[typing.List[typing.Any]] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventType.target +``` + +```` + +````` + +`````{py:class} RequestPayloadDict() +:canonical: nuropb.interface.RequestPayloadDict + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.__init__ +``` + +````{py:attribute} tag +:canonical: nuropb.interface.RequestPayloadDict.tag +:type: typing.Literal[request] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.tag +``` + +```` + +````{py:attribute} correlation_id +:canonical: nuropb.interface.RequestPayloadDict.correlation_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.correlation_id +``` + +```` + +````{py:attribute} context +:canonical: nuropb.interface.RequestPayloadDict.context +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.context +``` + +```` + +````{py:attribute} trace_id +:canonical: nuropb.interface.RequestPayloadDict.trace_id +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.trace_id +``` + +```` + +````{py:attribute} service +:canonical: nuropb.interface.RequestPayloadDict.service +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.service +``` + +```` + +````{py:attribute} method +:canonical: nuropb.interface.RequestPayloadDict.method +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.method +``` + +```` + +````{py:attribute} params +:canonical: nuropb.interface.RequestPayloadDict.params +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.RequestPayloadDict.params +``` + +```` + +````` + +`````{py:class} CommandPayloadDict() +:canonical: nuropb.interface.CommandPayloadDict + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.__init__ +``` + +````{py:attribute} tag +:canonical: nuropb.interface.CommandPayloadDict.tag +:type: typing.Literal[command] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.tag +``` + +```` + +````{py:attribute} correlation_id +:canonical: nuropb.interface.CommandPayloadDict.correlation_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.correlation_id +``` + +```` + +````{py:attribute} context +:canonical: nuropb.interface.CommandPayloadDict.context +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.context +``` + +```` + +````{py:attribute} trace_id +:canonical: nuropb.interface.CommandPayloadDict.trace_id +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.trace_id +``` + +```` + +````{py:attribute} service +:canonical: nuropb.interface.CommandPayloadDict.service +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.service +``` + +```` + +````{py:attribute} method +:canonical: nuropb.interface.CommandPayloadDict.method +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.method +``` + +```` + +````{py:attribute} params +:canonical: nuropb.interface.CommandPayloadDict.params +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.CommandPayloadDict.params +``` + +```` + +````` + +`````{py:class} EventPayloadDict() +:canonical: nuropb.interface.EventPayloadDict + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.__init__ +``` + +````{py:attribute} tag +:canonical: nuropb.interface.EventPayloadDict.tag +:type: typing.Literal[nuropb.interface.EventPayloadDict.event] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.tag +``` + +```` + +````{py:attribute} correlation_id +:canonical: nuropb.interface.EventPayloadDict.correlation_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.correlation_id +``` + +```` + +````{py:attribute} context +:canonical: nuropb.interface.EventPayloadDict.context +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.context +``` + +```` + +````{py:attribute} trace_id +:canonical: nuropb.interface.EventPayloadDict.trace_id +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.trace_id +``` + +```` + +````{py:attribute} topic +:canonical: nuropb.interface.EventPayloadDict.topic +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.topic +``` + +```` + +````{py:attribute} event +:canonical: nuropb.interface.EventPayloadDict.event +:type: typing.Any +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.event +``` + +```` + +````{py:attribute} target +:canonical: nuropb.interface.EventPayloadDict.target +:type: typing.Optional[typing.List[typing.Any]] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.EventPayloadDict.target +``` + +```` + +````` + +`````{py:class} ResponsePayloadDict() +:canonical: nuropb.interface.ResponsePayloadDict + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.__init__ +``` + +````{py:attribute} tag +:canonical: nuropb.interface.ResponsePayloadDict.tag +:type: typing.Literal[response] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.tag +``` + +```` + +````{py:attribute} correlation_id +:canonical: nuropb.interface.ResponsePayloadDict.correlation_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.correlation_id +``` + +```` + +````{py:attribute} context +:canonical: nuropb.interface.ResponsePayloadDict.context +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.context +``` + +```` + +````{py:attribute} trace_id +:canonical: nuropb.interface.ResponsePayloadDict.trace_id +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.trace_id +``` + +```` + +````{py:attribute} result +:canonical: nuropb.interface.ResponsePayloadDict.result +:type: typing.Any +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.result +``` + +```` + +````{py:attribute} error +:canonical: nuropb.interface.ResponsePayloadDict.error +:type: typing.Optional[typing.Dict[str, typing.Any]] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.error +``` + +```` + +````{py:attribute} warning +:canonical: nuropb.interface.ResponsePayloadDict.warning +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.warning +``` + +```` + +````{py:attribute} reply_to +:canonical: nuropb.interface.ResponsePayloadDict.reply_to +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadDict.reply_to +``` + +```` + +````` + +````{py:data} PayloadDict +:canonical: nuropb.interface.PayloadDict +:value: > + None + +```{autodoc2-docstring} nuropb.interface.PayloadDict +``` + +```` + +````{py:data} ServicePayloadTypes +:canonical: nuropb.interface.ServicePayloadTypes +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ServicePayloadTypes +``` + +```` + +````{py:data} ResponsePayloadTypes +:canonical: nuropb.interface.ResponsePayloadTypes +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResponsePayloadTypes +``` + +```` + +`````{py:class} TransportServicePayload() +:canonical: nuropb.interface.TransportServicePayload + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.__init__ +``` + +````{py:attribute} nuropb_protocol +:canonical: nuropb.interface.TransportServicePayload.nuropb_protocol +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.nuropb_protocol +``` + +```` + +````{py:attribute} correlation_id +:canonical: nuropb.interface.TransportServicePayload.correlation_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.correlation_id +``` + +```` + +````{py:attribute} trace_id +:canonical: nuropb.interface.TransportServicePayload.trace_id +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.trace_id +``` + +```` + +````{py:attribute} ttl +:canonical: nuropb.interface.TransportServicePayload.ttl +:type: typing.Optional[int] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.ttl +``` + +```` + +````{py:attribute} nuropb_type +:canonical: nuropb.interface.TransportServicePayload.nuropb_type +:type: nuropb.interface.NuropbMessageType +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.nuropb_type +``` + +```` + +````{py:attribute} nuropb_payload +:canonical: nuropb.interface.TransportServicePayload.nuropb_payload +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportServicePayload.nuropb_payload +``` + +```` + +````` + +`````{py:class} TransportRespondPayload() +:canonical: nuropb.interface.TransportRespondPayload + +Bases: {py:obj}`typing.TypedDict` + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.__init__ +``` + +````{py:attribute} nuropb_protocol +:canonical: nuropb.interface.TransportRespondPayload.nuropb_protocol +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.nuropb_protocol +``` + +```` + +````{py:attribute} correlation_id +:canonical: nuropb.interface.TransportRespondPayload.correlation_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.correlation_id +``` + +```` + +````{py:attribute} trace_id +:canonical: nuropb.interface.TransportRespondPayload.trace_id +:type: typing.Optional[str] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.trace_id +``` + +```` + +````{py:attribute} ttl +:canonical: nuropb.interface.TransportRespondPayload.ttl +:type: typing.Optional[int] +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.ttl +``` + +```` + +````{py:attribute} nuropb_type +:canonical: nuropb.interface.TransportRespondPayload.nuropb_type +:type: nuropb.interface.NuropbMessageType +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.nuropb_type +``` + +```` + +````{py:attribute} nuropb_payload +:canonical: nuropb.interface.TransportRespondPayload.nuropb_payload +:type: nuropb.interface.ResponsePayloadTypes +:value: > + None + +```{autodoc2-docstring} nuropb.interface.TransportRespondPayload.nuropb_payload +``` + +```` + +````` + +````{py:data} ResultFutureResponsePayload +:canonical: nuropb.interface.ResultFutureResponsePayload +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResultFutureResponsePayload +``` + +```` + +````{py:data} ResultFutureAny +:canonical: nuropb.interface.ResultFutureAny +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ResultFutureAny +``` + +```` + +````{py:data} AcknowledgeAction +:canonical: nuropb.interface.AcknowledgeAction +:value: > + None + +```{autodoc2-docstring} nuropb.interface.AcknowledgeAction +``` + +```` + +````{py:data} AcknowledgeCallbackFunction +:canonical: nuropb.interface.AcknowledgeCallbackFunction +:value: > + None + +```{autodoc2-docstring} nuropb.interface.AcknowledgeCallbackFunction +``` + +```` + +````{py:data} MessageCompleteFunction +:canonical: nuropb.interface.MessageCompleteFunction +:value: > + None + +```{autodoc2-docstring} nuropb.interface.MessageCompleteFunction +``` + +```` + +````{py:data} MessageCallbackFunction +:canonical: nuropb.interface.MessageCallbackFunction +:value: > + None + +```{autodoc2-docstring} nuropb.interface.MessageCallbackFunction +``` + +```` + +````{py:data} ConnectionCallbackFunction +:canonical: nuropb.interface.ConnectionCallbackFunction +:value: > + None + +```{autodoc2-docstring} nuropb.interface.ConnectionCallbackFunction +``` + +```` + +`````{py:exception} NuropbException(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbException + +Bases: {py:obj}`Exception` + +```{autodoc2-docstring} nuropb.interface.NuropbException +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbException.__init__ +``` + +````{py:attribute} description +:canonical: nuropb.interface.NuropbException.description +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbException.description +``` + +```` + +````{py:attribute} payload +:canonical: nuropb.interface.NuropbException.payload +:type: nuropb.interface.PayloadDict | nuropb.interface.TransportServicePayload | nuropb.interface.TransportRespondPayload | typing.Dict[str, typing.Any] | None +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbException.payload +``` + +```` + +````{py:attribute} exception +:canonical: nuropb.interface.NuropbException.exception +:type: BaseException | None +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbException.exception +``` + +```` + +````{py:method} to_dict() -> typing.Dict[str, typing.Any] +:canonical: nuropb.interface.NuropbException.to_dict + +```{autodoc2-docstring} nuropb.interface.NuropbException.to_dict +``` + +```` + +````` + +````{py:exception} NuropbTimeoutError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbTimeoutError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbTimeoutError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbTimeoutError.__init__ +``` + +```` + +`````{py:exception} NuropbTransportError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None, close_connection: bool = False) +:canonical: nuropb.interface.NuropbTransportError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbTransportError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbTransportError.__init__ +``` + +````{py:attribute} _close_connection +:canonical: nuropb.interface.NuropbTransportError._close_connection +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbTransportError._close_connection +``` + +```` + +````{py:property} close_connection +:canonical: nuropb.interface.NuropbTransportError.close_connection +:type: bool + +```{autodoc2-docstring} nuropb.interface.NuropbTransportError.close_connection +``` + +```` + +````` + +````{py:exception} NuropbMessageError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbMessageError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbMessageError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbMessageError.__init__ +``` + +```` + +````{py:exception} NuropbHandlingError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbHandlingError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbHandlingError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbHandlingError.__init__ +``` + +```` + +````{py:exception} NuropbDeprecatedError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbDeprecatedError + +Bases: {py:obj}`nuropb.interface.NuropbHandlingError` + +```{autodoc2-docstring} nuropb.interface.NuropbDeprecatedError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbDeprecatedError.__init__ +``` + +```` + +````{py:exception} NuropbValidationError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbValidationError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbValidationError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbValidationError.__init__ +``` + +```` + +````{py:exception} NuropbAuthenticationError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbAuthenticationError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbAuthenticationError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbAuthenticationError.__init__ +``` + +```` + +````{py:exception} NuropbAuthorizationError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbAuthorizationError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbAuthorizationError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbAuthorizationError.__init__ +``` + +```` + +````{py:exception} NuropbNotDeliveredError(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbNotDeliveredError + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbNotDeliveredError +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbNotDeliveredError.__init__ +``` + +```` + +````{py:exception} NuropbCallAgainReject(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbCallAgainReject + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbCallAgainReject +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbCallAgainReject.__init__ +``` + +```` + +````{py:exception} NuropbCallAgain(description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.PayloadDict] = None, exception: typing.Optional[BaseException] = None) +:canonical: nuropb.interface.NuropbCallAgain + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbCallAgain +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbCallAgain.__init__ +``` + +```` + +`````{py:exception} NuropbSuccess(result: typing.Any, description: typing.Optional[str] = None, payload: typing.Optional[nuropb.interface.ResponsePayloadDict] = None, events: typing.Optional[typing.List[nuropb.interface.EventType]] = None) +:canonical: nuropb.interface.NuropbSuccess + +Bases: {py:obj}`nuropb.interface.NuropbException` + +```{autodoc2-docstring} nuropb.interface.NuropbSuccess +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.interface.NuropbSuccess.__init__ +``` + +````{py:attribute} result +:canonical: nuropb.interface.NuropbSuccess.result +:type: typing.Any +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbSuccess.result +``` + +```` + +````{py:attribute} payload +:canonical: nuropb.interface.NuropbSuccess.payload +:type: nuropb.interface.ResponsePayloadDict | None +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbSuccess.payload +``` + +```` + +````{py:attribute} events +:canonical: nuropb.interface.NuropbSuccess.events +:type: typing.List[nuropb.interface.EventType] +:value: > + [] + +```{autodoc2-docstring} nuropb.interface.NuropbSuccess.events +``` + +```` + +````` + +`````{py:class} NuropbInterface +:canonical: nuropb.interface.NuropbInterface + +Bases: {py:obj}`abc.ABC` + +```{autodoc2-docstring} nuropb.interface.NuropbInterface +``` + +````{py:attribute} _service_name +:canonical: nuropb.interface.NuropbInterface._service_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbInterface._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: nuropb.interface.NuropbInterface._instance_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbInterface._instance_id +``` + +```` + +````{py:attribute} _service_instance +:canonical: nuropb.interface.NuropbInterface._service_instance +:type: object +:value: > + None + +```{autodoc2-docstring} nuropb.interface.NuropbInterface._service_instance +``` + +```` + +````{py:property} service_name +:canonical: nuropb.interface.NuropbInterface.service_name +:type: str + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.service_name +``` + +```` + +````{py:property} instance_id +:canonical: nuropb.interface.NuropbInterface.instance_id +:type: str + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.instance_id +``` + +```` + +````{py:method} connect() -> None +:canonical: nuropb.interface.NuropbInterface.connect +:abstractmethod: +:async: + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.connect +``` + +```` + +````{py:method} disconnect() -> None +:canonical: nuropb.interface.NuropbInterface.disconnect +:abstractmethod: +:async: + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.disconnect +``` + +```` + +````{py:property} connected +:canonical: nuropb.interface.NuropbInterface.connected +:abstractmethod: +:type: bool + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.connected +``` + +```` + +````{py:property} is_leader +:canonical: nuropb.interface.NuropbInterface.is_leader +:abstractmethod: +:type: bool + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.is_leader +``` + +```` + +````{py:method} receive_transport_message(service_message: nuropb.interface.TransportServicePayload, message_complete_callback: nuropb.interface.MessageCompleteFunction, metadata: typing.Dict[str, typing.Any]) -> None +:canonical: nuropb.interface.NuropbInterface.receive_transport_message +:abstractmethod: + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.receive_transport_message +``` + +```` + +````{py:method} request(service: str, method: str, params: typing.Dict[str, typing.Any], context: typing.Dict[str, typing.Any], ttl: typing.Optional[int] = None, trace_id: typing.Optional[str] = None, rpc_response: bool = True) -> typing.Union[nuropb.interface.ResponsePayloadDict, typing.Any] +:canonical: nuropb.interface.NuropbInterface.request +:abstractmethod: +:async: + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.request +``` + +```` + +````{py:method} command(service: str, method: str, params: typing.Dict[str, typing.Any], context: typing.Dict[str, typing.Any], ttl: typing.Optional[int] = None, trace_id: typing.Optional[str] = None) -> None +:canonical: nuropb.interface.NuropbInterface.command +:abstractmethod: + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.command +``` + +```` + +````{py:method} publish_event(topic: str, event: typing.Any, context: typing.Dict[str, typing.Any], trace_id: typing.Optional[str] = None) -> None +:canonical: nuropb.interface.NuropbInterface.publish_event +:abstractmethod: + +```{autodoc2-docstring} nuropb.interface.NuropbInterface.publish_event +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.md b/docs/source/apidocs/nuropb/nuropb.md new file mode 100644 index 0000000..4f38d69 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.md @@ -0,0 +1,33 @@ +# {py:mod}`nuropb` + +```{py:module} nuropb +``` + +```{autodoc2-docstring} nuropb +:allowtitles: +``` + +## Subpackages + +```{toctree} +:titlesonly: +:maxdepth: 3 + +nuropb.encodings +nuropb.contexts +nuropb.testing +``` + +## Submodules + +```{toctree} +:titlesonly: +:maxdepth: 1 + +nuropb.rmq_api +nuropb.rmq_transport +nuropb.interface +nuropb.rmq_lib +nuropb.utils +nuropb.service_runner +``` diff --git a/docs/source/apidocs/nuropb/nuropb.rmq_api.md b/docs/source/apidocs/nuropb/nuropb.rmq_api.md new file mode 100644 index 0000000..cab80bb --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.rmq_api.md @@ -0,0 +1,356 @@ +# {py:mod}`nuropb.rmq_api` + +```{py:module} nuropb.rmq_api +``` + +```{autodoc2-docstring} nuropb.rmq_api +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`RMQAPI ` + - ```{autodoc2-docstring} nuropb.rmq_api.RMQAPI + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.rmq_api.logger + :summary: + ``` +* - {py:obj}`verbose ` + - ```{autodoc2-docstring} nuropb.rmq_api.verbose + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.rmq_api.logger +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.logger +``` + +```` + +````{py:data} verbose +:canonical: nuropb.rmq_api.verbose +:value: > + False + +```{autodoc2-docstring} nuropb.rmq_api.verbose +``` + +```` + +`````{py:class} RMQAPI(amqp_url: str | typing.Dict[str, typing.Any], service_name: str | None = None, instance_id: str | None = None, service_instance: object | None = None, rpc_exchange: typing.Optional[str] = None, events_exchange: typing.Optional[str] = None, transport_settings: typing.Optional[typing.Dict[str, typing.Any]] = None) +:canonical: nuropb.rmq_api.RMQAPI + +Bases: {py:obj}`nuropb.interface.NuropbInterface` + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.__init__ +``` + +````{py:attribute} _mesh_name +:canonical: nuropb.rmq_api.RMQAPI._mesh_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._mesh_name +``` + +```` + +````{py:attribute} _connection_name +:canonical: nuropb.rmq_api.RMQAPI._connection_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._connection_name +``` + +```` + +````{py:attribute} _response_futures +:canonical: nuropb.rmq_api.RMQAPI._response_futures +:type: typing.Dict[str, nuropb.interface.ResultFutureResponsePayload] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._response_futures +``` + +```` + +````{py:attribute} _transport +:canonical: nuropb.rmq_api.RMQAPI._transport +:type: nuropb.rmq_transport.RMQTransport +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._transport +``` + +```` + +````{py:attribute} _rpc_exchange +:canonical: nuropb.rmq_api.RMQAPI._rpc_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._rpc_exchange +``` + +```` + +````{py:attribute} _events_exchange +:canonical: nuropb.rmq_api.RMQAPI._events_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._events_exchange +``` + +```` + +````{py:attribute} _service_instance +:canonical: nuropb.rmq_api.RMQAPI._service_instance +:type: object | None +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._service_instance +``` + +```` + +````{py:attribute} _default_ttl +:canonical: nuropb.rmq_api.RMQAPI._default_ttl +:type: int +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._default_ttl +``` + +```` + +````{py:attribute} _client_only +:canonical: nuropb.rmq_api.RMQAPI._client_only +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._client_only +``` + +```` + +````{py:attribute} _encryptor +:canonical: nuropb.rmq_api.RMQAPI._encryptor +:type: nuropb.encodings.encryption.Encryptor +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._encryptor +``` + +```` + +````{py:attribute} _service_discovery +:canonical: nuropb.rmq_api.RMQAPI._service_discovery +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._service_discovery +``` + +```` + +````{py:attribute} _service_public_keys +:canonical: nuropb.rmq_api.RMQAPI._service_public_keys +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._service_public_keys +``` + +```` + +````{py:method} _get_vhost(amqp_url: str | typing.Dict[str, typing.Any]) -> str +:canonical: nuropb.rmq_api.RMQAPI._get_vhost +:classmethod: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._get_vhost +``` + +```` + +````{py:attribute} _service_name +:canonical: nuropb.rmq_api.RMQAPI._service_name +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._service_name +``` + +```` + +````{py:property} service_name +:canonical: nuropb.rmq_api.RMQAPI.service_name +:type: str + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.service_name +``` + +```` + +````{py:property} is_leader +:canonical: nuropb.rmq_api.RMQAPI.is_leader +:type: bool + +```` + +````{py:property} client_only +:canonical: nuropb.rmq_api.RMQAPI.client_only +:type: bool + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.client_only +``` + +```` + +````{py:property} connected +:canonical: nuropb.rmq_api.RMQAPI.connected +:type: bool + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.connected +``` + +```` + +````{py:property} transport +:canonical: nuropb.rmq_api.RMQAPI.transport +:type: nuropb.rmq_transport.RMQTransport + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.transport +``` + +```` + +````{py:method} connect() -> None +:canonical: nuropb.rmq_api.RMQAPI.connect +:async: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.connect +``` + +```` + +````{py:method} disconnect() -> None +:canonical: nuropb.rmq_api.RMQAPI.disconnect +:async: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.disconnect +``` + +```` + +````{py:method} receive_transport_message(service_message: nuropb.interface.TransportServicePayload, message_complete_callback: nuropb.interface.MessageCompleteFunction, metadata: typing.Dict[str, typing.Any]) -> None +:canonical: nuropb.rmq_api.RMQAPI.receive_transport_message + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.receive_transport_message +``` + +```` + +````{py:method} _handle_immediate_request_error(rpc_response: bool, payload: nuropb.interface.RequestPayloadDict | nuropb.interface.ResponsePayloadDict, error: typing.Dict[str, typing.Any] | BaseException) -> nuropb.interface.ResponsePayloadDict +:canonical: nuropb.rmq_api.RMQAPI._handle_immediate_request_error +:classmethod: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI._handle_immediate_request_error +``` + +```` + +````{py:method} request(service: str, method: str, params: typing.Dict[str, typing.Any], context: typing.Dict[str, typing.Any], ttl: typing.Optional[int] = None, trace_id: typing.Optional[str] = None, rpc_response: bool = True, encrypted: bool = False) -> typing.Union[nuropb.interface.ResponsePayloadDict, typing.Any] +:canonical: nuropb.rmq_api.RMQAPI.request +:async: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.request +``` + +```` + +````{py:method} command(service: str, method: str, params: typing.Dict[str, typing.Any], context: typing.Dict[str, typing.Any], ttl: typing.Optional[int] = None, trace_id: typing.Optional[str] = None, encrypted: bool = False) -> None +:canonical: nuropb.rmq_api.RMQAPI.command + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.command +``` + +```` + +````{py:method} publish_event(topic: str, event: typing.Dict[str, typing.Any], context: typing.Dict[str, typing.Any], trace_id: typing.Optional[str] = None, encrypted: bool = False) -> None +:canonical: nuropb.rmq_api.RMQAPI.publish_event + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.publish_event +``` + +```` + +````{py:method} describe_service(service_name: str, refresh: bool = False) -> typing.Dict[str, typing.Any] | None +:canonical: nuropb.rmq_api.RMQAPI.describe_service +:async: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.describe_service +``` + +```` + +````{py:method} requires_encryption(service_name: str, method_name: str) -> bool +:canonical: nuropb.rmq_api.RMQAPI.requires_encryption +:async: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.requires_encryption +``` + +```` + +````{py:method} has_public_key(service_name: str) -> bool +:canonical: nuropb.rmq_api.RMQAPI.has_public_key +:async: + +```{autodoc2-docstring} nuropb.rmq_api.RMQAPI.has_public_key +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.rmq_lib.md b/docs/source/apidocs/nuropb/nuropb.rmq_lib.md new file mode 100644 index 0000000..b845f1a --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.rmq_lib.md @@ -0,0 +1,207 @@ +# {py:mod}`nuropb.rmq_lib` + +```{py:module} nuropb.rmq_lib +``` + +```{autodoc2-docstring} nuropb.rmq_lib +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`build_amqp_url ` + - ```{autodoc2-docstring} nuropb.rmq_lib.build_amqp_url + :summary: + ``` +* - {py:obj}`build_rmq_api_url ` + - ```{autodoc2-docstring} nuropb.rmq_lib.build_rmq_api_url + :summary: + ``` +* - {py:obj}`rmq_api_url_from_amqp_url ` + - ```{autodoc2-docstring} nuropb.rmq_lib.rmq_api_url_from_amqp_url + :summary: + ``` +* - {py:obj}`get_client_connection_properties ` + - ```{autodoc2-docstring} nuropb.rmq_lib.get_client_connection_properties + :summary: + ``` +* - {py:obj}`get_connection_parameters ` + - ```{autodoc2-docstring} nuropb.rmq_lib.get_connection_parameters + :summary: + ``` +* - {py:obj}`management_api_session_info ` + - ```{autodoc2-docstring} nuropb.rmq_lib.management_api_session_info + :summary: + ``` +* - {py:obj}`blocking_rabbitmq_channel ` + - ```{autodoc2-docstring} nuropb.rmq_lib.blocking_rabbitmq_channel + :summary: + ``` +* - {py:obj}`configure_nuropb_rmq ` + - ```{autodoc2-docstring} nuropb.rmq_lib.configure_nuropb_rmq + :summary: + ``` +* - {py:obj}`nack_message ` + - ```{autodoc2-docstring} nuropb.rmq_lib.nack_message + :summary: + ``` +* - {py:obj}`reject_message ` + - ```{autodoc2-docstring} nuropb.rmq_lib.reject_message + :summary: + ``` +* - {py:obj}`ack_message ` + - ```{autodoc2-docstring} nuropb.rmq_lib.ack_message + :summary: + ``` +* - {py:obj}`get_virtual_host_queues ` + - ```{autodoc2-docstring} nuropb.rmq_lib.get_virtual_host_queues + :summary: + ``` +* - {py:obj}`get_virtual_hosts ` + - ```{autodoc2-docstring} nuropb.rmq_lib.get_virtual_hosts + :summary: + ``` +* - {py:obj}`create_virtual_host ` + - ```{autodoc2-docstring} nuropb.rmq_lib.create_virtual_host + :summary: + ``` +* - {py:obj}`delete_virtual_host ` + - ```{autodoc2-docstring} nuropb.rmq_lib.delete_virtual_host + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.rmq_lib.logger + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.rmq_lib.logger +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_lib.logger +``` + +```` + +````{py:function} build_amqp_url(host: str, port: str | int, username: str, password: str, vhost: str) -> str +:canonical: nuropb.rmq_lib.build_amqp_url + +```{autodoc2-docstring} nuropb.rmq_lib.build_amqp_url +``` +```` + +````{py:function} build_rmq_api_url(scheme: str, host: str, port: str | int, username: str | None, password: str | None) -> str +:canonical: nuropb.rmq_lib.build_rmq_api_url + +```{autodoc2-docstring} nuropb.rmq_lib.build_rmq_api_url +``` +```` + +````{py:function} rmq_api_url_from_amqp_url(amqp_url: str, scheme: typing.Optional[str] = None, port: typing.Optional[int | str] = None) -> str +:canonical: nuropb.rmq_lib.rmq_api_url_from_amqp_url + +```{autodoc2-docstring} nuropb.rmq_lib.rmq_api_url_from_amqp_url +``` +```` + +````{py:function} get_client_connection_properties(name: typing.Optional[str] = None, instance_id: typing.Optional[str] = None, client_only: typing.Optional[bool] = None) -> typing.Dict[str, str] +:canonical: nuropb.rmq_lib.get_client_connection_properties + +```{autodoc2-docstring} nuropb.rmq_lib.get_client_connection_properties +``` +```` + +````{py:function} get_connection_parameters(amqp_url: str | typing.Dict[str, typing.Any], name: typing.Optional[str] = None, instance_id: typing.Optional[str] = None, client_only: typing.Optional[bool] = None, **overrides: typing.Any) -> pika.ConnectionParameters | pika.URLParameters +:canonical: nuropb.rmq_lib.get_connection_parameters + +```{autodoc2-docstring} nuropb.rmq_lib.get_connection_parameters +``` +```` + +````{py:function} management_api_session_info(scheme: str, host: str, port: str | int, username: typing.Optional[str] = None, password: typing.Optional[str] = None, bearer_token: typing.Optional[str] = None, verify: bool = False, **headers: typing.Any) -> typing.Dict[str, typing.Any] +:canonical: nuropb.rmq_lib.management_api_session_info + +```{autodoc2-docstring} nuropb.rmq_lib.management_api_session_info +``` +```` + +````{py:function} blocking_rabbitmq_channel(rmq_url: str | typing.Dict[str, typing.Any]) -> pika.channel.Channel +:canonical: nuropb.rmq_lib.blocking_rabbitmq_channel + +```{autodoc2-docstring} nuropb.rmq_lib.blocking_rabbitmq_channel +``` +```` + +````{py:function} configure_nuropb_rmq(rmq_url: str | typing.Dict[str, typing.Any], events_exchange: str, rpc_exchange: str, dl_exchange: str, dl_queue: str, **kwargs: typing.Any) -> bool +:canonical: nuropb.rmq_lib.configure_nuropb_rmq + +```{autodoc2-docstring} nuropb.rmq_lib.configure_nuropb_rmq +``` +```` + +````{py:function} nack_message(channel: pika.channel.Channel, delivery_tag: int, properties: pika.spec.BasicProperties, mesg: nuropb.interface.PayloadDict | None, error: Exception | None = None) -> None +:canonical: nuropb.rmq_lib.nack_message + +```{autodoc2-docstring} nuropb.rmq_lib.nack_message +``` +```` + +````{py:function} reject_message(channel: pika.channel.Channel, delivery_tag: int, properties: pika.spec.BasicProperties, mesg: nuropb.interface.PayloadDict | None, error: Exception | None = None) -> None +:canonical: nuropb.rmq_lib.reject_message + +```{autodoc2-docstring} nuropb.rmq_lib.reject_message +``` +```` + +````{py:function} ack_message(channel: pika.channel.Channel, delivery_tag: int, properties: pika.spec.BasicProperties, mesg: nuropb.interface.PayloadDict | None, error: Exception | None = None) -> None +:canonical: nuropb.rmq_lib.ack_message + +```{autodoc2-docstring} nuropb.rmq_lib.ack_message +``` +```` + +````{py:function} get_virtual_host_queues(api_url: str, vhost_url: str) -> typing.Any | None +:canonical: nuropb.rmq_lib.get_virtual_host_queues + +```{autodoc2-docstring} nuropb.rmq_lib.get_virtual_host_queues +``` +```` + +````{py:function} get_virtual_hosts(api_url: str, vhost_url: str | typing.Dict[str, typing.Any]) -> typing.Any | None +:canonical: nuropb.rmq_lib.get_virtual_hosts + +```{autodoc2-docstring} nuropb.rmq_lib.get_virtual_hosts +``` +```` + +````{py:function} create_virtual_host(api_url: str, vhost_url: str | typing.Dict[str, typing.Any]) -> None +:canonical: nuropb.rmq_lib.create_virtual_host + +```{autodoc2-docstring} nuropb.rmq_lib.create_virtual_host +``` +```` + +````{py:function} delete_virtual_host(api_url: str, vhost_url: str | typing.Dict[str, typing.Any]) -> None +:canonical: nuropb.rmq_lib.delete_virtual_host + +```{autodoc2-docstring} nuropb.rmq_lib.delete_virtual_host +``` +```` diff --git a/docs/source/apidocs/nuropb/nuropb.rmq_transport.md b/docs/source/apidocs/nuropb/nuropb.rmq_transport.md new file mode 100644 index 0000000..8f537c5 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.rmq_transport.md @@ -0,0 +1,871 @@ +# {py:mod}`nuropb.rmq_transport` + +```{py:module} nuropb.rmq_transport +``` + +```{autodoc2-docstring} nuropb.rmq_transport +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`RabbitMQConfiguration ` + - +* - {py:obj}`RMQTransport ` + - ```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`verbose ` + - ```{autodoc2-docstring} nuropb.rmq_transport.verbose + :summary: + ``` +* - {py:obj}`decode_rmq_body ` + - ```{autodoc2-docstring} nuropb.rmq_transport.decode_rmq_body + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.rmq_transport.logger + :summary: + ``` +* - {py:obj}`CONSUMER_CLOSED_WAIT_TIMEOUT ` + - ```{autodoc2-docstring} nuropb.rmq_transport.CONSUMER_CLOSED_WAIT_TIMEOUT + :summary: + ``` +* - {py:obj}`_verbose ` + - ```{autodoc2-docstring} nuropb.rmq_transport._verbose + :summary: + ``` +```` + +### API + +`````{py:class} RabbitMQConfiguration() +:canonical: nuropb.rmq_transport.RabbitMQConfiguration + +Bases: {py:obj}`typing.TypedDict` + +````{py:attribute} rpc_exchange +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.rpc_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.rpc_exchange +``` + +```` + +````{py:attribute} events_exchange +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.events_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.events_exchange +``` + +```` + +````{py:attribute} dl_exchange +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.dl_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.dl_exchange +``` + +```` + +````{py:attribute} dl_queue +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.dl_queue +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.dl_queue +``` + +```` + +````{py:attribute} service_queue +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.service_queue +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.service_queue +``` + +```` + +````{py:attribute} response_queue +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.response_queue +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.response_queue +``` + +```` + +````{py:attribute} rpc_bindings +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.rpc_bindings +:type: typing.List[str] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.rpc_bindings +``` + +```` + +````{py:attribute} event_bindings +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.event_bindings +:type: typing.List[str] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.event_bindings +``` + +```` + +````{py:attribute} default_ttl +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.default_ttl +:type: int +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.default_ttl +``` + +```` + +````{py:attribute} client_only +:canonical: nuropb.rmq_transport.RabbitMQConfiguration.client_only +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RabbitMQConfiguration.client_only +``` + +```` + +````` + +````{py:data} logger +:canonical: nuropb.rmq_transport.logger +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.logger +``` + +```` + +````{py:data} CONSUMER_CLOSED_WAIT_TIMEOUT +:canonical: nuropb.rmq_transport.CONSUMER_CLOSED_WAIT_TIMEOUT +:value: > + 10 + +```{autodoc2-docstring} nuropb.rmq_transport.CONSUMER_CLOSED_WAIT_TIMEOUT +``` + +```` + +````{py:data} _verbose +:canonical: nuropb.rmq_transport._verbose +:value: > + False + +```{autodoc2-docstring} nuropb.rmq_transport._verbose +``` + +```` + +````{py:function} verbose() -> bool +:canonical: nuropb.rmq_transport.verbose + +```{autodoc2-docstring} nuropb.rmq_transport.verbose +``` +```` + +````{py:function} decode_rmq_body(method: pika.spec.Basic.Deliver, properties: pika.spec.BasicProperties, body: bytes) -> nuropb.interface.TransportServicePayload +:canonical: nuropb.rmq_transport.decode_rmq_body + +```{autodoc2-docstring} nuropb.rmq_transport.decode_rmq_body +``` +```` + +````{py:exception} ServiceNotConfigured() +:canonical: nuropb.rmq_transport.ServiceNotConfigured + +Bases: {py:obj}`Exception` + +```{autodoc2-docstring} nuropb.rmq_transport.ServiceNotConfigured +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.rmq_transport.ServiceNotConfigured.__init__ +``` + +```` + +`````{py:class} RMQTransport(service_name: str, instance_id: str, amqp_url: str | typing.Dict[str, typing.Any], message_callback: nuropb.interface.MessageCallbackFunction, default_ttl: typing.Optional[int] = None, client_only: typing.Optional[bool] = None, encryptor: typing.Optional[nuropb.encodings.encryption.Encryptor] = None, **kwargs: typing.Any) +:canonical: nuropb.rmq_transport.RMQTransport + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.__init__ +``` + +````{py:attribute} _service_name +:canonical: nuropb.rmq_transport.RMQTransport._service_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: nuropb.rmq_transport.RMQTransport._instance_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._instance_id +``` + +```` + +````{py:attribute} _amqp_url +:canonical: nuropb.rmq_transport.RMQTransport._amqp_url +:type: str | typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._amqp_url +``` + +```` + +````{py:attribute} _rpc_exchange +:canonical: nuropb.rmq_transport.RMQTransport._rpc_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._rpc_exchange +``` + +```` + +````{py:attribute} _events_exchange +:canonical: nuropb.rmq_transport.RMQTransport._events_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._events_exchange +``` + +```` + +````{py:attribute} _dl_exchange +:canonical: nuropb.rmq_transport.RMQTransport._dl_exchange +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._dl_exchange +``` + +```` + +````{py:attribute} _dl_queue +:canonical: nuropb.rmq_transport.RMQTransport._dl_queue +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._dl_queue +``` + +```` + +````{py:attribute} _service_queue +:canonical: nuropb.rmq_transport.RMQTransport._service_queue +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._service_queue +``` + +```` + +````{py:attribute} _response_queue +:canonical: nuropb.rmq_transport.RMQTransport._response_queue +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._response_queue +``` + +```` + +````{py:attribute} _rpc_bindings +:canonical: nuropb.rmq_transport.RMQTransport._rpc_bindings +:type: typing.Set[str] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._rpc_bindings +``` + +```` + +````{py:attribute} _event_bindings +:canonical: nuropb.rmq_transport.RMQTransport._event_bindings +:type: typing.Set[str] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._event_bindings +``` + +```` + +````{py:attribute} _prefetch_count +:canonical: nuropb.rmq_transport.RMQTransport._prefetch_count +:type: int +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._prefetch_count +``` + +```` + +````{py:attribute} _default_ttl +:canonical: nuropb.rmq_transport.RMQTransport._default_ttl +:type: int +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._default_ttl +``` + +```` + +````{py:attribute} _client_only +:canonical: nuropb.rmq_transport.RMQTransport._client_only +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._client_only +``` + +```` + +````{py:attribute} _message_callback +:canonical: nuropb.rmq_transport.RMQTransport._message_callback +:type: nuropb.interface.MessageCallbackFunction +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._message_callback +``` + +```` + +````{py:attribute} _encryptor +:canonical: nuropb.rmq_transport.RMQTransport._encryptor +:type: nuropb.encodings.encryption.Encryptor | None +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._encryptor +``` + +```` + +````{py:attribute} _connected_future +:canonical: nuropb.rmq_transport.RMQTransport._connected_future +:type: typing.Any +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._connected_future +``` + +```` + +````{py:attribute} _disconnected_future +:canonical: nuropb.rmq_transport.RMQTransport._disconnected_future +:type: typing.Any +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._disconnected_future +``` + +```` + +````{py:attribute} _is_leader +:canonical: nuropb.rmq_transport.RMQTransport._is_leader +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._is_leader +``` + +```` + +````{py:attribute} _is_rabbitmq_configured +:canonical: nuropb.rmq_transport.RMQTransport._is_rabbitmq_configured +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._is_rabbitmq_configured +``` + +```` + +````{py:attribute} _connection +:canonical: nuropb.rmq_transport.RMQTransport._connection +:type: pika.adapters.asyncio_connection.AsyncioConnection | None +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._connection +``` + +```` + +````{py:attribute} _channel +:canonical: nuropb.rmq_transport.RMQTransport._channel +:type: pika.channel.Channel | None +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._channel +``` + +```` + +````{py:attribute} _consumer_tags +:canonical: nuropb.rmq_transport.RMQTransport._consumer_tags +:type: typing.Set[typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._consumer_tags +``` + +```` + +````{py:attribute} _consuming +:canonical: nuropb.rmq_transport.RMQTransport._consuming +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._consuming +``` + +```` + +````{py:attribute} _connecting +:canonical: nuropb.rmq_transport.RMQTransport._connecting +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._connecting +``` + +```` + +````{py:attribute} _closing +:canonical: nuropb.rmq_transport.RMQTransport._closing +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._closing +``` + +```` + +````{py:attribute} _connected +:canonical: nuropb.rmq_transport.RMQTransport._connected +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._connected +``` + +```` + +````{py:attribute} _was_consuming +:canonical: nuropb.rmq_transport.RMQTransport._was_consuming +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport._was_consuming +``` + +```` + +````{py:property} service_name +:canonical: nuropb.rmq_transport.RMQTransport.service_name +:type: str + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.service_name +``` + +```` + +````{py:property} instance_id +:canonical: nuropb.rmq_transport.RMQTransport.instance_id +:type: str + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.instance_id +``` + +```` + +````{py:property} amqp_url +:canonical: nuropb.rmq_transport.RMQTransport.amqp_url +:type: str | typing.Dict[str, typing.Any] + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.amqp_url +``` + +```` + +````{py:property} is_leader +:canonical: nuropb.rmq_transport.RMQTransport.is_leader +:type: bool + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.is_leader +``` + +```` + +````{py:property} connected +:canonical: nuropb.rmq_transport.RMQTransport.connected +:type: bool + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.connected +``` + +```` + +````{py:property} rpc_exchange +:canonical: nuropb.rmq_transport.RMQTransport.rpc_exchange +:type: str + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.rpc_exchange +``` + +```` + +````{py:property} events_exchange +:canonical: nuropb.rmq_transport.RMQTransport.events_exchange +:type: str + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.events_exchange +``` + +```` + +````{py:property} response_queue +:canonical: nuropb.rmq_transport.RMQTransport.response_queue +:type: str + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.response_queue +``` + +```` + +````{py:property} rmq_configuration +:canonical: nuropb.rmq_transport.RMQTransport.rmq_configuration +:type: nuropb.rmq_transport.RabbitMQConfiguration + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.rmq_configuration +``` + +```` + +````{py:method} configure_rabbitmq(rmq_configuration: typing.Optional[nuropb.rmq_transport.RabbitMQConfiguration] = None, amqp_url: typing.Optional[str | typing.Dict[str, typing.Any]] = None, rmq_api_url: typing.Optional[str] = None) -> None +:canonical: nuropb.rmq_transport.RMQTransport.configure_rabbitmq + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.configure_rabbitmq +``` + +```` + +````{py:method} start() -> None +:canonical: nuropb.rmq_transport.RMQTransport.start +:async: + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.start +``` + +```` + +````{py:method} stop() -> None +:canonical: nuropb.rmq_transport.RMQTransport.stop +:async: + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.stop +``` + +```` + +````{py:method} connect() -> asyncio.Future[bool] +:canonical: nuropb.rmq_transport.RMQTransport.connect + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.connect +``` + +```` + +````{py:method} disconnect() -> typing.Awaitable[bool] +:canonical: nuropb.rmq_transport.RMQTransport.disconnect + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.disconnect +``` + +```` + +````{py:method} on_connection_open(_connection: pika.adapters.asyncio_connection.AsyncioConnection) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_connection_open + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_connection_open +``` + +```` + +````{py:method} on_connection_open_error(conn: pika.adapters.asyncio_connection.AsyncioConnection, reason: Exception) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_connection_open_error + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_connection_open_error +``` + +```` + +````{py:method} on_connection_closed(_connection: pika.adapters.asyncio_connection.AsyncioConnection, reason: Exception) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_connection_closed + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_connection_closed +``` + +```` + +````{py:method} open_channel() -> None +:canonical: nuropb.rmq_transport.RMQTransport.open_channel + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.open_channel +``` + +```` + +````{py:method} on_channel_open(channel: pika.channel.Channel) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_channel_open + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_channel_open +``` + +```` + +````{py:method} on_channel_closed(channel: pika.channel.Channel, reason: Exception) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_channel_closed + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_channel_closed +``` + +```` + +````{py:method} declare_service_queue(frame: pika.frame.Method) -> None +:canonical: nuropb.rmq_transport.RMQTransport.declare_service_queue + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.declare_service_queue +``` + +```` + +````{py:method} on_service_queue_declareok(frame: pika.frame.Method, _userdata: str) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_service_queue_declareok + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_service_queue_declareok +``` + +```` + +````{py:method} declare_response_queue() -> None +:canonical: nuropb.rmq_transport.RMQTransport.declare_response_queue + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.declare_response_queue +``` + +```` + +````{py:method} on_response_queue_declareok(frame: pika.frame.Method, _userdata: str) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_response_queue_declareok + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_response_queue_declareok +``` + +```` + +````{py:method} on_bindok(_frame: pika.frame.Method, userdata: str) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_bindok + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_bindok +``` + +```` + +````{py:method} on_basic_qos_ok(_frame: pika.frame.Method) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_basic_qos_ok + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_basic_qos_ok +``` + +```` + +````{py:method} on_consumer_cancelled(method_frame: pika.frame.Method) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_consumer_cancelled + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_consumer_cancelled +``` + +```` + +````{py:method} on_message_returned(channel: pika.channel.Channel, method: pika.spec.Basic.Return, properties: pika.spec.BasicProperties, body: bytes) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_message_returned + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_message_returned +``` + +```` + +````{py:method} send_message(payload: typing.Dict[str, typing.Any], expiry: typing.Optional[int] = None, priority: typing.Optional[int] = None, encoding: str = 'json', encrypted: bool = False) -> None +:canonical: nuropb.rmq_transport.RMQTransport.send_message + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.send_message +``` + +```` + +````{py:method} acknowledge_service_message(channel: pika.channel.Channel, delivery_tag: int, action: typing.Literal[ack, nack, reject], redelivered: bool) -> None +:canonical: nuropb.rmq_transport.RMQTransport.acknowledge_service_message +:classmethod: + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.acknowledge_service_message +``` + +```` + +````{py:method} metadata_metrics(metadata: typing.Dict[str, typing.Any]) -> None +:canonical: nuropb.rmq_transport.RMQTransport.metadata_metrics +:classmethod: + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.metadata_metrics +``` + +```` + +````{py:method} on_service_message_complete(channel: pika.channel.Channel, basic_deliver: pika.spec.Basic.Deliver, properties: pika.spec.BasicProperties, private_metadata: typing.Dict[str, typing.Any], response_messages: typing.List[nuropb.interface.TransportRespondPayload], acknowledgement: nuropb.interface.AcknowledgeAction) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_service_message_complete + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_service_message_complete +``` + +```` + +````{py:method} on_service_message(queue_name: str, channel: pika.channel.Channel, basic_deliver: pika.spec.Basic.Deliver, properties: pika.spec.BasicProperties, body: bytes) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_service_message + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_service_message +``` + +```` + +````{py:method} on_response_message_complete(channel: pika.channel.Channel, basic_deliver: pika.spec.Basic.Deliver, properties: pika.spec.BasicProperties, private_metadata: typing.Dict[str, typing.Any], response_messages: typing.List[nuropb.interface.TransportRespondPayload], acknowledgement: nuropb.interface.AcknowledgeAction) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_response_message_complete + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_response_message_complete +``` + +```` + +````{py:method} on_response_message(_queue_name: str, channel: pika.channel.Channel, basic_deliver: pika.spec.Basic.Deliver, properties: pika.spec.BasicProperties, body: bytes) -> None +:canonical: nuropb.rmq_transport.RMQTransport.on_response_message + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.on_response_message +``` + +```` + +````{py:method} stop_consuming() -> None +:canonical: nuropb.rmq_transport.RMQTransport.stop_consuming +:async: + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.stop_consuming +``` + +```` + +````{py:method} close_channel() -> None +:canonical: nuropb.rmq_transport.RMQTransport.close_channel + +```{autodoc2-docstring} nuropb.rmq_transport.RMQTransport.close_channel +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.service_runner.md b/docs/source/apidocs/nuropb/nuropb.service_runner.md new file mode 100644 index 0000000..9e14149 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.service_runner.md @@ -0,0 +1,435 @@ +# {py:mod}`nuropb.service_runner` + +```{py:module} nuropb.service_runner +``` + +```{autodoc2-docstring} nuropb.service_runner +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`ServiceRunner ` + - ```{autodoc2-docstring} nuropb.service_runner.ServiceRunner + :summary: + ``` +* - {py:obj}`ServiceContainer ` + - +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.service_runner.logger + :summary: + ``` +* - {py:obj}`LEADER_KEY ` + - ```{autodoc2-docstring} nuropb.service_runner.LEADER_KEY + :summary: + ``` +* - {py:obj}`LEASE_TTL ` + - ```{autodoc2-docstring} nuropb.service_runner.LEASE_TTL + :summary: + ``` +* - {py:obj}`ContainerRunningState ` + - ```{autodoc2-docstring} nuropb.service_runner.ContainerRunningState + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.service_runner.logger +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.logger +``` + +```` + +````{py:data} LEADER_KEY +:canonical: nuropb.service_runner.LEADER_KEY +:value: > + '/leader' + +```{autodoc2-docstring} nuropb.service_runner.LEADER_KEY +``` + +```` + +````{py:data} LEASE_TTL +:canonical: nuropb.service_runner.LEASE_TTL +:value: > + 15 + +```{autodoc2-docstring} nuropb.service_runner.LEASE_TTL +``` + +```` + +`````{py:class} ServiceRunner +:canonical: nuropb.service_runner.ServiceRunner + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner +``` + +````{py:attribute} service_name +:canonical: nuropb.service_runner.ServiceRunner.service_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner.service_name +``` + +```` + +````{py:attribute} leader_id +:canonical: nuropb.service_runner.ServiceRunner.leader_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner.leader_id +``` + +```` + +````{py:attribute} configured +:canonical: nuropb.service_runner.ServiceRunner.configured +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner.configured +``` + +```` + +````{py:attribute} ready +:canonical: nuropb.service_runner.ServiceRunner.ready +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner.ready +``` + +```` + +````{py:attribute} consume +:canonical: nuropb.service_runner.ServiceRunner.consume +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner.consume +``` + +```` + +````{py:attribute} hw_mark +:canonical: nuropb.service_runner.ServiceRunner.hw_mark +:type: int +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner.hw_mark +``` + +```` + +````{py:attribute} _etc_client +:canonical: nuropb.service_runner.ServiceRunner._etc_client +:type: etcd3.Client +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceRunner._etc_client +``` + +```` + +````` + +````{py:data} ContainerRunningState +:canonical: nuropb.service_runner.ContainerRunningState +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ContainerRunningState +``` + +```` + +`````{py:class} ServiceContainer(rmq_api_url: str, instance: nuropb.rmq_api.RMQAPI, etcd_config: typing.Optional[typing.Dict[str, typing.Any]] = None) +:canonical: nuropb.service_runner.ServiceContainer + +Bases: {py:obj}`nuropb.service_runner.ServiceRunner` + +````{py:attribute} _instance +:canonical: nuropb.service_runner.ServiceContainer._instance +:type: nuropb.rmq_api.RMQAPI +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._instance +``` + +```` + +````{py:attribute} _rmq_api_url +:canonical: nuropb.service_runner.ServiceContainer._rmq_api_url +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._rmq_api_url +``` + +```` + +````{py:attribute} _service_name +:canonical: nuropb.service_runner.ServiceContainer._service_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._service_name +``` + +```` + +````{py:attribute} _transport +:canonical: nuropb.service_runner.ServiceContainer._transport +:type: nuropb.rmq_transport.RMQTransport +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._transport +``` + +```` + +````{py:attribute} _running_state +:canonical: nuropb.service_runner.ServiceContainer._running_state +:type: nuropb.service_runner.ContainerRunningState +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._running_state +``` + +```` + +````{py:attribute} _rmq_config_ok +:canonical: nuropb.service_runner.ServiceContainer._rmq_config_ok +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._rmq_config_ok +``` + +```` + +````{py:attribute} _shutdown +:canonical: nuropb.service_runner.ServiceContainer._shutdown +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._shutdown +``` + +```` + +````{py:attribute} _is_leader +:canonical: nuropb.service_runner.ServiceContainer._is_leader +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._is_leader +``` + +```` + +````{py:attribute} _leader_reference +:canonical: nuropb.service_runner.ServiceContainer._leader_reference +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._leader_reference +``` + +```` + +````{py:attribute} _etcd_config +:canonical: nuropb.service_runner.ServiceContainer._etcd_config +:type: typing.Dict[str, typing.Any] +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._etcd_config +``` + +```` + +````{py:attribute} _etcd_client +:canonical: nuropb.service_runner.ServiceContainer._etcd_client +:type: etcd3.Client | None +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._etcd_client +``` + +```` + +````{py:attribute} _etcd_lease +:canonical: nuropb.service_runner.ServiceContainer._etcd_lease +:type: etcd3.stateful.lease.Lease | None +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._etcd_lease +``` + +```` + +````{py:attribute} _etcd_watcher +:canonical: nuropb.service_runner.ServiceContainer._etcd_watcher +:type: etcd3.stateful.watch.Watcher | None +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._etcd_watcher +``` + +```` + +````{py:attribute} _etcd_prefix +:canonical: nuropb.service_runner.ServiceContainer._etcd_prefix +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._etcd_prefix +``` + +```` + +````{py:attribute} _container_running_future +:canonical: nuropb.service_runner.ServiceContainer._container_running_future +:type: typing.Awaitable[bool] | None +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._container_running_future +``` + +```` + +````{py:attribute} _container_shutdown_future +:canonical: nuropb.service_runner.ServiceContainer._container_shutdown_future +:type: typing.Awaitable[bool] | None +:value: > + None + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer._container_shutdown_future +``` + +```` + +````{py:property} running_state +:canonical: nuropb.service_runner.ServiceContainer.running_state +:type: nuropb.service_runner.ContainerRunningState + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.running_state +``` + +```` + +````{py:method} init_etcd(on_startup: bool = True) -> bool +:canonical: nuropb.service_runner.ServiceContainer.init_etcd +:async: + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.init_etcd +``` + +```` + +````{py:method} nominate_as_leader() -> None +:canonical: nuropb.service_runner.ServiceContainer.nominate_as_leader + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.nominate_as_leader +``` + +```` + +````{py:method} update_etcd_service_property(key: str, value: typing.Any) -> bool +:canonical: nuropb.service_runner.ServiceContainer.update_etcd_service_property + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.update_etcd_service_property +``` + +```` + +````{py:method} check_and_configure_rmq() -> None +:canonical: nuropb.service_runner.ServiceContainer.check_and_configure_rmq + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.check_and_configure_rmq +``` + +```` + +````{py:method} etcd_event_handler(event: etcd3.stateful.watch.Event) -> None +:canonical: nuropb.service_runner.ServiceContainer.etcd_event_handler + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.etcd_event_handler +``` + +```` + +````{py:method} startup_steps() -> None +:canonical: nuropb.service_runner.ServiceContainer.startup_steps +:async: + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.startup_steps +``` + +```` + +````{py:method} start() -> bool +:canonical: nuropb.service_runner.ServiceContainer.start +:async: + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.start +``` + +```` + +````{py:method} stop() -> None +:canonical: nuropb.service_runner.ServiceContainer.stop +:async: + +```{autodoc2-docstring} nuropb.service_runner.ServiceContainer.stop +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.testing.md b/docs/source/apidocs/nuropb/nuropb.testing.md new file mode 100644 index 0000000..4ee15a1 --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.testing.md @@ -0,0 +1,17 @@ +# {py:mod}`nuropb.testing` + +```{py:module} nuropb.testing +``` + +```{autodoc2-docstring} nuropb.testing +:allowtitles: +``` + +## Submodules + +```{toctree} +:titlesonly: +:maxdepth: 1 + +nuropb.testing.stubs +``` diff --git a/docs/source/apidocs/nuropb/nuropb.testing.stubs.md b/docs/source/apidocs/nuropb/nuropb.testing.stubs.md new file mode 100644 index 0000000..205700c --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.testing.stubs.md @@ -0,0 +1,261 @@ +# {py:mod}`nuropb.testing.stubs` + +```{py:module} nuropb.testing.stubs +``` + +```{autodoc2-docstring} nuropb.testing.stubs +:allowtitles: +``` + +## Module Contents + +### Classes + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`ServiceStub ` + - ```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub + :summary: + ``` +* - {py:obj}`ServiceExample ` + - ```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample + :summary: + ``` +```` + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`get_claims_from_token ` + - ```{autodoc2-docstring} nuropb.testing.stubs.get_claims_from_token + :summary: + ``` +```` + +### Data + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`logger ` + - ```{autodoc2-docstring} nuropb.testing.stubs.logger + :summary: + ``` +* - {py:obj}`IN_GITHUB_ACTIONS ` + - ```{autodoc2-docstring} nuropb.testing.stubs.IN_GITHUB_ACTIONS + :summary: + ``` +```` + +### API + +````{py:data} logger +:canonical: nuropb.testing.stubs.logger +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.logger +``` + +```` + +````{py:data} IN_GITHUB_ACTIONS +:canonical: nuropb.testing.stubs.IN_GITHUB_ACTIONS +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.IN_GITHUB_ACTIONS +``` + +```` + +````{py:function} get_claims_from_token(bearer_token: str) -> typing.Dict[str, typing.Any] | None +:canonical: nuropb.testing.stubs.get_claims_from_token + +```{autodoc2-docstring} nuropb.testing.stubs.get_claims_from_token +``` +```` + +`````{py:class} ServiceStub(service_name: str, instance_id: typing.Optional[str] = None, private_key: typing.Optional[cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey] = None) +:canonical: nuropb.testing.stubs.ServiceStub + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub.__init__ +``` + +````{py:attribute} _service_name +:canonical: nuropb.testing.stubs.ServiceStub._service_name +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub._service_name +``` + +```` + +````{py:attribute} _instance_id +:canonical: nuropb.testing.stubs.ServiceStub._instance_id +:type: str +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub._instance_id +``` + +```` + +````{py:attribute} _private_key +:canonical: nuropb.testing.stubs.ServiceStub._private_key +:type: cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub._private_key +``` + +```` + +````{py:property} service_name +:canonical: nuropb.testing.stubs.ServiceStub.service_name +:type: str + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub.service_name +``` + +```` + +````{py:property} instance_id +:canonical: nuropb.testing.stubs.ServiceStub.instance_id +:type: str + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub.instance_id +``` + +```` + +````{py:property} private_key +:canonical: nuropb.testing.stubs.ServiceStub.private_key +:type: cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceStub.private_key +``` + +```` + +````` + +`````{py:class} ServiceExample(*args: typing.Any, **kwargs: typing.Any) +:canonical: nuropb.testing.stubs.ServiceExample + +Bases: {py:obj}`nuropb.testing.stubs.ServiceStub` + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample +``` + +```{rubric} Initialization +``` + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.__init__ +``` + +````{py:attribute} _method_call_count +:canonical: nuropb.testing.stubs.ServiceExample._method_call_count +:type: int +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample._method_call_count +``` + +```` + +````{py:attribute} _raise_call_again_error +:canonical: nuropb.testing.stubs.ServiceExample._raise_call_again_error +:type: bool +:value: > + None + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample._raise_call_again_error +``` + +```` + +````{py:method} test_method(**kwargs: typing.Any) -> str +:canonical: nuropb.testing.stubs.ServiceExample.test_method + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_method +``` + +```` + +````{py:method} do_async_task(**kwargs: typing.Any) -> str +:canonical: nuropb.testing.stubs.ServiceExample.do_async_task +:async: + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.do_async_task +``` + +```` + +````{py:method} test_async_method(**kwargs: typing.Any) -> str +:canonical: nuropb.testing.stubs.ServiceExample.test_async_method +:async: + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_async_method +``` + +```` + +````{py:method} test_success_error(**kwargs: typing.Any) -> None +:canonical: nuropb.testing.stubs.ServiceExample.test_success_error + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_success_error +``` + +```` + +````{py:method} test_requires_user_claims(ctx: nuropb.contexts.context_manager.NuropbContextManager, **kwargs: typing.Any) -> typing.Any +:canonical: nuropb.testing.stubs.ServiceExample.test_requires_user_claims + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_requires_user_claims +``` + +```` + +````{py:method} test_requires_encryption(ctx: nuropb.contexts.context_manager.NuropbContextManager, **kwargs: typing.Any) -> typing.Any +:canonical: nuropb.testing.stubs.ServiceExample.test_requires_encryption + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_requires_encryption +``` + +```` + +````{py:method} test_call_again_error(**kwargs: typing.Any) -> typing.Dict[str, typing.Any] +:canonical: nuropb.testing.stubs.ServiceExample.test_call_again_error + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_call_again_error +``` + +```` + +````{py:method} test_call_again_loop(**kwargs: typing.Any) -> None +:canonical: nuropb.testing.stubs.ServiceExample.test_call_again_loop + +```{autodoc2-docstring} nuropb.testing.stubs.ServiceExample.test_call_again_loop +``` + +```` + +````` diff --git a/docs/source/apidocs/nuropb/nuropb.utils.md b/docs/source/apidocs/nuropb/nuropb.utils.md new file mode 100644 index 0000000..8fe02fe --- /dev/null +++ b/docs/source/apidocs/nuropb/nuropb.utils.md @@ -0,0 +1,31 @@ +# {py:mod}`nuropb.utils` + +```{py:module} nuropb.utils +``` + +```{autodoc2-docstring} nuropb.utils +:allowtitles: +``` + +## Module Contents + +### Functions + +````{list-table} +:class: autosummary longtable +:align: left + +* - {py:obj}`obfuscate_credentials ` + - ```{autodoc2-docstring} nuropb.utils.obfuscate_credentials + :summary: + ``` +```` + +### API + +````{py:function} obfuscate_credentials(url_with_credentials: str | typing.Dict[str, typing.Any]) -> str +:canonical: nuropb.utils.obfuscate_credentials + +```{autodoc2-docstring} nuropb.utils.obfuscate_credentials +``` +```` diff --git a/docs/source/background.md b/docs/source/background.md new file mode 100644 index 0000000..cf90beb --- /dev/null +++ b/docs/source/background.md @@ -0,0 +1,24 @@ +# Background + +## Where does the name originate from? +NuroPb is a contraction of the term nervous [system] and the scientific symbol for Lead and its +association with plumbing. So then NuroPb, the plumbing, routing and communications for connected services. + +## History, Pattern and Approach +NuroPb is a pattern and approach that supports event driven and service mesh engineering requirements. The +early roots evolved in the 2000's, and during the 2010's the pattern was used to drive hedge funds, startups, +banks and crypto and blockchain ventures. It's core development is in Python, and the pattern has been used +alongside Java, JavasScript and GoLang, Unfortunately those efforts are copyrighted. Any platform with support +for RabbitMQ should be able to implement the pattern and exist on the same mesh as Python Services. + +RabbitMQ is the underlying message broker for the NuroPb service mesh library. Various message brokers and +broker-less tools and approaches have been tried with the nuropb pattern. Some of these are Kafka, MQSeries and +ZeroMQ. RabbitMQ's AMPQ routing capabilities, low maintenance and robustness have proved the test of time. With +RabbitMQ's release of the streams feature, and offering message/logs streaming capabilities, there are new +and interesting opportunities all on a single platform. + +**Why not Kafka**? Kafka is a great tool, but it's not a message broker. It's a distributed log stream and +probably one of the best available. There are many use cases where NuroPb + RabbitMQ would integrate very +nicely alongside Kafka. Especially inter-process rpc and orderless event driven flows that are orchestrated +by NuroPb and ordered log/event streaming over Kafka. Kafka is also been used as to ingest all nuropb traffic +for auditing and tracing. \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 6e60199..1ea04cb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -14,15 +14,13 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -# sys.path.insert(0, os.path.abspath("../src")) - +sys.path.insert(0, os.path.abspath("../../examples")) +sys.path.insert(0, os.path.abspath("../../src")) # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information - year = datetime.datetime.now().year - project = 'nuropb' author = 'Robert Betts' copyright = f'{year}, {author}' @@ -55,12 +53,18 @@ spelling_warning = True spelling_show_suggestions = True +myst_enable_extensions = ["fieldlist"] autodoc2_packages = [ { - "path": "../../nuropb", + "path": "../../examples/", + "auto_mode": True, + }, + { + "path": "../../src/nuropb", "auto_mode": True, }, ] +autodoc2_render_plugin = "myst" source_suffix = { '.rst': 'restructuredtext', diff --git a/docs/source/contexts.md b/docs/source/contexts.md new file mode 100644 index 0000000..5755b89 --- /dev/null +++ b/docs/source/contexts.md @@ -0,0 +1,3 @@ + +```{include} ../../src/nuropb/contexts/README.md +``` \ No newline at end of file diff --git a/docs/source/encryption.md b/docs/source/encryption.md new file mode 100644 index 0000000..c9195e7 --- /dev/null +++ b/docs/source/encryption.md @@ -0,0 +1,3 @@ + +```{include} ../../src/nuropb/encodings/README.md +``` \ No newline at end of file diff --git a/docs/source/etcd.md b/docs/source/etcd.md deleted file mode 100644 index 5e7246d..0000000 --- a/docs/source/etcd.md +++ /dev/null @@ -1,24 +0,0 @@ -# etcd - -* Using etcd to for service leader election and coordinated configuration for a new service mesh for example - when spinning up a new cluster of services that not every service instance is attempting to concurrently - configure RabbitMQ, or other service infrastructure configurations. -* etcd is disabled by default in the `examples/server.py` example, but can be enabled by setting the - `enable_etcd_usage` variable to `True` - -```bash -# Update as needed, the docker ip address which in many cases is `localhost`. this will also be the RabbitMQ -# host address used by the examples. -export DOCKER_HOST_NAME=localhost - -# run RabbitMQ image with management plugin, exposing the amqp and management ports -docker run -d --name nuropb-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management - -# OPTIONAL: etcd for leader election and service mesh configuration -docker run -d --name nuropb-etcd \ - -p 2379:2379 \ - -p 2380:2380 \ - --env ALLOW_NONE_AUTHENTICATION=yes \ - --env ETCD_ADVERTISE_CLIENT_URLS=http://${DOCKER_HOST_NAME}:2379 \ - bitnami/etcd:latest -``` diff --git a/docs/source/index.md b/docs/source/index.md index fc6636c..9dd6965 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -6,8 +6,22 @@ :hidden: :maxdepth: 2 -installation.md +quickstart.md +``` + +```{toctree} +:hidden: +:caption: Guides + examples.md -apidocs/index +contexts.md +encryption.md +``` + +```{toctree} +:hidden: +:caption: Reference + +background.md +apidocs/index.rst ``` - diff --git a/docs/source/installation.md b/docs/source/installation.md deleted file mode 100644 index f34d65b..0000000 --- a/docs/source/installation.md +++ /dev/null @@ -1 +0,0 @@ -# Installation \ No newline at end of file diff --git a/docs/source/quickstart.md b/docs/source/quickstart.md new file mode 100644 index 0000000..cc9a63d --- /dev/null +++ b/docs/source/quickstart.md @@ -0,0 +1,123 @@ +# Quickstart + +The best way to get started is to look at the examples and the `examples/README.md` file. + +These quick fire steps are the minimum to get going.: +* Install Python >= 3.10 +* An accessible RabbitMQ >= 3.8.0 + Management Plugin +* Install the nuropb package, `pip install nuropb` + +Run this code block to see a client and service running in the same Python module. + +```python +import logging +from typing import Any, Dict +from uuid import uuid4 +import asyncio + +from nuropb.contexts.context_manager import NuropbContextManager +from nuropb.contexts.context_manager_decorator import nuropb_context +from nuropb.contexts.describe import publish_to_mesh +from nuropb.rmq_api import RMQAPI + +logger = logging.getLogger("nuropb-all-in-one") + + +def get_claims_from_token(bearer_token: str) -> Dict[str, Any] | None: + """ This is a stub for the required implementation of validating and decoding the bearer token + """ + _ = bearer_token + return { + "sub": "test_user", + "user_id": "test_user", + "scope": "openid, profile", + "roles": "user, admin", + } + + +class QuickExampleService: + _service_name = "quick-example" + _instance_id = uuid4().hex + + @nuropb_context + @publish_to_mesh(authorize_func=get_claims_from_token) + def test_requires_user_claims(self, ctx, **kwargs: Any) -> str: + logger.info("test_requires_user_claims called") + assert isinstance(ctx, NuropbContextManager) + return f"hello {ctx.user_claims['user_id']}" + + def test_method(self, param1, param2: Dict[str, Any]) -> Dict[str, Any]: + logger.info("test_method called") + _ = self + return { + "param1": param1, + "param2": param2, + "reply": "response from test_method", + } + + +async def main(): + logging.info("All in one example done") + amqp_url = "amqp://guest:guest@localhost:5672/nuropb-example" + service_instance = QuickExampleService() + transport_settings = { + "rpc_bindings": [service_instance._service_name], + } + service_api = RMQAPI( + service_instance=service_instance, + service_name=service_instance._service_name, + instance_id=service_instance._instance_id, + amqp_url=amqp_url, + transport_settings=transport_settings, + ) + await service_api.connect() + logger.info("Service Ready") + + client_api = RMQAPI( + amqp_url=amqp_url, + ) + await client_api.connect() + logger.info("Client connected") + + context = { + "Authorization": "Bearer 1234567890", + } + response = await client_api.request( + service="quick-example", + method="test_requires_user_claims", + params={}, + context=context, + ) + logger.info(f"Response: {response}") + + response = await client_api.request( + service="quick-example", + method="test_method", + params={ + "param1": "value1", + "param2": { + "param2a": "value2a", + } + }, + context={}, + ) + logger.info(f"Response: {response}") + + await client_api.disconnect() + await service_api.disconnect() + + logging.info("All in one example done") + + +if __name__ == "__main__": + log_format = ( + "%(levelname).1s %(asctime)s %(name) -25s %(funcName) " + "-35s %(lineno) -5d: %(message)s" + ) + logging.basicConfig(level=logging.INFO, format=log_format) + logging.getLogger("pika").setLevel(logging.WARNING) + logging.getLogger("etcd3").setLevel(logging.WARNING) + logging.getLogger("urllib3").setLevel(logging.WARNING) + asyncio.run(main()) + +``` diff --git a/examples/README.md b/examples/README.md index a4b64a1..2691828 100644 --- a/examples/README.md +++ b/examples/README.md @@ -62,8 +62,9 @@ poetry install ## Running an Example The next step is to initialize the nuropb service mesh configuration in RabbitMQ. This can be performed by -running the [scripted_mesh_setup.py](#myst_parser.sphinx_ext.main.setup_sphinx) and is required to be run before trying `server_basic.py`. With the example -`server.py`, the setup of the service mesh configuration is done automatically. +running the [scripted_mesh_setup.py](#examples.scripted_mesh_setup) and is required to be run before trying +[server_basic.py](#examples.server_basic). With the example +[server.py](#examples.server), the setup of the service mesh configuration is done automatically. ```bash # Check that the RabbitMQ container is running and in the code , that the variables `amqp_url` and `rmq_api_url` @@ -73,15 +74,15 @@ running the [scripted_mesh_setup.py](#myst_parser.sphinx_ext.main.setup_sphinx) poetry run python examples/scripted_mesh_setup.py ``` -The `examples/server_basic.py` example is for reference mainly, there are no requests from -`examples/client.py`. Add them at your pleasure. +The [server_basic.py](#examples.server_basic) example is for reference mainly, there are no requests from +[client.py](#examples.client). Add them at your pleasure. Finally, run the client example. ```bash poetry run python examples/client.py ``` -**`all_in_one.py`** is a single file example of a client and server running in the same python file. It also +**[all_in_one.py](#examples.all_in_one)`** is a single file example of a client and server running in the same python file. It also demonstrates the use of the `nuropb_context` and `publish_to_mesh` context manager decorators And there you are. Let us know what you think! All feedback is welcome. diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/poetry.lock b/poetry.lock index aae697d..c3b508f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -146,17 +146,22 @@ files = [ [[package]] name = "astroid" -version = "3.0.0" +version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.7.2" files = [ - {file = "astroid-3.0.0-py3-none-any.whl", hash = "sha256:f2510e7fdcd6cfda4ec50014726d4857abf79acfc010084ce8c26091913f1b25"}, - {file = "astroid-3.0.0.tar.gz", hash = "sha256:1defdbca052635dd29657ea674edfc45e4b5be9cd53630c5b084fcfed94344a8"}, + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, ] [package.dependencies] +lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] [[package]] name = "async-timeout" @@ -401,86 +406,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, ] [[package]] @@ -1378,6 +1398,51 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + [[package]] name = "livereload" version = "2.6.3" @@ -1558,13 +1623,13 @@ files = [ [[package]] name = "mistune" -version = "3.0.1" +version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.7" files = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] @@ -3306,6 +3371,90 @@ files = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + [[package]] name = "xattr" version = "0.10.1" @@ -3498,4 +3647,4 @@ docs = [] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "f880b271fc172622c18e13506455366457617491100a4594d3854e5cb34dae5d" +content-hash = "7ab5eee5b4d6cc77b88a0b1ce2d2112d34b927b7a7c7876d925a8c086590e2c7" diff --git a/pyproject.toml b/pyproject.toml index d1939a6..1ed0de0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,7 @@ sphinxext-opengraph = "^0.8.2" sphinxcontrib-spelling = "^8.0.0" sphinx-copybutton = "^0.5.2" sphinx-autodoc2 = "^0.4.2" +astroid = "<=2.15.8" [build-system] requires = ["poetry-core"] diff --git a/src/nuropb/contexts/README.md b/src/nuropb/contexts/README.md index 8e76a9a..08b3712 100644 --- a/src/nuropb/contexts/README.md +++ b/src/nuropb/contexts/README.md @@ -1,4 +1,4 @@ -# Service Mesh Context Management +# Discovery and Context Management ## NuroPb Context Manager and Decorator When a service instance method is decorated with @nuropb_context, a NuropbContextManager instance will diff --git a/src/nuropb/contexts/context_manager.py b/src/nuropb/contexts/context_manager.py index 0cb93ed..5fb5eff 100644 --- a/src/nuropb/contexts/context_manager.py +++ b/src/nuropb/contexts/context_manager.py @@ -79,15 +79,13 @@ def error(self) -> Dict[str, Any] | None: } def add_event(self, event: Dict[str, Any]) -> None: - """Add an event to the context manager. The event will be sent to the service mesh when - the context manager exits successfully. - - Event format: - { - "topic": "test_topic", - "event": "test_event_payload", - "context": {} - } + """ Add an event to the context manager. The event will be sent to the service mesh when the context manager + exits successfully. + + Event format + - "topic": "test_topic", + - "event": "test_event_payload", + - "context": {} :param event: :return: diff --git a/src/nuropb/encodings/README.md b/src/nuropb/encodings/README.md index 8c53e58..5f3c1a7 100644 --- a/src/nuropb/encodings/README.md +++ b/src/nuropb/encodings/README.md @@ -1,14 +1,13 @@ -# NuroPb Protocol Encodings -This directory contains the encoding definitions for the NuroPb protocol. +# Serialization and Encryption Out of the box NuroPb transmits JSON encoded messages payloads over the AMQP protocol. There are plans to support other encodings such as Protocol Buffers and m a y b e Avro. ## JSON -The JSON encoding is the default encoding for NuroPb. It is the most human-readable encoding and is the -easiest to debug. It is also the most verbose encoding and is not the most efficient encoding. Take a look -src/nuropb/interface.py for information on the structure of messages as this translates directly to the -JSON encoding. +The JSON encoding is the default encoding for NuroPb. It a handy human-readable encoding and is the +easiest to debug. It is also a verbose encoding and is not the most efficient. Take a look +[nuropb/interface.py](#nuropb.interface) for information on the structure of messages as this translates +directly to the JSON encoding. ## Encrypted Payloads This is the first extension to the NuroPb payload serialisation ahead of the introduction of Protocol Buffers diff --git a/src/nuropb/rmq_api.py b/src/nuropb/rmq_api.py index ee063f8..1809017 100644 --- a/src/nuropb/rmq_api.py +++ b/src/nuropb/rmq_api.py @@ -27,7 +27,7 @@ class RMQAPI(NuropbInterface): - """RMQAPI: A NuropbInterface implementation that uses RabbitMQ as the underlying transport. + """The primary nuropb API. When an existing transport initialised and connected, and a subsequent transport instance is connected with the same service_name and instance_id as the first, the broker @@ -321,8 +321,7 @@ async def request( rpc_response: bool = True, encrypted: bool = False, ) -> Union[ResponsePayloadDict, Any]: - """Makes a rpc request for a method on a service mesh service and waits until the response is - received. + """Makes a rpc request for a method on a service mesh service and waits until the response is received. :param service: str, The routing key on the rpc exchange to direct the request to the desired service request queue. From 58a051d0f1d1ac5f7c5530c4e968735feb3e7829 Mon Sep 17 00:00:00 2001 From: Robert Betts Date: Sat, 30 Sep 2023 18:46:49 +0100 Subject: [PATCH 9/9] Doc dependency config --- docs/Makefile | 20 ++++++++++++++++++++ docs/make.bat | 35 +++++++++++++++++++++++++++++++++++ docs/source/conf.py | 5 +---- docs/source/requirements.in | 3 ++- docs/source/requirements.txt | 7 ++++++- pyproject.toml | 1 + 6 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..dc1312a --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/conf.py b/docs/source/conf.py index 1ea04cb..1e8755e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -6,7 +6,6 @@ import os import sys import datetime -from pathlib import Path # -- Path setup -------------------------------------------------------------- @@ -33,10 +32,10 @@ "myst_parser", "autodoc2", "sphinx_rtd_theme", - # "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx.ext.autodoc", "sphinx.ext.autosummary", + # "sphinx.ext.todo", # "sphinxext.opengraph", # "sphinxcontrib.spelling", # "sphinx_copybutton", @@ -47,7 +46,6 @@ templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - ogp_site_url = "https://nuropb.readthedocs.io/en/latest/" spelling_warning = True @@ -71,7 +69,6 @@ '.md': 'markdown', } - # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output diff --git a/docs/source/requirements.in b/docs/source/requirements.in index 4374961..4ca79bb 100644 --- a/docs/source/requirements.in +++ b/docs/source/requirements.in @@ -8,4 +8,5 @@ sphinx-autoapi==3.0.0 sphinxext-opengraph==0.8.2 sphinxcontrib-spelling==8.0.0 sphinx-copybutton==0.5.2 -sphinx-autodoc2==0.4.2 \ No newline at end of file +sphinx-autodoc2==0.4.2 +astroid==2.15.8 \ No newline at end of file diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index a685855..48f6c6c 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -8,8 +8,9 @@ alabaster==0.7.13 # via sphinx anyascii==0.3.2 # via sphinx-autoapi -astroid==3.0.0 +astroid==2.15.8 # via + # -r requirements.in # sphinx-autoapi # sphinx-autodoc2 attrs==23.1.0 @@ -71,6 +72,8 @@ jupyterlab-pygments==0.2.2 # via nbconvert kiwisolver==1.4.5 # via matplotlib +lazy-object-proxy==1.9.0 + # via astroid livereload==2.6.3 # via sphinx-autobuild markdown-it-py==3.0.0 @@ -223,3 +226,5 @@ webencodings==0.5.1 # via # bleach # tinycss2 +wrapt==1.15.0 + # via astroid diff --git a/pyproject.toml b/pyproject.toml index 1ed0de0..78d826b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ readme = "README.md" license = "Apache-2.0" homepage = "https://github.com/robertbetts/nuropb" repository = "https://github.com/robertbetts/nuropb" +documentation = "https://nuropb.readthedocs.io/en/latest/" keywords = ["python", "asynchrous", "api", "event", "rpc", "distributed", "edd", "ddd", "sevice-mesh"] classifiers = [ "License :: OSI Approved :: Apache Software License",