diff --git a/packages/config-bundles/polywrap-sys-config-bundle/poetry.lock b/packages/config-bundles/polywrap-sys-config-bundle/poetry.lock index d40e2ca5..6527c2c0 100644 --- a/packages/config-bundles/polywrap-sys-config-bundle/poetry.lock +++ b/packages/config-bundles/polywrap-sys-config-bundle/poetry.lock @@ -1162,13 +1162,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -1177,7 +1177,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/config-bundles/polywrap-web3-config-bundle/poetry.lock b/packages/config-bundles/polywrap-web3-config-bundle/poetry.lock index 6c29c50f..5e21c882 100644 --- a/packages/config-bundles/polywrap-web3-config-bundle/poetry.lock +++ b/packages/config-bundles/polywrap-web3-config-bundle/poetry.lock @@ -2523,13 +2523,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -2538,7 +2538,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/plugins/polywrap-ethereum-wallet/poetry.lock b/packages/plugins/polywrap-ethereum-wallet/poetry.lock index 505d1cab..7df47f8b 100644 --- a/packages/plugins/polywrap-ethereum-wallet/poetry.lock +++ b/packages/plugins/polywrap-ethereum-wallet/poetry.lock @@ -2379,13 +2379,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -2394,7 +2394,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/plugins/polywrap-fs-plugin/poetry.lock b/packages/plugins/polywrap-fs-plugin/poetry.lock index 1bd27a51..50fe6d2e 100644 --- a/packages/plugins/polywrap-fs-plugin/poetry.lock +++ b/packages/plugins/polywrap-fs-plugin/poetry.lock @@ -1024,13 +1024,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -1039,7 +1039,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/plugins/polywrap-http-plugin/poetry.lock b/packages/plugins/polywrap-http-plugin/poetry.lock index 7cfb7037..10bb9140 100644 --- a/packages/plugins/polywrap-http-plugin/poetry.lock +++ b/packages/plugins/polywrap-http-plugin/poetry.lock @@ -1256,13 +1256,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -1271,7 +1271,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-client-config-builder/poetry.lock b/packages/polywrap-client-config-builder/poetry.lock index adb9ef41..f7a38a19 100644 --- a/packages/polywrap-client-config-builder/poetry.lock +++ b/packages/polywrap-client-config-builder/poetry.lock @@ -2553,13 +2553,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -2568,7 +2568,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-client/poetry.lock b/packages/polywrap-client/poetry.lock index 87d68859..f200a441 100644 --- a/packages/polywrap-client/poetry.lock +++ b/packages/polywrap-client/poetry.lock @@ -2570,13 +2570,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -2585,7 +2585,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-client/polywrap_client/client.py b/packages/polywrap-client/polywrap_client/client.py index d5ed08b2..a8ead399 100644 --- a/packages/polywrap-client/polywrap_client/client.py +++ b/packages/polywrap-client/polywrap_client/client.py @@ -20,7 +20,7 @@ from polywrap_manifest import AnyWrapManifest, DeserializeManifestOptions from polywrap_msgpack import msgpack_decode, msgpack_encode -from polywrap_client.errors import WrapNotFoundError +from .errors import WrapNotFoundError class PolywrapClient(Client): @@ -222,7 +222,20 @@ def invoke( """ resolution_context = resolution_context or UriResolutionContext() load_wrapper_context = resolution_context.create_sub_history_context() - wrapper = self.load_wrapper(uri, resolution_context=load_wrapper_context) + + try: + wrapper = self.load_wrapper(uri, resolution_context=load_wrapper_context) + except Exception as err: + resolution_context.track_step( + UriResolutionStep( + source_uri=uri, + result=uri, + description=f"Client.load_wrapper - Error: {err.__class__.__name__}", + sub_history=load_wrapper_context.get_history(), + ) + ) + raise err + wrapper_resolution_path = load_wrapper_context.get_resolution_path() wrapper_resolved_uri = wrapper_resolution_path[-1] @@ -241,14 +254,25 @@ def invoke( wrapper_invoke_context = resolution_context.create_sub_history_context() - invocable_result = wrapper.invoke( - uri=wrapper_resolved_uri, - method=method, - args=args, - env=env, - resolution_context=wrapper_invoke_context, - client=self, - ) + try: + invocable_result = wrapper.invoke( + uri=wrapper_resolved_uri, + method=method, + args=args, + env=env, + resolution_context=wrapper_invoke_context, + client=self, + ) + except Exception as err: + resolution_context.track_step( + UriResolutionStep( + source_uri=wrapper_resolved_uri, + result=wrapper_resolved_uri, + description=f"Wrapper.invoke - Error: {err.__class__.__name__}", + sub_history=wrapper_invoke_context.get_history(), + ) + ) + raise err resolution_context.track_step( UriResolutionStep( diff --git a/packages/polywrap-client/pyproject.toml b/packages/polywrap-client/pyproject.toml index c70e50c7..152f47f7 100644 --- a/packages/polywrap-client/pyproject.toml +++ b/packages/polywrap-client/pyproject.toml @@ -53,6 +53,7 @@ testpaths = [ [tool.pylint] disable = [ "too-many-arguments", + "too-many-locals", ] ignore = [ "tests/" diff --git a/packages/polywrap-core/poetry.lock b/packages/polywrap-core/poetry.lock index 234d773d..a86836d4 100644 --- a/packages/polywrap-core/poetry.lock +++ b/packages/polywrap-core/poetry.lock @@ -891,13 +891,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -906,7 +906,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-manifest/poetry.lock b/packages/polywrap-manifest/poetry.lock index 3f7d326a..4220bac5 100644 --- a/packages/polywrap-manifest/poetry.lock +++ b/packages/polywrap-manifest/poetry.lock @@ -1620,13 +1620,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -1635,7 +1635,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-msgpack/poetry.lock b/packages/polywrap-msgpack/poetry.lock index faf0b440..be5fd8de 100644 --- a/packages/polywrap-msgpack/poetry.lock +++ b/packages/polywrap-msgpack/poetry.lock @@ -997,13 +997,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -1012,7 +1012,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-plugin/poetry.lock b/packages/polywrap-plugin/poetry.lock index 9f18bace..9c0ee6d4 100644 --- a/packages/polywrap-plugin/poetry.lock +++ b/packages/polywrap-plugin/poetry.lock @@ -908,13 +908,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -923,7 +923,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-test-cases/poetry.lock b/packages/polywrap-test-cases/poetry.lock index f34e24b2..5710d4f7 100644 --- a/packages/polywrap-test-cases/poetry.lock +++ b/packages/polywrap-test-cases/poetry.lock @@ -734,13 +734,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -749,7 +749,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-uri-resolvers/poetry.lock b/packages/polywrap-uri-resolvers/poetry.lock index 02144bdb..10317f34 100644 --- a/packages/polywrap-uri-resolvers/poetry.lock +++ b/packages/polywrap-uri-resolvers/poetry.lock @@ -1009,13 +1009,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -1024,7 +1024,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/errors.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/errors.py index c25490d5..ef7ab379 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/errors.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/errors.py @@ -1,8 +1,5 @@ """This module contains all the errors related to URI resolution.""" -import json -from typing import List - -from polywrap_core import Uri, UriResolutionStep, build_clean_uri_history +from polywrap_core import Uri class UriResolutionError(Exception): @@ -14,19 +11,15 @@ class InfiniteLoopError(UriResolutionError): Args: uri (Uri): The URI that caused the infinite loop. - history (List[UriResolutionStep]): The resolution history. """ uri: Uri - history: List[UriResolutionStep] - def __init__(self, uri: Uri, history: List[UriResolutionStep]): + def __init__(self, uri: Uri): """Initialize a new InfiniteLoopError instance.""" self.uri = uri - self.history = history super().__init__( f"An infinite loop was detected while resolving the URI: {uri.uri}\n" - f"History: {json.dumps(build_clean_uri_history(history), indent=2)}" ) @@ -39,19 +32,15 @@ class UriResolverExtensionNotFoundError(UriResolverExtensionError): Args: uri (Uri): The URI that caused the error. - history (List[UriResolutionStep]): The resolution history. """ uri: Uri - history: List[UriResolutionStep] - def __init__(self, uri: Uri, history: List[UriResolutionStep]): + def __init__(self, uri: Uri): """Initialize a new UriResolverExtensionNotFoundError instance.""" self.uri = uri - self.history = history super().__init__( f"Could not find an extension resolver wrapper for the URI: {uri.uri}\n" - f"History: {json.dumps(build_clean_uri_history(history), indent=2)}" ) diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/aggregator/uri_resolver_aggregator_base.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/aggregator/uri_resolver_aggregator_base.py index 53ceafb0..d93abaa4 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/aggregator/uri_resolver_aggregator_base.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/aggregator/uri_resolver_aggregator_base.py @@ -14,6 +14,8 @@ UriWrapper, ) +from ...errors import UriResolutionError + class UriResolverAggregatorBase(UriResolver, ABC): """Defines a base resolver that aggregates a list of resolvers. @@ -57,7 +59,22 @@ def try_resolve_uri( sub_context = resolution_context.create_sub_history_context() for resolver in self.get_resolvers(client, sub_context): - uri_package_or_wrapper = resolver.try_resolve_uri(uri, client, sub_context) + try: + uri_package_or_wrapper = resolver.try_resolve_uri( + uri, client, sub_context + ) + except UriResolutionError as e: + step = UriResolutionStep( + source_uri=uri, + result=uri, + sub_history=sub_context.get_history(), + description=( + f"{self.get_step_description()} - Error: " + f"Failed to resolve uri: {uri}" + ), + ) + resolution_context.track_step(step) + raise e if ( isinstance(uri_package_or_wrapper, (UriPackage, UriWrapper)) or uri_package_or_wrapper != uri diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/resolution_result_cache_resolver.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/resolution_result_cache_resolver.py index cb3dd7d5..4d8f74fe 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/resolution_result_cache_resolver.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/cache/resolution_result_cache_resolver.py @@ -84,23 +84,25 @@ def try_resolve_uri( sub_context = resolution_context.create_sub_history_context() result: UriPackageOrWrapper - if self.cache_errors: - try: - result = self.resolver_to_cache.try_resolve_uri( - uri, - client, - sub_context, - ) - except UriResolutionError as error: - self.cache.set(uri, error) - raise error - else: + try: result = self.resolver_to_cache.try_resolve_uri( uri, client, sub_context, ) self.cache.set(uri, result) + except UriResolutionError as error: + if self.cache_errors: + self.cache.set(uri, error) + resolution_context.track_step( + UriResolutionStep( + source_uri=uri, + result=uri, + sub_history=sub_context.get_history(), + description="ResolutionResultCacheResolver - Error", + ) + ) + raise error resolution_context.track_step( UriResolutionStep( diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extension_wrapper_uri_resolver.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extension_wrapper_uri_resolver.py index 54b09854..1e6076f5 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extension_wrapper_uri_resolver.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/extensions/extension_wrapper_uri_resolver.py @@ -104,14 +104,39 @@ def try_resolve_uri( return uri_package_or_wrapper except WrapError as err: + resolution_context.track_step( + UriResolutionStep( + source_uri=uri, + result=uri, + description=( + f"{self.get_step_description()} - Error: " + f"Failed to resolve uri: {uri}, using extension resolver: " + f"({self.extension_wrapper_uri})" + ), + sub_history=sub_context.get_history(), + ) + ) raise UriResolverExtensionError( f"Failed to resolve uri: {uri}, using extension resolver: " f"({self.extension_wrapper_uri})" ) from err except InfiniteLoopError as err: + resolution_context.track_step( + UriResolutionStep( + source_uri=uri, + result=uri, + description=( + f"{self.get_step_description()} - Error: " + f"Infinite loop detected when resolving uri: {uri}, " + f"using extension resolver: ({self.extension_wrapper_uri})" + ), + sub_history=sub_context.get_history(), + ) + ) + if err.uri == self.extension_wrapper_uri: raise UriResolverExtensionNotFoundError( - self.extension_wrapper_uri, sub_context.get_history() + self.extension_wrapper_uri ) from err raise err diff --git a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/recursive/recursive_resolver.py b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/recursive/recursive_resolver.py index 6b4f05bb..162cf646 100644 --- a/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/recursive/recursive_resolver.py +++ b/packages/polywrap-uri-resolvers/polywrap_uri_resolvers/resolvers/recursive/recursive_resolver.py @@ -45,7 +45,7 @@ def try_resolve_uri( UriPackageOrWrapper: The resolved URI. """ if resolution_context.is_resolving(uri): - raise InfiniteLoopError(uri, resolution_context.get_history()) + raise InfiniteLoopError(uri) resolution_context.start_resolving(uri) diff --git a/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/histories/not_found_extension.py b/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/histories/not_found_extension.py index 22dcd12b..c9aafbc9 100644 --- a/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/histories/not_found_extension.py +++ b/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/histories/not_found_extension.py @@ -1,12 +1,15 @@ EXPECTED = [ - 'wrap://test/not-a-match => UriResolverAggregator => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n "wrap://test/undefined-resolver => UriResolverAggregator"\n])', + "wrap://test/not-a-match => UriResolverAggregator - Error: Failed to resolve uri: wrap://test/not-a-match", [ - 'wrap://test/not-a-match => ExtendableUriResolver => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n "wrap://test/undefined-resolver => UriResolverAggregator"\n])', + "wrap://test/not-a-match => ExtendableUriResolver - Error: Failed to resolve uri: wrap://test/not-a-match", [ - 'wrap://test/not-a-match => ResolverExtension (wrap://test/undefined-resolver) => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n "wrap://test/undefined-resolver => UriResolverAggregator"\n])', + "wrap://test/not-a-match => ResolverExtension (wrap://test/undefined-resolver) - Error: Failed to resolve uri: wrap://test/not-a-match, using extension resolver: (wrap://test/undefined-resolver)", [ - 'wrap://test/undefined-resolver => Client.loadWrapper => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n "wrap://test/undefined-resolver => UriResolverAggregator"\n])', - ["wrap://test/undefined-resolver => UriResolverAggregator"], + "wrap://test/undefined-resolver => Client.load_wrapper - Error: WrapNotFoundError", + [ + "wrap://test/undefined-resolver => UriResolverAggregator", + ["wrap://test/undefined-resolver => ExtendableUriResolver"], + ], ], ], ], diff --git a/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/test_not_found_extension.py b/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/test_not_found_extension.py index db4aec3e..df169e89 100644 --- a/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/test_not_found_extension.py +++ b/packages/polywrap-uri-resolvers/tests/integration/extension_resolver/test_not_found_extension.py @@ -3,6 +3,7 @@ ClientConfig, Uri, UriResolutionContext, + build_clean_uri_history, ) from polywrap_uri_resolvers import ( ExtendableUriResolver, @@ -10,6 +11,7 @@ UriResolverAggregator, UriResolverExtensionError, ) +import json import pytest @@ -42,3 +44,6 @@ def test_can_resolve_uri_with_plugin_extension(client: PolywrapClient) -> None: client.try_resolve_uri( uri=source_uri, resolution_context=resolution_context ) + + from .histories.not_found_extension import EXPECTED + assert build_clean_uri_history(resolution_context.get_history()) == EXPECTED diff --git a/packages/polywrap-wasm/poetry.lock b/packages/polywrap-wasm/poetry.lock index b26138b4..55f1c206 100644 --- a/packages/polywrap-wasm/poetry.lock +++ b/packages/polywrap-wasm/poetry.lock @@ -908,13 +908,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -923,7 +923,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] diff --git a/packages/polywrap/poetry.lock b/packages/polywrap/poetry.lock index 99d8ff66..425822f6 100644 --- a/packages/polywrap/poetry.lock +++ b/packages/polywrap/poetry.lock @@ -2575,13 +2575,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, ] [package.dependencies] @@ -2590,7 +2590,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]]