From 5e03597e08379cdcb0c2d9f2a3123afb2f9775bc Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Wed, 16 Nov 2022 11:08:33 +0100 Subject: [PATCH 01/21] chore: vs code workspace config, include plugins and ccb, and reworking structure of CCB package --- packages/polywrap-ccb/__init__.py | 5 + packages/polywrap-ccb/poetry.lock | 1406 +++++++++++++++++ .../polywrap-ccb/polywrap_ccb/__init__.py | 2 + packages/polywrap-ccb/polywrap_ccb/ccb.py | 61 + .../polywrap_ccb/client_config.py | 17 + packages/polywrap-ccb/pyproject.toml | 60 + .../polywrap-ccb/tests/test_clientconfig.py | 21 + packages/polywrap-ccb/tox.ini | 30 + python-monorepo.code-workspace | 79 +- 9 files changed, 1645 insertions(+), 36 deletions(-) create mode 100644 packages/polywrap-ccb/__init__.py create mode 100644 packages/polywrap-ccb/poetry.lock create mode 100644 packages/polywrap-ccb/polywrap_ccb/__init__.py create mode 100644 packages/polywrap-ccb/polywrap_ccb/ccb.py create mode 100644 packages/polywrap-ccb/polywrap_ccb/client_config.py create mode 100644 packages/polywrap-ccb/pyproject.toml create mode 100644 packages/polywrap-ccb/tests/test_clientconfig.py create mode 100644 packages/polywrap-ccb/tox.ini diff --git a/packages/polywrap-ccb/__init__.py b/packages/polywrap-ccb/__init__.py new file mode 100644 index 00000000..a7cc26d2 --- /dev/null +++ b/packages/polywrap-ccb/__init__.py @@ -0,0 +1,5 @@ +from polywrap_ccb import * +#from .base_client_config_builder import * +#from .client_config import * +#from .interface_client_config_builder import * +# from "./bundles" import * \ No newline at end of file diff --git a/packages/polywrap-ccb/poetry.lock b/packages/polywrap-ccb/poetry.lock new file mode 100644 index 00000000..afb7d91d --- /dev/null +++ b/packages/polywrap-ccb/poetry.lock @@ -0,0 +1,1406 @@ +[[package]] +name = "astroid" +version = "2.12.12" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + +[[package]] +name = "bandit" +version = "1.7.4" +description = "Security oriented static analyser for python code." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=1.0.1" +PyYAML = ">=5.3.1" +stevedore = ">=1.20.0" +toml = {version = "*", optional = true, markers = "extra == \"toml\""} + +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] +toml = ["toml"] +yaml = ["PyYAML"] + +[[package]] +name = "black" +version = "22.10.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "dill" +version = "0.3.6" +description = "serialize all of python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "exceptiongroup" +version = "1.0.4" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.8.0" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"] +testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "gitdb" +version = "4.0.9" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "GitPython" +version = "3.1.29" +description = "GitPython is a python library used to interact with Git repositories" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "gql" +version = "3.4.0" +description = "GraphQL client for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +backoff = ">=1.11.1,<3.0" +graphql-core = ">=3.2,<3.3" +yarl = ">=1.6,<2.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.7.1,<3.9.0)"] +all = ["aiohttp (>=3.7.1,<3.9.0)", "botocore (>=1.21,<2)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)", "websockets (>=10,<11)", "websockets (>=9,<10)"] +botocore = ["botocore (>=1.21,<2)"] +dev = ["aiofiles", "aiohttp (>=3.7.1,<3.9.0)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "sphinx (>=3.0.0,<4)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "urllib3 (>=1.26)", "vcrpy (==4.0.2)", "websockets (>=10,<11)", "websockets (>=9,<10)"] +requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)"] +test = ["aiofiles", "aiohttp (>=3.7.1,<3.9.0)", "botocore (>=1.21,<2)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)", "vcrpy (==4.0.2)", "websockets (>=10,<11)", "websockets (>=9,<10)"] +test_no_transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.0.2)"] +websockets = ["websockets (>=10,<11)", "websockets (>=9,<10)"] + +[[package]] +name = "graphql-core" +version = "3.2.3" +description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +category = "main" +optional = false +python-versions = ">=3.6,<4" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] + +[[package]] +name = "lazy-object-proxy" +version = "1.8.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "multidict" +version = "6.0.2" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nodeenv" +version = "1.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.10.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pbr" +version = "5.11.0" +description = "Python Build Reasonableness" +category = "dev" +optional = false +python-versions = ">=2.6" + +[[package]] +name = "platformdirs" +version = "2.5.4" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] +test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "polywrap-client" +version = "0.1.0" +description = "" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.dependencies] +polywrap-core = {path = "../polywrap-core", develop = true} +polywrap-manifest = {path = "../polywrap-manifest", develop = true} +polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} +polywrap-result = {path = "../polywrap-result", develop = true} +polywrap-uri-resolvers = {path = "../polywrap-uri-resolvers", develop = true} +pycryptodome = "^3.14.1" +pysha3 = "^1.0.2" +result = "^0.8.0" +unsync = "^1.4.0" +wasmtime = "^1.0.1" + +[package.source] +type = "directory" +url = "../polywrap-client" + +[[package]] +name = "polywrap-core" +version = "0.1.0" +description = "" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.dependencies] +gql = "3.4.0" +graphql-core = "^3.2.1" +polywrap-manifest = {path = "../polywrap-manifest", develop = true} +polywrap-result = {path = "../polywrap-result", develop = true} +pydantic = "^1.10.2" + +[package.source] +type = "directory" +url = "../polywrap-core" + +[[package]] +name = "polywrap-manifest" +version = "0.1.0" +description = "WRAP manifest" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.dependencies] +polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} +polywrap-result = {path = "../polywrap-result", develop = true} +pydantic = "^1.10.2" + +[package.source] +type = "directory" +url = "../polywrap-manifest" + +[[package]] +name = "polywrap-msgpack" +version = "0.1.0" +description = "WRAP msgpack encoding" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.dependencies] +msgpack = "^1.0.4" + +[package.source] +type = "directory" +url = "../polywrap-msgpack" + +[[package]] +name = "polywrap-result" +version = "0.1.0" +description = "Result object" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.source] +type = "directory" +url = "../polywrap-result" + +[[package]] +name = "polywrap-uri-resolvers" +version = "0.1.0" +description = "" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.dependencies] +polywrap-core = {path = "../polywrap-core", develop = true} +polywrap-result = {path = "../polywrap-result", develop = true} +polywrap-wasm = {path = "../polywrap-wasm", develop = true} +wasmtime = "^1.0.1" + +[package.source] +type = "directory" +url = "../polywrap-uri-resolvers" + +[[package]] +name = "polywrap-wasm" +version = "0.1.0" +description = "" +category = "main" +optional = false +python-versions = "^3.10" +develop = true + +[package.dependencies] +polywrap-core = {path = "../polywrap-core", develop = true} +polywrap-manifest = {path = "../polywrap-manifest", develop = true} +polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} +polywrap-result = {path = "../polywrap-result", develop = true} +unsync = "^1.4.0" +wasmtime = "^1.0.1" + +[package.source] +type = "directory" +url = "../polywrap-wasm" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycryptodome" +version = "3.15.0" +description = "Cryptographic library for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pydantic" +version = "1.10.2" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pydocstyle" +version = "6.1.1" +description = "Python docstring style checker" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +snowballstemmer = "*" + +[package.extras] +toml = ["toml"] + +[[package]] +name = "pylint" +version = "2.15.5" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +astroid = ">=2.12.12,<=2.14.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = ">=0.2" +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyright" +version = "1.1.280" +description = "Command line wrapper for pyright" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "pysha3" +version = "1.0.2" +description = "SHA-3 (Keccak) for Python 2.7 - 3.5" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pytest" +version = "7.2.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.19.0" +description = "Pytest support for asyncio" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pytest = ">=6.1.0" + +[package.extras] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "PyYAML" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "result" +version = "0.8.0" +description = "A Rust-like result type for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "setuptools" +version = "65.5.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "stevedore" +version = "4.1.1" +description = "Manage dynamic plugins for Python applications" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tomlkit" +version = "0.11.6" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tox" +version = "3.27.1" +description = "tox is a generic virtualenv management and test command line tool" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""} +filelock = ">=3.0.0" +packaging = ">=14" +pluggy = ">=0.12.0" +py = ">=1.4.17" +six = ">=1.14.0" +tomli = {version = ">=2.0.1", markers = "python_version >= \"3.7\" and python_version < \"3.11\""} +virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" + +[package.extras] +docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] +testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)"] + +[[package]] +name = "tox-poetry" +version = "0.4.1" +description = "Tox poetry plugin" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pluggy = "*" +toml = "*" +tox = {version = ">=3.7.0", markers = "python_version >= \"3\""} + +[package.extras] +test = ["coverage", "pycodestyle", "pylint", "pytest"] + +[[package]] +name = "typing-extensions" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "unsync" +version = "1.4.0" +description = "Unsynchronize asyncio" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "virtualenv" +version = "20.16.7" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<3" + +[package.extras] +docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] +testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "wasmtime" +version = "1.0.1" +description = "A WebAssembly runtime powered by Wasmtime" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["coverage", "flake8 (==4.0.1)", "pycparser", "pytest", "pytest-flake8", "pytest-mypy"] + +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "yarl" +version = "1.8.1" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "1.1" +python-versions = "^3.10" +content-hash = "622bd70194dbb37cffab77cd1907c23f174f6628f85ccda69f2e41df2977c791" + +[metadata.files] +astroid = [ + {file = "astroid-2.12.12-py3-none-any.whl", hash = "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"}, + {file = "astroid-2.12.12.tar.gz", hash = "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +backoff = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] +bandit = [ + {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, + {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, +] +black = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +dill = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] +distlib = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] +exceptiongroup = [ + {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, + {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, +] +filelock = [ + {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, + {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, +] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +GitPython = [ + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, +] +gql = [ + {file = "gql-3.4.0-py2.py3-none-any.whl", hash = "sha256:59c8a0b8f0a2f3b0b2ff970c94de86f82f65cb1da3340bfe57143e5f7ea82f71"}, + {file = "gql-3.4.0.tar.gz", hash = "sha256:ca81aa8314fa88a8c57dd1ce34941278e0c352d762eb721edcba0387829ea7c0"}, +] +graphql-core = [ + {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, + {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, +] +idna = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, + {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, + {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, + {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, +] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] +msgpack = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] +multidict = [ + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nodeenv = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, +] +pbr = [ + {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"}, + {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"}, +] +platformdirs = [ + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +polywrap-client = [] +polywrap-core = [] +polywrap-manifest = [] +polywrap-msgpack = [] +polywrap-result = [] +polywrap-uri-resolvers = [] +polywrap-wasm = [] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycryptodome = [ + {file = "pycryptodome-3.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff7ae90e36c1715a54446e7872b76102baa5c63aa980917f4aa45e8c78d1a3ec"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2ffd8b31561455453ca9f62cb4c24e6b8d119d6d531087af5f14b64bee2c23e6"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ea63d46157386c5053cfebcdd9bd8e0c8b7b0ac4a0507a027f5174929403884"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c9ed8aa31c146bef65d89a1b655f5f4eab5e1120f55fc297713c89c9e56ff0b"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5099c9ca345b2f252f0c28e96904643153bae9258647585e5e6f649bb7a1844a"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2ec709b0a58b539a4f9d33fb8508264c3678d7edb33a68b8906ba914f71e8c13"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-win32.whl", hash = "sha256:fd2184aae6ee2a944aaa49113e6f5787cdc5e4db1eb8edb1aea914bd75f33a0c"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:7e3a8f6ee405b3bd1c4da371b93c31f7027944b2bcce0697022801db93120d83"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b9c5b1a1977491533dfd31e01550ee36ae0249d78aae7f632590db833a5012b8"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0926f7cc3735033061ef3cf27ed16faad6544b14666410727b31fea85a5b16eb"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2aa55aae81f935a08d5a3c2042eb81741a43e044bd8a81ea7239448ad751f763"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c3640deff4197fa064295aaac10ab49a0d55ef3d6a54ae1499c40d646655c89f"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:045d75527241d17e6ef13636d845a12e54660aa82e823b3b3341bcf5af03fa79"}, + {file = "pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e"}, + {file = "pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1"}, + {file = "pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9cc96e274b253e47ad33ae1fccc36ea386f5251a823ccb50593a935db47fdd2"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:ecaaef2d21b365d9c5ca8427ffc10cebed9d9102749fd502218c23cb9a05feb5"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d2a39a66057ab191e5c27211a7daf8f0737f23acbf6b3562b25a62df65ffcb7b"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:9c772c485b27967514d0df1458b56875f4b6d025566bf27399d0c239ff1b369f"}, + {file = "pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8"}, +] +pydantic = [ + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] +pydocstyle = [ + {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, + {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, +] +pylint = [ + {file = "pylint-2.15.5-py3-none-any.whl", hash = "sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004"}, + {file = "pylint-2.15.5.tar.gz", hash = "sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyright = [ + {file = "pyright-1.1.280-py3-none-any.whl", hash = "sha256:25917a14d873252c5c2e6fdbec322888c0480f6db95068ff6459befa9af3c92a"}, + {file = "pyright-1.1.280.tar.gz", hash = "sha256:4bcb167251419b3b736137b0535cb6bbfb5bef16eb74057eaf3ccaccb01d74c1"}, +] +pysha3 = [ + {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9"}, + {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf"}, + {file = "pysha3-1.0.2-cp27-cp27m-win32.whl", hash = "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b"}, + {file = "pysha3-1.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d"}, + {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5"}, + {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f"}, + {file = "pysha3-1.0.2-cp33-cp33m-win32.whl", hash = "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603"}, + {file = "pysha3-1.0.2-cp33-cp33m-win_amd64.whl", hash = "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24"}, + {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48"}, + {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f"}, + {file = "pysha3-1.0.2-cp34-cp34m-win32.whl", hash = "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608"}, + {file = "pysha3-1.0.2-cp34-cp34m-win_amd64.whl", hash = "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07"}, + {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d"}, + {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9"}, + {file = "pysha3-1.0.2-cp35-cp35m-win32.whl", hash = "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8"}, + {file = "pysha3-1.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77"}, + {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4"}, + {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030"}, + {file = "pysha3-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef"}, + {file = "pysha3-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0"}, + {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"}, +] +pytest = [ + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, +] +pytest-asyncio = [ + {file = "pytest-asyncio-0.19.0.tar.gz", hash = "sha256:ac4ebf3b6207259750bc32f4c1d8fcd7e79739edbc67ad0c58dd150b1d072fed"}, + {file = "pytest_asyncio-0.19.0-py3-none-any.whl", hash = "sha256:7a97e37cfe1ed296e2e84941384bdd37c376453912d397ed39293e0916f521fa"}, +] +PyYAML = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +result = [ + {file = "result-0.8.0-py3-none-any.whl", hash = "sha256:d6a6258f32c057a4e0478999c6ce43dcadaf8ea435f58ac601ae2768f93ef243"}, + {file = "result-0.8.0.tar.gz", hash = "sha256:c48c909e92181a075ba358228a3fe161e26d205dad416ad81f27f23515a5626d"}, +] +setuptools = [ + {file = "setuptools-65.5.1-py3-none-any.whl", hash = "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31"}, + {file = "setuptools-65.5.1.tar.gz", hash = "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +stevedore = [ + {file = "stevedore-4.1.1-py3-none-any.whl", hash = "sha256:aa6436565c069b2946fe4ebff07f5041e0c8bf18c7376dd29edf80cf7d524e4e"}, + {file = "stevedore-4.1.1.tar.gz", hash = "sha256:7f8aeb6e3f90f96832c301bff21a7eb5eefbe894c88c506483d355565d88cc1a"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tomlkit = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] +tox = [ + {file = "tox-3.27.1-py2.py3-none-any.whl", hash = "sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84"}, + {file = "tox-3.27.1.tar.gz", hash = "sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04"}, +] +tox-poetry = [ + {file = "tox-poetry-0.4.1.tar.gz", hash = "sha256:2395808e1ce487b5894c10f2202e14702bfa6d6909c0d1e525170d14809ac7ef"}, + {file = "tox_poetry-0.4.1-py2.py3-none-any.whl", hash = "sha256:11d9cd4e51d4cd9484b3ba63f2650ab4cfb4096e5f0682ecf561ddfc3c8e8c92"}, +] +typing-extensions = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] +unsync = [ + {file = "unsync-1.4.0.tar.gz", hash = "sha256:a29e0f8952ffb0b3a0453ce436819a5a1ba2febbb5caa707c319f6f98d35f3c5"}, +] +virtualenv = [ + {file = "virtualenv-20.16.7-py3-none-any.whl", hash = "sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29"}, + {file = "virtualenv-20.16.7.tar.gz", hash = "sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e"}, +] +wasmtime = [ + {file = "wasmtime-1.0.1-py3-none-any.whl", hash = "sha256:20c1df95a3506408dcf2116502720e7cb248f1e98122b868932dbc9bbacb4ebd"}, + {file = "wasmtime-1.0.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9ccb42db2511b49c805b23a87e7c191d34112a9568292d475ec966204ac42bc3"}, + {file = "wasmtime-1.0.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:439960f6fb2a48482c8f7beaa2b491ce684f1599d9bfdd519b5320305edc2f39"}, + {file = "wasmtime-1.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:b257ec11ba6d39e3cd9eed4f90c4633bcf3b964219948254244347236fe45172"}, + {file = "wasmtime-1.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:f34ac6db5f91ab359566f531dca7c53d2e63f657d5b10ec9cf53d1c29ac718c0"}, + {file = "wasmtime-1.0.1-py3-none-win_amd64.whl", hash = "sha256:0ae7e2d43a5d9da72a884a695049d7b1773717ba059bdb0ad0369e5c1e03a388"}, +] +wrapt = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] +yarl = [ + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"}, + {file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"}, + {file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"}, + {file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"}, + {file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"}, + {file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"}, + {file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"}, + {file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"}, + {file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"}, + {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, + {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, +] diff --git a/packages/polywrap-ccb/polywrap_ccb/__init__.py b/packages/polywrap-ccb/polywrap_ccb/__init__.py new file mode 100644 index 00000000..8ac9f95f --- /dev/null +++ b/packages/polywrap-ccb/polywrap_ccb/__init__.py @@ -0,0 +1,2 @@ +from .ccb import * +from .client_config import * \ No newline at end of file diff --git a/packages/polywrap-ccb/polywrap_ccb/ccb.py b/packages/polywrap-ccb/polywrap_ccb/ccb.py new file mode 100644 index 00000000..ab61ed81 --- /dev/null +++ b/packages/polywrap-ccb/polywrap_ccb/ccb.py @@ -0,0 +1,61 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from polywrap_core import Uri, IUriResolver, Env +from typing import Dict, Any, List + +@dataclass(slots=True, kw_only=True) +class ClientConfig: + """ + This Abstract class is used to configure the polywrap client before it executes a call + The ClientConfig class is created and modified with the ClientConfigBuilder module + """ + envs: Dict[Uri, Dict[str, Any]] + interfaces: Dict[Uri, List[Uri]] + resolver: IUriResolver + +class IClientConfigBuilder(ABC): + @staticmethod + def build() -> ClientConfig: + """Returns a sanitized config object from the builder's config.""" + pass + + @abstractmethod + def set_env() -> ClientConfig: + """Returns a sanitized config object from the builder's config.""" + pass + + @abstractmethod + def set_env() -> ClientConfig: + """Returns a sanitized config object from the builder's config.""" + pass + +class BaseClientConfigBuilder(IClientConfigBuilder): + """A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class""" + # config: ClientConfig + + + def __init__(self): + self.config = ClientConfig(envs={}, interfaces={}, resolver=None) + + def build(self): + """ + Returns a sanitized config object from the builder's config. + """ + return self.config + + def set_env(self, env=None, uri=None): + if (env or uri) is None: + raise KeyError("Must provide both an env or uri") + self.config.envs[uri]: Env = env + return self + + def add_env(self, env: Env = None , uri: Uri = None): + pass + + def add_envs(self, envs): + for env in envs: + self.add_env(env) + return self + +class ClientConfigBuilder(BaseClientConfigBuilder): + ... diff --git a/packages/polywrap-ccb/polywrap_ccb/client_config.py b/packages/polywrap-ccb/polywrap_ccb/client_config.py new file mode 100644 index 00000000..695af866 --- /dev/null +++ b/packages/polywrap-ccb/polywrap_ccb/client_config.py @@ -0,0 +1,17 @@ +# Polywrap Python Client - https://polywrap.io +# https://github.com/polywrap/toolchain/blob/origin-0.10-dev/packages/js/client-config-builder/src/ClientConfig.ts + +from polywrap_core import Uri, IUriResolver +from dataclasses import dataclass +from typing import List, Dict, Any + +#TUri = TypeVar('TUri', Uri) +@dataclass(slots=True, kw_only=True) +class ClientConfig: + """ + This Abstract class is used to configure the polywrap client before it executes a call + The ClientConfig class is created and modified with the ClientConfigBuilder module + """ + envs: Dict[Uri, Dict[str, Any]] + interfaces: Dict[Uri, List[Uri]] + resolver: IUriResolver \ No newline at end of file diff --git a/packages/polywrap-ccb/pyproject.toml b/packages/polywrap-ccb/pyproject.toml new file mode 100644 index 00000000..8a821258 --- /dev/null +++ b/packages/polywrap-ccb/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "polywrap-ccb" +version = "0.1.0" +description = "" +authors = ["Media ", "Cesar ", "Niraj "] + +[tool.poetry.dependencies] +python = "^3.10" +gql = "3.4.0" +graphql-core = "^3.2.1" +result = "^0.8.0" +polywrap-core = { path = "../polywrap-core", develop = true } +polywrap-client = { path = "../polywrap-client", develop = true } +polywrap-uri-resolvers = { path = "../polywrap-uri-resolvers", develop = true } + +[tool.poetry.dev-dependencies] +pytest = "^7.1.2" +pytest-asyncio = "^0.19.0" +pylint = "^2.15.4" +black = "^22.10.0" +bandit = { version = "^1.7.4", extras = ["toml"]} +tox = "^3.26.0" +tox-poetry = "^0.4.1" +isort = "^5.10.1" +pyright = "^1.1.275" +pydocstyle = "^6.1.1" + +[tool.bandit] +exclude_dirs = ["tests"] + +[tool.black] +target-version = ["py310"] + +[tool.pyright] +# default + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = [ + "tests" +] + +[tool.pylint] +disable = [ + "too-many-return-statements", +] +ignore = [ + "tests/" +] + +[tool.isort] +profile = "black" +multi_line_output = 3 + +[tool.pydocstyle] +# default \ No newline at end of file diff --git a/packages/polywrap-ccb/tests/test_clientconfig.py b/packages/polywrap-ccb/tests/test_clientconfig.py new file mode 100644 index 00000000..353a6796 --- /dev/null +++ b/packages/polywrap-ccb/tests/test_clientconfig.py @@ -0,0 +1,21 @@ +import pytest +from polywrap_core import Uri, Env +from polywrap_ccb import ClientConfig, ClientConfigBuilder + +def test_client_config_structure_starts_empty(): + ccb = ClientConfigBuilder() + client_config = ccb.build() + result = ClientConfig(envs={}, interfaces={}, resolver = None) + assert client_config == result + + +def test_client_config_structure_sets_env(): + ccb = ClientConfigBuilder() + uri = Uri("wrap://ens/eth.plugin.one"), + env = { 'color': "red", 'size': "small" } + ccb = ccb.set_env( + uri = uri, + env = env + ) + client_config = ccb.build() + assert client_config == ClientConfig(envs={uri: env}, interfaces={}, resolver = None) \ No newline at end of file diff --git a/packages/polywrap-ccb/tox.ini b/packages/polywrap-ccb/tox.ini new file mode 100644 index 00000000..f3cb0f4e --- /dev/null +++ b/packages/polywrap-ccb/tox.ini @@ -0,0 +1,30 @@ +[tox] +isolated_build = True +envlist = py310 + +[testenv] +commands = + pytest tests/ + +[testenv:lint] +commands = + isort --check-only client_config_builder + black --check client_config_builder + pylint client_config_builder + pydocstyle client_config_builder + +[testenv:typecheck] +commands = + pyright client_config_builder + +[testenv:secure] +commands = + bandit -r client_config_builder -c pyproject.toml + +[testenv:dev] +basepython = python3.10 +usedevelop = True +commands = + isort client_config_builder + black client_config_builder + diff --git a/python-monorepo.code-workspace b/python-monorepo.code-workspace index d0068837..5d843d13 100644 --- a/python-monorepo.code-workspace +++ b/python-monorepo.code-workspace @@ -1,41 +1,48 @@ { "folders": [ - { - "name": "root", - "path": ".", - }, - { - "name": "polywrap-client", - "path": "packages/polywrap-client" - }, - { - "name": "polywrap-core", - "path": "packages/polywrap-core" - }, - { - "name": "polywrap-msgpack", - "path": "packages/polywrap-msgpack" - }, - { - "name": "polywrap-uri-resolvers", - "path": "packages/polywrap-uri-resolvers" - }, - { - "name": "polywrap-wasm", - "path": "packages/polywrap-wasm" - }, - { - "name": "polywrap-manifest", - "path": "packages/polywrap-manifest" - }, - { - "name": "polywrap-result", - "path": "packages/polywrap-result" - }, - { - "name": "polywrap-plugin", - "path": "packages/polywrap-plugin" - } + { + "name": "root", + "path": "." + }, + { + "name": "polywrap-client", + "path": "packages/polywrap-client" + }, + { + "name": "polywrap-core", + "path": "packages/polywrap-core" + }, + { + "name": "polywrap-msgpack", + "path": "packages/polywrap-msgpack" + }, + { + "name": "polywrap-uri-resolvers", + "path": "packages/polywrap-uri-resolvers" + }, + { + "name": "polywrap-wasm", + "path": "packages/polywrap-wasm" + }, + { + "name": "polywrap-manifest", + "path": "packages/polywrap-manifest" + }, + { + "name": "polywrap-result", + "path": "packages/polywrap-result" + }, + { + "name": "polywrap-plugin", + "path": "packages/polywrap-plugin" + }, + { + "name": "polywrap-client-config-builder", + "path": "packages/polywrap-client-config-builder" + }, + { + "path": "../../../Desktop/polywrap-client-config-builder" + } ], "settings": { "files.exclude": { From f3df14110f7e5e515a29901c43e77d1dc2994ddd Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Wed, 16 Nov 2022 20:12:17 +0100 Subject: [PATCH 02/21] set up config and fix tests --- packages/polywrap-ccb/polywrap_ccb/ccb.py | 24 ++++++++++++++----- .../polywrap-ccb/tests/test_clientconfig.py | 5 ++-- python-monorepo.code-workspace | 7 ++---- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/packages/polywrap-ccb/polywrap_ccb/ccb.py b/packages/polywrap-ccb/polywrap_ccb/ccb.py index ab61ed81..9d1fe18e 100644 --- a/packages/polywrap-ccb/polywrap_ccb/ccb.py +++ b/packages/polywrap-ccb/polywrap_ccb/ccb.py @@ -4,7 +4,7 @@ from typing import Dict, Any, List @dataclass(slots=True, kw_only=True) -class ClientConfig: +class ClientConfig(): """ This Abstract class is used to configure the polywrap client before it executes a call The ClientConfig class is created and modified with the ClientConfigBuilder module @@ -13,27 +13,39 @@ class ClientConfig: interfaces: Dict[Uri, List[Uri]] resolver: IUriResolver +# + class IClientConfigBuilder(ABC): - @staticmethod + + @abstractmethod def build() -> ClientConfig: """Returns a sanitized config object from the builder's config.""" pass @abstractmethod def set_env() -> ClientConfig: - """Returns a sanitized config object from the builder's config.""" pass @abstractmethod - def set_env() -> ClientConfig: - """Returns a sanitized config object from the builder's config.""" + def add_env() -> ClientConfig: pass + @abstractmethod + def add_envs() -> ClientConfig: + pass + + # @abstractmethod + # def add_interface() -> ClientConfig: + # pass + + # @abstractmethod + # def set_resolver() -> ClientConfig: + # pass + class BaseClientConfigBuilder(IClientConfigBuilder): """A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class""" # config: ClientConfig - def __init__(self): self.config = ClientConfig(envs={}, interfaces={}, resolver=None) diff --git a/packages/polywrap-ccb/tests/test_clientconfig.py b/packages/polywrap-ccb/tests/test_clientconfig.py index 353a6796..3ac34e66 100644 --- a/packages/polywrap-ccb/tests/test_clientconfig.py +++ b/packages/polywrap-ccb/tests/test_clientconfig.py @@ -1,12 +1,13 @@ import pytest from polywrap_core import Uri, Env from polywrap_ccb import ClientConfig, ClientConfigBuilder +from dataclasses import asdict def test_client_config_structure_starts_empty(): ccb = ClientConfigBuilder() client_config = ccb.build() result = ClientConfig(envs={}, interfaces={}, resolver = None) - assert client_config == result + assert asdict(client_config) == asdict(result) def test_client_config_structure_sets_env(): @@ -18,4 +19,4 @@ def test_client_config_structure_sets_env(): env = env ) client_config = ccb.build() - assert client_config == ClientConfig(envs={uri: env}, interfaces={}, resolver = None) \ No newline at end of file + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = None)) \ No newline at end of file diff --git a/python-monorepo.code-workspace b/python-monorepo.code-workspace index 5d843d13..9a73f9b2 100644 --- a/python-monorepo.code-workspace +++ b/python-monorepo.code-workspace @@ -37,11 +37,8 @@ "path": "packages/polywrap-plugin" }, { - "name": "polywrap-client-config-builder", - "path": "packages/polywrap-client-config-builder" - }, - { - "path": "../../../Desktop/polywrap-client-config-builder" + "name": "polywrap-client-cbb", + "path": "packages/polywrap-ccb" } ], "settings": { From 4bb2d6ca6288e9b164a9c19cdca37d23decff9dc Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Fri, 18 Nov 2022 15:21:53 +0100 Subject: [PATCH 03/21] wip:workspase_renaming --- .../polywrap_client_config_builder}/ccb.py | 0 .../client_config.py | 0 .../pyproject.toml | 60 +++++++++++++++++++ .../tests/test_clientconfig.py | 2 +- python-monorepo.code-workspace | 4 +- 5 files changed, 63 insertions(+), 3 deletions(-) rename packages/{polywrap-ccb/polywrap_ccb => polywrap-client-config-builder/polywrap_client_config_builder}/ccb.py (100%) rename packages/{polywrap-ccb/polywrap_ccb => polywrap-client-config-builder/polywrap_client_config_builder}/client_config.py (100%) create mode 100644 packages/polywrap-client-config-builder/pyproject.toml rename packages/{polywrap-ccb => polywrap-client-config-builder}/tests/test_clientconfig.py (89%) diff --git a/packages/polywrap-ccb/polywrap_ccb/ccb.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/ccb.py similarity index 100% rename from packages/polywrap-ccb/polywrap_ccb/ccb.py rename to packages/polywrap-client-config-builder/polywrap_client_config_builder/ccb.py diff --git a/packages/polywrap-ccb/polywrap_ccb/client_config.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py similarity index 100% rename from packages/polywrap-ccb/polywrap_ccb/client_config.py rename to packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py diff --git a/packages/polywrap-client-config-builder/pyproject.toml b/packages/polywrap-client-config-builder/pyproject.toml new file mode 100644 index 00000000..db04dbc7 --- /dev/null +++ b/packages/polywrap-client-config-builder/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "polywrap-client-config-builder" +version = "0.1.0" +description = "" +authors = ["Media ", "Cesar ", "Niraj "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +wasmtime = "^1.0.1" +polywrap-core = { path = "../polywrap-core", develop = true } +polywrap-wasm = { path = "../polywrap-wasm", develop = true } +polywrap-result = { path = "../polywrap-result", develop = true } + +[tool.poetry.dev-dependencies] +polywrap-client = { path = "../polywrap-client", develop = true } +pytest = "^7.1.2" +pytest-asyncio = "^0.19.0" +pylint = "^2.15.4" +black = "^22.10.0" +bandit = { version = "^1.7.4", extras = ["toml"]} +tox = "^3.26.0" +tox-poetry = "^0.4.1" +isort = "^5.10.1" +pyright = "^1.1.275" +pydocstyle = "^6.1.1" + +[tool.bandit] +exclude_dirs = ["tests"] + +[tool.black] +target-version = ["py310"] + +[tool.pyright] +# default + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = [ + "tests" +] + +[tool.pylint] +disable = [ + "too-many-return-statements", +] +ignore = [ + "tests/" +] + +[tool.isort] +profile = "black" +multi_line_output = 3 + +[tool.pydocstyle] +# default \ No newline at end of file diff --git a/packages/polywrap-ccb/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py similarity index 89% rename from packages/polywrap-ccb/tests/test_clientconfig.py rename to packages/polywrap-client-config-builder/tests/test_clientconfig.py index 3ac34e66..c23aab9a 100644 --- a/packages/polywrap-ccb/tests/test_clientconfig.py +++ b/packages/polywrap-client-config-builder/tests/test_clientconfig.py @@ -1,6 +1,6 @@ import pytest from polywrap_core import Uri, Env -from polywrap_ccb import ClientConfig, ClientConfigBuilder +from polywrap_client_config_builder import ClientConfig, ClientConfigBuilder from dataclasses import asdict def test_client_config_structure_starts_empty(): diff --git a/python-monorepo.code-workspace b/python-monorepo.code-workspace index 9a73f9b2..c61f7725 100644 --- a/python-monorepo.code-workspace +++ b/python-monorepo.code-workspace @@ -37,8 +37,8 @@ "path": "packages/polywrap-plugin" }, { - "name": "polywrap-client-cbb", - "path": "packages/polywrap-ccb" + "name": "polywrap-client-config-builder", + "path": "packages/polywrap-client-config-builder" } ], "settings": { From fae0f54676ba4dc1a84f98be5551615b157ce759 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Fri, 18 Nov 2022 15:29:35 +0100 Subject: [PATCH 04/21] ClientConfigBuilder functionality and tests *(add envs, interfaces, resolvers, wrappers ) --- packages/polywrap-ccb/__init__.py | 5 - .../polywrap-ccb/polywrap_ccb/__init__.py | 2 - packages/polywrap-ccb/pyproject.toml | 60 ------- packages/polywrap-ccb/tox.ini | 30 ---- .../polywrap-client-config-builder/README.md | 14 ++ .../poetry.lock | 12 +- .../__init__.py | 2 + .../polywrap_client_config_builder/ccb.py | 73 --------- .../client_config.py | 15 -- .../client_config_builder.py | 149 ++++++++++++++++++ .../tests/test_client_config_builder.py | 92 +++++++++++ .../tests/test_clientconfig.py | 10 +- .../polywrap-client-config-builder/tox.ini | 35 ++++ 13 files changed, 306 insertions(+), 193 deletions(-) delete mode 100644 packages/polywrap-ccb/__init__.py delete mode 100644 packages/polywrap-ccb/polywrap_ccb/__init__.py delete mode 100644 packages/polywrap-ccb/pyproject.toml delete mode 100644 packages/polywrap-ccb/tox.ini create mode 100644 packages/polywrap-client-config-builder/README.md rename packages/{polywrap-ccb => polywrap-client-config-builder}/poetry.lock (99%) create mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py delete mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/ccb.py create mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py create mode 100644 packages/polywrap-client-config-builder/tests/test_client_config_builder.py create mode 100644 packages/polywrap-client-config-builder/tox.ini diff --git a/packages/polywrap-ccb/__init__.py b/packages/polywrap-ccb/__init__.py deleted file mode 100644 index a7cc26d2..00000000 --- a/packages/polywrap-ccb/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from polywrap_ccb import * -#from .base_client_config_builder import * -#from .client_config import * -#from .interface_client_config_builder import * -# from "./bundles" import * \ No newline at end of file diff --git a/packages/polywrap-ccb/polywrap_ccb/__init__.py b/packages/polywrap-ccb/polywrap_ccb/__init__.py deleted file mode 100644 index 8ac9f95f..00000000 --- a/packages/polywrap-ccb/polywrap_ccb/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .ccb import * -from .client_config import * \ No newline at end of file diff --git a/packages/polywrap-ccb/pyproject.toml b/packages/polywrap-ccb/pyproject.toml deleted file mode 100644 index 8a821258..00000000 --- a/packages/polywrap-ccb/pyproject.toml +++ /dev/null @@ -1,60 +0,0 @@ -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry] -name = "polywrap-ccb" -version = "0.1.0" -description = "" -authors = ["Media ", "Cesar ", "Niraj "] - -[tool.poetry.dependencies] -python = "^3.10" -gql = "3.4.0" -graphql-core = "^3.2.1" -result = "^0.8.0" -polywrap-core = { path = "../polywrap-core", develop = true } -polywrap-client = { path = "../polywrap-client", develop = true } -polywrap-uri-resolvers = { path = "../polywrap-uri-resolvers", develop = true } - -[tool.poetry.dev-dependencies] -pytest = "^7.1.2" -pytest-asyncio = "^0.19.0" -pylint = "^2.15.4" -black = "^22.10.0" -bandit = { version = "^1.7.4", extras = ["toml"]} -tox = "^3.26.0" -tox-poetry = "^0.4.1" -isort = "^5.10.1" -pyright = "^1.1.275" -pydocstyle = "^6.1.1" - -[tool.bandit] -exclude_dirs = ["tests"] - -[tool.black] -target-version = ["py310"] - -[tool.pyright] -# default - -[tool.pytest.ini_options] -asyncio_mode = "auto" -testpaths = [ - "tests" -] - -[tool.pylint] -disable = [ - "too-many-return-statements", -] -ignore = [ - "tests/" -] - -[tool.isort] -profile = "black" -multi_line_output = 3 - -[tool.pydocstyle] -# default \ No newline at end of file diff --git a/packages/polywrap-ccb/tox.ini b/packages/polywrap-ccb/tox.ini deleted file mode 100644 index f3cb0f4e..00000000 --- a/packages/polywrap-ccb/tox.ini +++ /dev/null @@ -1,30 +0,0 @@ -[tox] -isolated_build = True -envlist = py310 - -[testenv] -commands = - pytest tests/ - -[testenv:lint] -commands = - isort --check-only client_config_builder - black --check client_config_builder - pylint client_config_builder - pydocstyle client_config_builder - -[testenv:typecheck] -commands = - pyright client_config_builder - -[testenv:secure] -commands = - bandit -r client_config_builder -c pyproject.toml - -[testenv:dev] -basepython = python3.10 -usedevelop = True -commands = - isort client_config_builder - black client_config_builder - diff --git a/packages/polywrap-client-config-builder/README.md b/packages/polywrap-client-config-builder/README.md new file mode 100644 index 00000000..fd7cdb53 --- /dev/null +++ b/packages/polywrap-client-config-builder/README.md @@ -0,0 +1,14 @@ + +# Polywrap Python Client +## This object allows you to build proper Polywrapt ClientConfig objects + +These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. + +Look at [this file][./client_config_builder.py] to detail all of its functionality +# Polywrap Python Client +## This object allows you to build proper Polywrapt ClientConfig objects + +These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. + +Look at [this file](./polywrap_client_config_builder/client_config_builder.py) to detail all of its functionality +And at [tests](./tests/test_client_config_builder.py) \ No newline at end of file diff --git a/packages/polywrap-ccb/poetry.lock b/packages/polywrap-client-config-builder/poetry.lock similarity index 99% rename from packages/polywrap-ccb/poetry.lock rename to packages/polywrap-client-config-builder/poetry.lock index afb7d91d..80644bbe 100644 --- a/packages/polywrap-ccb/poetry.lock +++ b/packages/polywrap-client-config-builder/poetry.lock @@ -326,7 +326,7 @@ testing = ["pytest", "pytest-benchmark"] name = "polywrap-client" version = "0.1.0" description = "" -category = "main" +category = "dev" optional = false python-versions = "^3.10" develop = true @@ -418,7 +418,7 @@ url = "../polywrap-result" name = "polywrap-uri-resolvers" version = "0.1.0" description = "" -category = "main" +category = "dev" optional = false python-versions = "^3.10" develop = true @@ -466,7 +466,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" name = "pycryptodome" version = "3.15.0" description = "Cryptographic library for Python" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -551,7 +551,7 @@ dev = ["twine (>=3.4.1)"] name = "pysha3" version = "1.0.2" description = "SHA-3 (Keccak) for Python 2.7 - 3.5" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -601,7 +601,7 @@ python-versions = ">=3.6" name = "result" version = "0.8.0" description = "A Rust-like result type for Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -782,7 +782,7 @@ multidict = ">=4.0" [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "622bd70194dbb37cffab77cd1907c23f174f6628f85ccda69f2e41df2977c791" +content-hash = "cd2bba92384496c44782192f2cd104841841ac1cd61efd403c1df0fb1e87a477" [metadata.files] astroid = [ diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py new file mode 100644 index 00000000..91530deb --- /dev/null +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py @@ -0,0 +1,2 @@ +from .client_config_builder import * +from .client_config import * \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/ccb.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/ccb.py deleted file mode 100644 index 9d1fe18e..00000000 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/ccb.py +++ /dev/null @@ -1,73 +0,0 @@ -from abc import ABC, abstractmethod -from dataclasses import dataclass -from polywrap_core import Uri, IUriResolver, Env -from typing import Dict, Any, List - -@dataclass(slots=True, kw_only=True) -class ClientConfig(): - """ - This Abstract class is used to configure the polywrap client before it executes a call - The ClientConfig class is created and modified with the ClientConfigBuilder module - """ - envs: Dict[Uri, Dict[str, Any]] - interfaces: Dict[Uri, List[Uri]] - resolver: IUriResolver - -# - -class IClientConfigBuilder(ABC): - - @abstractmethod - def build() -> ClientConfig: - """Returns a sanitized config object from the builder's config.""" - pass - - @abstractmethod - def set_env() -> ClientConfig: - pass - - @abstractmethod - def add_env() -> ClientConfig: - pass - - @abstractmethod - def add_envs() -> ClientConfig: - pass - - # @abstractmethod - # def add_interface() -> ClientConfig: - # pass - - # @abstractmethod - # def set_resolver() -> ClientConfig: - # pass - -class BaseClientConfigBuilder(IClientConfigBuilder): - """A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class""" - # config: ClientConfig - - def __init__(self): - self.config = ClientConfig(envs={}, interfaces={}, resolver=None) - - def build(self): - """ - Returns a sanitized config object from the builder's config. - """ - return self.config - - def set_env(self, env=None, uri=None): - if (env or uri) is None: - raise KeyError("Must provide both an env or uri") - self.config.envs[uri]: Env = env - return self - - def add_env(self, env: Env = None , uri: Uri = None): - pass - - def add_envs(self, envs): - for env in envs: - self.add_env(env) - return self - -class ClientConfigBuilder(BaseClientConfigBuilder): - ... diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py index 695af866..984d9bf2 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py @@ -1,17 +1,2 @@ # Polywrap Python Client - https://polywrap.io # https://github.com/polywrap/toolchain/blob/origin-0.10-dev/packages/js/client-config-builder/src/ClientConfig.ts - -from polywrap_core import Uri, IUriResolver -from dataclasses import dataclass -from typing import List, Dict, Any - -#TUri = TypeVar('TUri', Uri) -@dataclass(slots=True, kw_only=True) -class ClientConfig: - """ - This Abstract class is used to configure the polywrap client before it executes a call - The ClientConfig class is created and modified with the ClientConfigBuilder module - """ - envs: Dict[Uri, Dict[str, Any]] - interfaces: Dict[Uri, List[Uri]] - resolver: IUriResolver \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py new file mode 100644 index 00000000..77a7b09a --- /dev/null +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -0,0 +1,149 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from polywrap_core import Uri, IUriResolver, Env +from typing import Dict, Any, List, Optional, Union + +@dataclass(slots=True, kw_only=True) +class ClientConfig(): + """ + This Abstract class is used to configure the polywrap client before it executes a call + The ClientConfig class is created and modified with the ClientConfigBuilder module + """ + envs: Dict[Uri, Dict[str, Any]] + interfaces: Dict[Uri, List[Uri]] + resolver: IUriResolver + wrappers: List[Uri] + + +class IClientConfigBuilder(ABC): + """ + Interface used by the BaseClientConfigBuilder class. + This interface is used to configure the polywrap client before it executes a call + It defines the methods that can be used to configure the ClientConfig object. + """ + + @abstractmethod + def build() -> ClientConfig: + """Returns a sanitized config object from the builder's config.""" + pass + + def get_envs(self) -> Optional[Dict[Uri, Dict[str, Any]]]: + """Returns the envs dictionary from the builder's config.""" + pass + + @abstractmethod + def set_env(self, env: Dict[str, Any], uri: Uri): + pass + + @abstractmethod + def add_env(self, env: Dict[str, Any], uri: Uri): + pass + + @abstractmethod + def add_envs(self, envs: List[Env], uri: Uri): + pass + + @abstractmethod + def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]): + pass + + @abstractmethod + def add_wrapper(self, wrapper_uri: Uri) -> ClientConfig: + pass + + @abstractmethod + def add_wrappers(self, wrapper_uris: Optional[List[Uri]]) -> ClientConfig: + pass + + @abstractmethod + def set_resolver(self) -> ClientConfig: + pass + +class BaseClientConfigBuilder(IClientConfigBuilder): + """A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class""" + # config: ClientConfig + + def __init__(self): + self.config = ClientConfig(envs={}, interfaces={}, resolver=None, wrappers= []) + + def build(self)-> ClientConfig: + """ + Returns a sanitized config object from the builder's config. + """ + return self.config + + def get_envs(self)-> Dict[Uri, Dict[str, Any]]: + return self.config.envs + + def set_env(self, env: Env={'test':'tested'}, uri=Uri("wrap://ens/eth.plugin.one"))-> IClientConfigBuilder: + # TODO: This is a temporary solution to the problem of the Uri / Env not being able to pass as None initially + # should be (self, env: Env=None, uri: Uri=None): but that causes an error + if (env or uri) is None: + raise KeyError("Must provide both an env or uri") + self.config.envs[uri] = env + return self + + # for key in self.config.envs[uri].keys(): + # if key in env.keys(): + # self.config.envs[uri][key] = env[key] + # else: + # self.config.envs[uri][key] = None + # return self + + def add_env(self, env: Env = None , uri: Uri = None)-> IClientConfigBuilder: + if (env or uri) is None: + raise KeyError("Must provide both an env or uri") + self.config.envs[uri] = env + return self + + def add_envs(self, envs: List[Env]) -> IClientConfigBuilder: + """ + Adds a list of environments (each in the form of an `Env`) for a given uri + """ + for env in envs: + self.add_env(env) + return self + + def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]) -> IClientConfigBuilder: + """ + Adds a list of implementations (each in the form of an `Uri`) for a given interface + """ + if interface_uri is None: + raise ValueError() + if interface_uri in self.config.interfaces.keys(): + self.config.interfaces[interface_uri] = self.config.interfaces[interface_uri] + implementations_uris + else: + self.config.interfaces[interface_uri] = implementations_uris + return self + + def add_wrapper(self, wrapper_uri: Uri) -> IClientConfigBuilder: + """ + Adds a wrapper to the list of wrappers + """ + self.config.wrappers.append(wrapper_uri) + return self + + def add_wrappers(self, wrappers_uris: List[Uri]) -> IClientConfigBuilder: + """ + Adds a list of wrappers to the list of wrappers + """ + for wrapper_uri in wrappers_uris: + self.add_wrapper(wrapper_uri) + return self + + def remove_wrapper(self, wrapper_uri: Uri) -> IClientConfigBuilder: + """ + Removes a wrapper from the list of wrappers + """ + self.config.wrappers.remove(wrapper_uri) + return self + + def set_resolver(self, uri_resolver) -> IClientConfigBuilder: + """ + Sets a single resolver for the `ClientConfig` object before it is built + """ + self.config.resolver = uri_resolver + return self + +class ClientConfigBuilder(BaseClientConfigBuilder): + ... diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py new file mode 100644 index 00000000..9b13f239 --- /dev/null +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -0,0 +1,92 @@ +from typing import List, Any, Dict, Union +from polywrap_core import Env +from polywrap_core import Uri +from polywrap_core import IUriResolver +from polywrap_client_config_builder import ClientConfigBuilder +import pytest +from pytest import fixture +from polywrap_client_config_builder import ClientConfig +from dataclasses import asdict + +# Variables + +env_varA = { 'color': "yellow", 'size': "large" } +env_varB = { 'color': "red", 'size': "small" } +env_varM = { 'dog': "corgi", 'season': "autumn" } +env_varN = { 'dog': "poodle", 'season': "summer" } +env_uriX = Uri("wrap://ens/eth.plugin.one") +env_uriY = Uri("wrap://ipfs/filecoin.wrapper.two") + + +# ENVS + +def test_client_config_builder_set_env(): + ccb = ClientConfigBuilder() + envs = { env_uriX: env_varA } + ccb = ccb.set_env( env_varA, env_uriX) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = None, wrappers=[])) + +def test_client_config_builder_add_env(): + ccb = ClientConfigBuilder() # instantiate new client config builder + ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder + client_config: ClientConfig = ccb.build() # build a client config object + print(client_config) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = None, wrappers=[])) + +def test_client_config_builder_add_env_updates_env_value(): + ccb = ClientConfigBuilder() # instantiate new client config builder + ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder + client_config: ClientConfig = ccb.build() # build a client config object + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = None, wrappers=[])) + ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder + client_config: ClientConfig = ccb.build() # build a new client config object + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = None, wrappers=[])) + +# INTERFACES AND IMPLEMENTATIONS + +def test_client_config_builder_adds_interface_implementations(): + ccb = ClientConfigBuilder() + interfaces_uri = Uri("wrap://ens/eth.plugin.one") + implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] + ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = None, wrappers=[])) + +# WRAPPERS AND PLUGINS + +def test_client_config_builder_add_wrapper(): + ccb = ClientConfigBuilder() + wrapper = Uri("wrap://ens/uni.wrapper.eth") + ccb = ccb.add_wrapper(wrapper) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[wrapper])) + +def test_client_config_builder_adds_multiple_wrappers(): + ccb = ClientConfigBuilder() + wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] + ccb = ccb.add_wrappers(wrappers) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=wrappers)) + +def test_client_config_builder_removes_wrapper(): + ccb = ClientConfigBuilder() + wrapper = Uri("wrap://ens/uni.wrapper.eth") + ccb = ccb.add_wrapper(wrapper) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[wrapper])) + ccb = ccb.remove_wrapper(wrapper) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[])) + +# RESOLVER + +@pytest.mark.skip("Should implement IURIResolver interface") +def test_client_config_builder_set_uri_resolver(): + ccb = ClientConfigBuilder() + resolver = IUriResolver() + Uri("wrap://ens/eth.resolver.one") + ccb = ccb.set_resolver() + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolver, wrappers=[])) + \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py index c23aab9a..ba7e3bf9 100644 --- a/packages/polywrap-client-config-builder/tests/test_clientconfig.py +++ b/packages/polywrap-client-config-builder/tests/test_clientconfig.py @@ -6,7 +6,12 @@ def test_client_config_structure_starts_empty(): ccb = ClientConfigBuilder() client_config = ccb.build() - result = ClientConfig(envs={}, interfaces={}, resolver = None) + result = ClientConfig( + envs={}, + interfaces={}, + resolver = None, + wrappers = [] + ) assert asdict(client_config) == asdict(result) @@ -19,4 +24,5 @@ def test_client_config_structure_sets_env(): env = env ) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = None)) \ No newline at end of file + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = None, wrappers=[])) + diff --git a/packages/polywrap-client-config-builder/tox.ini b/packages/polywrap-client-config-builder/tox.ini new file mode 100644 index 00000000..9651e250 --- /dev/null +++ b/packages/polywrap-client-config-builder/tox.ini @@ -0,0 +1,35 @@ +[tox] +isolated_build = True +envlist = py310 + + +[testenv] +commands = + pytest tests/ + +[testenv:v] # verbose +commands = + pytest -vv tests/ + +[testenv:lint] +commands = + isort --check-only polywrap_client_config_builder + black --check polywrap_client_config_builder + pylint polywrap_client_config_builder + pydocstyle polywrap_client_config_builder + +[testenv:typecheck] +commands = + pyright polywrap_client_config_builder + +[testenv:secure] +commands = + bandit -r polywrap_client_config_builder -c pyproject.toml + +[testenv:dev] +basepython = python3.10 +usedevelop = True +commands = + isort polywrap_client_config_builder + black polywrap_client_config_builder + From 76bf9545cd5e1e86cb6bde02fd425db9e2cc830a Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 22 Nov 2022 15:30:49 +0100 Subject: [PATCH 05/21] feat:implemented_add_envs, added tests for add_envs and set_envs together. --- .../__init__.py | 1 - .../client_config.py | 2 - .../client_config_builder.py | 63 ++++++++++++----- .../pyproject.toml | 2 - .../tests/test_client_config_builder.py | 70 ++++++++++++++++--- .../tests/test_clientconfig.py | 4 +- 6 files changed, 106 insertions(+), 36 deletions(-) delete mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py index 91530deb..464ccf12 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py @@ -1,2 +1 @@ from .client_config_builder import * -from .client_config import * \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py deleted file mode 100644 index 984d9bf2..00000000 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config.py +++ /dev/null @@ -1,2 +0,0 @@ -# Polywrap Python Client - https://polywrap.io -# https://github.com/polywrap/toolchain/blob/origin-0.10-dev/packages/js/client-config-builder/src/ClientConfig.ts diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 77a7b09a..cbcdd700 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -11,7 +11,7 @@ class ClientConfig(): """ envs: Dict[Uri, Dict[str, Any]] interfaces: Dict[Uri, List[Uri]] - resolver: IUriResolver + resolver: List[IUriResolver] wrappers: List[Uri] @@ -23,7 +23,7 @@ class IClientConfigBuilder(ABC): """ @abstractmethod - def build() -> ClientConfig: + def build(self) -> ClientConfig: """Returns a sanitized config object from the builder's config.""" pass @@ -32,15 +32,15 @@ def get_envs(self) -> Optional[Dict[Uri, Dict[str, Any]]]: pass @abstractmethod - def set_env(self, env: Dict[str, Any], uri: Uri): + def set_env(self, env: Dict[str, Any], uri: Uri)-> ClientConfig: pass @abstractmethod - def add_env(self, env: Dict[str, Any], uri: Uri): + def add_env(self, env: Dict[str, Any], uri: Uri) -> ClientConfig: pass @abstractmethod - def add_envs(self, envs: List[Env], uri: Uri): + def add_envs(self, envs: List[Env], uri: Uri) -> ClientConfig: pass @abstractmethod @@ -56,15 +56,22 @@ def add_wrappers(self, wrapper_uris: Optional[List[Uri]]) -> ClientConfig: pass @abstractmethod - def set_resolver(self) -> ClientConfig: + def set_resolver(self, resolver: IUriResolver) -> ClientConfig: pass + @abstractmethod + def add_resolver(self, resolver: IUriResolver) -> ClientConfig: + pass + + @abstractmethod + def add_resolvers(self, resolvers_list: List[IUriResolver]) -> ClientConfig: + pass class BaseClientConfigBuilder(IClientConfigBuilder): """A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class""" # config: ClientConfig def __init__(self): - self.config = ClientConfig(envs={}, interfaces={}, resolver=None, wrappers= []) + self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= []) def build(self)-> ClientConfig: """ @@ -75,7 +82,7 @@ def build(self)-> ClientConfig: def get_envs(self)-> Dict[Uri, Dict[str, Any]]: return self.config.envs - def set_env(self, env: Env={'test':'tested'}, uri=Uri("wrap://ens/eth.plugin.one"))-> IClientConfigBuilder: + def set_env(self, env: Env={'test':'tested'}, uri: Uri=Uri("wrap://ens/eth.plugin.one"))-> IClientConfigBuilder: # TODO: This is a temporary solution to the problem of the Uri / Env not being able to pass as None initially # should be (self, env: Env=None, uri: Uri=None): but that causes an error if (env or uri) is None: @@ -83,25 +90,25 @@ def set_env(self, env: Env={'test':'tested'}, uri=Uri("wrap://ens/eth.plugin.one self.config.envs[uri] = env return self - # for key in self.config.envs[uri].keys(): - # if key in env.keys(): - # self.config.envs[uri][key] = env[key] - # else: - # self.config.envs[uri][key] = None - # return self - def add_env(self, env: Env = None , uri: Uri = None)-> IClientConfigBuilder: + """Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments, + unless the env key already exists in the environment, then it will overwrite the existing value""" if (env or uri) is None: raise KeyError("Must provide both an env or uri") - self.config.envs[uri] = env + + if uri in self.config.envs.keys(): + for key in env.keys(): + self.config.envs[uri][key] = env[key] + else: + self.config.envs[uri] = env return self - def add_envs(self, envs: List[Env]) -> IClientConfigBuilder: + def add_envs(self, envs: List[Env], uri: Uri = None) -> IClientConfigBuilder: """ Adds a list of environments (each in the form of an `Env`) for a given uri """ for env in envs: - self.add_env(env) + self.add_env(env, uri ) return self def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]) -> IClientConfigBuilder: @@ -142,7 +149,25 @@ def set_resolver(self, uri_resolver) -> IClientConfigBuilder: """ Sets a single resolver for the `ClientConfig` object before it is built """ - self.config.resolver = uri_resolver + self.config.resolver = [uri_resolver] + return self + + def add_resolver(self, resolver: IUriResolver) -> IClientConfigBuilder: + """ + Adds a resolver to the list of resolvers + """ + + if self.config.resolver is None: + raise ValueError("This resolver is not set. Please set a resolver before adding resolvers.") + self.config.resolver.append(resolver) + return self + + def add_resolvers(self, resolvers_list: List[IUriResolver]) -> IClientConfigBuilder: + """ + Adds a list of resolvers to the list of resolvers + """ + for resolver in resolvers_list: + self.add_resolver(resolver) return self class ClientConfigBuilder(BaseClientConfigBuilder): diff --git a/packages/polywrap-client-config-builder/pyproject.toml b/packages/polywrap-client-config-builder/pyproject.toml index db04dbc7..0fd513d8 100644 --- a/packages/polywrap-client-config-builder/pyproject.toml +++ b/packages/polywrap-client-config-builder/pyproject.toml @@ -11,9 +11,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" -wasmtime = "^1.0.1" polywrap-core = { path = "../polywrap-core", develop = true } -polywrap-wasm = { path = "../polywrap-wasm", develop = true } polywrap-result = { path = "../polywrap-result", develop = true } [tool.poetry.dev-dependencies] diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 9b13f239..11986cfc 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -12,8 +12,10 @@ env_varA = { 'color': "yellow", 'size': "large" } env_varB = { 'color': "red", 'size': "small" } +env_varN = { 'dog': "poodle", 'season': "summer" } env_varM = { 'dog': "corgi", 'season': "autumn" } env_varN = { 'dog': "poodle", 'season': "summer" } +env_varS = { 'vehicle': "scooter"} env_uriX = Uri("wrap://ens/eth.plugin.one") env_uriY = Uri("wrap://ipfs/filecoin.wrapper.two") @@ -25,23 +27,49 @@ def test_client_config_builder_set_env(): envs = { env_uriX: env_varA } ccb = ccb.set_env( env_varA, env_uriX) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[])) def test_client_config_builder_add_env(): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object print(client_config) - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) def test_client_config_builder_add_env_updates_env_value(): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder client_config: ClientConfig = ccb.build() # build a new client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[])) + +def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): + ccb = ClientConfigBuilder() + ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + + ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[])) + + ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig( + envs={ + env_uriX: env_varB, + env_uriY: env_varM + }, + interfaces={}, resolver = [], wrappers=[])) + + # add new env vars on the second Uri, while also updating the Env vars of dog and season + ccb = ccb.add_envs([env_varN, env_varS], env_uriY) + new_envs = {**env_varM, **env_varN, **env_varS} + print(new_envs) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[])) # INTERFACES AND IMPLEMENTATIONS @@ -51,7 +79,7 @@ def test_client_config_builder_adds_interface_implementations(): implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[])) # WRAPPERS AND PLUGINS @@ -60,24 +88,24 @@ def test_client_config_builder_add_wrapper(): wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[wrapper])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper])) def test_client_config_builder_adds_multiple_wrappers(): ccb = ClientConfigBuilder() wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] ccb = ccb.add_wrappers(wrappers) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=wrappers)) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers)) def test_client_config_builder_removes_wrapper(): ccb = ClientConfigBuilder() wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[wrapper])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper])) ccb = ccb.remove_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[])) # RESOLVER @@ -89,4 +117,26 @@ def test_client_config_builder_set_uri_resolver(): ccb = ccb.set_resolver() client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolver, wrappers=[])) - \ No newline at end of file + +def test_client_config_builder_add_resolver(): + + # set a first resolver + ccb = ClientConfigBuilder() + resolverA = Uri("wrap://ens/eth.resolver.one") + ccb: ClientConfigBuilder = ccb.set_resolver(resolverA) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[])) + + # add a second resolver + resolverB = Uri("wrap://ens/eth.resolver.two") + ccb = ccb.add_resolver(resolverB) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[])) + + # add a third and fourth resolver + resolverC = Uri("wrap://ens/eth.resolver.three") + resolverD = Uri("wrap://ens/eth.resolver.four") + ccb = ccb.add_resolvers([resolverC, resolverD]) + client_config: ClientConfig = ccb.build() + resolvers = [resolverA, resolverB, resolverC, resolverD] + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[])) diff --git a/packages/polywrap-client-config-builder/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py index ba7e3bf9..25d8ecf1 100644 --- a/packages/polywrap-client-config-builder/tests/test_clientconfig.py +++ b/packages/polywrap-client-config-builder/tests/test_clientconfig.py @@ -9,7 +9,7 @@ def test_client_config_structure_starts_empty(): result = ClientConfig( envs={}, interfaces={}, - resolver = None, + resolver = [], wrappers = [] ) assert asdict(client_config) == asdict(result) @@ -24,5 +24,5 @@ def test_client_config_structure_sets_env(): env = env ) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = None, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[])) From c27ff7483d52d91a8646df8e72ee450fa7ea230e Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Thu, 24 Nov 2022 11:48:10 +0100 Subject: [PATCH 06/21] chore: refactoring abstract base classes to remove IClientConfigBuilder --- .../client_config_builder.py | 149 ++++++++++-------- 1 file changed, 80 insertions(+), 69 deletions(-) diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index cbcdd700..b0faa12c 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -15,82 +15,35 @@ class ClientConfig(): wrappers: List[Uri] -class IClientConfigBuilder(ABC): +class BaseClientConfigBuilder(ABC): """ - Interface used by the BaseClientConfigBuilder class. - This interface is used to configure the polywrap client before it executes a call - It defines the methods that can be used to configure the ClientConfig object. + An abstract base class of the `ClientConfigBuilder`, which uses the ABC module + to define the methods that can be used to configure the `ClientConfig` object. """ + def __init__(self): + self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= []) + @abstractmethod def build(self) -> ClientConfig: """Returns a sanitized config object from the builder's config.""" pass - def get_envs(self) -> Optional[Dict[Uri, Dict[str, Any]]]: - """Returns the envs dictionary from the builder's config.""" - pass - - @abstractmethod - def set_env(self, env: Dict[str, Any], uri: Uri)-> ClientConfig: - pass - - @abstractmethod - def add_env(self, env: Dict[str, Any], uri: Uri) -> ClientConfig: - pass - - @abstractmethod - def add_envs(self, envs: List[Env], uri: Uri) -> ClientConfig: - pass - - @abstractmethod - def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]): - pass - - @abstractmethod - def add_wrapper(self, wrapper_uri: Uri) -> ClientConfig: - pass - - @abstractmethod - def add_wrappers(self, wrapper_uris: Optional[List[Uri]]) -> ClientConfig: - pass - - @abstractmethod - def set_resolver(self, resolver: IUriResolver) -> ClientConfig: - pass - - @abstractmethod - def add_resolver(self, resolver: IUriResolver) -> ClientConfig: - pass - @abstractmethod - def add_resolvers(self, resolvers_list: List[IUriResolver]) -> ClientConfig: - pass -class BaseClientConfigBuilder(IClientConfigBuilder): - """A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class""" - # config: ClientConfig - - def __init__(self): - self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= []) - - def build(self)-> ClientConfig: - """ - Returns a sanitized config object from the builder's config. - """ - return self.config - def get_envs(self)-> Dict[Uri, Dict[str, Any]]: + """Returns the envs dictionary from the builder's config.""" return self.config.envs - - def set_env(self, env: Env={'test':'tested'}, uri: Uri=Uri("wrap://ens/eth.plugin.one"))-> IClientConfigBuilder: - # TODO: This is a temporary solution to the problem of the Uri / Env not being able to pass as None initially - # should be (self, env: Env=None, uri: Uri=None): but that causes an error + + @abstractmethod + def set_env(self, env: Env, uri: Uri): + """Sets the envs dictionary in the builder's config, overiding any existing values.""" if (env or uri) is None: raise KeyError("Must provide both an env or uri") self.config.envs[uri] = env return self - def add_env(self, env: Env = None , uri: Uri = None)-> IClientConfigBuilder: + @abstractmethod + def add_env(self, env: Env = None , uri: Uri = None): """Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments, unless the env key already exists in the environment, then it will overwrite the existing value""" if (env or uri) is None: @@ -103,7 +56,8 @@ def add_env(self, env: Env = None , uri: Uri = None)-> IClientConfigBuilder: self.config.envs[uri] = env return self - def add_envs(self, envs: List[Env], uri: Uri = None) -> IClientConfigBuilder: + @abstractmethod + def add_envs(self, envs: List[Env], uri: Uri = None): """ Adds a list of environments (each in the form of an `Env`) for a given uri """ @@ -111,7 +65,8 @@ def add_envs(self, envs: List[Env], uri: Uri = None) -> IClientConfigBuilder: self.add_env(env, uri ) return self - def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]) -> IClientConfigBuilder: + @abstractmethod + def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]): """ Adds a list of implementations (each in the form of an `Uri`) for a given interface """ @@ -123,14 +78,16 @@ def add_interface_implementations(self, interface_uri: Uri, implementations_uris self.config.interfaces[interface_uri] = implementations_uris return self - def add_wrapper(self, wrapper_uri: Uri) -> IClientConfigBuilder: + @abstractmethod + def add_wrapper(self, wrapper_uri: Uri) : """ Adds a wrapper to the list of wrappers """ self.config.wrappers.append(wrapper_uri) return self - def add_wrappers(self, wrappers_uris: List[Uri]) -> IClientConfigBuilder: + @abstractmethod + def add_wrappers(self, wrappers_uris: List[Uri]) : """ Adds a list of wrappers to the list of wrappers """ @@ -138,21 +95,24 @@ def add_wrappers(self, wrappers_uris: List[Uri]) -> IClientConfigBuilder: self.add_wrapper(wrapper_uri) return self - def remove_wrapper(self, wrapper_uri: Uri) -> IClientConfigBuilder: + @abstractmethod + def remove_wrapper(self, wrapper_uri: Uri) : """ Removes a wrapper from the list of wrappers """ self.config.wrappers.remove(wrapper_uri) return self - def set_resolver(self, uri_resolver) -> IClientConfigBuilder: + @abstractmethod + def set_resolver(self, uri_resolver): """ Sets a single resolver for the `ClientConfig` object before it is built """ self.config.resolver = [uri_resolver] return self - def add_resolver(self, resolver: IUriResolver) -> IClientConfigBuilder: + @abstractmethod + def add_resolver(self, resolver: IUriResolver) : """ Adds a resolver to the list of resolvers """ @@ -162,7 +122,8 @@ def add_resolver(self, resolver: IUriResolver) -> IClientConfigBuilder: self.config.resolver.append(resolver) return self - def add_resolvers(self, resolvers_list: List[IUriResolver]) -> IClientConfigBuilder: + @abstractmethod + def add_resolvers(self, resolvers_list: List[IUriResolver]): """ Adds a list of resolvers to the list of resolvers """ @@ -171,4 +132,54 @@ def add_resolvers(self, resolvers_list: List[IUriResolver]) -> IClientConfigBuil return self class ClientConfigBuilder(BaseClientConfigBuilder): - ... + + def build(self)-> ClientConfig: + """ + Returns a sanitized config object from the builder's config. + """ + return self.config + + def get_envs(self) -> Dict[Uri, Dict[str, Any]]: + return super().get_envs() + + def set_env(self, env: Env, uri: Uri)-> BaseClientConfigBuilder: + super().set_env(env, uri) + return self + + def add_env(self, env: Env, uri: Uri)-> BaseClientConfigBuilder: + super().add_env(env, uri) + return self + + def add_envs(self, envs: List[Env], uri: Uri)-> BaseClientConfigBuilder: + super().add_envs(envs, uri) + return self + + def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri])-> BaseClientConfigBuilder: + super().add_interface_implementations(interface_uri, implementations_uris) + return self + + def add_wrapper(self, wrapper_uri: Uri)-> BaseClientConfigBuilder: + super().add_wrapper(wrapper_uri) + return self + + def add_wrappers(self, wrappers_uris: List[Uri])-> BaseClientConfigBuilder: + super().add_wrappers(wrappers_uris) + return self + + def remove_wrapper(self, wrapper_uri: Uri)-> BaseClientConfigBuilder: + super().remove_wrapper(wrapper_uri) + return self + + def set_resolver(self, uri_resolver: IUriResolver)-> BaseClientConfigBuilder: + super().set_resolver(uri_resolver) + return self + + def add_resolver(self, resolver: IUriResolver)-> BaseClientConfigBuilder: + super().add_resolver(resolver) + return self + + def add_resolvers(self, resolvers_list: List[IUriResolver])-> BaseClientConfigBuilder: + super().add_resolvers(resolvers_list) + return self + + From 958caf90018f84336c505398d992f1a36177e46b Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Thu, 24 Nov 2022 20:27:32 +0100 Subject: [PATCH 07/21] readme --- packages/polywrap-client-config-builder/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/polywrap-client-config-builder/README.md b/packages/polywrap-client-config-builder/README.md index fd7cdb53..7620a5d8 100644 --- a/packages/polywrap-client-config-builder/README.md +++ b/packages/polywrap-client-config-builder/README.md @@ -11,4 +11,10 @@ Look at [this file][./client_config_builder.py] to detail all of its functionali These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. Look at [this file](./polywrap_client_config_builder/client_config_builder.py) to detail all of its functionality -And at [tests](./tests/test_client_config_builder.py) \ No newline at end of file +And at [tests](./tests/test_client_config_builder.py) + +--- + +The current implementation uses the `ClientConfig` as a dataclass to later create an Abstract Base Class of a `BaseClientConfigBuilder` which defines more clearly the functions of the module, like add_envs, set_resolvers, remove_wrappers, and so on. + +This `BaseClientConfigBuilder` is later used in the class `ClientConfigBuilder` which only implements the build method, for now, and inherits all the abstract methods of the `BaseClientConfigBuilder`. \ No newline at end of file From 002eecc213025e4dfc43278f2edfa7d699b794d5 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Thu, 24 Nov 2022 20:28:54 +0100 Subject: [PATCH 08/21] readme --- packages/polywrap-client-config-builder/README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/polywrap-client-config-builder/README.md b/packages/polywrap-client-config-builder/README.md index 7620a5d8..935fda66 100644 --- a/packages/polywrap-client-config-builder/README.md +++ b/packages/polywrap-client-config-builder/README.md @@ -4,12 +4,6 @@ These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. -Look at [this file][./client_config_builder.py] to detail all of its functionality -# Polywrap Python Client -## This object allows you to build proper Polywrapt ClientConfig objects - -These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. - Look at [this file](./polywrap_client_config_builder/client_config_builder.py) to detail all of its functionality And at [tests](./tests/test_client_config_builder.py) From 39571245f9dc4d72d05c5857be8b5d3505e3936e Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Fri, 25 Nov 2022 12:33:08 +0100 Subject: [PATCH 09/21] feat:packages property on CCB --- .../client_config_builder.py | 49 ++++++++++++++++--- .../tests/test_clientconfig.py | 5 +- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index b0faa12c..f8a09f8f 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from polywrap_core import Uri, IUriResolver, Env +from polywrap_core import Uri, IUriResolver, Env, UriWrapper,UriPackage +from polywrap_uri_resolvers import IUriResolver from typing import Dict, Any, List, Optional, Union @dataclass(slots=True, kw_only=True) @@ -11,8 +12,9 @@ class ClientConfig(): """ envs: Dict[Uri, Dict[str, Any]] interfaces: Dict[Uri, List[Uri]] + packages: List[UriPackage] resolver: List[IUriResolver] - wrappers: List[Uri] + wrappers: List[UriWrapper] class BaseClientConfigBuilder(ABC): @@ -22,7 +24,7 @@ class BaseClientConfigBuilder(ABC): """ def __init__(self): - self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= []) + self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= [], packages=[]) @abstractmethod def build(self) -> ClientConfig: @@ -37,13 +39,11 @@ def get_envs(self)-> Dict[Uri, Dict[str, Any]]: @abstractmethod def set_env(self, env: Env, uri: Uri): """Sets the envs dictionary in the builder's config, overiding any existing values.""" - if (env or uri) is None: - raise KeyError("Must provide both an env or uri") self.config.envs[uri] = env return self @abstractmethod - def add_env(self, env: Env = None , uri: Uri = None): + def add_env(self, env: Env, uri: Uri): """Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments, unless the env key already exists in the environment, then it will overwrite the existing value""" if (env or uri) is None: @@ -103,6 +103,31 @@ def remove_wrapper(self, wrapper_uri: Uri) : self.config.wrappers.remove(wrapper_uri) return self + @abstractmethod + def set_package(self, uri_package: UriPackage): + """ + Sets the package in the builder's config, overiding any existing values. + """ + self.config.packages = [uri_package] + return self + + @abstractmethod + def add_package(self, uri_package: UriPackage): + """ + Adds a package to the list of packages + """ + self.config.packages.append(uri_package) + return self + + @abstractmethod + def add_packages(self, uri_packages: List[UriPackage]): + """ + Adds a list of packages to the list of packages + """ + for uri_package in uri_packages: + self.add_package(uri_package) + return self + @abstractmethod def set_resolver(self, uri_resolver): """ @@ -170,6 +195,18 @@ def remove_wrapper(self, wrapper_uri: Uri)-> BaseClientConfigBuilder: super().remove_wrapper(wrapper_uri) return self + def set_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + super().set_package(uri_package) + return self + + def add_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + super().add_package(uri_package) + return self + + def add_packages(self, uri_packages: List[UriPackage])-> BaseClientConfigBuilder: + super().add_packages(uri_packages) + return self + def set_resolver(self, uri_resolver: IUriResolver)-> BaseClientConfigBuilder: super().set_resolver(uri_resolver) return self diff --git a/packages/polywrap-client-config-builder/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py index 25d8ecf1..32959d61 100644 --- a/packages/polywrap-client-config-builder/tests/test_clientconfig.py +++ b/packages/polywrap-client-config-builder/tests/test_clientconfig.py @@ -10,7 +10,8 @@ def test_client_config_structure_starts_empty(): envs={}, interfaces={}, resolver = [], - wrappers = [] + wrappers = [], + packages=[] ) assert asdict(client_config) == asdict(result) @@ -24,5 +25,5 @@ def test_client_config_structure_sets_env(): env = env ) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[])) From 7a861be0ef1f6b3b7900e1eebb7bdef6af875a1e Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Fri, 25 Nov 2022 13:06:47 +0100 Subject: [PATCH 10/21] feat: ccb generic add function and tests outline for configuring packages --- .../client_config_builder.py | 34 +++++++ .../tests/test_client_config_builder.py | 95 +++++++++++++++---- 2 files changed, 110 insertions(+), 19 deletions(-) diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index f8a09f8f..6a035ddd 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -31,6 +31,21 @@ def build(self) -> ClientConfig: """Returns a sanitized config object from the builder's config.""" pass + @abstractmethod + def add(self, new_config: ClientConfig) -> ClientConfig: + """Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object.""" + if new_config.envs: + self.config.envs.update(new_config.envs) + if new_config.interfaces: + self.config.interfaces.update(new_config.interfaces) + if new_config.resolver: + self.config.resolver.extend(new_config.resolver) + if new_config.wrappers: + self.config.wrappers.extend(new_config.wrappers) + if new_config.packages: + self.config.packages.extend(new_config.packages) + return self.config + @abstractmethod def get_envs(self)-> Dict[Uri, Dict[str, Any]]: """Returns the envs dictionary from the builder's config.""" @@ -128,6 +143,14 @@ def add_packages(self, uri_packages: List[UriPackage]): self.add_package(uri_package) return self + @abstractmethod + def remove_package(self, uri_package: UriPackage): + """ + Removes a package from the list of packages + """ + self.config.packages.remove(uri_package) + return self + @abstractmethod def set_resolver(self, uri_resolver): """ @@ -164,6 +187,13 @@ def build(self)-> ClientConfig: """ return self.config + def add(self, new_config: ClientConfig) -> ClientConfig: + """ + Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object. + """ + super().add(new_config) + return self.config + def get_envs(self) -> Dict[Uri, Dict[str, Any]]: return super().get_envs() @@ -207,6 +237,10 @@ def add_packages(self, uri_packages: List[UriPackage])-> BaseClientConfigBuilder super().add_packages(uri_packages) return self + def remove_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + super().remove_package(uri_package) + return self + def set_resolver(self, uri_resolver: IUriResolver)-> BaseClientConfigBuilder: super().set_resolver(uri_resolver) return self diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 11986cfc..5ee2af2a 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,7 +1,7 @@ from typing import List, Any, Dict, Union from polywrap_core import Env from polywrap_core import Uri -from polywrap_core import IUriResolver +from polywrap_core import IUriResolver, UriPackage, UriWrapper from polywrap_client_config_builder import ClientConfigBuilder import pytest from pytest import fixture @@ -27,33 +27,33 @@ def test_client_config_builder_set_env(): envs = { env_uriX: env_varA } ccb = ccb.set_env( env_varA, env_uriX) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[])) def test_client_config_builder_add_env(): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object print(client_config) - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) def test_client_config_builder_add_env_updates_env_value(): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder client_config: ClientConfig = ccb.build() # build a new client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): ccb = ClientConfigBuilder() ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri client_config: ClientConfig = ccb.build() @@ -62,14 +62,14 @@ def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): env_uriX: env_varB, env_uriY: env_varM }, - interfaces={}, resolver = [], wrappers=[])) + interfaces={}, resolver = [], wrappers=[], packages=[])) # add new env vars on the second Uri, while also updating the Env vars of dog and season ccb = ccb.add_envs([env_varN, env_varS], env_uriY) new_envs = {**env_varM, **env_varN, **env_varS} print(new_envs) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[], packages=[])) # INTERFACES AND IMPLEMENTATIONS @@ -79,7 +79,58 @@ def test_client_config_builder_adds_interface_implementations(): implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[], packages=[])) + +# PACKAGES + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_set_package(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth"), version="1.0.0") + ccb = ccb.set_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_package(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_package_updates_package(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_packages(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + package2 = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_packages([package, package2]) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package, package2])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_packages_removes_packages(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + package2 = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_packages([package, package2]) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package, package2])) + ccb = ccb.remove_package([package1]) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package2])) # WRAPPERS AND PLUGINS @@ -88,24 +139,24 @@ def test_client_config_builder_add_wrapper(): wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[])) def test_client_config_builder_adds_multiple_wrappers(): ccb = ClientConfigBuilder() wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] ccb = ccb.add_wrappers(wrappers) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers)) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers, packages=[])) def test_client_config_builder_removes_wrapper(): ccb = ClientConfigBuilder() wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[])) ccb = ccb.remove_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[])) # RESOLVER @@ -114,9 +165,9 @@ def test_client_config_builder_set_uri_resolver(): ccb = ClientConfigBuilder() resolver = IUriResolver() Uri("wrap://ens/eth.resolver.one") - ccb = ccb.set_resolver() + ccb = ccb.set_resolver(resolver) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolver, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[])) def test_client_config_builder_add_resolver(): @@ -125,13 +176,13 @@ def test_client_config_builder_add_resolver(): resolverA = Uri("wrap://ens/eth.resolver.one") ccb: ClientConfigBuilder = ccb.set_resolver(resolverA) client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[])) # add a second resolver resolverB = Uri("wrap://ens/eth.resolver.two") ccb = ccb.add_resolver(resolverB) client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[], packages=[])) # add a third and fourth resolver resolverC = Uri("wrap://ens/eth.resolver.three") @@ -139,4 +190,10 @@ def test_client_config_builder_add_resolver(): ccb = ccb.add_resolvers([resolverC, resolverD]) client_config: ClientConfig = ccb.build() resolvers = [resolverA, resolverB, resolverC, resolverD] - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[])) + +# TODO: add tests for the following methods + +def test_client_config_builder_generic_add(): + # Test adding package, wrapper, resolver, interface, and env with the ccb.add method + pass \ No newline at end of file From 2c2c61e5b51406349d18c474eec41a1b64e59646 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Thu, 24 Nov 2022 20:27:32 +0100 Subject: [PATCH 11/21] feat: packages refactor, added generic add function, plus a tests suite for configuring packages, readme. --- .../polywrap-client-config-builder/README.md | 12 +-- .../client_config_builder.py | 83 ++++++++++++++-- .../tests/test_client_config_builder.py | 95 +++++++++++++++---- .../tests/test_clientconfig.py | 5 +- 4 files changed, 162 insertions(+), 33 deletions(-) diff --git a/packages/polywrap-client-config-builder/README.md b/packages/polywrap-client-config-builder/README.md index fd7cdb53..935fda66 100644 --- a/packages/polywrap-client-config-builder/README.md +++ b/packages/polywrap-client-config-builder/README.md @@ -4,11 +4,11 @@ These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. -Look at [this file][./client_config_builder.py] to detail all of its functionality -# Polywrap Python Client -## This object allows you to build proper Polywrapt ClientConfig objects +Look at [this file](./polywrap_client_config_builder/client_config_builder.py) to detail all of its functionality +And at [tests](./tests/test_client_config_builder.py) -These objects are needed to configure your python client's wrappers, pluggins, env variables, resolvers and interfaces. +--- -Look at [this file](./polywrap_client_config_builder/client_config_builder.py) to detail all of its functionality -And at [tests](./tests/test_client_config_builder.py) \ No newline at end of file +The current implementation uses the `ClientConfig` as a dataclass to later create an Abstract Base Class of a `BaseClientConfigBuilder` which defines more clearly the functions of the module, like add_envs, set_resolvers, remove_wrappers, and so on. + +This `BaseClientConfigBuilder` is later used in the class `ClientConfigBuilder` which only implements the build method, for now, and inherits all the abstract methods of the `BaseClientConfigBuilder`. \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index b0faa12c..6a035ddd 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from polywrap_core import Uri, IUriResolver, Env +from polywrap_core import Uri, IUriResolver, Env, UriWrapper,UriPackage +from polywrap_uri_resolvers import IUriResolver from typing import Dict, Any, List, Optional, Union @dataclass(slots=True, kw_only=True) @@ -11,8 +12,9 @@ class ClientConfig(): """ envs: Dict[Uri, Dict[str, Any]] interfaces: Dict[Uri, List[Uri]] + packages: List[UriPackage] resolver: List[IUriResolver] - wrappers: List[Uri] + wrappers: List[UriWrapper] class BaseClientConfigBuilder(ABC): @@ -22,13 +24,28 @@ class BaseClientConfigBuilder(ABC): """ def __init__(self): - self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= []) + self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= [], packages=[]) @abstractmethod def build(self) -> ClientConfig: """Returns a sanitized config object from the builder's config.""" pass + @abstractmethod + def add(self, new_config: ClientConfig) -> ClientConfig: + """Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object.""" + if new_config.envs: + self.config.envs.update(new_config.envs) + if new_config.interfaces: + self.config.interfaces.update(new_config.interfaces) + if new_config.resolver: + self.config.resolver.extend(new_config.resolver) + if new_config.wrappers: + self.config.wrappers.extend(new_config.wrappers) + if new_config.packages: + self.config.packages.extend(new_config.packages) + return self.config + @abstractmethod def get_envs(self)-> Dict[Uri, Dict[str, Any]]: """Returns the envs dictionary from the builder's config.""" @@ -37,13 +54,11 @@ def get_envs(self)-> Dict[Uri, Dict[str, Any]]: @abstractmethod def set_env(self, env: Env, uri: Uri): """Sets the envs dictionary in the builder's config, overiding any existing values.""" - if (env or uri) is None: - raise KeyError("Must provide both an env or uri") self.config.envs[uri] = env return self @abstractmethod - def add_env(self, env: Env = None , uri: Uri = None): + def add_env(self, env: Env, uri: Uri): """Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments, unless the env key already exists in the environment, then it will overwrite the existing value""" if (env or uri) is None: @@ -103,6 +118,39 @@ def remove_wrapper(self, wrapper_uri: Uri) : self.config.wrappers.remove(wrapper_uri) return self + @abstractmethod + def set_package(self, uri_package: UriPackage): + """ + Sets the package in the builder's config, overiding any existing values. + """ + self.config.packages = [uri_package] + return self + + @abstractmethod + def add_package(self, uri_package: UriPackage): + """ + Adds a package to the list of packages + """ + self.config.packages.append(uri_package) + return self + + @abstractmethod + def add_packages(self, uri_packages: List[UriPackage]): + """ + Adds a list of packages to the list of packages + """ + for uri_package in uri_packages: + self.add_package(uri_package) + return self + + @abstractmethod + def remove_package(self, uri_package: UriPackage): + """ + Removes a package from the list of packages + """ + self.config.packages.remove(uri_package) + return self + @abstractmethod def set_resolver(self, uri_resolver): """ @@ -139,6 +187,13 @@ def build(self)-> ClientConfig: """ return self.config + def add(self, new_config: ClientConfig) -> ClientConfig: + """ + Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object. + """ + super().add(new_config) + return self.config + def get_envs(self) -> Dict[Uri, Dict[str, Any]]: return super().get_envs() @@ -170,6 +225,22 @@ def remove_wrapper(self, wrapper_uri: Uri)-> BaseClientConfigBuilder: super().remove_wrapper(wrapper_uri) return self + def set_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + super().set_package(uri_package) + return self + + def add_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + super().add_package(uri_package) + return self + + def add_packages(self, uri_packages: List[UriPackage])-> BaseClientConfigBuilder: + super().add_packages(uri_packages) + return self + + def remove_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + super().remove_package(uri_package) + return self + def set_resolver(self, uri_resolver: IUriResolver)-> BaseClientConfigBuilder: super().set_resolver(uri_resolver) return self diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 11986cfc..5ee2af2a 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,7 +1,7 @@ from typing import List, Any, Dict, Union from polywrap_core import Env from polywrap_core import Uri -from polywrap_core import IUriResolver +from polywrap_core import IUriResolver, UriPackage, UriWrapper from polywrap_client_config_builder import ClientConfigBuilder import pytest from pytest import fixture @@ -27,33 +27,33 @@ def test_client_config_builder_set_env(): envs = { env_uriX: env_varA } ccb = ccb.set_env( env_varA, env_uriX) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[])) def test_client_config_builder_add_env(): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object print(client_config) - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) def test_client_config_builder_add_env_updates_env_value(): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder client_config: ClientConfig = ccb.build() # build a new client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): ccb = ClientConfigBuilder() ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri client_config: ClientConfig = ccb.build() @@ -62,14 +62,14 @@ def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): env_uriX: env_varB, env_uriY: env_varM }, - interfaces={}, resolver = [], wrappers=[])) + interfaces={}, resolver = [], wrappers=[], packages=[])) # add new env vars on the second Uri, while also updating the Env vars of dog and season ccb = ccb.add_envs([env_varN, env_varS], env_uriY) new_envs = {**env_varM, **env_varN, **env_varS} print(new_envs) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[], packages=[])) # INTERFACES AND IMPLEMENTATIONS @@ -79,7 +79,58 @@ def test_client_config_builder_adds_interface_implementations(): implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[], packages=[])) + +# PACKAGES + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_set_package(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth"), version="1.0.0") + ccb = ccb.set_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_package(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_package_updates_package(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_package(package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_packages(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + package2 = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_packages([package, package2]) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package, package2])) + +@pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_packages_removes_packages(): + ccb = ClientConfigBuilder() + package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + package2 = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) + ccb = ccb.add_packages([package, package2]) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package, package2])) + ccb = ccb.remove_package([package1]) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package2])) # WRAPPERS AND PLUGINS @@ -88,24 +139,24 @@ def test_client_config_builder_add_wrapper(): wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[])) def test_client_config_builder_adds_multiple_wrappers(): ccb = ClientConfigBuilder() wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] ccb = ccb.add_wrappers(wrappers) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers)) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers, packages=[])) def test_client_config_builder_removes_wrapper(): ccb = ClientConfigBuilder() wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[])) ccb = ccb.remove_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[])) # RESOLVER @@ -114,9 +165,9 @@ def test_client_config_builder_set_uri_resolver(): ccb = ClientConfigBuilder() resolver = IUriResolver() Uri("wrap://ens/eth.resolver.one") - ccb = ccb.set_resolver() + ccb = ccb.set_resolver(resolver) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolver, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[])) def test_client_config_builder_add_resolver(): @@ -125,13 +176,13 @@ def test_client_config_builder_add_resolver(): resolverA = Uri("wrap://ens/eth.resolver.one") ccb: ClientConfigBuilder = ccb.set_resolver(resolverA) client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[])) # add a second resolver resolverB = Uri("wrap://ens/eth.resolver.two") ccb = ccb.add_resolver(resolverB) client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[], packages=[])) # add a third and fourth resolver resolverC = Uri("wrap://ens/eth.resolver.three") @@ -139,4 +190,10 @@ def test_client_config_builder_add_resolver(): ccb = ccb.add_resolvers([resolverC, resolverD]) client_config: ClientConfig = ccb.build() resolvers = [resolverA, resolverB, resolverC, resolverD] - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[])) + +# TODO: add tests for the following methods + +def test_client_config_builder_generic_add(): + # Test adding package, wrapper, resolver, interface, and env with the ccb.add method + pass \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py index 25d8ecf1..32959d61 100644 --- a/packages/polywrap-client-config-builder/tests/test_clientconfig.py +++ b/packages/polywrap-client-config-builder/tests/test_clientconfig.py @@ -10,7 +10,8 @@ def test_client_config_structure_starts_empty(): envs={}, interfaces={}, resolver = [], - wrappers = [] + wrappers = [], + packages=[] ) assert asdict(client_config) == asdict(result) @@ -24,5 +25,5 @@ def test_client_config_structure_sets_env(): env = env ) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[])) From 7dd6a59d3618d0fef3e53d99f19515b424a46463 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 29 Nov 2022 10:34:00 +0100 Subject: [PATCH 12/21] feat: set packages tests and functionality --- .../client_config_builder.py | 118 +++++++++-------- .../tests/test_ccb_packages_wrappers.py | 120 ++++++++++++++++++ .../tests/test_client_config_builder.py | 90 +++++++------ 3 files changed, 230 insertions(+), 98 deletions(-) create mode 100644 packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 6a035ddd..2d33ea8d 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -1,20 +1,25 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from polywrap_core import Uri, IUriResolver, Env, UriWrapper,UriPackage -from polywrap_uri_resolvers import IUriResolver -from typing import Dict, Any, List, Optional, Union +from typing import Any, Dict, List, Optional, Union -@dataclass(slots=True, kw_only=True) -class ClientConfig(): +from polywrap_core import Env, Uri, UriPackage, UriWrapper +from polywrap_uri_resolvers import UriResolverLike + +# from polywrap_plugin import PluginPackage + + +@dataclass(slots=True, kw_only=True) +class ClientConfig: """ This Abstract class is used to configure the polywrap client before it executes a call The ClientConfig class is created and modified with the ClientConfigBuilder module """ + envs: Dict[Uri, Dict[str, Any]] interfaces: Dict[Uri, List[Uri]] - packages: List[UriPackage] - resolver: List[IUriResolver] wrappers: List[UriWrapper] + packages: List[UriPackage] + resolver: List[UriResolverLike] class BaseClientConfigBuilder(ABC): @@ -24,14 +29,16 @@ class BaseClientConfigBuilder(ABC): """ def __init__(self): - self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= [], packages=[]) + self.config = ClientConfig( + envs={}, interfaces={}, resolver=[], wrappers=[], packages=[] + ) @abstractmethod def build(self) -> ClientConfig: """Returns a sanitized config object from the builder's config.""" pass - @abstractmethod + def add(self, new_config: ClientConfig) -> ClientConfig: """Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object.""" if new_config.envs: @@ -46,24 +53,19 @@ def add(self, new_config: ClientConfig) -> ClientConfig: self.config.packages.extend(new_config.packages) return self.config - @abstractmethod - def get_envs(self)-> Dict[Uri, Dict[str, Any]]: + def get_envs(self) -> Dict[Uri, Dict[str, Any]]: """Returns the envs dictionary from the builder's config.""" return self.config.envs - @abstractmethod def set_env(self, env: Env, uri: Uri): """Sets the envs dictionary in the builder's config, overiding any existing values.""" self.config.envs[uri] = env return self - @abstractmethod def add_env(self, env: Env, uri: Uri): """Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments, unless the env key already exists in the environment, then it will overwrite the existing value""" - if (env or uri) is None: - raise KeyError("Must provide both an env or uri") - + if uri in self.config.envs.keys(): for key in env.keys(): self.config.envs[uri][key] = env[key] @@ -71,38 +73,38 @@ def add_env(self, env: Env, uri: Uri): self.config.envs[uri] = env return self - @abstractmethod def add_envs(self, envs: List[Env], uri: Uri = None): """ Adds a list of environments (each in the form of an `Env`) for a given uri """ for env in envs: - self.add_env(env, uri ) + self.add_env(env, uri) return self - @abstractmethod - def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]): + def add_interface_implementations( + self, interface_uri: Uri, implementations_uris: List[Uri] + ): """ Adds a list of implementations (each in the form of an `Uri`) for a given interface """ if interface_uri is None: raise ValueError() if interface_uri in self.config.interfaces.keys(): - self.config.interfaces[interface_uri] = self.config.interfaces[interface_uri] + implementations_uris + self.config.interfaces[interface_uri] = ( + self.config.interfaces[interface_uri] + implementations_uris + ) else: self.config.interfaces[interface_uri] = implementations_uris return self - @abstractmethod - def add_wrapper(self, wrapper_uri: Uri) : + def add_wrapper(self, wrapper_uri: Uri): """ Adds a wrapper to the list of wrappers """ self.config.wrappers.append(wrapper_uri) return self - @abstractmethod - def add_wrappers(self, wrappers_uris: List[Uri]) : + def add_wrappers(self, wrappers_uris: List[Uri]): """ Adds a list of wrappers to the list of wrappers """ @@ -110,15 +112,13 @@ def add_wrappers(self, wrappers_uris: List[Uri]) : self.add_wrapper(wrapper_uri) return self - @abstractmethod - def remove_wrapper(self, wrapper_uri: Uri) : + def remove_wrapper(self, wrapper_uri: Uri): """ Removes a wrapper from the list of wrappers """ self.config.wrappers.remove(wrapper_uri) return self - @abstractmethod def set_package(self, uri_package: UriPackage): """ Sets the package in the builder's config, overiding any existing values. @@ -126,15 +126,13 @@ def set_package(self, uri_package: UriPackage): self.config.packages = [uri_package] return self - @abstractmethod def add_package(self, uri_package: UriPackage): """ Adds a package to the list of packages """ self.config.packages.append(uri_package) return self - - @abstractmethod + def add_packages(self, uri_packages: List[UriPackage]): """ Adds a list of packages to the list of packages @@ -143,7 +141,6 @@ def add_packages(self, uri_packages: List[UriPackage]): self.add_package(uri_package) return self - @abstractmethod def remove_package(self, uri_package: UriPackage): """ Removes a package from the list of packages @@ -151,7 +148,6 @@ def remove_package(self, uri_package: UriPackage): self.config.packages.remove(uri_package) return self - @abstractmethod def set_resolver(self, uri_resolver): """ Sets a single resolver for the `ClientConfig` object before it is built @@ -159,19 +155,19 @@ def set_resolver(self, uri_resolver): self.config.resolver = [uri_resolver] return self - @abstractmethod - def add_resolver(self, resolver: IUriResolver) : + def add_resolver(self, resolver: UriResolverLike): """ Adds a resolver to the list of resolvers """ if self.config.resolver is None: - raise ValueError("This resolver is not set. Please set a resolver before adding resolvers.") + raise ValueError( + "This resolver is not set. Please set a resolver before adding resolvers." + ) self.config.resolver.append(resolver) return self - @abstractmethod - def add_resolvers(self, resolvers_list: List[IUriResolver]): + def add_resolvers(self, resolvers_list: List[UriResolverLike]): """ Adds a list of resolvers to the list of resolvers """ @@ -179,78 +175,80 @@ def add_resolvers(self, resolvers_list: List[IUriResolver]): self.add_resolver(resolver) return self + class ClientConfigBuilder(BaseClientConfigBuilder): - - def build(self)-> ClientConfig: + def build(self) -> ClientConfig: """ Returns a sanitized config object from the builder's config. """ return self.config - + def add(self, new_config: ClientConfig) -> ClientConfig: """ Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object. """ super().add(new_config) - return self.config + return self.config def get_envs(self) -> Dict[Uri, Dict[str, Any]]: return super().get_envs() - def set_env(self, env: Env, uri: Uri)-> BaseClientConfigBuilder: + def set_env(self, env: Env, uri: Uri) -> BaseClientConfigBuilder: super().set_env(env, uri) return self - def add_env(self, env: Env, uri: Uri)-> BaseClientConfigBuilder: + def add_env(self, env: Env, uri: Uri) -> BaseClientConfigBuilder: super().add_env(env, uri) return self - def add_envs(self, envs: List[Env], uri: Uri)-> BaseClientConfigBuilder: + def add_envs(self, envs: List[Env], uri: Uri) -> BaseClientConfigBuilder: super().add_envs(envs, uri) return self - def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri])-> BaseClientConfigBuilder: + def add_interface_implementations( + self, interface_uri: Uri, implementations_uris: List[Uri] + ) -> BaseClientConfigBuilder: super().add_interface_implementations(interface_uri, implementations_uris) return self - def add_wrapper(self, wrapper_uri: Uri)-> BaseClientConfigBuilder: + def add_wrapper(self, wrapper_uri: Uri) -> BaseClientConfigBuilder: super().add_wrapper(wrapper_uri) return self - def add_wrappers(self, wrappers_uris: List[Uri])-> BaseClientConfigBuilder: + def add_wrappers(self, wrappers_uris: List[Uri]) -> BaseClientConfigBuilder: super().add_wrappers(wrappers_uris) return self - def remove_wrapper(self, wrapper_uri: Uri)-> BaseClientConfigBuilder: + def remove_wrapper(self, wrapper_uri: Uri) -> BaseClientConfigBuilder: super().remove_wrapper(wrapper_uri) - return self - - def set_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + return self + + def set_package(self, uri_package: UriPackage) -> BaseClientConfigBuilder: super().set_package(uri_package) return self - def add_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + def add_package(self, uri_package: UriPackage) -> BaseClientConfigBuilder: super().add_package(uri_package) return self - def add_packages(self, uri_packages: List[UriPackage])-> BaseClientConfigBuilder: + def add_packages(self, uri_packages: List[UriPackage]) -> BaseClientConfigBuilder: super().add_packages(uri_packages) return self - def remove_package(self, uri_package: UriPackage)-> BaseClientConfigBuilder: + def remove_package(self, uri_package: UriPackage) -> BaseClientConfigBuilder: super().remove_package(uri_package) return self - def set_resolver(self, uri_resolver: IUriResolver)-> BaseClientConfigBuilder: + def set_resolver(self, uri_resolver: UriResolverLike) -> BaseClientConfigBuilder: super().set_resolver(uri_resolver) return self - def add_resolver(self, resolver: IUriResolver)-> BaseClientConfigBuilder: + def add_resolver(self, resolver: UriResolverLike) -> BaseClientConfigBuilder: super().add_resolver(resolver) return self - def add_resolvers(self, resolvers_list: List[IUriResolver])-> BaseClientConfigBuilder: + def add_resolvers( + self, resolvers_list: List[UriResolverLike] + ) -> BaseClientConfigBuilder: super().add_resolvers(resolvers_list) return self - - diff --git a/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py b/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py new file mode 100644 index 00000000..ff1159fa --- /dev/null +++ b/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py @@ -0,0 +1,120 @@ +from typing import List, Any, Dict, Union +from polywrap_core import Env +from polywrap_core import Uri +from polywrap_core import IUriResolver, UriPackage, UriWrapper, IWrapPackage +from polywrap_client_config_builder import ClientConfigBuilder +import pytest +from pytest import fixture +from polywrap_client_config_builder import ClientConfig +from dataclasses import asdict +from polywrap_client import PolywrapClient + + +# polywrap plugins +from abc import ABC +from typing import Any, Dict, TypeVar, Generic, List + +from polywrap_core import Invoker, InvokeOptions, InvocableResult, GetFileOptions +from polywrap_result import Err, Ok, Result +from typing import Generic, Optional, cast + +from polywrap_core import IWrapPackage, Wrapper, GetManifestOptions +from polywrap_manifest import AnyWrapManifest +from polywrap_result import Ok, Result +from polywrap_msgpack import msgpack_decode + + +TConfig = TypeVar('TConfig') +TResult = TypeVar('TResult') + +class MockedModule(Generic[TConfig, TResult], ABC): + env: Dict[str, Any] + config: TConfig + + def __init__(self, config: TConfig): + self.config = config + + def set_env(self, env: Dict[str, Any]) -> None: + self.env = env + + async def __wrap_invoke__(self, method: str, args: Dict[str, Any], client: Invoker) -> Result[TResult]: + methods: List[str] = [name for name in dir(self) if name == method] + + if not methods: + return Err.from_str(f"{method} is not defined in plugin") + + callable_method = getattr(self, method) + return Ok(callable_method(args, client)) if callable(callable_method) else Err.from_str(f"{method} is an attribute, not a method") + + +class MockedWrapper(Wrapper, Generic[TConfig, TResult]): + module: MockedModule[TConfig, TResult] + + def __init__(self, module: MockedModule[TConfig, TResult], manifest: AnyWrapManifest) -> None: + self.module = module + self.manifest = manifest + + async def invoke( + self, options: InvokeOptions, invoker: Invoker + ) -> Result[InvocableResult]: + env = options.env or {} + self.module.set_env(env) + + args: Union[Dict[str, Any], bytes] = options.args or {} + decoded_args: Dict[str, Any] = msgpack_decode(args) if isinstance(args, bytes) else args + + result: Result[TResult] = await self.module.__wrap_invoke__(options.method, decoded_args, invoker) + + if result.is_err(): + return cast(Err, result.err) + + return Ok(InvocableResult(result=result,encoded=False)) + + + async def get_file(self, options: GetFileOptions) -> Result[Union[str, bytes]]: + return Err.from_str("client.get_file(..) is not implemented for plugins") + + def get_manifest(self) -> Result[AnyWrapManifest]: + return Ok(self.manifest) + +class MockedPackage(Generic[TConfig, TResult], IWrapPackage): + module: MockedModule[TConfig, TResult] + manifest: AnyWrapManifest + + def __init__( + self, + module: MockedModule[TConfig, TResult], + manifest: AnyWrapManifest + ): + self.module = module + self.manifest = manifest + + async def create_wrapper(self) -> Result[Wrapper]: + return Ok(MockedWrapper(module=self.module, manifest=self.manifest)) + + async def get_manifest(self, options: Optional[GetManifestOptions] = None) -> Result[AnyWrapManifest]: + return Ok(self.manifest) + + +pw = PolywrapClient() +resolver: IUriResolver = pw.get_uri_resolver() + +def test_client_config_builder_set_package(): + # wrap_package = IWrapPackage() + ccb = ClientConfigBuilder() + uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + ccb = ccb.set_package(uri_package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package])) + +def test_client_config_builder_add_wrapper(): + ccb = ClientConfigBuilder() + uri_wrapper = UriWrapper(uri=Uri("wrap://ens/eth.plugin.one"),wrapper="todo") + ccb = ccb.add_wrapper(uri_wrapper) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[])) + # add second wrapper + uri_wrapper2 = UriWrapper(uri=Uri("wrap://ens/eth.plugin.two"),wrapper="Todo") + ccb = ccb.add_wrapper(uri_wrapper2) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[])) \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 5ee2af2a..f171aacc 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,12 +1,15 @@ -from typing import List, Any, Dict, Union +from typing import List, Any, Dict, Union, cast from polywrap_core import Env from polywrap_core import Uri -from polywrap_core import IUriResolver, UriPackage, UriWrapper -from polywrap_client_config_builder import ClientConfigBuilder +from polywrap_core import UriPackage, UriWrapper, AnyWrapManifest +from polywrap_uri_resolvers import UriResolverLike + +from polywrap_client_config_builder import ClientConfigBuilder, BaseClientConfigBuilder import pytest from pytest import fixture from polywrap_client_config_builder import ClientConfig from dataclasses import asdict +from test_ccb_packages_wrappers import MockedPackage, MockedWrapper, MockedModule # Variables @@ -83,54 +86,67 @@ def test_client_config_builder_adds_interface_implementations(): # PACKAGES -@pytest.mark.skip("Should implement UriPackage interface with package argument") +# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_set_package(): ccb = ClientConfigBuilder() - package = UriPackage(Uri("wrap://ens/uni.wrapper.eth"), version="1.0.0") - ccb = ccb.set_package(package) + module: MockedModule[None, str] = MockedModule(config=None) + manifest = cast(AnyWrapManifest, {}) + # This implementation below is correct, but the test fails because the UriPackage + # gets instantiated twice and two different instances are created. + # uri_package: UriPackage = UriPackage(uri=env_uriX, package=MockedPackage(module, manifest)) + # so instead we use the following implementation + uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + ccb = ccb.set_package(uri_package) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, + interfaces={}, resolver = [], wrappers=[], packages=[uri_package])) -@pytest.mark.skip("Should implement UriPackage interface with package argument") +# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_add_package(): ccb = ClientConfigBuilder() - package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - ccb = ccb.add_package(package) + uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + ccb = ccb.add_package(uri_package) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, + resolver = [], wrappers=[], packages=[uri_package])) -@pytest.mark.skip("Should implement UriPackage interface with package argument") -def test_client_config_builder_add_package_updates_package(): +# @pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_package_updates_packages_list(): ccb = ClientConfigBuilder() - package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - ccb = ccb.add_package(package) + uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + ccb = ccb.add_package(uri_package1) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) - package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - ccb = ccb.add_package(package) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, + resolver = [], wrappers=[], packages=[uri_package1])) + uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") + ccb = ccb.add_package(uri_package2) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, + resolver = [], wrappers=[], packages=[uri_package1, uri_package2])) -@pytest.mark.skip("Should implement UriPackage interface with package argument") -def test_client_config_builder_add_packages(): +# @pytest.mark.skip("Should implement UriPackage interface with package argument") +def test_client_config_builder_add_multiple_packages(): ccb = ClientConfigBuilder() - package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - package2 = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - ccb = ccb.add_packages([package, package2]) + uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") + ccb = ccb.add_packages([uri_package1, uri_package2]) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package, package2])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], + wrappers=[], packages=[uri_package1, uri_package2])) -@pytest.mark.skip("Should implement UriPackage interface with package argument") +# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_add_packages_removes_packages(): ccb = ClientConfigBuilder() - package = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - package2 = UriPackage(Uri("wrap://ens/uni.wrapper.eth")) - ccb = ccb.add_packages([package, package2]) + uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") + ccb = ccb.add_packages([uri_package1, uri_package2]) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package, package2])) - ccb = ccb.remove_package([package1]) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], + wrappers=[], packages=[uri_package1, uri_package2])) + ccb = ccb.remove_package(uri_package1) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[package2])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], + wrappers=[], packages=[uri_package2])) # WRAPPERS AND PLUGINS @@ -160,21 +176,19 @@ def test_client_config_builder_removes_wrapper(): # RESOLVER -@pytest.mark.skip("Should implement IURIResolver interface") +@pytest.mark.skip("Should implement UriResolverLike interface") def test_client_config_builder_set_uri_resolver(): ccb = ClientConfigBuilder() - resolver = IUriResolver() - Uri("wrap://ens/eth.resolver.one") + resolver = Uri("wrap://ens/eth.resolver.one") ccb = ccb.set_resolver(resolver) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[])) def test_client_config_builder_add_resolver(): - # set a first resolver ccb = ClientConfigBuilder() resolverA = Uri("wrap://ens/eth.resolver.one") - ccb: ClientConfigBuilder = ccb.set_resolver(resolverA) + ccb: BaseClientConfigBuilder = ccb.set_resolver(resolverA) client_config: ClientConfig = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[])) @@ -189,7 +203,7 @@ def test_client_config_builder_add_resolver(): resolverD = Uri("wrap://ens/eth.resolver.four") ccb = ccb.add_resolvers([resolverC, resolverD]) client_config: ClientConfig = ccb.build() - resolvers = [resolverA, resolverB, resolverC, resolverD] + resolvers: List[UriResolverLike] = [resolverA, resolverB, resolverC, resolverD] assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[])) # TODO: add tests for the following methods From e14a2ef6ac74d4478dadf85a93d997ff3d90082e Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 29 Nov 2022 10:55:08 +0100 Subject: [PATCH 13/21] chore:creating fixtures for tests --- .../tests/conftest.py | 34 +++++++++++++++++++ .../tests/test_client_config_builder.py | 27 ++++----------- 2 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 packages/polywrap-client-config-builder/tests/conftest.py diff --git a/packages/polywrap-client-config-builder/tests/conftest.py b/packages/polywrap-client-config-builder/tests/conftest.py new file mode 100644 index 00000000..e630a4cb --- /dev/null +++ b/packages/polywrap-client-config-builder/tests/conftest.py @@ -0,0 +1,34 @@ +from polywrap_core import Uri +from pytest import fixture + +# Variables + +@fixture +def env_varA(): + return { 'color': "yellow", 'size': "large" } + +@fixture +def env_varB(): + return { 'color': "red", 'size': "small" } + +@fixture +def env_varN(): + return { 'dog': "poodle", 'season': "summer" } + +@fixture +def env_varM(): + return { 'dog': "corgi", 'season': "autumn" } + +@fixture +def env_varS(): + return { 'vehicle': "scooter"} + +# Uris + +@fixture +def env_uriX(): + return Uri("wrap://ens/eth.plugin.one") + +@fixture +def env_uriY(): + return Uri("wrap://ipfs/filecoin.wrapper.two") diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index f171aacc..5c7ffb50 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,45 +1,32 @@ -from typing import List, Any, Dict, Union, cast -from polywrap_core import Env +from typing import List, cast from polywrap_core import Uri -from polywrap_core import UriPackage, UriWrapper, AnyWrapManifest +from polywrap_core import UriPackage, AnyWrapManifest from polywrap_uri_resolvers import UriResolverLike from polywrap_client_config_builder import ClientConfigBuilder, BaseClientConfigBuilder import pytest -from pytest import fixture from polywrap_client_config_builder import ClientConfig from dataclasses import asdict -from test_ccb_packages_wrappers import MockedPackage, MockedWrapper, MockedModule - -# Variables - -env_varA = { 'color': "yellow", 'size': "large" } -env_varB = { 'color': "red", 'size': "small" } -env_varN = { 'dog': "poodle", 'season': "summer" } -env_varM = { 'dog': "corgi", 'season': "autumn" } -env_varN = { 'dog': "poodle", 'season': "summer" } -env_varS = { 'vehicle': "scooter"} -env_uriX = Uri("wrap://ens/eth.plugin.one") -env_uriY = Uri("wrap://ipfs/filecoin.wrapper.two") +from test_ccb_packages_wrappers import MockedModule # ENVS -def test_client_config_builder_set_env(): +def test_client_config_builder_set_env(env_varA, env_uriX): ccb = ClientConfigBuilder() envs = { env_uriX: env_varA } ccb = ccb.set_env( env_varA, env_uriX) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[])) -def test_client_config_builder_add_env(): +def test_client_config_builder_add_env(env_varA, env_uriX): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object print(client_config) assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) -def test_client_config_builder_add_env_updates_env_value(): +def test_client_config_builder_add_env_updates_env_value(env_varA,env_varB, env_uriX): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object @@ -48,7 +35,7 @@ def test_client_config_builder_add_env_updates_env_value(): client_config: ClientConfig = ccb.build() # build a new client config object assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) -def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): +def test_client_config_builder_set_env_and_add_env_updates_and_add_values(env_varA, env_varB, env_varN, env_varM, env_varS, env_uriX, env_uriY): ccb = ClientConfigBuilder() ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A client_config: ClientConfig = ccb.build() From 54ce58c6429181d30009e131555fd2a4a554babe Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 29 Nov 2022 10:55:08 +0100 Subject: [PATCH 14/21] chore:creating fixtures for tests, cleanup , test:e2e test of generic add configurations to CCB , remove unnecessary functions from ClientConfigBuilder class --- .../client_config_builder.py | 73 +------------- .../tests/conftest.py | 34 +++++++ .../tests/test_client_config_builder.py | 95 +++++++++++++------ 3 files changed, 102 insertions(+), 100 deletions(-) create mode 100644 packages/polywrap-client-config-builder/tests/conftest.py diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 24ababb2..095b46f2 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -39,7 +39,7 @@ def build(self) -> ClientConfig: pass - def add(self, new_config: ClientConfig) -> ClientConfig: + def add(self, new_config: ClientConfig): """Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object.""" if new_config.envs: self.config.envs.update(new_config.envs) @@ -51,7 +51,7 @@ def add(self, new_config: ClientConfig) -> ClientConfig: self.config.wrappers.extend(new_config.wrappers) if new_config.packages: self.config.packages.extend(new_config.packages) - return self.config + return self def get_envs(self) -> Dict[Uri, Dict[str, Any]]: """Returns the envs dictionary from the builder's config.""" @@ -176,77 +176,10 @@ def add_resolvers(self, resolvers_list: List[UriResolverLike]): class ClientConfigBuilder(BaseClientConfigBuilder): + def build(self) -> ClientConfig: """ Returns a sanitized config object from the builder's config. """ return self.config - def add(self, new_config: ClientConfig) -> ClientConfig: - """ - Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object. - """ - super().add(new_config) - return self.config - - def get_envs(self) -> Dict[Uri, Dict[str, Any]]: - return super().get_envs() - - def set_env(self, env: Env, uri: Uri) -> BaseClientConfigBuilder: - super().set_env(env, uri) - return self - def add_env(self, env: Env, uri: Uri) -> BaseClientConfigBuilder: - super().add_env(env, uri) - return self - - def add_envs(self, envs: List[Env], uri: Uri) -> BaseClientConfigBuilder: - super().add_envs(envs, uri) - return self - - def add_interface_implementations( - self, interface_uri: Uri, implementations_uris: List[Uri] - ) -> BaseClientConfigBuilder: - super().add_interface_implementations(interface_uri, implementations_uris) - return self - - def add_wrapper(self, wrapper_uri: Uri) -> BaseClientConfigBuilder: - super().add_wrapper(wrapper_uri) - return self - - def add_wrappers(self, wrappers_uris: List[Uri]) -> BaseClientConfigBuilder: - super().add_wrappers(wrappers_uris) - return self - - def remove_wrapper(self, wrapper_uri: Uri) -> BaseClientConfigBuilder: - super().remove_wrapper(wrapper_uri) - return self - - def set_package(self, uri_package: UriPackage) -> BaseClientConfigBuilder: - super().set_package(uri_package) - return self - - def add_package(self, uri_package: UriPackage) -> BaseClientConfigBuilder: - super().add_package(uri_package) - return self - - def add_packages(self, uri_packages: List[UriPackage]) -> BaseClientConfigBuilder: - super().add_packages(uri_packages) - return self - - def remove_package(self, uri_package: UriPackage) -> BaseClientConfigBuilder: - super().remove_package(uri_package) - return self - - def set_resolver(self, uri_resolver: UriResolverLike) -> BaseClientConfigBuilder: - super().set_resolver(uri_resolver) - return self - - def add_resolver(self, resolver: UriResolverLike) -> BaseClientConfigBuilder: - super().add_resolver(resolver) - return self - - def add_resolvers( - self, resolvers_list: List[UriResolverLike] - ) -> BaseClientConfigBuilder: - super().add_resolvers(resolvers_list) - return self diff --git a/packages/polywrap-client-config-builder/tests/conftest.py b/packages/polywrap-client-config-builder/tests/conftest.py new file mode 100644 index 00000000..e630a4cb --- /dev/null +++ b/packages/polywrap-client-config-builder/tests/conftest.py @@ -0,0 +1,34 @@ +from polywrap_core import Uri +from pytest import fixture + +# Variables + +@fixture +def env_varA(): + return { 'color': "yellow", 'size': "large" } + +@fixture +def env_varB(): + return { 'color': "red", 'size': "small" } + +@fixture +def env_varN(): + return { 'dog': "poodle", 'season': "summer" } + +@fixture +def env_varM(): + return { 'dog': "corgi", 'season': "autumn" } + +@fixture +def env_varS(): + return { 'vehicle': "scooter"} + +# Uris + +@fixture +def env_uriX(): + return Uri("wrap://ens/eth.plugin.one") + +@fixture +def env_uriY(): + return Uri("wrap://ipfs/filecoin.wrapper.two") diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index f171aacc..3d88b40d 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,45 +1,32 @@ -from typing import List, Any, Dict, Union, cast -from polywrap_core import Env +from typing import List, cast from polywrap_core import Uri -from polywrap_core import UriPackage, UriWrapper, AnyWrapManifest +from polywrap_core import UriPackage, AnyWrapManifest from polywrap_uri_resolvers import UriResolverLike from polywrap_client_config_builder import ClientConfigBuilder, BaseClientConfigBuilder import pytest -from pytest import fixture from polywrap_client_config_builder import ClientConfig from dataclasses import asdict -from test_ccb_packages_wrappers import MockedPackage, MockedWrapper, MockedModule - -# Variables - -env_varA = { 'color': "yellow", 'size': "large" } -env_varB = { 'color': "red", 'size': "small" } -env_varN = { 'dog': "poodle", 'season': "summer" } -env_varM = { 'dog': "corgi", 'season': "autumn" } -env_varN = { 'dog': "poodle", 'season': "summer" } -env_varS = { 'vehicle': "scooter"} -env_uriX = Uri("wrap://ens/eth.plugin.one") -env_uriY = Uri("wrap://ipfs/filecoin.wrapper.two") +from test_ccb_packages_wrappers import MockedModule # ENVS -def test_client_config_builder_set_env(): +def test_client_config_builder_set_env(env_varA, env_uriX): ccb = ClientConfigBuilder() envs = { env_uriX: env_varA } ccb = ccb.set_env( env_varA, env_uriX) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[])) -def test_client_config_builder_add_env(): +def test_client_config_builder_add_env(env_varA, env_uriX): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object print(client_config) assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) -def test_client_config_builder_add_env_updates_env_value(): +def test_client_config_builder_add_env_updates_env_value(env_varA,env_varB, env_uriX): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object @@ -48,7 +35,7 @@ def test_client_config_builder_add_env_updates_env_value(): client_config: ClientConfig = ccb.build() # build a new client config object assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) -def test_client_config_builder_set_env_and_add_env_updates_and_add_values(): +def test_client_config_builder_set_env_and_add_env_updates_and_add_values(env_varA, env_varB, env_varN, env_varM, env_varS, env_uriX, env_uriY): ccb = ClientConfigBuilder() ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A client_config: ClientConfig = ccb.build() @@ -86,7 +73,6 @@ def test_client_config_builder_adds_interface_implementations(): # PACKAGES -# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_set_package(): ccb = ClientConfigBuilder() module: MockedModule[None, str] = MockedModule(config=None) @@ -101,7 +87,6 @@ def test_client_config_builder_set_package(): assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package])) -# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_add_package(): ccb = ClientConfigBuilder() uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") @@ -110,7 +95,6 @@ def test_client_config_builder_add_package(): assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package])) -# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_add_package_updates_packages_list(): ccb = ClientConfigBuilder() uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") @@ -124,7 +108,6 @@ def test_client_config_builder_add_package_updates_packages_list(): assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package1, uri_package2])) -# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_add_multiple_packages(): ccb = ClientConfigBuilder() uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") @@ -134,7 +117,6 @@ def test_client_config_builder_add_multiple_packages(): assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package1, uri_package2])) -# @pytest.mark.skip("Should implement UriPackage interface with package argument") def test_client_config_builder_add_packages_removes_packages(): ccb = ClientConfigBuilder() uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") @@ -176,10 +158,9 @@ def test_client_config_builder_removes_wrapper(): # RESOLVER -@pytest.mark.skip("Should implement UriResolverLike interface") def test_client_config_builder_set_uri_resolver(): ccb = ClientConfigBuilder() - resolver = Uri("wrap://ens/eth.resolver.one") + resolver: UriResolverLike = Uri("wrap://ens/eth.resolver.one") ccb = ccb.set_resolver(resolver) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[])) @@ -206,8 +187,62 @@ def test_client_config_builder_add_resolver(): resolvers: List[UriResolverLike] = [resolverA, resolverB, resolverC, resolverD] assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[])) -# TODO: add tests for the following methods +# GENERIC ADD FUNCTION -def test_client_config_builder_generic_add(): +def test_client_config_builder_generic_add(env_varA,env_uriX, env_uriY): # Test adding package, wrapper, resolver, interface, and env with the ccb.add method - pass \ No newline at end of file + ccb = ClientConfigBuilder() + + # starts empty + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, + resolver = [], wrappers=[], packages=[])) + + # add an env + new_config = ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[]) + ccb = ccb.add(new_config) + client_config1 = ccb.build() + assert asdict(client_config1) == asdict(new_config) + + # add a resolver + new_resolvers = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.one")], envs={}, interfaces={}, wrappers=[], packages=[]) + ccb = ccb.add(new_resolvers) + client_config2 = ccb.build() + assert asdict(client_config2) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, + resolver = [Uri("wrap://ens/eth.resolver.one")], wrappers=[], packages=[])) + + # add a second resolver + new_resolver = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.two")], envs={}, interfaces={}, wrappers=[], packages=[]) + ccb = ccb.add(new_resolver) + client_config5 = ccb.build() + assert asdict(client_config5) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, + resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], wrappers=[], packages=[])) + + + # add a wrapper + new_wrapper = ClientConfig(wrappers=[Uri("wrap://ens/uni.wrapper.eth")], envs={}, interfaces={}, resolver = [], packages=[]) + ccb = ccb.add(new_wrapper) + client_config3 = ccb.build() + assert asdict(client_config3) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, + resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], + wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[])) + + # add an interface + interfaces: Dict[Uri, List[Uri]] = {Uri("wrap://ens/eth.interface.eth"): [env_uriX,env_uriY]} + new_interface = ClientConfig(interfaces=interfaces, envs={}, resolver = [], wrappers=[], packages=[]) + ccb = ccb.add(new_interface) + client_config4 = ccb.build() + assert asdict(client_config4) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, + resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], + wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[])) + + # add a package + uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + new_package = ClientConfig(packages=[uri_package], envs={}, interfaces={}, resolver = [], wrappers=[]) + ccb = ccb.add(new_package) + client_config6 = ccb.build() + assert asdict(client_config6) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, + resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], + wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[uri_package])) + + From 572901c9a9fc549d57dc3cdf48ab202a635cc64d Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 29 Nov 2022 14:06:01 +0100 Subject: [PATCH 15/21] feat:implement uri_redirects --- .../client_config_builder.py | 14 +++- .../tests/test_ccb_packages_wrappers.py | 6 +- .../tests/test_client_config_builder.py | 72 +++++++++---------- .../tests/test_clientconfig.py | 5 +- 4 files changed, 53 insertions(+), 44 deletions(-) diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 095b46f2..e741e41a 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -20,6 +20,7 @@ class ClientConfig: wrappers: List[UriWrapper] packages: List[UriPackage] resolver: List[UriResolverLike] + redirects: Dict[Uri, Uri] class BaseClientConfigBuilder(ABC): @@ -30,7 +31,7 @@ class BaseClientConfigBuilder(ABC): def __init__(self): self.config = ClientConfig( - envs={}, interfaces={}, resolver=[], wrappers=[], packages=[] + envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={} ) @abstractmethod @@ -158,7 +159,6 @@ def add_resolver(self, resolver: UriResolverLike): """ Adds a resolver to the list of resolvers """ - if self.config.resolver is None: raise ValueError( "This resolver is not set. Please set a resolver before adding resolvers." @@ -174,9 +174,17 @@ def add_resolvers(self, resolvers_list: List[UriResolverLike]): self.add_resolver(resolver) return self + def set_uri_redirect(self, uri_from: Uri, uri_to: Uri): + """ + Sets an uri redirect, from one uri to another + If there was a redirect previously listed, it's changed to the new one + """ + self.config.redirects = {uri_from : uri_to} + return self + class ClientConfigBuilder(BaseClientConfigBuilder): - + def build(self) -> ClientConfig: """ Returns a sanitized config object from the builder's config. diff --git a/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py b/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py index ff1159fa..b1cde455 100644 --- a/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py +++ b/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py @@ -105,16 +105,16 @@ def test_client_config_builder_set_package(): uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") ccb = ccb.set_package(uri_package) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) def test_client_config_builder_add_wrapper(): ccb = ClientConfigBuilder() uri_wrapper = UriWrapper(uri=Uri("wrap://ens/eth.plugin.one"),wrapper="todo") ccb = ccb.add_wrapper(uri_wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[], redirects={})) # add second wrapper uri_wrapper2 = UriWrapper(uri=Uri("wrap://ens/eth.plugin.two"),wrapper="Todo") ccb = ccb.add_wrapper(uri_wrapper2) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[])) \ No newline at end of file + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[], redirects={})) \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 3d88b40d..98f57772 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -17,33 +17,33 @@ def test_client_config_builder_set_env(env_varA, env_uriX): envs = { env_uriX: env_varA } ccb = ccb.set_env( env_varA, env_uriX) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) def test_client_config_builder_add_env(env_varA, env_uriX): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object print(client_config) - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) def test_client_config_builder_add_env_updates_env_value(env_varA,env_varB, env_uriX): ccb = ClientConfigBuilder() # instantiate new client config builder ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder client_config: ClientConfig = ccb.build() # build a client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder client_config: ClientConfig = ccb.build() # build a new client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) def test_client_config_builder_set_env_and_add_env_updates_and_add_values(env_varA, env_varB, env_varN, env_varM, env_varS, env_uriX, env_uriY): ccb = ClientConfigBuilder() ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri client_config: ClientConfig = ccb.build() @@ -52,14 +52,14 @@ def test_client_config_builder_set_env_and_add_env_updates_and_add_values(env_va env_uriX: env_varB, env_uriY: env_varM }, - interfaces={}, resolver = [], wrappers=[], packages=[])) + interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) # add new env vars on the second Uri, while also updating the Env vars of dog and season ccb = ccb.add_envs([env_varN, env_varS], env_uriY) new_envs = {**env_varM, **env_varN, **env_varS} print(new_envs) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) # INTERFACES AND IMPLEMENTATIONS @@ -69,7 +69,7 @@ def test_client_config_builder_adds_interface_implementations(): implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[], packages=[], redirects={})) # PACKAGES @@ -85,7 +85,7 @@ def test_client_config_builder_set_package(): ccb = ccb.set_package(uri_package) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, - interfaces={}, resolver = [], wrappers=[], packages=[uri_package])) + interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) def test_client_config_builder_add_package(): ccb = ClientConfigBuilder() @@ -93,7 +93,7 @@ def test_client_config_builder_add_package(): ccb = ccb.add_package(uri_package) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[uri_package])) + resolver = [], wrappers=[], packages=[uri_package], redirects={})) def test_client_config_builder_add_package_updates_packages_list(): ccb = ClientConfigBuilder() @@ -101,12 +101,12 @@ def test_client_config_builder_add_package_updates_packages_list(): ccb = ccb.add_package(uri_package1) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[uri_package1])) + resolver = [], wrappers=[], packages=[uri_package1], redirects={})) uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") ccb = ccb.add_package(uri_package2) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[uri_package1, uri_package2])) + resolver = [], wrappers=[], packages=[uri_package1, uri_package2], redirects={})) def test_client_config_builder_add_multiple_packages(): ccb = ClientConfigBuilder() @@ -115,7 +115,7 @@ def test_client_config_builder_add_multiple_packages(): ccb = ccb.add_packages([uri_package1, uri_package2]) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], - wrappers=[], packages=[uri_package1, uri_package2])) + wrappers=[], packages=[uri_package1, uri_package2], redirects={})) def test_client_config_builder_add_packages_removes_packages(): ccb = ClientConfigBuilder() @@ -124,11 +124,11 @@ def test_client_config_builder_add_packages_removes_packages(): ccb = ccb.add_packages([uri_package1, uri_package2]) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], - wrappers=[], packages=[uri_package1, uri_package2])) + wrappers=[], packages=[uri_package1, uri_package2], redirects={})) ccb = ccb.remove_package(uri_package1) client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], - wrappers=[], packages=[uri_package2])) + wrappers=[], packages=[uri_package2], redirects={})) # WRAPPERS AND PLUGINS @@ -137,24 +137,24 @@ def test_client_config_builder_add_wrapper(): wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[], redirects={})) def test_client_config_builder_adds_multiple_wrappers(): ccb = ClientConfigBuilder() wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] ccb = ccb.add_wrappers(wrappers) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers, packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers, packages=[], redirects={})) def test_client_config_builder_removes_wrapper(): ccb = ClientConfigBuilder() wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[], redirects={})) ccb = ccb.remove_wrapper(wrapper) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) # RESOLVER @@ -163,7 +163,7 @@ def test_client_config_builder_set_uri_resolver(): resolver: UriResolverLike = Uri("wrap://ens/eth.resolver.one") ccb = ccb.set_resolver(resolver) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[], redirects={})) def test_client_config_builder_add_resolver(): # set a first resolver @@ -171,13 +171,13 @@ def test_client_config_builder_add_resolver(): resolverA = Uri("wrap://ens/eth.resolver.one") ccb: BaseClientConfigBuilder = ccb.set_resolver(resolverA) client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[], redirects={})) # add a second resolver resolverB = Uri("wrap://ens/eth.resolver.two") ccb = ccb.add_resolver(resolverB) client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[], packages=[], redirects={})) # add a third and fourth resolver resolverC = Uri("wrap://ens/eth.resolver.three") @@ -185,7 +185,7 @@ def test_client_config_builder_add_resolver(): ccb = ccb.add_resolvers([resolverC, resolverD]) client_config: ClientConfig = ccb.build() resolvers: List[UriResolverLike] = [resolverA, resolverB, resolverC, resolverD] - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[], redirects={})) # GENERIC ADD FUNCTION @@ -196,53 +196,53 @@ def test_client_config_builder_generic_add(env_varA,env_uriX, env_uriY): # starts empty client_config = ccb.build() assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[])) + resolver = [], wrappers=[], packages=[], redirects={})) # add an env - new_config = ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[]) + new_config = ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={}) ccb = ccb.add(new_config) client_config1 = ccb.build() assert asdict(client_config1) == asdict(new_config) # add a resolver - new_resolvers = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.one")], envs={}, interfaces={}, wrappers=[], packages=[]) + new_resolvers = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.one")], envs={}, interfaces={}, wrappers=[], packages=[], redirects={}) ccb = ccb.add(new_resolvers) client_config2 = ccb.build() assert asdict(client_config2) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, - resolver = [Uri("wrap://ens/eth.resolver.one")], wrappers=[], packages=[])) + resolver = [Uri("wrap://ens/eth.resolver.one")], wrappers=[], packages=[], redirects={})) # add a second resolver - new_resolver = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.two")], envs={}, interfaces={}, wrappers=[], packages=[]) + new_resolver = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.two")], envs={}, interfaces={}, wrappers=[], packages=[], redirects={}) ccb = ccb.add(new_resolver) client_config5 = ccb.build() assert asdict(client_config5) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, - resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], wrappers=[], packages=[])) + resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], wrappers=[], packages=[], redirects={})) # add a wrapper - new_wrapper = ClientConfig(wrappers=[Uri("wrap://ens/uni.wrapper.eth")], envs={}, interfaces={}, resolver = [], packages=[]) + new_wrapper = ClientConfig(wrappers=[Uri("wrap://ens/uni.wrapper.eth")], envs={}, interfaces={}, resolver = [], packages=[], redirects={}) ccb = ccb.add(new_wrapper) client_config3 = ccb.build() assert asdict(client_config3) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], - wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[])) + wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[], redirects={})) # add an interface interfaces: Dict[Uri, List[Uri]] = {Uri("wrap://ens/eth.interface.eth"): [env_uriX,env_uriY]} - new_interface = ClientConfig(interfaces=interfaces, envs={}, resolver = [], wrappers=[], packages=[]) + new_interface = ClientConfig(interfaces=interfaces, envs={}, resolver = [], wrappers=[], packages=[], redirects={}) ccb = ccb.add(new_interface) client_config4 = ccb.build() assert asdict(client_config4) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], - wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[])) + wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[], redirects={})) # add a package uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - new_package = ClientConfig(packages=[uri_package], envs={}, interfaces={}, resolver = [], wrappers=[]) + new_package = ClientConfig(packages=[uri_package], envs={}, interfaces={}, resolver = [], wrappers=[], redirects={}) ccb = ccb.add(new_package) client_config6 = ccb.build() assert asdict(client_config6) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], - wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[uri_package])) + wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[uri_package], redirects={})) diff --git a/packages/polywrap-client-config-builder/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py index 32959d61..65a7ea4c 100644 --- a/packages/polywrap-client-config-builder/tests/test_clientconfig.py +++ b/packages/polywrap-client-config-builder/tests/test_clientconfig.py @@ -11,7 +11,8 @@ def test_client_config_structure_starts_empty(): interfaces={}, resolver = [], wrappers = [], - packages=[] + packages=[], + redirects={} ) assert asdict(client_config) == asdict(result) @@ -25,5 +26,5 @@ def test_client_config_structure_sets_env(): env = env ) client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[])) + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) From a339f54a2e654ccb4c2ca14cb84fb82c9b9846c0 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 29 Nov 2022 17:40:40 +0100 Subject: [PATCH 16/21] feat: set_redirects, remove_redirects, add many redirects, plus their tests --- .../client_config_builder.py | 20 ++++- .../tests/conftest.py | 8 +- .../tests/test_client_config_builder.py | 75 +++++++++++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index e741e41a..8e999bcd 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -179,7 +179,25 @@ def set_uri_redirect(self, uri_from: Uri, uri_to: Uri): Sets an uri redirect, from one uri to another If there was a redirect previously listed, it's changed to the new one """ - self.config.redirects = {uri_from : uri_to} + self.config.redirects[uri_from] = uri_to + return self + + def remove_uri_redirect(self, uri_from: Uri): + """ + Removes an uri redirect, from one uri to another + """ + self.config.redirects.pop(uri_from) + return self + + def set_uri_redirects(self, redirects: List[Dict[Uri,Uri]]): + """ + Sets various Uri redirects from a list simultaneously + """ + count = 0 + for redir in redirects: + for k,v in redir.items(): + self.set_uri_redirect(k,v) + count += 1 return self diff --git a/packages/polywrap-client-config-builder/tests/conftest.py b/packages/polywrap-client-config-builder/tests/conftest.py index e630a4cb..99d4893e 100644 --- a/packages/polywrap-client-config-builder/tests/conftest.py +++ b/packages/polywrap-client-config-builder/tests/conftest.py @@ -27,8 +27,12 @@ def env_varS(): @fixture def env_uriX(): - return Uri("wrap://ens/eth.plugin.one") + return Uri("wrap://ens/eth.plugin.one/X") @fixture def env_uriY(): - return Uri("wrap://ipfs/filecoin.wrapper.two") + return Uri("wrap://ipfs/filecoin.wrapper.two/Y") + +@fixture +def env_uriZ(): + return Uri("wrap://pinlist/dev.wrappers.io/Z") diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 98f57772..1012422a 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -187,6 +187,81 @@ def test_client_config_builder_add_resolver(): resolvers: List[UriResolverLike] = [resolverA, resolverB, resolverC, resolverD] assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[], redirects={})) +# REDIRECTS + +def test_client_config_builder_sets_uri_redirects(env_uriX, env_uriY, env_uriZ): + # set a first redirect + ccb = ClientConfigBuilder() + ccb = ccb.set_uri_redirect(env_uriX, env_uriY) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], + redirects={env_uriX: env_uriY})) + + # add a second redirect + ccb = ccb.set_uri_redirect(env_uriY, env_uriZ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], + redirects={env_uriX: env_uriY, env_uriY: env_uriZ})) + + # update the first redirect + ccb.set_uri_redirect(env_uriX, env_uriZ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], + redirects={env_uriX: env_uriZ, env_uriY: env_uriZ})) + +def test_client_config_builder_removes_uri_redirects(env_uriX, env_uriY, env_uriZ): + ccb = ClientConfigBuilder() + ccb = ccb.set_uri_redirect(env_uriX, env_uriY) + ccb = ccb.set_uri_redirect(env_uriY, env_uriZ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], + redirects={env_uriX: env_uriY, env_uriY: env_uriZ})) + + ccb = ccb.remove_uri_redirect(env_uriX) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], + redirects={env_uriY: env_uriZ})) + + + +def test_client_config_builder_sets_many_uri_redirects(env_uriX,env_uriY, env_uriZ): + + # set a first redirect + ccb = ClientConfigBuilder() + ccb = ccb.set_uri_redirects([{ + env_uriX: env_uriY, + }] ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriY})) + + # updates that first redirect to a new value + ccb = ccb.set_uri_redirects([{ + env_uriX: env_uriZ, + }] ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriZ})) + + # add a second redirect + ccb = ccb.set_uri_redirects([{ + env_uriY: env_uriX, + }] ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriZ, env_uriY: env_uriX})) + + # add a third redirect and update the first redirect + ccb = ccb.set_uri_redirects([{ + env_uriX: env_uriY, + env_uriZ: env_uriY, + }] ) + client_config: ClientConfig = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], + redirects={ + env_uriX: env_uriY, + env_uriY: env_uriX, + env_uriZ: env_uriY + })) + + # GENERIC ADD FUNCTION def test_client_config_builder_generic_add(env_varA,env_uriX, env_uriY): From a3601a8b63a9b44d4f9ad85b1e4412164c97aa14 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:20:34 +0100 Subject: [PATCH 17/21] chore: small test refactors, all linting fixes --- .../__init__.py | 10 ++ .../client_config_builder.py | 143 ++++++++--------- .../tests/conftest.py | 27 ++++ .../tests/test_ccb_packages_wrappers.py | 120 -------------- .../tests/test_client_config_builder.py | 150 ++++++++++++++++-- .../tests/test_clientconfig.py | 30 ---- 6 files changed, 248 insertions(+), 232 deletions(-) delete mode 100644 packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py delete mode 100644 packages/polywrap-client-config-builder/tests/test_clientconfig.py diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py index 464ccf12..73466205 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py @@ -1 +1,11 @@ +""" +Polywrap Python Client. + +ClientConfigBuilder Package + +docs.polywrap.io + +Copyright 2022 Polywrap +""" + from .client_config_builder import * diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 8e999bcd..0f8d6487 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -1,18 +1,30 @@ +""" +Polywrap Python Client. + +The ClientConfigBuilder Package provides a simple interface for building a ClientConfig object, +which is used to configure the Polywrap Client and its sub-components. You can use the +ClientConfigBuilder to set the wrappers, packages, and other configuration options for the +Polywrap Client. + +docs.polywrap.io +Copyright 2022 Polywrap +""" + from abc import ABC, abstractmethod from dataclasses import dataclass -from polywrap_core import Uri, IUriResolver, Env, UriWrapper,UriPackage -from polywrap_uri_resolvers import IUriResolver -from typing import Dict, Any, List, Optional, Union -from polywrap_uri_resolvers import UriResolverLike +from typing import Any, Dict, List, Union + +from polywrap_core import Env, Uri, UriPackage, UriWrapper -# from polywrap_plugin import PluginPackage +UriResolverLike = Union[Uri, UriPackage, UriWrapper, List["UriResolverLike"]] @dataclass(slots=True, kw_only=True) class ClientConfig: """ - This Abstract class is used to configure the polywrap client before it executes a call - The ClientConfig class is created and modified with the ClientConfigBuilder module + Abstract class used to configure the polywrap client before it executes a call. + + The ClientConfig class is created and modified with the ClientConfigBuilder module. """ envs: Dict[Uri, Dict[str, Any]] @@ -25,23 +37,28 @@ class ClientConfig: class BaseClientConfigBuilder(ABC): """ - An abstract base class of the `ClientConfigBuilder`, which uses the ABC module - to define the methods that can be used to configure the `ClientConfig` object. + An abstract base class of the `ClientConfigBuilder`. + + It uses the ABC module to define the methods that can be used to + configure the `ClientConfig` object. """ def __init__(self): + """Initialize the builder's config attributes with empty values.""" self.config = ClientConfig( envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={} ) @abstractmethod def build(self) -> ClientConfig: - """Returns a sanitized config object from the builder's config.""" - pass + """Return a sanitized config object from the builder's config.""" - def add(self, new_config: ClientConfig): - """Returns a sanitized config object from the builder's config after receiving a partial `ClientConfig` object.""" + """ + Return a sanitized config object from the builder's config. + + Input is a partial `ClientConfig` object. + """ if new_config.envs: self.config.envs.update(new_config.envs) if new_config.interfaces: @@ -55,18 +72,21 @@ def add(self, new_config: ClientConfig): return self def get_envs(self) -> Dict[Uri, Dict[str, Any]]: - """Returns the envs dictionary from the builder's config.""" + """Return the envs dictionary from the builder's config.""" return self.config.envs def set_env(self, env: Env, uri: Uri): - """Sets the envs dictionary in the builder's config, overiding any existing values.""" + """Set the envs dictionary in the builder's config, overiding any existing values.""" self.config.envs[uri] = env return self def add_env(self, env: Env, uri: Uri): - """Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments, - unless the env key already exists in the environment, then it will overwrite the existing value""" + """ + Add an environment (in the form of an `Env`) for a given uri. + Note it is not overwriting existing environments, unless the + env key already exists in the environment, then it will overwrite the existing value. + """ if uri in self.config.envs.keys(): for key in env.keys(): self.config.envs[uri][key] = env[key] @@ -75,9 +95,7 @@ def add_env(self, env: Env, uri: Uri): return self def add_envs(self, envs: List[Env], uri: Uri = None): - """ - Adds a list of environments (each in the form of an `Env`) for a given uri - """ + """Add a list of environments (each in the form of an `Env`) for a given uri.""" for env in envs: self.add_env(env, uri) return self @@ -85,9 +103,7 @@ def add_envs(self, envs: List[Env], uri: Uri = None): def add_interface_implementations( self, interface_uri: Uri, implementations_uris: List[Uri] ): - """ - Adds a list of implementations (each in the form of an `Uri`) for a given interface - """ + """Add a list of implementations (each in the form of an `Uri`) for a given interface.""" if interface_uri is None: raise ValueError() if interface_uri in self.config.interfaces.keys(): @@ -98,67 +114,50 @@ def add_interface_implementations( self.config.interfaces[interface_uri] = implementations_uris return self - def add_wrapper(self, wrapper_uri: Uri): - """ - Adds a wrapper to the list of wrappers - """ + def add_wrapper(self, wrapper_uri: UriWrapper): + """Add a wrapper to the list of wrappers.""" self.config.wrappers.append(wrapper_uri) return self - def add_wrappers(self, wrappers_uris: List[Uri]): - """ - Adds a list of wrappers to the list of wrappers - """ + def add_wrappers(self, wrappers_uris: List[UriWrapper]): + """Add a list of wrappers to the list of wrappers.""" for wrapper_uri in wrappers_uris: self.add_wrapper(wrapper_uri) return self - def remove_wrapper(self, wrapper_uri: Uri): - """ - Removes a wrapper from the list of wrappers - """ + def remove_wrapper(self, wrapper_uri: UriWrapper): + """Remove a wrapper from the list of wrappers.""" self.config.wrappers.remove(wrapper_uri) return self def set_package(self, uri_package: UriPackage): - """ - Sets the package in the builder's config, overiding any existing values. - """ + """Set the package in the builder's config, overiding any existing values.""" self.config.packages = [uri_package] return self def add_package(self, uri_package: UriPackage): - """ - Adds a package to the list of packages - """ + """Add a package to the list of packages.""" self.config.packages.append(uri_package) return self + def add_packages(self, uri_packages: List[UriPackage]): - """ - Adds a list of packages to the list of packages - """ + """Add a list of packages to the list of packages.""" for uri_package in uri_packages: self.add_package(uri_package) return self def remove_package(self, uri_package: UriPackage): - """ - Removes a package from the list of packages - """ + """Remove a package from the list of packages.""" self.config.packages.remove(uri_package) return self def set_resolver(self, uri_resolver: UriResolverLike): - """ - Sets a single resolver for the `ClientConfig` object before it is built - """ + """Set a single resolver for the `ClientConfig` object.""" self.config.resolver = [uri_resolver] return self def add_resolver(self, resolver: UriResolverLike): - """ - Adds a resolver to the list of resolvers - """ + """Add a resolver to the list of resolvers.""" if self.config.resolver is None: raise ValueError( "This resolver is not set. Please set a resolver before adding resolvers." @@ -167,45 +166,43 @@ def add_resolver(self, resolver: UriResolverLike): return self def add_resolvers(self, resolvers_list: List[UriResolverLike]): - """ - Adds a list of resolvers to the list of resolvers - """ + """Add a list of resolvers to the list of resolvers.""" for resolver in resolvers_list: self.add_resolver(resolver) return self def set_uri_redirect(self, uri_from: Uri, uri_to: Uri): """ - Sets an uri redirect, from one uri to another - If there was a redirect previously listed, it's changed to the new one - """ + Set an uri redirect, from one uri to another. + + If there was a redirect previously listed, it's changed to the new one. + """ self.config.redirects[uri_from] = uri_to return self - + def remove_uri_redirect(self, uri_from: Uri): - """ - Removes an uri redirect, from one uri to another - """ + """Remove an uri redirect, from one uri to another.""" self.config.redirects.pop(uri_from) return self - def set_uri_redirects(self, redirects: List[Dict[Uri,Uri]]): - """ - Sets various Uri redirects from a list simultaneously - """ + def set_uri_redirects(self, redirects: List[Dict[Uri, Uri]]): + """Set various Uri redirects from a list simultaneously.""" count = 0 for redir in redirects: - for k,v in redir.items(): - self.set_uri_redirect(k,v) + for key, value in redir.items(): + self.set_uri_redirect(key, value) count += 1 return self class ClientConfigBuilder(BaseClientConfigBuilder): + """ + A class that can build the `ClientConfig` object. + + This class inherits the `BaseClientConfigBuilder` class, + and adds the `build` method + """ def build(self) -> ClientConfig: - """ - Returns a sanitized config object from the builder's config. - """ + """Return a sanitized config object from the builder's config.""" return self.config - diff --git a/packages/polywrap-client-config-builder/tests/conftest.py b/packages/polywrap-client-config-builder/tests/conftest.py index 99d4893e..ecc2a93e 100644 --- a/packages/polywrap-client-config-builder/tests/conftest.py +++ b/packages/polywrap-client-config-builder/tests/conftest.py @@ -1,5 +1,28 @@ +from pytest import fixture +from abc import ABC +from typing import Any, Dict, TypeVar, Generic, List +from typing import Generic, Optional, cast +import pytest + +from typing import List, Any, Dict, Union +from polywrap_core import Env from polywrap_core import Uri +from polywrap_core import IUriResolver, UriPackage, UriWrapper, IWrapPackage from pytest import fixture +from polywrap_client_config_builder import ClientConfig +from dataclasses import asdict + + +# polywrap plugins + +from polywrap_core import Invoker, InvokeOptions, InvocableResult, GetFileOptions +from polywrap_result import Err, Ok, Result + +from polywrap_core import IWrapPackage, Wrapper, GetManifestOptions +from polywrap_manifest import AnyWrapManifest +from polywrap_result import Ok, Result +from polywrap_msgpack import msgpack_decode +from polywrap_core import Uri # Variables @@ -36,3 +59,7 @@ def env_uriY(): @fixture def env_uriZ(): return Uri("wrap://pinlist/dev.wrappers.io/Z") + + + + diff --git a/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py b/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py deleted file mode 100644 index b1cde455..00000000 --- a/packages/polywrap-client-config-builder/tests/test_ccb_packages_wrappers.py +++ /dev/null @@ -1,120 +0,0 @@ -from typing import List, Any, Dict, Union -from polywrap_core import Env -from polywrap_core import Uri -from polywrap_core import IUriResolver, UriPackage, UriWrapper, IWrapPackage -from polywrap_client_config_builder import ClientConfigBuilder -import pytest -from pytest import fixture -from polywrap_client_config_builder import ClientConfig -from dataclasses import asdict -from polywrap_client import PolywrapClient - - -# polywrap plugins -from abc import ABC -from typing import Any, Dict, TypeVar, Generic, List - -from polywrap_core import Invoker, InvokeOptions, InvocableResult, GetFileOptions -from polywrap_result import Err, Ok, Result -from typing import Generic, Optional, cast - -from polywrap_core import IWrapPackage, Wrapper, GetManifestOptions -from polywrap_manifest import AnyWrapManifest -from polywrap_result import Ok, Result -from polywrap_msgpack import msgpack_decode - - -TConfig = TypeVar('TConfig') -TResult = TypeVar('TResult') - -class MockedModule(Generic[TConfig, TResult], ABC): - env: Dict[str, Any] - config: TConfig - - def __init__(self, config: TConfig): - self.config = config - - def set_env(self, env: Dict[str, Any]) -> None: - self.env = env - - async def __wrap_invoke__(self, method: str, args: Dict[str, Any], client: Invoker) -> Result[TResult]: - methods: List[str] = [name for name in dir(self) if name == method] - - if not methods: - return Err.from_str(f"{method} is not defined in plugin") - - callable_method = getattr(self, method) - return Ok(callable_method(args, client)) if callable(callable_method) else Err.from_str(f"{method} is an attribute, not a method") - - -class MockedWrapper(Wrapper, Generic[TConfig, TResult]): - module: MockedModule[TConfig, TResult] - - def __init__(self, module: MockedModule[TConfig, TResult], manifest: AnyWrapManifest) -> None: - self.module = module - self.manifest = manifest - - async def invoke( - self, options: InvokeOptions, invoker: Invoker - ) -> Result[InvocableResult]: - env = options.env or {} - self.module.set_env(env) - - args: Union[Dict[str, Any], bytes] = options.args or {} - decoded_args: Dict[str, Any] = msgpack_decode(args) if isinstance(args, bytes) else args - - result: Result[TResult] = await self.module.__wrap_invoke__(options.method, decoded_args, invoker) - - if result.is_err(): - return cast(Err, result.err) - - return Ok(InvocableResult(result=result,encoded=False)) - - - async def get_file(self, options: GetFileOptions) -> Result[Union[str, bytes]]: - return Err.from_str("client.get_file(..) is not implemented for plugins") - - def get_manifest(self) -> Result[AnyWrapManifest]: - return Ok(self.manifest) - -class MockedPackage(Generic[TConfig, TResult], IWrapPackage): - module: MockedModule[TConfig, TResult] - manifest: AnyWrapManifest - - def __init__( - self, - module: MockedModule[TConfig, TResult], - manifest: AnyWrapManifest - ): - self.module = module - self.manifest = manifest - - async def create_wrapper(self) -> Result[Wrapper]: - return Ok(MockedWrapper(module=self.module, manifest=self.manifest)) - - async def get_manifest(self, options: Optional[GetManifestOptions] = None) -> Result[AnyWrapManifest]: - return Ok(self.manifest) - - -pw = PolywrapClient() -resolver: IUriResolver = pw.get_uri_resolver() - -def test_client_config_builder_set_package(): - # wrap_package = IWrapPackage() - ccb = ClientConfigBuilder() - uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - ccb = ccb.set_package(uri_package) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) - -def test_client_config_builder_add_wrapper(): - ccb = ClientConfigBuilder() - uri_wrapper = UriWrapper(uri=Uri("wrap://ens/eth.plugin.one"),wrapper="todo") - ccb = ccb.add_wrapper(uri_wrapper) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[], redirects={})) - # add second wrapper - uri_wrapper2 = UriWrapper(uri=Uri("wrap://ens/eth.plugin.two"),wrapper="Todo") - ccb = ccb.add_wrapper(uri_wrapper2) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[], redirects={})) \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 1012422a..1e5d05ae 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,13 +1,123 @@ -from typing import List, cast -from polywrap_core import Uri -from polywrap_core import UriPackage, AnyWrapManifest -from polywrap_uri_resolvers import UriResolverLike +from abc import ABC + +from typing import Any, Dict, TypeVar, Generic, List, Union, Optional, List, cast -from polywrap_client_config_builder import ClientConfigBuilder, BaseClientConfigBuilder -import pytest -from polywrap_client_config_builder import ClientConfig from dataclasses import asdict -from test_ccb_packages_wrappers import MockedModule + +from polywrap_core import IUriResolver, UriPackage, UriWrapper, IWrapPackage, AnyWrapManifest +from polywrap_core import Uri +from polywrap_core import Invoker, InvokeOptions, InvocableResult, GetFileOptions +from polywrap_core import IWrapPackage, Wrapper, GetManifestOptions + +from polywrap_client import PolywrapClient + +from polywrap_client_config_builder import ClientConfigBuilder, BaseClientConfigBuilder, ClientConfig + +from polywrap_result import Err, Ok, Result + +from polywrap_uri_resolvers import UriResolverLike + + +# Mocked Classes for the tests (class fixtures arent supported in pytest) +pw = PolywrapClient() +resolver: IUriResolver = pw.get_uri_resolver() +TConfig = TypeVar('TConfig') +TResult = TypeVar('TResult') + +class MockedModule(Generic[TConfig, TResult], ABC): + env: Dict[str, Any] + config: TConfig + + def __init__(self, config: TConfig): + self.config = config + + def set_env(self, env: Dict[str, Any]) -> None: + self.env = env + + async def __wrap_invoke__(self, method: str, args: Dict[str, Any], client: Invoker) -> Result[TResult]: + methods: List[str] = [name for name in dir(self) if name == method] + + if not methods: + return Err.from_str(f"{method} is not defined in plugin") + + callable_method = getattr(self, method) + return Ok(callable_method(args, client)) if callable(callable_method) else Err.from_str(f"{method} is an attribute, not a method") + + +class MockedWrapper(Wrapper, Generic[TConfig, TResult]): + module: MockedModule[TConfig, TResult] + + def __init__(self, module: MockedModule[TConfig, TResult], manifest: AnyWrapManifest) -> None: + self.module = module + self.manifest = manifest + + async def invoke( + self, options: InvokeOptions, invoker: Invoker + ) -> Result[InvocableResult]: + env = options.env or {} + self.module.set_env(env) + + args: Union[Dict[str, Any], bytes] = options.args or {} + decoded_args: Dict[str, Any] = msgpack_decode(args) if isinstance(args, bytes) else args + + result: Result[TResult] = await self.module.__wrap_invoke__(options.method, decoded_args, invoker) + + if result.is_err(): + return cast(Err, result.err) + + return Ok(InvocableResult(result=result,encoded=False)) + + + async def get_file(self, options: GetFileOptions) -> Result[Union[str, bytes]]: + return Err.from_str("client.get_file(..) is not implemented for plugins") + + def get_manifest(self) -> Result[AnyWrapManifest]: + return Ok(self.manifest) + +class MockedPackage(Generic[TConfig, TResult], IWrapPackage): + module: MockedModule[TConfig, TResult] + manifest: AnyWrapManifest + + def __init__( + self, + module: MockedModule[TConfig, TResult], + manifest: AnyWrapManifest + ): + self.module = module + self.manifest = manifest + + async def create_wrapper(self) -> Result[Wrapper]: + return Ok(MockedWrapper(module=self.module, manifest=self.manifest)) + + async def get_manifest(self, options: Optional[GetManifestOptions] = None) -> Result[AnyWrapManifest]: + return Ok(self.manifest) + + + +def test_client_config_structure_starts_empty(): + ccb = ClientConfigBuilder() + client_config = ccb.build() + result = ClientConfig( + envs={}, + interfaces={}, + resolver = [], + wrappers = [], + packages=[], + redirects={} + ) + assert asdict(client_config) == asdict(result) + + +def test_client_config_structure_sets_env(): + ccb = ClientConfigBuilder() + uri = Uri("wrap://ens/eth.plugin.one"), + env = { 'color': "red", 'size': "small" } + ccb = ccb.set_env( + uri = uri, + env = env + ) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) # ENVS @@ -73,6 +183,15 @@ def test_client_config_builder_adds_interface_implementations(): # PACKAGES +def test_client_config_builder_set_package(): + # wrap_package = IWrapPackage() + ccb = ClientConfigBuilder() + uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") + ccb = ccb.set_package(uri_package) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) + + def test_client_config_builder_set_package(): ccb = ClientConfigBuilder() module: MockedModule[None, str] = MockedModule(config=None) @@ -132,7 +251,20 @@ def test_client_config_builder_add_packages_removes_packages(): # WRAPPERS AND PLUGINS -def test_client_config_builder_add_wrapper(): +def test_client_config_builder_add_wrapper1(): + ccb = ClientConfigBuilder() + uri_wrapper = UriWrapper(uri=Uri("wrap://ens/eth.plugin.one"),wrapper="todo") + ccb = ccb.add_wrapper(uri_wrapper) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[], redirects={})) + # add second wrapper + uri_wrapper2 = UriWrapper(uri=Uri("wrap://ens/eth.plugin.two"),wrapper="Todo") + ccb = ccb.add_wrapper(uri_wrapper2) + client_config = ccb.build() + assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[], redirects={})) + + +def test_client_config_builder_add_wrapper2(): ccb = ClientConfigBuilder() wrapper = Uri("wrap://ens/uni.wrapper.eth") ccb = ccb.add_wrapper(wrapper) diff --git a/packages/polywrap-client-config-builder/tests/test_clientconfig.py b/packages/polywrap-client-config-builder/tests/test_clientconfig.py deleted file mode 100644 index 65a7ea4c..00000000 --- a/packages/polywrap-client-config-builder/tests/test_clientconfig.py +++ /dev/null @@ -1,30 +0,0 @@ -import pytest -from polywrap_core import Uri, Env -from polywrap_client_config_builder import ClientConfig, ClientConfigBuilder -from dataclasses import asdict - -def test_client_config_structure_starts_empty(): - ccb = ClientConfigBuilder() - client_config = ccb.build() - result = ClientConfig( - envs={}, - interfaces={}, - resolver = [], - wrappers = [], - packages=[], - redirects={} - ) - assert asdict(client_config) == asdict(result) - - -def test_client_config_structure_sets_env(): - ccb = ClientConfigBuilder() - uri = Uri("wrap://ens/eth.plugin.one"), - env = { 'color': "red", 'size': "small" } - ccb = ccb.set_env( - uri = uri, - env = env - ) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - From 4b725f3f556bd5e7b3fd05523b8817c302fdced3 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Wed, 30 Nov 2022 11:53:09 +0100 Subject: [PATCH 18/21] chore: isort and cleanup --- .../tests/conftest.py | 31 +---------- .../tests/test_client_config_builder.py | 51 ++++++++++++++----- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/polywrap-client-config-builder/tests/conftest.py b/packages/polywrap-client-config-builder/tests/conftest.py index ecc2a93e..57054b53 100644 --- a/packages/polywrap-client-config-builder/tests/conftest.py +++ b/packages/polywrap-client-config-builder/tests/conftest.py @@ -1,28 +1,5 @@ +from polywrap_core import Uri from pytest import fixture -from abc import ABC -from typing import Any, Dict, TypeVar, Generic, List -from typing import Generic, Optional, cast -import pytest - -from typing import List, Any, Dict, Union -from polywrap_core import Env -from polywrap_core import Uri -from polywrap_core import IUriResolver, UriPackage, UriWrapper, IWrapPackage -from pytest import fixture -from polywrap_client_config_builder import ClientConfig -from dataclasses import asdict - - -# polywrap plugins - -from polywrap_core import Invoker, InvokeOptions, InvocableResult, GetFileOptions -from polywrap_result import Err, Ok, Result - -from polywrap_core import IWrapPackage, Wrapper, GetManifestOptions -from polywrap_manifest import AnyWrapManifest -from polywrap_result import Ok, Result -from polywrap_msgpack import msgpack_decode -from polywrap_core import Uri # Variables @@ -58,8 +35,4 @@ def env_uriY(): @fixture def env_uriZ(): - return Uri("wrap://pinlist/dev.wrappers.io/Z") - - - - + return Uri("wrap://pinlist/dev.wrappers.io/Z") \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index 1e5d05ae..e0f9b9c4 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,21 +1,48 @@ -from abc import ABC - -from typing import Any, Dict, TypeVar, Generic, List, Union, Optional, List, cast +""" +Polywrap Python Client. + +The Test suite for the Polywrap Client Config Builder uses pytest to +test the various methods of the ClientConfigBuilder class. These tests +include sample code for configuring the client's: +- Envs +- Interfaces +- Packages +- Redirects +- Wrappers +- Resolvers + +docs.polywrap.io +Copyright 2022 Polywrap +""" +from abc import ABC from dataclasses import asdict - -from polywrap_core import IUriResolver, UriPackage, UriWrapper, IWrapPackage, AnyWrapManifest -from polywrap_core import Uri -from polywrap_core import Invoker, InvokeOptions, InvocableResult, GetFileOptions -from polywrap_core import IWrapPackage, Wrapper, GetManifestOptions +from typing import Any, Dict, Generic, List, Optional, TypeVar, Union, cast from polywrap_client import PolywrapClient - -from polywrap_client_config_builder import ClientConfigBuilder, BaseClientConfigBuilder, ClientConfig - +from polywrap_core import ( + AnyWrapManifest, + GetFileOptions, + GetManifestOptions, + InvocableResult, + InvokeOptions, + Invoker, + IUriResolver, + IWrapPackage, + Uri, + UriPackage, + UriWrapper, + Wrapper, +) from polywrap_result import Err, Ok, Result -from polywrap_uri_resolvers import UriResolverLike +from polywrap_client_config_builder import ( + BaseClientConfigBuilder, + ClientConfig, + ClientConfigBuilder, +) + +UriResolverLike = Union[Uri, UriPackage, UriWrapper, List["UriResolverLike"]] # Mocked Classes for the tests (class fixtures arent supported in pytest) From 07b00316a89bcfe5ef70f985a171a610daf62b13 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Mon, 3 Apr 2023 19:52:33 +0400 Subject: [PATCH 19/21] wip: client config builder --- .../poetry.lock | 1533 +++++++++-------- .../__init__.py | 10 +- .../client_config_builder.py | 290 ++-- .../types/__init__.py | 2 + .../types/build_options.py | 18 + .../types/builder_config.py | 26 + .../pyproject.toml | 1 - .../resolvers/cache/cache_resolver.py | 2 +- .../cache/request_synchronizer_resolver.py | 2 +- .../extensions/extendable_uri_resolver.py | 63 +- 10 files changed, 994 insertions(+), 953 deletions(-) create mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py create mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py create mode 100644 packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py diff --git a/packages/polywrap-client-config-builder/poetry.lock b/packages/polywrap-client-config-builder/poetry.lock index 80644bbe..4ddede8b 100644 --- a/packages/polywrap-client-config-builder/poetry.lock +++ b/packages/polywrap-client-config-builder/poetry.lock @@ -1,13 +1,20 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "astroid" -version = "2.12.12" +version = "2.15.1" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.1-py3-none-any.whl", hash = "sha256:89860bda98fe2bbd1f5d262229be7629d778ce280de68d95d4a73d1f592ad268"}, + {file = "astroid-2.15.1.tar.gz", hash = "sha256:af4e0aff46e2868218502789898269ed95b663fba49e65d91c1e09c966266c34"}, +] [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\""}, @@ -15,17 +22,22 @@ wrapt = [ [[package]] name = "attrs" -version = "22.1.0" +version = "22.2.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] [[package]] name = "backoff" @@ -34,34 +46,57 @@ description = "Function decoration for backoff and retry" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] [[package]] name = "bandit" -version = "1.7.4" +version = "1.7.5" description = "Security oriented static analyser for python code." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} GitPython = ">=1.0.1" PyYAML = ">=5.3.1" +rich = "*" stevedore = ">=1.20.0" -toml = {version = "*", optional = true, markers = "extra == \"toml\""} +tomli = {version = ">=1.1.0", optional = true, markers = "python_version < \"3.11\" and extra == \"toml\""} [package.extras] -test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] -toml = ["toml"] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] [[package]] name = "black" -version = "22.10.0" +version = "22.12.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] [package.dependencies] click = ">=8.0.0" @@ -83,6 +118,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -94,6 +133,10 @@ description = "Cross-platform colored terminal text." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "dill" @@ -102,6 +145,10 @@ description = "serialize all of python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] @@ -113,48 +160,68 @@ description = "Distribution utilities" category = "dev" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] [[package]] name = "exceptiongroup" -version = "1.0.4" +version = "1.1.1" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] [package.extras] test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.8.0" +version = "3.10.7" description = "A platform independent file lock." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, + {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, +] [package.extras] -docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"] -testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] -name = "GitPython" -version = "3.1.29" -description = "GitPython is a python library used to interact with Git repositories" +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" @@ -166,6 +233,10 @@ description = "GraphQL client for Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "gql-3.4.0-py2.py3-none-any.whl", hash = "sha256:59c8a0b8f0a2f3b0b2ff970c94de86f82f65cb1da3340bfe57143e5f7ea82f71"}, + {file = "gql-3.4.0.tar.gz", hash = "sha256:ca81aa8314fa88a8c57dd1ce34941278e0c352d762eb721edcba0387829ea7c0"}, +] [package.dependencies] backoff = ">=1.11.1,<3.0" @@ -179,7 +250,7 @@ botocore = ["botocore (>=1.21,<2)"] dev = ["aiofiles", "aiohttp (>=3.7.1,<3.9.0)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "sphinx (>=3.0.0,<4)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "urllib3 (>=1.26)", "vcrpy (==4.0.2)", "websockets (>=10,<11)", "websockets (>=9,<10)"] requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)"] test = ["aiofiles", "aiohttp (>=3.7.1,<3.9.0)", "botocore (>=1.21,<2)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)", "vcrpy (==4.0.2)", "websockets (>=10,<11)", "websockets (>=9,<10)"] -test_no_transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.0.2)"] +test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.0.2)"] websockets = ["websockets (>=10,<11)", "websockets (>=9,<10)"] [[package]] @@ -189,6 +260,10 @@ description = "GraphQL implementation for Python, a port of GraphQL.js, the Java category = "main" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, + {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, +] [[package]] name = "idna" @@ -197,36 +272,111 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "isort" -version = "5.10.1" +version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "lazy-object-proxy" -version = "1.8.0" +version = "1.9.0" description = "A fast and thorough lazy object proxy." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "mccabe" @@ -235,30 +385,191 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "msgpack" -version = "1.0.4" +version = "1.0.5" description = "MessagePack serializer" category = "main" optional = false python-versions = "*" +files = [ + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, + {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, + {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, + {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, + {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, + {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, + {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, + {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, + {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, + {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, + {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, + {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, + {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, + {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, + {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, + {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +] [[package]] name = "multidict" -version = "6.0.2" +version = "6.0.4" description = "multidict implementation" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] name = "nodeenv" @@ -267,48 +578,65 @@ description = "Node.js virtual environment builder" category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] [package.dependencies] setuptools = "*" [[package]] name = "packaging" -version = "21.3" +version = "23.0" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] [[package]] name = "pathspec" -version = "0.10.2" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] [[package]] name = "pbr" -version = "5.11.0" +version = "5.11.1" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] [[package]] name = "platformdirs" -version = "2.5.4" +version = "3.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, +] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -317,6 +645,10 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -329,19 +661,14 @@ description = "" category = "dev" optional = false python-versions = "^3.10" +files = [] develop = true [package.dependencies] polywrap-core = {path = "../polywrap-core", develop = true} polywrap-manifest = {path = "../polywrap-manifest", develop = true} polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} -polywrap-result = {path = "../polywrap-result", develop = true} polywrap-uri-resolvers = {path = "../polywrap-uri-resolvers", develop = true} -pycryptodome = "^3.14.1" -pysha3 = "^1.0.2" -result = "^0.8.0" -unsync = "^1.4.0" -wasmtime = "^1.0.1" [package.source] type = "directory" @@ -354,13 +681,14 @@ description = "" category = "main" optional = false python-versions = "^3.10" +files = [] develop = true [package.dependencies] gql = "3.4.0" graphql-core = "^3.2.1" polywrap-manifest = {path = "../polywrap-manifest", develop = true} -polywrap-result = {path = "../polywrap-result", develop = true} +polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} pydantic = "^1.10.2" [package.source] @@ -374,11 +702,11 @@ description = "WRAP manifest" category = "main" optional = false python-versions = "^3.10" +files = [] develop = true [package.dependencies] polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} -polywrap-result = {path = "../polywrap-result", develop = true} pydantic = "^1.10.2" [package.source] @@ -392,6 +720,7 @@ description = "WRAP msgpack encoding" category = "main" optional = false python-versions = "^3.10" +files = [] develop = true [package.dependencies] @@ -401,19 +730,6 @@ msgpack = "^1.0.4" type = "directory" url = "../polywrap-msgpack" -[[package]] -name = "polywrap-result" -version = "0.1.0" -description = "Result object" -category = "main" -optional = false -python-versions = "^3.10" -develop = true - -[package.source] -type = "directory" -url = "../polywrap-result" - [[package]] name = "polywrap-uri-resolvers" version = "0.1.0" @@ -421,13 +737,12 @@ description = "" category = "dev" optional = false python-versions = "^3.10" +files = [] develop = true [package.dependencies] polywrap-core = {path = "../polywrap-core", develop = true} -polywrap-result = {path = "../polywrap-result", develop = true} polywrap-wasm = {path = "../polywrap-wasm", develop = true} -wasmtime = "^1.0.1" [package.source] type = "directory" @@ -437,18 +752,19 @@ url = "../polywrap-uri-resolvers" name = "polywrap-wasm" version = "0.1.0" description = "" -category = "main" +category = "dev" optional = false python-versions = "^3.10" +files = [] develop = true [package.dependencies] polywrap-core = {path = "../polywrap-core", develop = true} polywrap-manifest = {path = "../polywrap-manifest", develop = true} polywrap-msgpack = {path = "../polywrap-msgpack", develop = true} -polywrap-result = {path = "../polywrap-result", develop = true} unsync = "^1.4.0" -wasmtime = "^1.0.1" +unsync-stubs = "^0.1.2" +wasmtime = "^6.0.0" [package.source] type = "directory" @@ -461,25 +777,59 @@ description = "library with cross-python path, ini-parsing, io, code, log facili category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pycryptodome" -version = "3.15.0" -description = "Cryptographic library for Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pydantic" -version = "1.10.2" +version = "1.10.7" description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -487,30 +837,56 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] [package.dependencies] -snowballstemmer = "*" +snowballstemmer = ">=2.2.0" + +[package.extras] +toml = ["tomli (>=1.2.3)"] + +[[package]] +name = "pygments" +version = "2.14.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +] [package.extras] -toml = ["toml"] +plugins = ["importlib-metadata"] [[package]] name = "pylint" -version = "2.15.5" +version = "2.17.1" description = "python code static checker" category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.1-py3-none-any.whl", hash = "sha256:8660a54e3f696243d644fca98f79013a959c03f979992c1ab59c24d3f4ec2700"}, + {file = "pylint-2.17.1.tar.gz", hash = "sha256:d4d009b0116e16845533bc2163493d6681846ac725eab8ca8014afb520178ddd"}, +] [package.dependencies] -astroid = ">=2.12.12,<=2.14.0-dev0" +astroid = ">=2.15.0,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = ">=0.2" +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" @@ -521,24 +897,17 @@ tomlkit = ">=0.10.1" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pyright" -version = "1.1.280" +version = "1.1.301" description = "Command line wrapper for pyright" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.301-py3-none-any.whl", hash = "sha256:ecc3752ba8c866a8041c90becf6be79bd52f4c51f98472e4776cae6d55e12826"}, + {file = "pyright-1.1.301.tar.gz", hash = "sha256:6ac4afc0004dca3a977a4a04a8ba25b5b5aa55f8289550697bfc20e11be0d5f2"}, +] [package.dependencies] nodeenv = ">=1.6.0" @@ -547,21 +916,17 @@ nodeenv = ">=1.6.0" all = ["twine (>=3.4.1)"] dev = ["twine (>=3.4.1)"] -[[package]] -name = "pysha3" -version = "1.0.2" -description = "SHA-3 (Keccak) for Python 2.7 - 3.5" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, + {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -582,6 +947,10 @@ description = "Pytest support for asyncio" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.19.0.tar.gz", hash = "sha256:ac4ebf3b6207259750bc32f4c1d8fcd7e79739edbc67ad0c58dd150b1d072fed"}, + {file = "pytest_asyncio-0.19.0-py3-none-any.whl", hash = "sha256:7a97e37cfe1ed296e2e84941384bdd37c376453912d397ed39293e0916f521fa"}, +] [package.dependencies] pytest = ">=6.1.0" @@ -590,31 +959,88 @@ pytest = ">=6.1.0" testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] [[package]] -name = "PyYAML" +name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] -name = "result" -version = "0.8.0" -description = "A Rust-like result type for Python" +name = "rich" +version = "13.3.3" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.3.3-py3-none-any.whl", hash = "sha256:540c7d6d26a1178e8e8b37e9ba44573a3cd1464ff6348b99ee7061b95d1c6333"}, + {file = "rich-13.3.3.tar.gz", hash = "sha256:dc84400a9d842b3a9c5ff74addd8eb798d155f36c1c91303888e0a66850d2a15"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "setuptools" -version = "65.5.1" +version = "67.6.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, + {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, +] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] @@ -625,6 +1051,10 @@ description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" @@ -633,6 +1063,10 @@ description = "A pure Python implementation of a sliding window memory map manag category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "snowballstemmer" @@ -641,14 +1075,22 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "dev" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "stevedore" -version = "4.1.1" +version = "5.0.0" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "stevedore-5.0.0-py3-none-any.whl", hash = "sha256:bd5a71ff5e5e5f5ea983880e4a1dd1bb47f8feebbb3d95b592398e2f02194771"}, + {file = "stevedore-5.0.0.tar.gz", hash = "sha256:2c428d2338976279e8eb2196f7a94910960d9f7ba2f41f3988511e95ca447021"}, +] [package.dependencies] pbr = ">=2.0.0,<2.1.0 || >2.1.0" @@ -660,6 +1102,10 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" @@ -668,22 +1114,34 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" -version = "0.11.6" +version = "0.11.7" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.7-py3-none-any.whl", hash = "sha256:5325463a7da2ef0c6bbfefb62a3dc883aebe679984709aee32a317907d0a8d3c"}, + {file = "tomlkit-0.11.7.tar.gz", hash = "sha256:f392ef70ad87a672f02519f99967d28a4d3047133e2d1df936511465fbb3791d"}, +] [[package]] name = "tox" -version = "3.27.1" +version = "3.28.0" description = "tox is a generic virtualenv management and test command line tool" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "tox-3.28.0-py2.py3-none-any.whl", hash = "sha256:57b5ab7e8bb3074edc3c0c0b4b192a4f3799d3723b2c5b76f1fa9f2d40316eea"}, + {file = "tox-3.28.0.tar.gz", hash = "sha256:d0d28f3fe6d6d7195c27f8b054c3e99d5451952b54abdae673b71609a581f640"}, +] [package.dependencies] colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""} @@ -706,6 +1164,10 @@ description = "Tox poetry plugin" category = "dev" optional = false python-versions = "*" +files = [ + {file = "tox-poetry-0.4.1.tar.gz", hash = "sha256:2395808e1ce487b5894c10f2202e14702bfa6d6909c0d1e525170d14809ac7ef"}, + {file = "tox_poetry-0.4.1-py2.py3-none-any.whl", hash = "sha256:11d9cd4e51d4cd9484b3ba63f2650ab4cfb4096e5f0682ecf561ddfc3c8e8c92"}, +] [package.dependencies] pluggy = "*" @@ -717,690 +1179,253 @@ test = ["coverage", "pycodestyle", "pylint", "pytest"] [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] [[package]] name = "unsync" version = "1.4.0" description = "Unsynchronize asyncio" -category = "main" +category = "dev" optional = false python-versions = "*" +files = [ + {file = "unsync-1.4.0.tar.gz", hash = "sha256:a29e0f8952ffb0b3a0453ce436819a5a1ba2febbb5caa707c319f6f98d35f3c5"}, +] + +[[package]] +name = "unsync-stubs" +version = "0.1.2" +description = "" +category = "dev" +optional = false +python-versions = ">=3.10,<4.0" +files = [ + {file = "unsync_stubs-0.1.2-py3-none-any.whl", hash = "sha256:a65aa80480c6b7ba985681d3833a202f0a33e159801c2a747bfcf6a0fb328a07"}, + {file = "unsync_stubs-0.1.2.tar.gz", hash = "sha256:9f5b7d5cd35a03e36b735be2ba5f1c2c3848c613ad124ccbf5fc0c3cdb21cc50"}, +] [[package]] name = "virtualenv" -version = "20.16.7" +version = "20.21.0" description = "Virtual Python Environment builder" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, +] [package.dependencies] distlib = ">=0.3.6,<1" filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<3" +platformdirs = ">=2.4,<4" [package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] [[package]] name = "wasmtime" -version = "1.0.1" +version = "6.0.0" description = "A WebAssembly runtime powered by Wasmtime" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "wasmtime-6.0.0-py3-none-any.whl", hash = "sha256:4b9ccb4c29a6c03729b8eb376de2c7e7e27a92ed5b6f84c2b1a37379eeeeb255"}, + {file = "wasmtime-6.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:dfb974d82f09f8b9f4993a9c3256c42b40d9f223128f54da7d9a07043645ed35"}, + {file = "wasmtime-6.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:df1e6f735642490de585701c1030dc4e9cc4d853628370183fa3d91e9b5d816c"}, + {file = "wasmtime-6.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:5a457ae39c77521aced2a9d66148a38583965ded101cd97803a2f0aa86139b9e"}, + {file = "wasmtime-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:694420c5049d1bdd767daa7969eb73d1dd70a778f2d831d13c4aa14fe63beeef"}, + {file = "wasmtime-6.0.0-py3-none-win_amd64.whl", hash = "sha256:fe77820fecc6f12da97be35d2a3bf0be8e47904e8b7e75e0e07b156a79eadba0"}, +] [package.extras] testing = ["coverage", "flake8 (==4.0.1)", "pycparser", "pytest", "pytest-flake8", "pytest-mypy"] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] [[package]] name = "yarl" -version = "1.8.1" +version = "1.8.2" description = "Yet another URL library" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, + {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, + {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, + {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, + {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, + {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, + {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, + {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, + {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, + {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, + {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, + {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, + {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, + {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, + {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, +] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.10" -content-hash = "cd2bba92384496c44782192f2cd104841841ac1cd61efd403c1df0fb1e87a477" - -[metadata.files] -astroid = [ - {file = "astroid-2.12.12-py3-none-any.whl", hash = "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"}, - {file = "astroid-2.12.12.tar.gz", hash = "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -backoff = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] -bandit = [ - {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, - {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] -distlib = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, - {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, -] -filelock = [ - {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, - {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -GitPython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, -] -gql = [ - {file = "gql-3.4.0-py2.py3-none-any.whl", hash = "sha256:59c8a0b8f0a2f3b0b2ff970c94de86f82f65cb1da3340bfe57143e5f7ea82f71"}, - {file = "gql-3.4.0.tar.gz", hash = "sha256:ca81aa8314fa88a8c57dd1ce34941278e0c352d762eb721edcba0387829ea7c0"}, -] -graphql-core = [ - {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, - {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, - {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, - {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, - {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -msgpack = [ - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, - {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, - {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, - {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, - {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, - {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, - {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, - {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, - {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, - {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, - {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, - {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, - {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, - {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, -] -multidict = [ - {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, - {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, - {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, - {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, - {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, - {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, - {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, - {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, - {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, - {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, - {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, - {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, - {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, - {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, - {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, - {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, - {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, - {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, - {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nodeenv = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, -] -pbr = [ - {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"}, - {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"}, -] -platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -polywrap-client = [] -polywrap-core = [] -polywrap-manifest = [] -polywrap-msgpack = [] -polywrap-result = [] -polywrap-uri-resolvers = [] -polywrap-wasm = [] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycryptodome = [ - {file = "pycryptodome-3.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff7ae90e36c1715a54446e7872b76102baa5c63aa980917f4aa45e8c78d1a3ec"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2ffd8b31561455453ca9f62cb4c24e6b8d119d6d531087af5f14b64bee2c23e6"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ea63d46157386c5053cfebcdd9bd8e0c8b7b0ac4a0507a027f5174929403884"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c9ed8aa31c146bef65d89a1b655f5f4eab5e1120f55fc297713c89c9e56ff0b"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5099c9ca345b2f252f0c28e96904643153bae9258647585e5e6f649bb7a1844a"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2ec709b0a58b539a4f9d33fb8508264c3678d7edb33a68b8906ba914f71e8c13"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-win32.whl", hash = "sha256:fd2184aae6ee2a944aaa49113e6f5787cdc5e4db1eb8edb1aea914bd75f33a0c"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:7e3a8f6ee405b3bd1c4da371b93c31f7027944b2bcce0697022801db93120d83"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b9c5b1a1977491533dfd31e01550ee36ae0249d78aae7f632590db833a5012b8"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0926f7cc3735033061ef3cf27ed16faad6544b14666410727b31fea85a5b16eb"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2aa55aae81f935a08d5a3c2042eb81741a43e044bd8a81ea7239448ad751f763"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c3640deff4197fa064295aaac10ab49a0d55ef3d6a54ae1499c40d646655c89f"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:045d75527241d17e6ef13636d845a12e54660aa82e823b3b3341bcf5af03fa79"}, - {file = "pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e"}, - {file = "pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1"}, - {file = "pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9cc96e274b253e47ad33ae1fccc36ea386f5251a823ccb50593a935db47fdd2"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:ecaaef2d21b365d9c5ca8427ffc10cebed9d9102749fd502218c23cb9a05feb5"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d2a39a66057ab191e5c27211a7daf8f0737f23acbf6b3562b25a62df65ffcb7b"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:9c772c485b27967514d0df1458b56875f4b6d025566bf27399d0c239ff1b369f"}, - {file = "pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8"}, -] -pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, -] -pydocstyle = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, -] -pylint = [ - {file = "pylint-2.15.5-py3-none-any.whl", hash = "sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004"}, - {file = "pylint-2.15.5.tar.gz", hash = "sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyright = [ - {file = "pyright-1.1.280-py3-none-any.whl", hash = "sha256:25917a14d873252c5c2e6fdbec322888c0480f6db95068ff6459befa9af3c92a"}, - {file = "pyright-1.1.280.tar.gz", hash = "sha256:4bcb167251419b3b736137b0535cb6bbfb5bef16eb74057eaf3ccaccb01d74c1"}, -] -pysha3 = [ - {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9"}, - {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf"}, - {file = "pysha3-1.0.2-cp27-cp27m-win32.whl", hash = "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b"}, - {file = "pysha3-1.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d"}, - {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5"}, - {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f"}, - {file = "pysha3-1.0.2-cp33-cp33m-win32.whl", hash = "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603"}, - {file = "pysha3-1.0.2-cp33-cp33m-win_amd64.whl", hash = "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24"}, - {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48"}, - {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f"}, - {file = "pysha3-1.0.2-cp34-cp34m-win32.whl", hash = "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608"}, - {file = "pysha3-1.0.2-cp34-cp34m-win_amd64.whl", hash = "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07"}, - {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d"}, - {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9"}, - {file = "pysha3-1.0.2-cp35-cp35m-win32.whl", hash = "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8"}, - {file = "pysha3-1.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77"}, - {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4"}, - {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030"}, - {file = "pysha3-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef"}, - {file = "pysha3-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0"}, - {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -pytest-asyncio = [ - {file = "pytest-asyncio-0.19.0.tar.gz", hash = "sha256:ac4ebf3b6207259750bc32f4c1d8fcd7e79739edbc67ad0c58dd150b1d072fed"}, - {file = "pytest_asyncio-0.19.0-py3-none-any.whl", hash = "sha256:7a97e37cfe1ed296e2e84941384bdd37c376453912d397ed39293e0916f521fa"}, -] -PyYAML = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -result = [ - {file = "result-0.8.0-py3-none-any.whl", hash = "sha256:d6a6258f32c057a4e0478999c6ce43dcadaf8ea435f58ac601ae2768f93ef243"}, - {file = "result-0.8.0.tar.gz", hash = "sha256:c48c909e92181a075ba358228a3fe161e26d205dad416ad81f27f23515a5626d"}, -] -setuptools = [ - {file = "setuptools-65.5.1-py3-none-any.whl", hash = "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31"}, - {file = "setuptools-65.5.1.tar.gz", hash = "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -stevedore = [ - {file = "stevedore-4.1.1-py3-none-any.whl", hash = "sha256:aa6436565c069b2946fe4ebff07f5041e0c8bf18c7376dd29edf80cf7d524e4e"}, - {file = "stevedore-4.1.1.tar.gz", hash = "sha256:7f8aeb6e3f90f96832c301bff21a7eb5eefbe894c88c506483d355565d88cc1a"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, -] -tox = [ - {file = "tox-3.27.1-py2.py3-none-any.whl", hash = "sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84"}, - {file = "tox-3.27.1.tar.gz", hash = "sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04"}, -] -tox-poetry = [ - {file = "tox-poetry-0.4.1.tar.gz", hash = "sha256:2395808e1ce487b5894c10f2202e14702bfa6d6909c0d1e525170d14809ac7ef"}, - {file = "tox_poetry-0.4.1-py2.py3-none-any.whl", hash = "sha256:11d9cd4e51d4cd9484b3ba63f2650ab4cfb4096e5f0682ecf561ddfc3c8e8c92"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -unsync = [ - {file = "unsync-1.4.0.tar.gz", hash = "sha256:a29e0f8952ffb0b3a0453ce436819a5a1ba2febbb5caa707c319f6f98d35f3c5"}, -] -virtualenv = [ - {file = "virtualenv-20.16.7-py3-none-any.whl", hash = "sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29"}, - {file = "virtualenv-20.16.7.tar.gz", hash = "sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e"}, -] -wasmtime = [ - {file = "wasmtime-1.0.1-py3-none-any.whl", hash = "sha256:20c1df95a3506408dcf2116502720e7cb248f1e98122b868932dbc9bbacb4ebd"}, - {file = "wasmtime-1.0.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9ccb42db2511b49c805b23a87e7c191d34112a9568292d475ec966204ac42bc3"}, - {file = "wasmtime-1.0.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:439960f6fb2a48482c8f7beaa2b491ce684f1599d9bfdd519b5320305edc2f39"}, - {file = "wasmtime-1.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:b257ec11ba6d39e3cd9eed4f90c4633bcf3b964219948254244347236fe45172"}, - {file = "wasmtime-1.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:f34ac6db5f91ab359566f531dca7c53d2e63f657d5b10ec9cf53d1c29ac718c0"}, - {file = "wasmtime-1.0.1-py3-none-win_amd64.whl", hash = "sha256:0ae7e2d43a5d9da72a884a695049d7b1773717ba059bdb0ad0369e5c1e03a388"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] -yarl = [ - {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"}, - {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"}, - {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"}, - {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"}, - {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"}, - {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"}, - {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"}, - {file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"}, - {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"}, - {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"}, - {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"}, - {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"}, - {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"}, - {file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"}, - {file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"}, - {file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"}, - {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"}, - {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"}, - {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"}, - {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"}, - {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"}, - {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"}, - {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"}, - {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"}, - {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"}, - {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"}, - {file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"}, - {file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"}, - {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"}, - {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"}, - {file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"}, - {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"}, - {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"}, - {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"}, - {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"}, - {file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"}, - {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"}, - {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"}, - {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"}, - {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"}, - {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"}, - {file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"}, - {file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"}, - {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"}, - {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"}, - {file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"}, - {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"}, - {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"}, - {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"}, - {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"}, - {file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"}, - {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"}, - {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"}, - {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"}, - {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"}, - {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"}, - {file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"}, - {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, - {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, -] +content-hash = "cc8bdcef1e787dc69cb9acf343f6ec74a3ced1db23f3ef990a755609e5e6a347" diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py index 73466205..3de0fb86 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/__init__.py @@ -1,11 +1,3 @@ -""" -Polywrap Python Client. - -ClientConfigBuilder Package - -docs.polywrap.io - -Copyright 2022 Polywrap -""" +"""This package contains modules related to client config builder.""" from .client_config_builder import * diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 0f8d6487..b0ffcbf8 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -1,208 +1,204 @@ -""" -Polywrap Python Client. - -The ClientConfigBuilder Package provides a simple interface for building a ClientConfig object, -which is used to configure the Polywrap Client and its sub-components. You can use the -ClientConfigBuilder to set the wrappers, packages, and other configuration options for the -Polywrap Client. - -docs.polywrap.io -Copyright 2022 Polywrap -""" - -from abc import ABC, abstractmethod -from dataclasses import dataclass -from typing import Any, Dict, List, Union - -from polywrap_core import Env, Uri, UriPackage, UriWrapper - -UriResolverLike = Union[Uri, UriPackage, UriWrapper, List["UriResolverLike"]] - - -@dataclass(slots=True, kw_only=True) -class ClientConfig: - """ - Abstract class used to configure the polywrap client before it executes a call. - - The ClientConfig class is created and modified with the ClientConfigBuilder module. - """ - - envs: Dict[Uri, Dict[str, Any]] - interfaces: Dict[Uri, List[Uri]] - wrappers: List[UriWrapper] - packages: List[UriPackage] - resolver: List[UriResolverLike] - redirects: Dict[Uri, Uri] - - -class BaseClientConfigBuilder(ABC): - """ - An abstract base class of the `ClientConfigBuilder`. - - It uses the ABC module to define the methods that can be used to - configure the `ClientConfig` object. +"""This module provides a simple builder for building a ClientConfig object.""" + +from typing import Any, Dict, List, Optional, cast + +from polywrap_core import ( + Env, + Uri, + UriPackage, + UriWrapper, + UriPackageOrWrapper, + Wrapper, + WrapPackage, + UriResolver, +) +from polywrap_client import PolywrapClientConfig + +from polywrap_uri_resolvers import ( + RecursiveResolver, + RequestSynchronizerResolver, + WrapperCacheResolver, + PackageToWrapperResolver, + StaticResolver, + ExtendableUriResolver, + InMemoryWrapperCache, + UriResolverAggregator, +) + +from .types import BuilderConfig, BuildOptions + + +class ClientConfigBuilder: + """Defines a simple builder for building a ClientConfig object. + + The ClientConfigBuilder is used to create a ClientConfig object, which is used to configure + the Polywrap Client and its sub-components. ClientConfigBuilder provides a simple interface + for setting the redirects, wrappers, packages, and other configuration options for the Polywrap Client. """ def __init__(self): """Initialize the builder's config attributes with empty values.""" - self.config = ClientConfig( - envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={} + self.config = BuilderConfig( + envs={}, interfaces={}, resolvers=[], wrappers={}, packages={}, redirects={} ) - @abstractmethod - def build(self) -> ClientConfig: - """Return a sanitized config object from the builder's config.""" + def build(self, options: Optional[BuildOptions] = None) -> PolywrapClientConfig: + """Build the ClientConfig object from the builder's config.""" + resolver = ( + options.resolver + if options and options.resolver + else RecursiveResolver( + RequestSynchronizerResolver( + WrapperCacheResolver( + PackageToWrapperResolver( + UriResolverAggregator( + [ + StaticResolver(self.config.redirects), + StaticResolver(self.config.wrappers), + StaticResolver(self.config.packages), + *self.config.resolvers, + ExtendableUriResolver(), + ] + ) + ), + options.wrapper_cache + if options and options.wrapper_cache + else InMemoryWrapperCache(), + ) + ) + ) + ) - def add(self, new_config: ClientConfig): - """ - Return a sanitized config object from the builder's config. + return PolywrapClientConfig( + envs=self.config.envs, + interfaces=self.config.interfaces, + resolver=resolver, + ) - Input is a partial `ClientConfig` object. - """ - if new_config.envs: - self.config.envs.update(new_config.envs) - if new_config.interfaces: - self.config.interfaces.update(new_config.interfaces) - if new_config.resolver: - self.config.resolver.extend(new_config.resolver) - if new_config.wrappers: - self.config.wrappers.extend(new_config.wrappers) - if new_config.packages: - self.config.packages.extend(new_config.packages) + def add(self, config: BuilderConfig): + """Add the values from the given config to the builder's config.""" + if config.envs: + self.config.envs.update(config.envs) + if config.interfaces: + self.config.interfaces.update(config.interfaces) + if config.redirects: + self.config.redirects.update(config.redirects) + if config.resolvers: + self.config.resolvers.extend(config.resolvers) + if config.wrappers: + self.config.wrappers.update(config.wrappers) + if config.packages: + self.config.packages.update(config.packages) return self def get_envs(self) -> Dict[Uri, Dict[str, Any]]: - """Return the envs dictionary from the builder's config.""" + """Return the envs from the builder's config.""" return self.config.envs - def set_env(self, env: Env, uri: Uri): - """Set the envs dictionary in the builder's config, overiding any existing values.""" + def set_env(self, uri: Uri, env: Env): + """Set the env by uri in the builder's config, overiding any existing values.""" self.config.envs[uri] = env return self - def add_env(self, env: Env, uri: Uri): - """ - Add an environment (in the form of an `Env`) for a given uri. + def set_envs(self, uri_envs: Dict[Uri, Env]): + """Set the envs in the builder's config, overiding any existing values.""" + self.config.envs.update(uri_envs) + return self - Note it is not overwriting existing environments, unless the - env key already exists in the environment, then it will overwrite the existing value. + def add_env(self, uri: Uri, env: Env): + """Add an env for the given uri. + + If an Env is already associated with the uri, it is modified. """ - if uri in self.config.envs.keys(): - for key in env.keys(): + if self.config.envs.get(uri): + for key in self.config.envs[uri]: self.config.envs[uri][key] = env[key] else: self.config.envs[uri] = env return self - def add_envs(self, envs: List[Env], uri: Uri = None): - """Add a list of environments (each in the form of an `Env`) for a given uri.""" - for env in envs: - self.add_env(env, uri) + def add_envs(self, uri_envs: Dict[Uri, Env]): + """Add a list of envs to the builder's config.""" + for uri, env in uri_envs.items(): + self.add_env(uri, env) return self def add_interface_implementations( self, interface_uri: Uri, implementations_uris: List[Uri] ): - """Add a list of implementations (each in the form of an `Uri`) for a given interface.""" - if interface_uri is None: - raise ValueError() + """Add a list of implementation URIs for the given interface URI to the builder's config.""" if interface_uri in self.config.interfaces.keys(): - self.config.interfaces[interface_uri] = ( - self.config.interfaces[interface_uri] + implementations_uris - ) + self.config.interfaces[interface_uri].extend(implementations_uris) else: self.config.interfaces[interface_uri] = implementations_uris return self - def add_wrapper(self, wrapper_uri: UriWrapper): - """Add a wrapper to the list of wrappers.""" - self.config.wrappers.append(wrapper_uri) + def add_wrapper(self, uri: Uri, wrapper: Wrapper[UriPackageOrWrapper]): + """Add a wrapper by its URI to the builder's config""" + self.config.wrappers[uri] = wrapper return self - def add_wrappers(self, wrappers_uris: List[UriWrapper]): - """Add a list of wrappers to the list of wrappers.""" - for wrapper_uri in wrappers_uris: - self.add_wrapper(wrapper_uri) + def add_wrappers(self, uri_wrappers: List[UriWrapper[UriPackageOrWrapper]]): + """Add a list of URI-wrapper pairs to the builder's config.""" + for uri_wrapper in uri_wrappers: + self.add_wrapper(cast(Uri, uri_wrapper), uri_wrapper.wrapper) return self - def remove_wrapper(self, wrapper_uri: UriWrapper): - """Remove a wrapper from the list of wrappers.""" - self.config.wrappers.remove(wrapper_uri) + def remove_wrapper(self, uri: Uri): + """Remove a wrapper by its URI from the builder's config.""" + del self.config.wrappers[uri] return self - def set_package(self, uri_package: UriPackage): - """Set the package in the builder's config, overiding any existing values.""" - self.config.packages = [uri_package] + def remove_wrappers(self, uris: List[Uri]): + """Remove a list of wrappers by its URIs""" + for uri in uris: + self.remove_wrapper(uri) return self - def add_package(self, uri_package: UriPackage): - """Add a package to the list of packages.""" - self.config.packages.append(uri_package) + def add_package(self, uri: Uri, package: WrapPackage[UriPackageOrWrapper]): + """Add a package by its URI to the builder's config.""" + self.config.packages[uri] = package return self - def add_packages(self, uri_packages: List[UriPackage]): - """Add a list of packages to the list of packages.""" + def add_packages(self, uri_packages: List[UriPackage[UriPackageOrWrapper]]): + """Add a list of URI-package pairs to the builder's config.""" for uri_package in uri_packages: - self.add_package(uri_package) + self.add_package(cast(Uri, uri_package), uri_package.package) return self - def remove_package(self, uri_package: UriPackage): - """Remove a package from the list of packages.""" - self.config.packages.remove(uri_package) + def remove_package(self, uri: Uri): + """Remove a package by its URI from the builder's config.""" + del self.config.packages[uri] return self - def set_resolver(self, uri_resolver: UriResolverLike): - """Set a single resolver for the `ClientConfig` object.""" - self.config.resolver = [uri_resolver] + def remove_packages(self, uris: List[Uri]): + """Remove a list of packages by its URIs from the builder's config.""" + for uri in uris: + self.remove_package(uri) return self - def add_resolver(self, resolver: UriResolverLike): - """Add a resolver to the list of resolvers.""" - if self.config.resolver is None: - raise ValueError( - "This resolver is not set. Please set a resolver before adding resolvers." - ) - self.config.resolver.append(resolver) + def add_resolver(self, resolver: UriResolver): + """Add a resolver to the builder's config.""" + self.config.resolvers.append(resolver) return self - def add_resolvers(self, resolvers_list: List[UriResolverLike]): - """Add a list of resolvers to the list of resolvers.""" + def add_resolvers(self, resolvers_list: List[UriResolver]): + """Add a list of resolvers to the builder's config.""" for resolver in resolvers_list: self.add_resolver(resolver) return self - def set_uri_redirect(self, uri_from: Uri, uri_to: Uri): - """ - Set an uri redirect, from one uri to another. - - If there was a redirect previously listed, it's changed to the new one. - """ - self.config.redirects[uri_from] = uri_to + def add_redirect(self, from_uri: Uri, to_uri: Uri): + """Add a URI redirect from `from_uri` to `to_uri`.""" + self.config.redirects[from_uri] = to_uri return self - def remove_uri_redirect(self, uri_from: Uri): - """Remove an uri redirect, from one uri to another.""" - self.config.redirects.pop(uri_from) + def remove_redirect(self, from_uri: Uri): + """Remove a URI redirect by `from_uri`.""" + del self.config.redirects[from_uri] return self - def set_uri_redirects(self, redirects: List[Dict[Uri, Uri]]): - """Set various Uri redirects from a list simultaneously.""" - count = 0 - for redir in redirects: - for key, value in redir.items(): - self.set_uri_redirect(key, value) - count += 1 + def add_redirects(self, redirects: Dict[Uri, Uri]): + """Add a list of URI redirects to the builder's config.""" + self.config.redirects.update(redirects) return self - - -class ClientConfigBuilder(BaseClientConfigBuilder): - """ - A class that can build the `ClientConfig` object. - - This class inherits the `BaseClientConfigBuilder` class, - and adds the `build` method - """ - - def build(self) -> ClientConfig: - """Return a sanitized config object from the builder's config.""" - return self.config diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py new file mode 100644 index 00000000..7c255a1e --- /dev/null +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py @@ -0,0 +1,2 @@ +from .builder_config import * +from .build_options import * \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py new file mode 100644 index 00000000..06172c1a --- /dev/null +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py @@ -0,0 +1,18 @@ +from dataclasses import dataclass +from typing import Optional + +from polywrap_core import UriResolver + +from polywrap_uri_resolvers import WrapperCache + + +@dataclass(slots=True, kw_only=True) +class BuildOptions: + """ + Abstract class used to configure the polywrap client before it executes a call. + + The ClientConfig class is created and modified with the ClientConfigBuilder module. + """ + + wrapper_cache: Optional[WrapperCache] = None + resolver: Optional[UriResolver] = None diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py new file mode 100644 index 00000000..374a1448 --- /dev/null +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass +from typing import Any, Dict, List +from polywrap_client import Wrapper + +from polywrap_core import ( + Uri, + UriPackageOrWrapper, + UriResolver, + WrapPackage, +) + + +@dataclass(slots=True, kw_only=True) +class BuilderConfig: + """ + Abstract class used to configure the polywrap client before it executes a call. + + The ClientConfig class is created and modified with the ClientConfigBuilder module. + """ + + envs: Dict[Uri, Dict[str, Any]] + interfaces: Dict[Uri, List[Uri]] + wrappers: Dict[Uri, Wrapper[UriPackageOrWrapper]] + packages: Dict[Uri, WrapPackage[UriPackageOrWrapper]] + resolvers: List[UriResolver] + redirects: Dict[Uri, Uri] diff --git a/packages/polywrap-client-config-builder/pyproject.toml b/packages/polywrap-client-config-builder/pyproject.toml index 0fd513d8..0ff53381 100644 --- a/packages/polywrap-client-config-builder/pyproject.toml +++ b/packages/polywrap-client-config-builder/pyproject.toml @@ -12,7 +12,6 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" polywrap-core = { path = "../polywrap-core", develop = true } -polywrap-result = { path = "../polywrap-result", develop = true } [tool.poetry.dev-dependencies] polywrap-client = { path = "../polywrap-client", develop = true } diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/cache_resolver.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/cache_resolver.py index e67f3406..94e076ab 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/cache_resolver.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/cache_resolver.py @@ -54,7 +54,7 @@ def __init__( self, resolver_to_cache: UriResolver, cache: WrapperCache, - options: Optional[WrapperCacheResolverOptions], + options: Optional[WrapperCacheResolverOptions] = None, ): """Initialize a new PackageToWrapperCacheResolver instance. diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/request_synchronizer_resolver.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/request_synchronizer_resolver.py index 19eaf2e8..674c0bd7 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/request_synchronizer_resolver.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/request_synchronizer_resolver.py @@ -54,7 +54,7 @@ class RequestSynchronizerResolver(UriResolver): def __init__( self, resolver_to_synchronize: UriResolver, - options: Optional[RequestSynchronizerResolverOptions], + options: Optional[RequestSynchronizerResolverOptions] = None, ): """Initialize a new RequestSynchronizerResolver instance. diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extendable_uri_resolver.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extendable_uri_resolver.py index 0a488939..93748075 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extendable_uri_resolver.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extendable_uri_resolver.py @@ -25,61 +25,33 @@ class ExtendableUriResolver(UriResolver): Attributes: DEFAULT_EXT_INTERFACE_URIS (List[Uri]): The default list of extension\ interface uris. - resolver_aggregator (UriResolverAggregator): The resolver aggregator\ - to use for resolving the extension interface uris. + ext_interface_uris (List[Uri]): The list of extension interface uris. + resolver_name (str): The name of the resolver. """ DEFAULT_EXT_INTERFACE_URIS = [ Uri.from_str("wrap://ens/wraps.eth:uri-resolver-ext@1.1.0"), Uri.from_str("wrap://ens/wraps.eth:uri-resolver-ext@1.0.0"), ] - resolver_aggregator: UriResolverAggregator + ext_interface_uris: List[Uri] + resolver_name: str - def __init__(self, resolver_aggregator: UriResolverAggregator): - """Initialize a new ExtendableUriResolver instance. - - Args: - resolver_aggregator (UriResolverAggregator): The resolver aggregator\ - to use for resolving the extension interface uris. - """ - self.resolver_aggregator = resolver_aggregator - - @classmethod - def from_interface( - cls, - client: InvokerClient[UriPackageOrWrapper], + def __init__( + self, ext_interface_uris: Optional[List[Uri]] = None, resolver_name: Optional[str] = None, ): - """Create a new ExtendableUriResolver instance from a list of extension interface uris. - + """Initialize a new ExtendableUriResolver instance. + Args: - client (InvokerClient[UriPackageOrWrapper]): The client to use for\ - resolving the extension interface uris. ext_interface_uris (Optional[List[Uri]]): The list of extension\ interface uris. Defaults to the default list of extension\ interface uris. resolver_name (Optional[str]): The name of the resolver. Defaults\ to the class name. - - Returns: - ExtendableUriResolver: The new ExtendableUriResolver instance. """ - ext_interface_uris = ext_interface_uris or cls.DEFAULT_EXT_INTERFACE_URIS - resolver_name = resolver_name or cls.__name__ - - uri_resolvers_uris: List[Uri] = [] - - for ext_interface_uri in ext_interface_uris: - uri_resolvers_uris.extend( - client.get_implementations(ext_interface_uri) or [] - ) - - resolvers = [ExtensionWrapperUriResolver(uri) for uri in uri_resolvers_uris] - - return cls( - UriResolverAggregator(cast(List[UriResolver], resolvers), resolver_name) - ) + self.ext_interface_uris = ext_interface_uris or self.DEFAULT_EXT_INTERFACE_URIS + self.resolver_name = resolver_name or self.__class__.__name__ async def try_resolve_uri( self, @@ -99,6 +71,17 @@ async def try_resolve_uri( Returns: UriPackageOrWrapper: The resolved URI, wrap package, or wrapper. """ - return await self.resolver_aggregator.try_resolve_uri( - uri, client, resolution_context + + uri_resolvers_uris: List[Uri] = [] + + for ext_interface_uri in self.ext_interface_uris: + uri_resolvers_uris.extend( + client.get_implementations(ext_interface_uri) or [] + ) + + resolvers = [ExtensionWrapperUriResolver(uri) for uri in uri_resolvers_uris] + aggregator = UriResolverAggregator( + cast(List[UriResolver], resolvers), self.resolver_name ) + + return await aggregator.try_resolve_uri(uri, client, resolution_context) From 227463316001ae55069c14fbfe4beca1d46f2af2 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 4 Apr 2023 01:24:08 +0400 Subject: [PATCH 20/21] wip: client config builder --- .../client_config_builder.py | 6 +- .../types/builder_config.py | 2 +- .../tests/conftest.py | 6 +- .../tests/test_client_config_builder.py | 944 +++++++++--------- 4 files changed, 479 insertions(+), 479 deletions(-) diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index b0ffcbf8..7f3b7cd7 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -11,8 +11,8 @@ Wrapper, WrapPackage, UriResolver, + ClientConfig ) -from polywrap_client import PolywrapClientConfig from polywrap_uri_resolvers import ( RecursiveResolver, @@ -42,7 +42,7 @@ def __init__(self): envs={}, interfaces={}, resolvers=[], wrappers={}, packages={}, redirects={} ) - def build(self, options: Optional[BuildOptions] = None) -> PolywrapClientConfig: + def build(self, options: Optional[BuildOptions] = None) -> ClientConfig: """Build the ClientConfig object from the builder's config.""" resolver = ( options.resolver @@ -69,7 +69,7 @@ def build(self, options: Optional[BuildOptions] = None) -> PolywrapClientConfig: ) ) - return PolywrapClientConfig( + return ClientConfig( envs=self.config.envs, interfaces=self.config.interfaces, resolver=resolver, diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py index 374a1448..5949db21 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py @@ -1,12 +1,12 @@ from dataclasses import dataclass from typing import Any, Dict, List -from polywrap_client import Wrapper from polywrap_core import ( Uri, UriPackageOrWrapper, UriResolver, WrapPackage, + Wrapper ) diff --git a/packages/polywrap-client-config-builder/tests/conftest.py b/packages/polywrap-client-config-builder/tests/conftest.py index 57054b53..7f56003c 100644 --- a/packages/polywrap-client-config-builder/tests/conftest.py +++ b/packages/polywrap-client-config-builder/tests/conftest.py @@ -27,12 +27,12 @@ def env_varS(): @fixture def env_uriX(): - return Uri("wrap://ens/eth.plugin.one/X") + return Uri.from_str("wrap://ens/eth.plugin.one/X") @fixture def env_uriY(): - return Uri("wrap://ipfs/filecoin.wrapper.two/Y") + return Uri.from_str("wrap://ipfs/filecoin.wrapper.two/Y") @fixture def env_uriZ(): - return Uri("wrap://pinlist/dev.wrappers.io/Z") \ No newline at end of file + return Uri.from_str("wrap://pinlist/dev.wrappers.io/Z") \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py index e0f9b9c4..9c8ae684 100644 --- a/packages/polywrap-client-config-builder/tests/test_client_config_builder.py +++ b/packages/polywrap-client-config-builder/tests/test_client_config_builder.py @@ -1,482 +1,482 @@ -""" -Polywrap Python Client. +# """ +# Polywrap Python Client. -The Test suite for the Polywrap Client Config Builder uses pytest to -test the various methods of the ClientConfigBuilder class. These tests -include sample code for configuring the client's: -- Envs -- Interfaces -- Packages -- Redirects -- Wrappers -- Resolvers - -docs.polywrap.io -Copyright 2022 Polywrap -""" - -from abc import ABC -from dataclasses import asdict -from typing import Any, Dict, Generic, List, Optional, TypeVar, Union, cast +# The Test suite for the Polywrap Client Config Builder uses pytest to +# test the various methods of the ClientConfigBuilder class. These tests +# include sample code for configuring the client's: +# - Envs +# - Interfaces +# - Packages +# - Redirects +# - Wrappers +# - Resolvers + +# docs.polywrap.io +# Copyright 2022 Polywrap +# """ + +# from abc import ABC +# from dataclasses import asdict +# from typing import Any, Dict, Generic, List, Optional, TypeVar, Union, cast -from polywrap_client import PolywrapClient -from polywrap_core import ( - AnyWrapManifest, - GetFileOptions, - GetManifestOptions, - InvocableResult, - InvokeOptions, - Invoker, - IUriResolver, - IWrapPackage, - Uri, - UriPackage, - UriWrapper, - Wrapper, -) -from polywrap_result import Err, Ok, Result +# from polywrap_client import PolywrapClient +# from polywrap_core import ( +# AnyWrapManifest, +# GetFileOptions, +# GetManifestOptions, +# InvocableResult, +# InvokeOptions, +# Invoker, +# IUriResolver, +# IWrapPackage, +# Uri, +# UriPackage, +# UriWrapper, +# Wrapper, +# ) +# from polywrap_result import Err, Ok, Result -from polywrap_client_config_builder import ( - BaseClientConfigBuilder, - ClientConfig, - ClientConfigBuilder, -) - -UriResolverLike = Union[Uri, UriPackage, UriWrapper, List["UriResolverLike"]] - - -# Mocked Classes for the tests (class fixtures arent supported in pytest) -pw = PolywrapClient() -resolver: IUriResolver = pw.get_uri_resolver() -TConfig = TypeVar('TConfig') -TResult = TypeVar('TResult') - -class MockedModule(Generic[TConfig, TResult], ABC): - env: Dict[str, Any] - config: TConfig - - def __init__(self, config: TConfig): - self.config = config - - def set_env(self, env: Dict[str, Any]) -> None: - self.env = env - - async def __wrap_invoke__(self, method: str, args: Dict[str, Any], client: Invoker) -> Result[TResult]: - methods: List[str] = [name for name in dir(self) if name == method] - - if not methods: - return Err.from_str(f"{method} is not defined in plugin") - - callable_method = getattr(self, method) - return Ok(callable_method(args, client)) if callable(callable_method) else Err.from_str(f"{method} is an attribute, not a method") - - -class MockedWrapper(Wrapper, Generic[TConfig, TResult]): - module: MockedModule[TConfig, TResult] - - def __init__(self, module: MockedModule[TConfig, TResult], manifest: AnyWrapManifest) -> None: - self.module = module - self.manifest = manifest - - async def invoke( - self, options: InvokeOptions, invoker: Invoker - ) -> Result[InvocableResult]: - env = options.env or {} - self.module.set_env(env) - - args: Union[Dict[str, Any], bytes] = options.args or {} - decoded_args: Dict[str, Any] = msgpack_decode(args) if isinstance(args, bytes) else args - - result: Result[TResult] = await self.module.__wrap_invoke__(options.method, decoded_args, invoker) - - if result.is_err(): - return cast(Err, result.err) - - return Ok(InvocableResult(result=result,encoded=False)) - - - async def get_file(self, options: GetFileOptions) -> Result[Union[str, bytes]]: - return Err.from_str("client.get_file(..) is not implemented for plugins") - - def get_manifest(self) -> Result[AnyWrapManifest]: - return Ok(self.manifest) - -class MockedPackage(Generic[TConfig, TResult], IWrapPackage): - module: MockedModule[TConfig, TResult] - manifest: AnyWrapManifest - - def __init__( - self, - module: MockedModule[TConfig, TResult], - manifest: AnyWrapManifest - ): - self.module = module - self.manifest = manifest - - async def create_wrapper(self) -> Result[Wrapper]: - return Ok(MockedWrapper(module=self.module, manifest=self.manifest)) - - async def get_manifest(self, options: Optional[GetManifestOptions] = None) -> Result[AnyWrapManifest]: - return Ok(self.manifest) - - - -def test_client_config_structure_starts_empty(): - ccb = ClientConfigBuilder() - client_config = ccb.build() - result = ClientConfig( - envs={}, - interfaces={}, - resolver = [], - wrappers = [], - packages=[], - redirects={} - ) - assert asdict(client_config) == asdict(result) - - -def test_client_config_structure_sets_env(): - ccb = ClientConfigBuilder() - uri = Uri("wrap://ens/eth.plugin.one"), - env = { 'color': "red", 'size': "small" } - ccb = ccb.set_env( - uri = uri, - env = env - ) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - - -# ENVS - -def test_client_config_builder_set_env(env_varA, env_uriX): - ccb = ClientConfigBuilder() - envs = { env_uriX: env_varA } - ccb = ccb.set_env( env_varA, env_uriX) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - -def test_client_config_builder_add_env(env_varA, env_uriX): - ccb = ClientConfigBuilder() # instantiate new client config builder - ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder - client_config: ClientConfig = ccb.build() # build a client config object - print(client_config) - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - -def test_client_config_builder_add_env_updates_env_value(env_varA,env_varB, env_uriX): - ccb = ClientConfigBuilder() # instantiate new client config builder - ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder - client_config: ClientConfig = ccb.build() # build a client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder - client_config: ClientConfig = ccb.build() # build a new client config object - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - -def test_client_config_builder_set_env_and_add_env_updates_and_add_values(env_varA, env_varB, env_varN, env_varM, env_varS, env_uriX, env_uriY): - ccb = ClientConfigBuilder() - ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - - ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - - ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig( - envs={ - env_uriX: env_varB, - env_uriY: env_varM - }, - interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - - # add new env vars on the second Uri, while also updating the Env vars of dog and season - ccb = ccb.add_envs([env_varN, env_varS], env_uriY) - new_envs = {**env_varM, **env_varN, **env_varS} - print(new_envs) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - -# INTERFACES AND IMPLEMENTATIONS - -def test_client_config_builder_adds_interface_implementations(): - ccb = ClientConfigBuilder() - interfaces_uri = Uri("wrap://ens/eth.plugin.one") - implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] - ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[], packages=[], redirects={})) - -# PACKAGES - -def test_client_config_builder_set_package(): - # wrap_package = IWrapPackage() - ccb = ClientConfigBuilder() - uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - ccb = ccb.set_package(uri_package) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) - - -def test_client_config_builder_set_package(): - ccb = ClientConfigBuilder() - module: MockedModule[None, str] = MockedModule(config=None) - manifest = cast(AnyWrapManifest, {}) - # This implementation below is correct, but the test fails because the UriPackage - # gets instantiated twice and two different instances are created. - # uri_package: UriPackage = UriPackage(uri=env_uriX, package=MockedPackage(module, manifest)) - # so instead we use the following implementation - uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - ccb = ccb.set_package(uri_package) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, - interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) - -def test_client_config_builder_add_package(): - ccb = ClientConfigBuilder() - uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - ccb = ccb.add_package(uri_package) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[uri_package], redirects={})) - -def test_client_config_builder_add_package_updates_packages_list(): - ccb = ClientConfigBuilder() - uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - ccb = ccb.add_package(uri_package1) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[uri_package1], redirects={})) - uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") - ccb = ccb.add_package(uri_package2) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[uri_package1, uri_package2], redirects={})) - -def test_client_config_builder_add_multiple_packages(): - ccb = ClientConfigBuilder() - uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") - ccb = ccb.add_packages([uri_package1, uri_package2]) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], - wrappers=[], packages=[uri_package1, uri_package2], redirects={})) - -def test_client_config_builder_add_packages_removes_packages(): - ccb = ClientConfigBuilder() - uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") - ccb = ccb.add_packages([uri_package1, uri_package2]) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], - wrappers=[], packages=[uri_package1, uri_package2], redirects={})) - ccb = ccb.remove_package(uri_package1) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], - wrappers=[], packages=[uri_package2], redirects={})) - -# WRAPPERS AND PLUGINS - -def test_client_config_builder_add_wrapper1(): - ccb = ClientConfigBuilder() - uri_wrapper = UriWrapper(uri=Uri("wrap://ens/eth.plugin.one"),wrapper="todo") - ccb = ccb.add_wrapper(uri_wrapper) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[], redirects={})) - # add second wrapper - uri_wrapper2 = UriWrapper(uri=Uri("wrap://ens/eth.plugin.two"),wrapper="Todo") - ccb = ccb.add_wrapper(uri_wrapper2) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[], redirects={})) - - -def test_client_config_builder_add_wrapper2(): - ccb = ClientConfigBuilder() - wrapper = Uri("wrap://ens/uni.wrapper.eth") - ccb = ccb.add_wrapper(wrapper) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[], redirects={})) - -def test_client_config_builder_adds_multiple_wrappers(): - ccb = ClientConfigBuilder() - wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] - ccb = ccb.add_wrappers(wrappers) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers, packages=[], redirects={})) - -def test_client_config_builder_removes_wrapper(): - ccb = ClientConfigBuilder() - wrapper = Uri("wrap://ens/uni.wrapper.eth") - ccb = ccb.add_wrapper(wrapper) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[], redirects={})) - ccb = ccb.remove_wrapper(wrapper) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) - -# RESOLVER - -def test_client_config_builder_set_uri_resolver(): - ccb = ClientConfigBuilder() - resolver: UriResolverLike = Uri("wrap://ens/eth.resolver.one") - ccb = ccb.set_resolver(resolver) - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[], redirects={})) +# from polywrap_client_config_builder import ( +# BaseClientConfigBuilder, +# ClientConfig, +# ClientConfigBuilder, +# ) + +# UriResolverLike = Union[Uri, UriPackage, UriWrapper, List["UriResolverLike"]] + + +# # Mocked Classes for the tests (class fixtures arent supported in pytest) +# pw = PolywrapClient() +# resolver: IUriResolver = pw.get_uri_resolver() +# TConfig = TypeVar('TConfig') +# TResult = TypeVar('TResult') + +# class MockedModule(Generic[TConfig, TResult], ABC): +# env: Dict[str, Any] +# config: TConfig + +# def __init__(self, config: TConfig): +# self.config = config + +# def set_env(self, env: Dict[str, Any]) -> None: +# self.env = env + +# async def __wrap_invoke__(self, method: str, args: Dict[str, Any], client: Invoker) -> Result[TResult]: +# methods: List[str] = [name for name in dir(self) if name == method] + +# if not methods: +# return Err.from_str(f"{method} is not defined in plugin") + +# callable_method = getattr(self, method) +# return Ok(callable_method(args, client)) if callable(callable_method) else Err.from_str(f"{method} is an attribute, not a method") + + +# class MockedWrapper(Wrapper, Generic[TConfig, TResult]): +# module: MockedModule[TConfig, TResult] + +# def __init__(self, module: MockedModule[TConfig, TResult], manifest: AnyWrapManifest) -> None: +# self.module = module +# self.manifest = manifest + +# async def invoke( +# self, options: InvokeOptions, invoker: Invoker +# ) -> Result[InvocableResult]: +# env = options.env or {} +# self.module.set_env(env) + +# args: Union[Dict[str, Any], bytes] = options.args or {} +# decoded_args: Dict[str, Any] = msgpack_decode(args) if isinstance(args, bytes) else args + +# result: Result[TResult] = await self.module.__wrap_invoke__(options.method, decoded_args, invoker) + +# if result.is_err(): +# return cast(Err, result.err) + +# return Ok(InvocableResult(result=result,encoded=False)) + + +# async def get_file(self, options: GetFileOptions) -> Result[Union[str, bytes]]: +# return Err.from_str("client.get_file(..) is not implemented for plugins") + +# def get_manifest(self) -> Result[AnyWrapManifest]: +# return Ok(self.manifest) + +# class MockedPackage(Generic[TConfig, TResult], IWrapPackage): +# module: MockedModule[TConfig, TResult] +# manifest: AnyWrapManifest + +# def __init__( +# self, +# module: MockedModule[TConfig, TResult], +# manifest: AnyWrapManifest +# ): +# self.module = module +# self.manifest = manifest + +# async def create_wrapper(self) -> Result[Wrapper]: +# return Ok(MockedWrapper(module=self.module, manifest=self.manifest)) + +# async def get_manifest(self, options: Optional[GetManifestOptions] = None) -> Result[AnyWrapManifest]: +# return Ok(self.manifest) + + + +# def test_client_config_structure_starts_empty(): +# ccb = ClientConfigBuilder() +# client_config = ccb.build() +# result = ClientConfig( +# envs={}, +# interfaces={}, +# resolver = [], +# wrappers = [], +# packages=[], +# redirects={} +# ) +# assert asdict(client_config) == asdict(result) + + +# def test_client_config_structure_sets_env(): +# ccb = ClientConfigBuilder() +# uri = Uri("wrap://ens/eth.plugin.one"), +# env = { 'color': "red", 'size': "small" } +# ccb = ccb.set_env( +# uri = uri, +# env = env +# ) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + + +# # ENVS + +# def test_client_config_builder_set_env(env_varA, env_uriX): +# ccb = ClientConfigBuilder() +# envs = { env_uriX: env_varA } +# ccb = ccb.set_env( env_varA, env_uriX) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# def test_client_config_builder_add_env(env_varA, env_uriX): +# ccb = ClientConfigBuilder() # instantiate new client config builder +# ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder +# client_config: ClientConfig = ccb.build() # build a client config object +# print(client_config) +# assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# def test_client_config_builder_add_env_updates_env_value(env_varA,env_varB, env_uriX): +# ccb = ClientConfigBuilder() # instantiate new client config builder +# ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder +# client_config: ClientConfig = ccb.build() # build a client config object +# assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) +# ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder +# client_config: ClientConfig = ccb.build() # build a new client config object +# assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# def test_client_config_builder_set_env_and_add_env_updates_and_add_values(env_varA, env_varB, env_varN, env_varM, env_varS, env_uriX, env_uriY): +# ccb = ClientConfigBuilder() +# ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig( +# envs={ +# env_uriX: env_varB, +# env_uriY: env_varM +# }, +# interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# # add new env vars on the second Uri, while also updating the Env vars of dog and season +# ccb = ccb.add_envs([env_varN, env_varS], env_uriY) +# new_envs = {**env_varM, **env_varN, **env_varS} +# print(new_envs) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# # INTERFACES AND IMPLEMENTATIONS + +# def test_client_config_builder_adds_interface_implementations(): +# ccb = ClientConfigBuilder() +# interfaces_uri = Uri("wrap://ens/eth.plugin.one") +# implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")] +# ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[], packages=[], redirects={})) + +# # PACKAGES + +# def test_client_config_builder_set_package(): +# # wrap_package = IWrapPackage() +# ccb = ClientConfigBuilder() +# uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# ccb = ccb.set_package(uri_package) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) + + +# def test_client_config_builder_set_package(): +# ccb = ClientConfigBuilder() +# module: MockedModule[None, str] = MockedModule(config=None) +# manifest = cast(AnyWrapManifest, {}) +# # This implementation below is correct, but the test fails because the UriPackage +# # gets instantiated twice and two different instances are created. +# # uri_package: UriPackage = UriPackage(uri=env_uriX, package=MockedPackage(module, manifest)) +# # so instead we use the following implementation +# uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# ccb = ccb.set_package(uri_package) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, +# interfaces={}, resolver = [], wrappers=[], packages=[uri_package], redirects={})) + +# def test_client_config_builder_add_package(): +# ccb = ClientConfigBuilder() +# uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# ccb = ccb.add_package(uri_package) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, +# resolver = [], wrappers=[], packages=[uri_package], redirects={})) + +# def test_client_config_builder_add_package_updates_packages_list(): +# ccb = ClientConfigBuilder() +# uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# ccb = ccb.add_package(uri_package1) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, +# resolver = [], wrappers=[], packages=[uri_package1], redirects={})) +# uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") +# ccb = ccb.add_package(uri_package2) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, +# resolver = [], wrappers=[], packages=[uri_package1, uri_package2], redirects={})) + +# def test_client_config_builder_add_multiple_packages(): +# ccb = ClientConfigBuilder() +# uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") +# ccb = ccb.add_packages([uri_package1, uri_package2]) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], +# wrappers=[], packages=[uri_package1, uri_package2], redirects={})) + +# def test_client_config_builder_add_packages_removes_packages(): +# ccb = ClientConfigBuilder() +# uri_package1 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# uri_package2 = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Updated") +# ccb = ccb.add_packages([uri_package1, uri_package2]) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], +# wrappers=[], packages=[uri_package1, uri_package2], redirects={})) +# ccb = ccb.remove_package(uri_package1) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], +# wrappers=[], packages=[uri_package2], redirects={})) + +# # WRAPPERS AND PLUGINS + +# def test_client_config_builder_add_wrapper1(): +# ccb = ClientConfigBuilder() +# uri_wrapper = UriWrapper(uri=Uri("wrap://ens/eth.plugin.one"),wrapper="todo") +# ccb = ccb.add_wrapper(uri_wrapper) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper], packages=[], redirects={})) +# # add second wrapper +# uri_wrapper2 = UriWrapper(uri=Uri("wrap://ens/eth.plugin.two"),wrapper="Todo") +# ccb = ccb.add_wrapper(uri_wrapper2) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[uri_wrapper, uri_wrapper2], packages=[], redirects={})) + + +# def test_client_config_builder_add_wrapper2(): +# ccb = ClientConfigBuilder() +# wrapper = Uri("wrap://ens/uni.wrapper.eth") +# ccb = ccb.add_wrapper(wrapper) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[], redirects={})) + +# def test_client_config_builder_adds_multiple_wrappers(): +# ccb = ClientConfigBuilder() +# wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")] +# ccb = ccb.add_wrappers(wrappers) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers, packages=[], redirects={})) + +# def test_client_config_builder_removes_wrapper(): +# ccb = ClientConfigBuilder() +# wrapper = Uri("wrap://ens/uni.wrapper.eth") +# ccb = ccb.add_wrapper(wrapper) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper], packages=[], redirects={})) +# ccb = ccb.remove_wrapper(wrapper) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={})) + +# # RESOLVER + +# def test_client_config_builder_set_uri_resolver(): +# ccb = ClientConfigBuilder() +# resolver: UriResolverLike = Uri("wrap://ens/eth.resolver.one") +# ccb = ccb.set_resolver(resolver) +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolver], wrappers=[], packages=[], redirects={})) -def test_client_config_builder_add_resolver(): - # set a first resolver - ccb = ClientConfigBuilder() - resolverA = Uri("wrap://ens/eth.resolver.one") - ccb: BaseClientConfigBuilder = ccb.set_resolver(resolverA) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[], redirects={})) +# def test_client_config_builder_add_resolver(): +# # set a first resolver +# ccb = ClientConfigBuilder() +# resolverA = Uri("wrap://ens/eth.resolver.one") +# ccb: BaseClientConfigBuilder = ccb.set_resolver(resolverA) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[], packages=[], redirects={})) - # add a second resolver - resolverB = Uri("wrap://ens/eth.resolver.two") - ccb = ccb.add_resolver(resolverB) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[], packages=[], redirects={})) - - # add a third and fourth resolver - resolverC = Uri("wrap://ens/eth.resolver.three") - resolverD = Uri("wrap://ens/eth.resolver.four") - ccb = ccb.add_resolvers([resolverC, resolverD]) - client_config: ClientConfig = ccb.build() - resolvers: List[UriResolverLike] = [resolverA, resolverB, resolverC, resolverD] - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[], redirects={})) - -# REDIRECTS - -def test_client_config_builder_sets_uri_redirects(env_uriX, env_uriY, env_uriZ): - # set a first redirect - ccb = ClientConfigBuilder() - ccb = ccb.set_uri_redirect(env_uriX, env_uriY) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], - redirects={env_uriX: env_uriY})) +# # add a second resolver +# resolverB = Uri("wrap://ens/eth.resolver.two") +# ccb = ccb.add_resolver(resolverB) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[], packages=[], redirects={})) + +# # add a third and fourth resolver +# resolverC = Uri("wrap://ens/eth.resolver.three") +# resolverD = Uri("wrap://ens/eth.resolver.four") +# ccb = ccb.add_resolvers([resolverC, resolverD]) +# client_config: ClientConfig = ccb.build() +# resolvers: List[UriResolverLike] = [resolverA, resolverB, resolverC, resolverD] +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[], packages=[], redirects={})) + +# # REDIRECTS + +# def test_client_config_builder_sets_uri_redirects(env_uriX, env_uriY, env_uriZ): +# # set a first redirect +# ccb = ClientConfigBuilder() +# ccb = ccb.set_uri_redirect(env_uriX, env_uriY) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], +# redirects={env_uriX: env_uriY})) - # add a second redirect - ccb = ccb.set_uri_redirect(env_uriY, env_uriZ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], - redirects={env_uriX: env_uriY, env_uriY: env_uriZ})) - - # update the first redirect - ccb.set_uri_redirect(env_uriX, env_uriZ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], - redirects={env_uriX: env_uriZ, env_uriY: env_uriZ})) - -def test_client_config_builder_removes_uri_redirects(env_uriX, env_uriY, env_uriZ): - ccb = ClientConfigBuilder() - ccb = ccb.set_uri_redirect(env_uriX, env_uriY) - ccb = ccb.set_uri_redirect(env_uriY, env_uriZ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], - redirects={env_uriX: env_uriY, env_uriY: env_uriZ})) +# # add a second redirect +# ccb = ccb.set_uri_redirect(env_uriY, env_uriZ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], +# redirects={env_uriX: env_uriY, env_uriY: env_uriZ})) + +# # update the first redirect +# ccb.set_uri_redirect(env_uriX, env_uriZ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], +# redirects={env_uriX: env_uriZ, env_uriY: env_uriZ})) + +# def test_client_config_builder_removes_uri_redirects(env_uriX, env_uriY, env_uriZ): +# ccb = ClientConfigBuilder() +# ccb = ccb.set_uri_redirect(env_uriX, env_uriY) +# ccb = ccb.set_uri_redirect(env_uriY, env_uriZ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], +# redirects={env_uriX: env_uriY, env_uriY: env_uriZ})) - ccb = ccb.remove_uri_redirect(env_uriX) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], - redirects={env_uriY: env_uriZ})) - - - -def test_client_config_builder_sets_many_uri_redirects(env_uriX,env_uriY, env_uriZ): - - # set a first redirect - ccb = ClientConfigBuilder() - ccb = ccb.set_uri_redirects([{ - env_uriX: env_uriY, - }] ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriY})) - - # updates that first redirect to a new value - ccb = ccb.set_uri_redirects([{ - env_uriX: env_uriZ, - }] ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriZ})) - - # add a second redirect - ccb = ccb.set_uri_redirects([{ - env_uriY: env_uriX, - }] ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriZ, env_uriY: env_uriX})) - - # add a third redirect and update the first redirect - ccb = ccb.set_uri_redirects([{ - env_uriX: env_uriY, - env_uriZ: env_uriY, - }] ) - client_config: ClientConfig = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], - redirects={ - env_uriX: env_uriY, - env_uriY: env_uriX, - env_uriZ: env_uriY - })) - - -# GENERIC ADD FUNCTION - -def test_client_config_builder_generic_add(env_varA,env_uriX, env_uriY): - # Test adding package, wrapper, resolver, interface, and env with the ccb.add method - ccb = ClientConfigBuilder() +# ccb = ccb.remove_uri_redirect(env_uriX) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], +# redirects={env_uriY: env_uriZ})) + + + +# def test_client_config_builder_sets_many_uri_redirects(env_uriX,env_uriY, env_uriZ): + +# # set a first redirect +# ccb = ClientConfigBuilder() +# ccb = ccb.set_uri_redirects([{ +# env_uriX: env_uriY, +# }] ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriY})) + +# # updates that first redirect to a new value +# ccb = ccb.set_uri_redirects([{ +# env_uriX: env_uriZ, +# }] ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriZ})) + +# # add a second redirect +# ccb = ccb.set_uri_redirects([{ +# env_uriY: env_uriX, +# }] ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], redirects={env_uriX: env_uriZ, env_uriY: env_uriX})) + +# # add a third redirect and update the first redirect +# ccb = ccb.set_uri_redirects([{ +# env_uriX: env_uriY, +# env_uriZ: env_uriY, +# }] ) +# client_config: ClientConfig = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[], wrappers=[], packages=[], +# redirects={ +# env_uriX: env_uriY, +# env_uriY: env_uriX, +# env_uriZ: env_uriY +# })) + + +# # GENERIC ADD FUNCTION + +# def test_client_config_builder_generic_add(env_varA,env_uriX, env_uriY): +# # Test adding package, wrapper, resolver, interface, and env with the ccb.add method +# ccb = ClientConfigBuilder() - # starts empty - client_config = ccb.build() - assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, - resolver = [], wrappers=[], packages=[], redirects={})) - - # add an env - new_config = ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={}) - ccb = ccb.add(new_config) - client_config1 = ccb.build() - assert asdict(client_config1) == asdict(new_config) - - # add a resolver - new_resolvers = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.one")], envs={}, interfaces={}, wrappers=[], packages=[], redirects={}) - ccb = ccb.add(new_resolvers) - client_config2 = ccb.build() - assert asdict(client_config2) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, - resolver = [Uri("wrap://ens/eth.resolver.one")], wrappers=[], packages=[], redirects={})) - - # add a second resolver - new_resolver = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.two")], envs={}, interfaces={}, wrappers=[], packages=[], redirects={}) - ccb = ccb.add(new_resolver) - client_config5 = ccb.build() - assert asdict(client_config5) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, - resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], wrappers=[], packages=[], redirects={})) - - - # add a wrapper - new_wrapper = ClientConfig(wrappers=[Uri("wrap://ens/uni.wrapper.eth")], envs={}, interfaces={}, resolver = [], packages=[], redirects={}) - ccb = ccb.add(new_wrapper) - client_config3 = ccb.build() - assert asdict(client_config3) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, - resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], - wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[], redirects={})) - - # add an interface - interfaces: Dict[Uri, List[Uri]] = {Uri("wrap://ens/eth.interface.eth"): [env_uriX,env_uriY]} - new_interface = ClientConfig(interfaces=interfaces, envs={}, resolver = [], wrappers=[], packages=[], redirects={}) - ccb = ccb.add(new_interface) - client_config4 = ccb.build() - assert asdict(client_config4) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, - resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], - wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[], redirects={})) - - # add a package - uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") - new_package = ClientConfig(packages=[uri_package], envs={}, interfaces={}, resolver = [], wrappers=[], redirects={}) - ccb = ccb.add(new_package) - client_config6 = ccb.build() - assert asdict(client_config6) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, - resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], - wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[uri_package], redirects={})) +# # starts empty +# client_config = ccb.build() +# assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, +# resolver = [], wrappers=[], packages=[], redirects={})) + +# # add an env +# new_config = ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[], packages=[], redirects={}) +# ccb = ccb.add(new_config) +# client_config1 = ccb.build() +# assert asdict(client_config1) == asdict(new_config) + +# # add a resolver +# new_resolvers = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.one")], envs={}, interfaces={}, wrappers=[], packages=[], redirects={}) +# ccb = ccb.add(new_resolvers) +# client_config2 = ccb.build() +# assert asdict(client_config2) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, +# resolver = [Uri("wrap://ens/eth.resolver.one")], wrappers=[], packages=[], redirects={})) + +# # add a second resolver +# new_resolver = ClientConfig(resolver=[Uri("wrap://ens/eth.resolver.two")], envs={}, interfaces={}, wrappers=[], packages=[], redirects={}) +# ccb = ccb.add(new_resolver) +# client_config5 = ccb.build() +# assert asdict(client_config5) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, +# resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], wrappers=[], packages=[], redirects={})) + + +# # add a wrapper +# new_wrapper = ClientConfig(wrappers=[Uri("wrap://ens/uni.wrapper.eth")], envs={}, interfaces={}, resolver = [], packages=[], redirects={}) +# ccb = ccb.add(new_wrapper) +# client_config3 = ccb.build() +# assert asdict(client_config3) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, +# resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], +# wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[], redirects={})) + +# # add an interface +# interfaces: Dict[Uri, List[Uri]] = {Uri("wrap://ens/eth.interface.eth"): [env_uriX,env_uriY]} +# new_interface = ClientConfig(interfaces=interfaces, envs={}, resolver = [], wrappers=[], packages=[], redirects={}) +# ccb = ccb.add(new_interface) +# client_config4 = ccb.build() +# assert asdict(client_config4) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, +# resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], +# wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[], redirects={})) + +# # add a package +# uri_package = UriPackage(uri=Uri("wrap://ens/eth.plugin.one"),package="Todo") +# new_package = ClientConfig(packages=[uri_package], envs={}, interfaces={}, resolver = [], wrappers=[], redirects={}) +# ccb = ccb.add(new_package) +# client_config6 = ccb.build() +# assert asdict(client_config6) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces=interfaces, +# resolver = [Uri("wrap://ens/eth.resolver.one"), Uri("wrap://ens/eth.resolver.two")], +# wrappers=[Uri("wrap://ens/uni.wrapper.eth")], packages=[uri_package], redirects={})) From b20c6f125221a4f23057cc72ff15f71d6a329dad Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 4 Apr 2023 01:34:13 +0400 Subject: [PATCH 21/21] feat: initial version of client-config-builder --- .../poetry.lock | 14 ++++----- .../client_config_builder.py | 29 ++++++++++--------- .../types/__init__.py | 3 +- .../types/build_options.py | 2 +- .../types/builder_config.py | 9 ++---- .../pyproject.toml | 1 + .../tests/test_sanity.py | 12 ++++++++ 7 files changed, 40 insertions(+), 30 deletions(-) create mode 100644 packages/polywrap-client-config-builder/tests/test_sanity.py diff --git a/packages/polywrap-client-config-builder/poetry.lock b/packages/polywrap-client-config-builder/poetry.lock index 4ddede8b..b5afa42a 100644 --- a/packages/polywrap-client-config-builder/poetry.lock +++ b/packages/polywrap-client-config-builder/poetry.lock @@ -2,14 +2,14 @@ [[package]] name = "astroid" -version = "2.15.1" +version = "2.15.2" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false python-versions = ">=3.7.2" files = [ - {file = "astroid-2.15.1-py3-none-any.whl", hash = "sha256:89860bda98fe2bbd1f5d262229be7629d778ce280de68d95d4a73d1f592ad268"}, - {file = "astroid-2.15.1.tar.gz", hash = "sha256:af4e0aff46e2868218502789898269ed95b663fba49e65d91c1e09c966266c34"}, + {file = "astroid-2.15.2-py3-none-any.whl", hash = "sha256:dea89d9f99f491c66ac9c04ebddf91e4acf8bd711722175fe6245c0725cc19bb"}, + {file = "astroid-2.15.2.tar.gz", hash = "sha256:6e61b85c891ec53b07471aec5878f4ac6446a41e590ede0f2ce095f39f7d49dd"}, ] [package.dependencies] @@ -870,18 +870,18 @@ plugins = ["importlib-metadata"] [[package]] name = "pylint" -version = "2.17.1" +version = "2.17.2" description = "python code static checker" category = "dev" optional = false python-versions = ">=3.7.2" files = [ - {file = "pylint-2.17.1-py3-none-any.whl", hash = "sha256:8660a54e3f696243d644fca98f79013a959c03f979992c1ab59c24d3f4ec2700"}, - {file = "pylint-2.17.1.tar.gz", hash = "sha256:d4d009b0116e16845533bc2163493d6681846ac725eab8ca8014afb520178ddd"}, + {file = "pylint-2.17.2-py3-none-any.whl", hash = "sha256:001cc91366a7df2970941d7e6bbefcbf98694e00102c1f121c531a814ddc2ea8"}, + {file = "pylint-2.17.2.tar.gz", hash = "sha256:1b647da5249e7c279118f657ca28b6aaebb299f86bf92affc632acf199f7adbb"}, ] [package.dependencies] -astroid = ">=2.15.0,<=2.17.0-dev0" +astroid = ">=2.15.2,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py index 7f3b7cd7..99c10e3d 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/client_config_builder.py @@ -3,26 +3,25 @@ from typing import Any, Dict, List, Optional, cast from polywrap_core import ( + ClientConfig, Env, Uri, UriPackage, - UriWrapper, UriPackageOrWrapper, - Wrapper, - WrapPackage, UriResolver, - ClientConfig + UriWrapper, + WrapPackage, + Wrapper, ) - from polywrap_uri_resolvers import ( + ExtendableUriResolver, + InMemoryWrapperCache, + PackageToWrapperResolver, RecursiveResolver, RequestSynchronizerResolver, - WrapperCacheResolver, - PackageToWrapperResolver, StaticResolver, - ExtendableUriResolver, - InMemoryWrapperCache, UriResolverAggregator, + WrapperCacheResolver, ) from .types import BuilderConfig, BuildOptions @@ -31,9 +30,11 @@ class ClientConfigBuilder: """Defines a simple builder for building a ClientConfig object. - The ClientConfigBuilder is used to create a ClientConfig object, which is used to configure - the Polywrap Client and its sub-components. ClientConfigBuilder provides a simple interface - for setting the redirects, wrappers, packages, and other configuration options for the Polywrap Client. + The ClientConfigBuilder is used to create a ClientConfig object,\ + which is used to configure the Polywrap Client and its sub-components.\ + ClientConfigBuilder provides a simple interface for setting\ + the redirects, wrappers, packages, and other configuration options\ + for the Polywrap Client. """ def __init__(self): @@ -134,7 +135,7 @@ def add_interface_implementations( return self def add_wrapper(self, uri: Uri, wrapper: Wrapper[UriPackageOrWrapper]): - """Add a wrapper by its URI to the builder's config""" + """Add a wrapper by its URI to the builder's config.""" self.config.wrappers[uri] = wrapper return self @@ -150,7 +151,7 @@ def remove_wrapper(self, uri: Uri): return self def remove_wrappers(self, uris: List[Uri]): - """Remove a list of wrappers by its URIs""" + """Remove a list of wrappers by its URIs.""" for uri in uris: self.remove_wrapper(uri) return self diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py index 7c255a1e..bde2ea40 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/__init__.py @@ -1,2 +1,3 @@ +"""This package contains types related to client config builder.""" +from .build_options import * from .builder_config import * -from .build_options import * \ No newline at end of file diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py index 06172c1a..d8830974 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/build_options.py @@ -1,8 +1,8 @@ +"""This module contains the BuildOptions class.""" from dataclasses import dataclass from typing import Optional from polywrap_core import UriResolver - from polywrap_uri_resolvers import WrapperCache diff --git a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py index 5949db21..65194e3b 100644 --- a/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py +++ b/packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py @@ -1,13 +1,8 @@ +"""This module contains the BuilderConfig class.""" from dataclasses import dataclass from typing import Any, Dict, List -from polywrap_core import ( - Uri, - UriPackageOrWrapper, - UriResolver, - WrapPackage, - Wrapper -) +from polywrap_core import Uri, UriPackageOrWrapper, UriResolver, WrapPackage, Wrapper @dataclass(slots=True, kw_only=True) diff --git a/packages/polywrap-client-config-builder/pyproject.toml b/packages/polywrap-client-config-builder/pyproject.toml index 0ff53381..a5765cb4 100644 --- a/packages/polywrap-client-config-builder/pyproject.toml +++ b/packages/polywrap-client-config-builder/pyproject.toml @@ -44,6 +44,7 @@ testpaths = [ [tool.pylint] disable = [ "too-many-return-statements", + "too-many-public-methods", ] ignore = [ "tests/" diff --git a/packages/polywrap-client-config-builder/tests/test_sanity.py b/packages/polywrap-client-config-builder/tests/test_sanity.py new file mode 100644 index 00000000..846aea4b --- /dev/null +++ b/packages/polywrap-client-config-builder/tests/test_sanity.py @@ -0,0 +1,12 @@ +from polywrap_core import Uri +from polywrap_client_config_builder import ClientConfigBuilder + + +def test_sanity(): + config = ( + ClientConfigBuilder() + .add_env(Uri.from_str("ens/hello.eth"), {"hello": "world"}) + .build() + ) + + assert config.envs[Uri.from_str("ens/hello.eth")]["hello"] == "world"