Skip to content

Commit a77b010

Browse files
committed
Merge remote-tracking branch 'origin/main' into feat/uri-resolution-impl
2 parents 88eb118 + 0f46d50 commit a77b010

12 files changed

Lines changed: 67 additions & 95 deletions

File tree

packages/polywrap-client/polywrap_client/client.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,18 @@
22

33
from dataclasses import dataclass
44
from textwrap import dedent
5-
from typing import Any, List, Optional, Union, cast
5+
from typing import Any, Dict, List, Optional, Union, cast
66

77
from polywrap_core import (
88
Client,
99
ClientConfig,
10-
Env,
11-
GetEnvsOptions,
1210
GetFileOptions,
1311
GetManifestOptions,
14-
InterfaceImplementations,
1512
InvokerOptions,
1613
IUriResolutionContext,
1714
IUriResolver,
1815
TryResolveUriOptions,
16+
Env,
1917
Uri,
2018
UriPackage,
2119
UriPackageOrWrapper,
@@ -48,24 +46,25 @@ def get_config(self):
4846
def get_uri_resolver(self) -> IUriResolver:
4947
return self._config.resolver
5048

51-
def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]:
52-
return self._config.envs
49+
def get_envs(self) -> Dict[Uri, Env]:
50+
envs: Dict[Uri, Env] = self._config.envs
51+
return envs
5352

54-
def get_interfaces(self) -> List[InterfaceImplementations]:
55-
return self._config.interfaces
53+
def get_interfaces(self) -> Dict[Uri, List[Uri]]:
54+
interfaces: Dict[Uri, List[Uri]] = self._config.interfaces
55+
return interfaces
5656

57-
def get_implementations(self, uri: Uri) -> Result[List[Uri]]:
58-
if interface_implementations := next(
59-
filter(lambda x: x.interface == uri, self._config.interfaces), None
60-
):
61-
return Ok(interface_implementations.implementations)
57+
def get_implementations(self, uri: Uri) -> Result[Union[List[Uri], None]]:
58+
interfaces: Dict[Uri, List[Uri]] = self.get_interfaces()
59+
if interfaces.get(uri):
60+
return Ok(interfaces.get(uri))
6261
else:
6362
return Err.from_str(f"Unable to find implementations for uri: {uri}")
6463

6564
def get_env_by_uri(
66-
self, uri: Uri, options: Optional[GetEnvsOptions] = None
65+
self, uri: Uri
6766
) -> Union[Env, None]:
68-
return next(filter(lambda env: env.uri == uri, self.get_envs()), None)
67+
return self._config.envs.get(uri)
6968

7069
async def get_file(
7170
self, uri: Uri, options: GetFileOptions
@@ -136,9 +135,7 @@ async def invoke(self, options: InvokerOptions) -> Result[Any]:
136135
if wrapper_result.is_err():
137136
return cast(Err, wrapper_result)
138137
wrapper = wrapper_result.unwrap()
139-
140-
env = self.get_env_by_uri(options.uri)
141-
options.env = options.env or (env.env if env else None)
138+
options.env = options.env or self.get_env_by_uri(options.uri)
142139

143140
result = await wrapper.invoke(options, invoker=self)
144141
if result.is_err():

packages/polywrap-client/tests/test_client.py

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import pytest
22
from pathlib import Path
3-
4-
from polywrap_client import PolywrapClient
5-
from polywrap_core import Uri, InvokerOptions, InterfaceImplementations, Env, UriWrapper
3+
import pytest
4+
from polywrap_client import PolywrapClient, PolywrapClientConfig
5+
from polywrap_manifest import deserialize_wrap_manifest
6+
from polywrap_core import Uri, InvokerOptions, UriWrapper
67
from polywrap_uri_resolvers import BaseUriResolver, SimpleFileReader, StaticResolver
78
from polywrap_result import Result, Ok, Err
8-
from polywrap_client.client import PolywrapClientConfig
99
from polywrap_wasm import WRAP_MANIFEST_PATH, WRAP_MODULE_PATH, IFileReader, WasmWrapper
1010

1111
@pytest.fixture
@@ -51,10 +51,12 @@ async def test_invoke(
5151

5252
assert result.unwrap() == args["arg"]
5353

54+
manifest = deserialize_wrap_manifest(simple_wrap_manifest).unwrap()
55+
5456
wrapper = WasmWrapper(
5557
file_reader=simple_file_reader,
5658
wasm_module=simple_wrap_module,
57-
manifest=simple_wrap_manifest
59+
manifest=manifest
5860
)
5961
uri_wrapper = UriWrapper(uri=Uri("ens/wrapper.eth"), wrapper=wrapper)
6062
resolver = StaticResolver.from_list([uri_wrapper]).unwrap()
@@ -83,7 +85,7 @@ async def test_subinvoke():
8385
},
8486
)
8587

86-
client = PolywrapClient(config=PolywrapClientConfig(envs=[], resolver=uri_resolver))
88+
client = PolywrapClient(config=PolywrapClientConfig(resolver=uri_resolver))
8789
uri = Uri(
8890
f'fs/{Path(__file__).parent.joinpath("cases", "simple-subinvoke", "invoke").absolute()}'
8991
)
@@ -100,19 +102,15 @@ async def test_interface_implementation():
100102
redirects={},
101103
)
102104

105+
interface_uri = Uri("ens/interface.eth")
103106
impl_uri = Uri(
104107
f'fs/{Path(__file__).parent.joinpath("cases", "simple-interface", "implementation").absolute()}'
105108
)
106109

107110
client = PolywrapClient(
108111
config=PolywrapClientConfig(
109-
envs=[],
110112
resolver=uri_resolver,
111-
interfaces=[
112-
InterfaceImplementations(
113-
interface=Uri("ens/interface.eth"), implementations=[impl_uri]
114-
)
115-
],
113+
interfaces= {interface_uri : [impl_uri]}
116114
)
117115
)
118116
uri = Uri(
@@ -123,10 +121,26 @@ async def test_interface_implementation():
123121
uri=uri, method="moduleMethod", args=args, encode_result=False
124122
)
125123
result = await client.invoke(options)
126-
124+
assert client.get_implementations(interface_uri) == Ok([impl_uri])
127125
assert result.unwrap() == {"str": "hello", "uint8": 2}
128126

129127

128+
def test_get_env_by_uri():
129+
uri_resolver = BaseUriResolver(
130+
file_reader=SimpleFileReader(),
131+
redirects={},
132+
)
133+
uri = Uri(f'fs/{Path(__file__).parent.joinpath("cases", "simple-env").absolute()}')
134+
env = {"externalArray": [1, 2, 3], "externalString": "hello"}
135+
136+
client = PolywrapClient(
137+
config=PolywrapClientConfig(
138+
envs={uri: env},
139+
resolver=uri_resolver,
140+
)
141+
)
142+
assert client.get_env_by_uri(uri) == env
143+
130144
async def test_env():
131145
uri_resolver = BaseUriResolver(
132146
file_reader=SimpleFileReader(),
@@ -138,13 +152,14 @@ async def test_env():
138152

139153
client = PolywrapClient(
140154
config=PolywrapClientConfig(
141-
envs=[Env(uri=uri, env=env)],
155+
envs={uri: env},
142156
resolver=uri_resolver,
143157
)
144158
)
145159
options = InvokerOptions(
146-
uri=uri, method="externalEnvMethod", args={}, encode_result=False
160+
uri=uri, method="externalEnvMethod", args={}, encode_result=False,
147161
)
162+
148163
result = await client.invoke(options)
149164

150165
assert result.unwrap() == env

packages/polywrap-client/tests/test_sha3.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ async def test_invoke_sha3_512():
1919
result = await client.invoke(options)
2020
s = hashlib.sha512()
2121
s.update(b"hello polywrap!")
22-
print(result)
2322
assert result.result == s.digest()
2423

2524
@pytest.mark.skip(reason="can't invoke sha3 wrapper due to an error related to wasmtime")
@@ -90,7 +89,6 @@ async def test_invoke_hex_keccak_256():
9089
async def test_invoke_buffer_keccak_256():
9190
options = InvokerOptions(uri=uri, method="buffer_keccak_256", args=args, encode_result=False)
9291
result = await client.invoke(options)
93-
print(result)
9492
# TODO: Not sure exactly what this function `buffer_keccak_256` is doing in order to assert it properly
9593
assert result.result == False
9694

packages/polywrap-core/polywrap_core/types/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from .client import *
2-
from .env import *
32
from .file_reader import *
43
from .invoke import *
54
from .uri import *

packages/polywrap-core/polywrap_core/types/client.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,24 @@
22

33
from abc import abstractmethod
44
from dataclasses import dataclass, field
5-
from typing import List, Optional, Union
5+
from typing import List, Optional, Union, Dict
66

77
from polywrap_manifest import AnyWrapManifest, DeserializeManifestOptions
88
from polywrap_result import Result
99

10-
from .env import Env
11-
from .interface_implementation import InterfaceImplementations
1210
from .invoke import Invoker
1311
from .uri import Uri
12+
from .env import Env
1413
from .uri_resolver import IUriResolver
1514
from .uri_resolver_handler import UriResolverHandler
1615

17-
1816
@dataclass(slots=True, kw_only=True)
1917
class ClientConfig:
20-
envs: List[Env] = field(default_factory=list)
21-
interfaces: List[InterfaceImplementations] = field(default_factory=list)
18+
envs: Dict[Uri, Env] = field(default_factory=dict)
19+
interfaces: Dict[Uri, List[Uri]] = field(default_factory=dict)
2220
resolver: IUriResolver
2321

2422

25-
@dataclass(slots=True, kw_only=True)
26-
class GetEnvsOptions:
27-
pass
28-
29-
3023
@dataclass(slots=True, kw_only=True)
3124
class GetFileOptions:
3225
path: str
@@ -40,16 +33,16 @@ class GetManifestOptions(DeserializeManifestOptions):
4033

4134
class Client(Invoker, UriResolverHandler):
4235
@abstractmethod
43-
def get_interfaces(self) -> List[InterfaceImplementations]:
36+
def get_interfaces(self) -> Dict[Uri, List[Uri]]:
4437
pass
4538

4639
@abstractmethod
47-
def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]:
40+
def get_envs(self) -> Dict[Uri, Env]:
4841
pass
4942

5043
@abstractmethod
5144
def get_env_by_uri(
52-
self, uri: Uri, options: Optional[GetEnvsOptions] = None
45+
self, uri: Uri
5346
) -> Union[Env, None]:
5447
pass
5548

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,3 @@
1-
from __future__ import annotations
2-
3-
from dataclasses import dataclass, field
41
from typing import Any, Dict
52

6-
from .uri import Uri
7-
8-
9-
@dataclass(slots=True, kw_only=True)
10-
class Env:
11-
"""
12-
this type can be used to set env for a wrapper in the client
13-
14-
Args:
15-
uri: Uri of wrapper
16-
env: env variables used by the module
17-
"""
18-
19-
uri: Uri
20-
env: Dict[str, Any] = field(default_factory=dict)
3+
Env = Dict[str, Any]

packages/polywrap-core/polywrap_core/types/interface_implementation.py

Lines changed: 0 additions & 12 deletions
This file was deleted.

packages/polywrap-core/polywrap_core/types/invoke.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from polywrap_result import Result
88

99
from .uri import Uri
10+
from .env import Env
1011
from .uri_resolution_context import IUriResolutionContext
1112

1213

@@ -26,7 +27,7 @@ class InvokeOptions:
2627
uri: Uri
2728
method: str
2829
args: Optional[Union[Dict[str, Any], bytes]] = field(default_factory=dict)
29-
env: Optional[Dict[str, Any]] = None
30+
env: Optional[Env] = None
3031
resolution_context: Optional[IUriResolutionContext] = None
3132

3233

@@ -55,7 +56,7 @@ async def invoke(self, options: InvokerOptions) -> Result[Any]:
5556
pass
5657

5758
@abstractmethod
58-
def get_implementations(self, uri: Uri) -> Result[List[Uri]]:
59+
def get_implementations(self, uri: Uri) -> Result[Union[List[Uri], None]]:
5960
pass
6061

6162

packages/polywrap-core/polywrap_core/types/wasm_package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
class IWasmPackage(IWrapPackage, ABC):
88
@abstractmethod
9-
async def get_wasm_module() -> Result[bytearray]:
9+
async def get_wasm_module() -> Result[bytes]:
1010
pass
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from typing import List, Union
1+
from typing import List, Union, Dict, Any
22

33
from ..types import Client, Env, Uri
44

55

66
def get_env_from_uri_history(
77
uri_history: List[Uri], client: Client
8-
) -> Union[Env, None]:
8+
) -> Union[Dict[str, Any], None]:
99
for uri in uri_history:
1010
return client.get_env_by_uri(uri)

0 commit comments

Comments
 (0)