Skip to content

Commit 0f46d50

Browse files
authored
Merge pull request #44 from polywrap/rihp/fix/test_env
refactor: env and interfaces from ClientConfig base class
2 parents 154f5eb + 55246d3 commit 0f46d50

10 files changed

Lines changed: 55 additions & 88 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,21 +2,19 @@
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,
1412
GetUriResolversOptions,
15-
InterfaceImplementations,
1613
InvokerOptions,
1714
IUriResolutionContext,
1815
IUriResolver,
1916
TryResolveUriOptions,
17+
Env,
2018
Uri,
2119
UriPackage,
2220
UriPackageOrWrapper,
@@ -51,24 +49,25 @@ def get_uri_resolver(
5149
) -> IUriResolver:
5250
return self._config.resolver
5351

54-
def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]:
55-
return self._config.envs
52+
def get_envs(self) -> Dict[Uri, Env]:
53+
envs: Dict[Uri, Env] = self._config.envs
54+
return envs
5655

57-
def get_interfaces(self) -> List[InterfaceImplementations]:
58-
return self._config.interfaces
56+
def get_interfaces(self) -> Dict[Uri, List[Uri]]:
57+
interfaces: Dict[Uri, List[Uri]] = self._config.interfaces
58+
return interfaces
5959

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

6867
def get_env_by_uri(
69-
self, uri: Uri, options: Optional[GetEnvsOptions] = None
68+
self, uri: Uri
7069
) -> Union[Env, None]:
71-
return next(filter(lambda env: env.uri == uri, self.get_envs()), None)
70+
return self._config.envs.get(uri)
7271

7372
async def get_file(
7473
self, uri: Uri, options: GetFileOptions
@@ -139,9 +138,7 @@ async def invoke(self, options: InvokerOptions) -> Result[Any]:
139138
if wrapper_result.is_err():
140139
return cast(Err, wrapper_result)
141140
wrapper = wrapper_result.unwrap()
142-
143-
env = self.get_env_by_uri(options.uri)
144-
options.env = options.env or (env.env if env else None)
141+
options.env = options.env or self.get_env_by_uri(options.uri)
145142

146143
result = await wrapper.invoke(options, invoker=self)
147144
if result.is_err():

packages/polywrap-client/tests/test_client.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from pathlib import Path
2-
2+
import pytest
33
from polywrap_client import PolywrapClient
4-
from polywrap_core import Uri, InvokerOptions, InterfaceImplementations, Env
4+
from polywrap_core import Uri, InvokerOptions
55
from polywrap_uri_resolvers import BaseUriResolver, SimpleFileReader
6-
6+
from polywrap_result import Ok
77
from polywrap_client.client import PolywrapClientConfig
88

99

@@ -31,7 +31,7 @@ async def test_subinvoke():
3131
},
3232
)
3333

34-
client = PolywrapClient(config=PolywrapClientConfig(envs=[], resolver=uri_resolver))
34+
client = PolywrapClient(config=PolywrapClientConfig(resolver=uri_resolver))
3535
uri = Uri(
3636
f'fs/{Path(__file__).parent.joinpath("cases", "simple-subinvoke", "invoke").absolute()}'
3737
)
@@ -48,19 +48,15 @@ async def test_interface_implementation():
4848
redirects={},
4949
)
5050

51+
interface_uri = Uri("ens/interface.eth")
5152
impl_uri = Uri(
5253
f'fs/{Path(__file__).parent.joinpath("cases", "simple-interface", "implementation").absolute()}'
5354
)
5455

5556
client = PolywrapClient(
5657
config=PolywrapClientConfig(
57-
envs=[],
5858
resolver=uri_resolver,
59-
interfaces=[
60-
InterfaceImplementations(
61-
interface=Uri("ens/interface.eth"), implementations=[impl_uri]
62-
)
63-
],
59+
interfaces= {interface_uri : [impl_uri]}
6460
)
6561
)
6662
uri = Uri(
@@ -71,10 +67,26 @@ async def test_interface_implementation():
7167
uri=uri, method="moduleMethod", args=args, encode_result=False
7268
)
7369
result = await client.invoke(options)
74-
70+
assert client.get_implementations(interface_uri) == Ok([impl_uri])
7571
assert result.unwrap() == {"str": "hello", "uint8": 2}
7672

7773

74+
def test_get_env_by_uri():
75+
uri_resolver = BaseUriResolver(
76+
file_reader=SimpleFileReader(),
77+
redirects={},
78+
)
79+
uri = Uri(f'fs/{Path(__file__).parent.joinpath("cases", "simple-env").absolute()}')
80+
env = {"externalArray": [1, 2, 3], "externalString": "hello"}
81+
82+
client = PolywrapClient(
83+
config=PolywrapClientConfig(
84+
envs={uri: env},
85+
resolver=uri_resolver,
86+
)
87+
)
88+
assert client.get_env_by_uri(uri) == env
89+
7890
async def test_env():
7991
uri_resolver = BaseUriResolver(
8092
file_reader=SimpleFileReader(),
@@ -86,13 +98,14 @@ async def test_env():
8698

8799
client = PolywrapClient(
88100
config=PolywrapClientConfig(
89-
envs=[Env(uri=uri, env=env)],
101+
envs={uri: env},
90102
resolver=uri_resolver,
91103
)
92104
)
93105
options = InvokerOptions(
94-
uri=uri, method="externalEnvMethod", args={}, encode_result=False
106+
uri=uri, method="externalEnvMethod", args={}, encode_result=False,
95107
)
108+
96109
result = await client.invoke(options)
97110

98111
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 GetUriResolversOptions:
3225
pass
@@ -45,16 +38,16 @@ class GetManifestOptions(DeserializeManifestOptions):
4538

4639
class Client(Invoker, UriResolverHandler):
4740
@abstractmethod
48-
def get_interfaces(self) -> List[InterfaceImplementations]:
41+
def get_interfaces(self) -> Dict[Uri, List[Uri]]:
4942
pass
5043

5144
@abstractmethod
52-
def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]:
45+
def get_envs(self) -> Dict[Uri, Env]:
5346
pass
5447

5548
@abstractmethod
5649
def get_env_by_uri(
57-
self, uri: Uri, options: Optional[GetEnvsOptions] = None
50+
self, uri: Uri
5851
) -> Union[Env, None]:
5952
pass
6053

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

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)

packages/polywrap-msgpack/polywrap_msgpack/__init__.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,7 @@ def sanitize(value: Any) -> Any:
5353
if isinstance(value, dict):
5454
dictionary: Dict[Any, Any] = value
5555
for key, val in dictionary.items():
56-
if isinstance(key, str):
57-
dictionary[key] = sanitize(val)
58-
else:
59-
raise ValueError(
60-
f"expected dict key to be str received {key} with type {type(key)}"
61-
)
56+
dictionary[str(key)] = sanitize(val)
6257
return dictionary
6358
if isinstance(value, list):
6459
array: List[Any] = value

0 commit comments

Comments
 (0)