Skip to content

Commit 1458649

Browse files
committed
feat: add support for interface
1 parent b6e46d4 commit 1458649

12 files changed

Lines changed: 226 additions & 11 deletions

File tree

packages/polywrap-client/polywrap_client/client.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
UriPackage,
2121
UriPackageOrWrapper,
2222
UriResolutionContext,
23+
InterfaceImplementations,
2324
Wrapper,
2425
)
2526
from polywrap_msgpack import msgpack_decode, msgpack_encode
@@ -53,6 +54,17 @@ def get_uri_resolver(
5354
def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]:
5455
return self._config.envs
5556

57+
def get_interfaces(self) -> List[InterfaceImplementations]:
58+
return self._config.interfaces
59+
60+
def get_implementations(self, uri: Uri) -> Result[List[Uri], Exception]:
61+
if interface_implementations := next(
62+
filter(lambda x: x.interface == uri, self._config.interfaces), None
63+
):
64+
return Ok(interface_implementations.implementations)
65+
else:
66+
return Err(ValueError(f"Unable to find implementations for uri: {uri}"))
67+
5668
def get_env_by_uri(
5769
self, uri: Uri, options: Optional[GetEnvsOptions] = None
5870
) -> Union[Env, None]:
@@ -62,7 +74,9 @@ async def get_file(self, uri: Uri, options: GetFileOptions) -> Union[bytes, str]
6274
loaded_wrapper = (await self.load_wrapper(uri)).unwrap()
6375
return await loaded_wrapper.get_file(options)
6476

65-
async def get_manifest(self, uri: Uri, options: Optional[GetManifestOptions] = None) -> AnyWrapManifest:
77+
async def get_manifest(
78+
self, uri: Uri, options: Optional[GetManifestOptions] = None
79+
) -> AnyWrapManifest:
6680
loaded_wrapper = (await self.load_wrapper(uri)).unwrap()
6781
return loaded_wrapper.get_manifest()
6882

@@ -124,4 +138,5 @@ async def invoke(self, options: InvokerOptions) -> InvokeResult:
124138
return result
125139

126140
except Exception as e:
127-
return InvokeResult(result=None, error=e)
141+
raise e
142+
# return InvokeResult(result=None, error=e)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

packages/polywrap-client/tests/test_client.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from pathlib import Path
22

33
from polywrap_client import PolywrapClient
4-
from polywrap_core import Uri, InvokerOptions
4+
from polywrap_core import Uri, InvokerOptions, InterfaceImplementations
55
from polywrap_uri_resolvers import BaseUriResolver, SimpleFileReader
66

77
from polywrap_client.client import PolywrapClientConfig
@@ -31,17 +31,43 @@ async def test_subinvoke():
3131
},
3232
)
3333

34-
client = PolywrapClient(config=PolywrapClientConfig(
35-
envs=[], resolver=uri_resolver
36-
))
34+
client = PolywrapClient(config=PolywrapClientConfig(envs=[], resolver=uri_resolver))
3735
uri = Uri(
3836
f'fs/{Path(__file__).parent.joinpath("cases", "simple-subinvoke", "invoke").absolute()}'
3937
)
40-
args = b'\x82\xa1a\x01\xa1b\x02'
41-
options = InvokerOptions(
42-
uri=uri, method="add", args=args, encode_result=False
43-
)
38+
args = {"a": 1, "b": 2}
39+
options = InvokerOptions(uri=uri, method="add", args=args, encode_result=False)
4440
result = await client.invoke(options)
4541

4642
assert result.result == "1 + 2 = 3"
4743

44+
45+
async def test_interface_implementation():
46+
uri_resolver = BaseUriResolver(
47+
file_reader=SimpleFileReader(),
48+
redirects={},
49+
)
50+
51+
impl_uri = Uri(
52+
f'fs/{Path(__file__).parent.joinpath("cases", "simple-interface", "implementation").absolute()}'
53+
)
54+
55+
client = PolywrapClient(
56+
config=PolywrapClientConfig(
57+
envs=[],
58+
resolver=uri_resolver,
59+
interfaces=[
60+
InterfaceImplementations(
61+
interface=Uri("ens/interface.eth"), implementations=[impl_uri]
62+
)
63+
],
64+
)
65+
)
66+
uri = Uri(
67+
f'fs/{Path(__file__).parent.joinpath("cases", "simple-interface", "wrapper").absolute()}'
68+
)
69+
args = {"arg": {"str": "hello", "uint8": 2}}
70+
options = InvokerOptions(uri=uri, method="moduleMethod", args=args, encode_result=False)
71+
result = await client.invoke(options)
72+
73+
assert result.result == {"str": "hello", "uint8": 2}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from polywrap_manifest import DeserializeManifestOptions, AnyWrapManifest
88

9+
from .interface_implementation import InterfaceImplementations
910
from .env import Env
1011
from .invoke import Invoker
1112
from .uri import Uri
@@ -16,6 +17,7 @@
1617
@dataclass(slots=True, kw_only=True)
1718
class ClientConfig:
1819
envs: List[Env] = field(default_factory=list)
20+
interfaces: List[InterfaceImplementations] = field(default_factory=list)
1921
resolver: IUriResolver
2022

2123

@@ -41,6 +43,10 @@ class GetManifestOptions(DeserializeManifestOptions):
4143

4244

4345
class Client(Invoker, UriResolverHandler):
46+
@abstractmethod
47+
def get_interfaces(self) -> List[InterfaceImplementations]:
48+
pass
49+
4450
@abstractmethod
4551
def get_envs(self, options: Optional[GetEnvsOptions] = None) -> List[Env]:
4652
pass
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from dataclasses import dataclass
2+
from typing import List
3+
4+
from .uri import Uri
5+
6+
@dataclass(slots=True, kw_only=True)
7+
class InterfaceImplementations:
8+
interface: Uri
9+
implementations: List[Uri]

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
from abc import ABC, abstractmethod
44
from dataclasses import dataclass, field
5-
from typing import Any, Dict, Optional, Union
5+
from typing import Any, Dict, List, Optional, Union
6+
7+
from result import Result
68

79
from .uri import Uri
810
from .uri_resolution_context import IUriResolutionContext
@@ -57,6 +59,10 @@ class Invoker(ABC):
5759
async def invoke(self, options: InvokerOptions) -> InvokeResult:
5860
pass
5961

62+
@abstractmethod
63+
def get_implementations(self, uri: Uri) -> Result[List[Uri], Exception]:
64+
pass
65+
6066

6167
class Invocable(ABC):
6268
@abstractmethod

0 commit comments

Comments
 (0)