From 13037190cdc42b9ad747a366536eff6bd1aaaa49 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 8 Nov 2022 10:47:19 +0100 Subject: [PATCH 1/5] wip: ClientConfig refactor into Dicts instead of list --- .../polywrap-client/polywrap_client/client.py | 2 ++ packages/polywrap-client/tests/test_client.py | 21 +++++++++++-------- .../polywrap_core/types/client.py | 7 ++++--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/polywrap-client/polywrap_client/client.py b/packages/polywrap-client/polywrap_client/client.py index 0cb96ebe..cd49d71e 100644 --- a/packages/polywrap-client/polywrap_client/client.py +++ b/packages/polywrap-client/polywrap_client/client.py @@ -40,6 +40,8 @@ class PolywrapClient(Client): def __init__(self, config: Optional[PolywrapClientConfig] = None): # TODO: this is naive solution need to use polywrap-client-config-builder once we have it self._config = config or PolywrapClientConfig( + envs={}, + interfaces={}, resolver=FsUriResolver(file_reader=SimpleFileReader()) ) diff --git a/packages/polywrap-client/tests/test_client.py b/packages/polywrap-client/tests/test_client.py index fcb3c8db..ebc9dca4 100644 --- a/packages/polywrap-client/tests/test_client.py +++ b/packages/polywrap-client/tests/test_client.py @@ -31,7 +31,7 @@ async def test_subinvoke(): }, ) - client = PolywrapClient(config=PolywrapClientConfig(envs=[], resolver=uri_resolver)) + client = PolywrapClient(config=PolywrapClientConfig(envs={}, interfaces={}, resolver=uri_resolver)) uri = Uri( f'fs/{Path(__file__).parent.joinpath("cases", "simple-subinvoke", "invoke").absolute()}' ) @@ -54,14 +54,15 @@ async def test_interface_implementation(): client = PolywrapClient( config=PolywrapClientConfig( - envs=[], + envs={}, + interfaces={ + InterfaceImplementations( + interface=Uri("ens/interface.eth"), implementations=[impl_uri] + ) + }, resolver=uri_resolver, - interfaces=[ - InterfaceImplementations( - interface=Uri("ens/interface.eth"), implementations=[impl_uri] - ) - ], - ) + ) + ) uri = Uri( f'fs/{Path(__file__).parent.joinpath("cases", "simple-interface", "wrapper").absolute()}' @@ -86,13 +87,15 @@ async def test_env(): client = PolywrapClient( config=PolywrapClientConfig( - envs=[Env(uri=uri, env=env)], + envs={uri: env}, resolver=uri_resolver, + interfaces={} ) ) options = InvokerOptions( uri=uri, method="externalEnvMethod", args={}, encode_result=False ) + print(client._config__) result = await client.invoke(options) assert result.unwrap() == env diff --git a/packages/polywrap-core/polywrap_core/types/client.py b/packages/polywrap-core/polywrap_core/types/client.py index 46845bac..1c5d2ea2 100644 --- a/packages/polywrap-core/polywrap_core/types/client.py +++ b/packages/polywrap-core/polywrap_core/types/client.py @@ -2,7 +2,7 @@ from abc import abstractmethod from dataclasses import dataclass, field -from typing import List, Optional, Union +from typing import List, Optional, Union, Dict, Any from polywrap_manifest import AnyWrapManifest, DeserializeManifestOptions from polywrap_result import Result @@ -17,8 +17,9 @@ @dataclass(slots=True, kw_only=True) class ClientConfig: - envs: List[Env] = field(default_factory=list) - interfaces: List[InterfaceImplementations] = field(default_factory=list) + # TODO this is naive solution, the `Any` type should be more specific (str | Uri | int, etc.) + envs: Dict[Uri, Env: Dict[str, Any]] = field(default_factory=dict) + interfaces: Dict[Uri, List[Uri]] resolver: IUriResolver From 33a7103b9fe1c0271ff7fe8b5a3817f70d507f25 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 8 Nov 2022 10:48:57 +0100 Subject: [PATCH 2/5] wip: ClientConfig data structure improvements --- packages/polywrap-client/tests/test_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/polywrap-client/tests/test_client.py b/packages/polywrap-client/tests/test_client.py index ebc9dca4..017505d6 100644 --- a/packages/polywrap-client/tests/test_client.py +++ b/packages/polywrap-client/tests/test_client.py @@ -95,7 +95,7 @@ async def test_env(): options = InvokerOptions( uri=uri, method="externalEnvMethod", args={}, encode_result=False ) - print(client._config__) + print(client._config) result = await client.invoke(options) assert result.unwrap() == env From 4069cf8f840872a7489ba00ee41f1d3d84088464 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 8 Nov 2022 11:52:56 +0100 Subject: [PATCH 3/5] wip: clientconfig refactor: some implementations and env error in tests --- packages/polywrap-client/polywrap_client/client.py | 9 +++++---- packages/polywrap-client/tests/test_client.py | 13 ++++++------- .../polywrap-core/polywrap_core/types/client.py | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/polywrap-client/polywrap_client/client.py b/packages/polywrap-client/polywrap_client/client.py index cd49d71e..18dcc97e 100644 --- a/packages/polywrap-client/polywrap_client/client.py +++ b/packages/polywrap-client/polywrap_client/client.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from textwrap import dedent -from typing import Any, List, Optional, Union, cast +from typing import Any, List, Optional, Union, cast, Dict from polywrap_core import ( Client, @@ -53,7 +53,7 @@ def get_uri_resolver( ) -> IUriResolver: return self._config.resolver - def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]: + def get_envs(self, options: Optional[GetEnvsOptions] = None) -> Dict[Uri, List[Uri]]: return self._config.envs def get_interfaces(self) -> List[InterfaceImplementations]: @@ -61,9 +61,10 @@ def get_interfaces(self) -> List[InterfaceImplementations]: def get_implementations(self, uri: Uri) -> Result[List[Uri]]: if interface_implementations := next( - filter(lambda x: x.interface == uri, self._config.interfaces), None + filter(lambda x: x == uri, self._config.interfaces[uri]), None ): - return Ok(interface_implementations.implementations) + print(interface_implementations) + return Ok(interface_implementations) else: return Err.from_str(f"Unable to find implementations for uri: {uri}") diff --git a/packages/polywrap-client/tests/test_client.py b/packages/polywrap-client/tests/test_client.py index 017505d6..5e461bdf 100644 --- a/packages/polywrap-client/tests/test_client.py +++ b/packages/polywrap-client/tests/test_client.py @@ -5,7 +5,7 @@ from polywrap_uri_resolvers import BaseUriResolver, SimpleFileReader from polywrap_client.client import PolywrapClientConfig - +import pytest async def test_invoke(): client = PolywrapClient() @@ -41,7 +41,7 @@ async def test_subinvoke(): assert result.unwrap() == "1 + 2 = 3" - +@pytest.mark.skip(reason="Exception: Unable to find implementations for uri: wrap://ens/interface.eth") async def test_interface_implementation(): uri_resolver = BaseUriResolver( file_reader=SimpleFileReader(), @@ -54,11 +54,10 @@ async def test_interface_implementation(): client = PolywrapClient( config=PolywrapClientConfig( - envs={}, + envs={Uri('wrap://ens/interface.eth'): {'environment_variable', 'test'}}, interfaces={ - InterfaceImplementations( - interface=Uri("ens/interface.eth"), implementations=[impl_uri] - ) + Uri("wrap://ens/interface.eth"): + [impl_uri] }, resolver=uri_resolver, ) @@ -75,7 +74,7 @@ async def test_interface_implementation(): assert result.unwrap() == {"str": "hello", "uint8": 2} - +@pytest.mark.skip(reason="Message: __wrap_abort: Missing required property: 'externalArray: [UInt32]'") async def test_env(): uri_resolver = BaseUriResolver( file_reader=SimpleFileReader(), diff --git a/packages/polywrap-core/polywrap_core/types/client.py b/packages/polywrap-core/polywrap_core/types/client.py index 1c5d2ea2..b1da0cfb 100644 --- a/packages/polywrap-core/polywrap_core/types/client.py +++ b/packages/polywrap-core/polywrap_core/types/client.py @@ -17,7 +17,7 @@ @dataclass(slots=True, kw_only=True) class ClientConfig: - # TODO this is naive solution, the `Any` type should be more specific (str | Uri | int, etc.) + # TODO is this a naive solution? the `Any` type should be more specific (str | Uri | int, etc.) envs: Dict[Uri, Env: Dict[str, Any]] = field(default_factory=dict) interfaces: Dict[Uri, List[Uri]] resolver: IUriResolver From b18555130bab782ebee7c24ce9f1909f272ed7b5 Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 8 Nov 2022 12:22:15 +0100 Subject: [PATCH 4/5] typecheck fix --- packages/polywrap-core/polywrap_core/types/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/polywrap-core/polywrap_core/types/client.py b/packages/polywrap-core/polywrap_core/types/client.py index b1da0cfb..11135c5f 100644 --- a/packages/polywrap-core/polywrap_core/types/client.py +++ b/packages/polywrap-core/polywrap_core/types/client.py @@ -18,7 +18,7 @@ @dataclass(slots=True, kw_only=True) class ClientConfig: # TODO is this a naive solution? the `Any` type should be more specific (str | Uri | int, etc.) - envs: Dict[Uri, Env: Dict[str, Any]] = field(default_factory=dict) + envs: Dict[Uri, Dict[str, Any]] = field(default_factory=dict) interfaces: Dict[Uri, List[Uri]] resolver: IUriResolver From e2f0b9f24d74044cc71907bfb03643f9632efa9d Mon Sep 17 00:00:00 2001 From: DaoAdvocate <12145726+rihp@users.noreply.github.com> Date: Tue, 8 Nov 2022 12:24:00 +0100 Subject: [PATCH 5/5] typechecks --- packages/polywrap-client/polywrap_client/client.py | 3 ++- packages/polywrap-client/tests/test_client.py | 4 ++-- packages/polywrap-wasm/polywrap_wasm/imports.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/polywrap-client/polywrap_client/client.py b/packages/polywrap-client/polywrap_client/client.py index 18dcc97e..5f2c8bae 100644 --- a/packages/polywrap-client/polywrap_client/client.py +++ b/packages/polywrap-client/polywrap_client/client.py @@ -61,7 +61,8 @@ def get_interfaces(self) -> List[InterfaceImplementations]: def get_implementations(self, uri: Uri) -> Result[List[Uri]]: if interface_implementations := next( - filter(lambda x: x == uri, self._config.interfaces[uri]), None + filter(lambda x: x == uri, + self._config.interfaces), None ): print(interface_implementations) return Ok(interface_implementations) diff --git a/packages/polywrap-client/tests/test_client.py b/packages/polywrap-client/tests/test_client.py index 5e461bdf..2c9b03b6 100644 --- a/packages/polywrap-client/tests/test_client.py +++ b/packages/polywrap-client/tests/test_client.py @@ -41,7 +41,7 @@ async def test_subinvoke(): assert result.unwrap() == "1 + 2 = 3" -@pytest.mark.skip(reason="Exception: Unable to find implementations for uri: wrap://ens/interface.eth") +# @pytest.mark.skip(reason="Exception: Unable to find implementations for uri: wrap://ens/interface.eth") async def test_interface_implementation(): uri_resolver = BaseUriResolver( file_reader=SimpleFileReader(), @@ -74,7 +74,7 @@ async def test_interface_implementation(): assert result.unwrap() == {"str": "hello", "uint8": 2} -@pytest.mark.skip(reason="Message: __wrap_abort: Missing required property: 'externalArray: [UInt32]'") +# @pytest.mark.skip(reason="Message: __wrap_abort: Missing required property: 'externalArray: [UInt32]'") async def test_env(): uri_resolver = BaseUriResolver( file_reader=SimpleFileReader(), diff --git a/packages/polywrap-wasm/polywrap_wasm/imports.py b/packages/polywrap-wasm/polywrap_wasm/imports.py index f4ce2172..55ca7b47 100644 --- a/packages/polywrap-wasm/polywrap_wasm/imports.py +++ b/packages/polywrap-wasm/polywrap_wasm/imports.py @@ -316,7 +316,7 @@ def wrap_get_implementations(uri_ptr: int, uri_len: int) -> bool: raise WasmAbortError( f"failed calling invoker.get_implementations({repr(Uri(uri))})" ) from result.unwrap_err() - implementations: List[str] = [uri.uri for uri in result.unwrap()] + implementations: List[Uri] = [uri.uri for uri in result.unwrap()] state.get_implementations_result = msgpack_encode(implementations) return len(implementations) > 0