Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions packages/polywrap-client/polywrap_client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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())
)

Expand All @@ -51,17 +53,19 @@ 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]:
return self._config.interfaces

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), 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}")

Expand Down
26 changes: 14 additions & 12 deletions packages/polywrap-client/tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()}'
)
Expand All @@ -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(),
Expand All @@ -54,14 +54,14 @@ async def test_interface_implementation():

client = PolywrapClient(
config=PolywrapClientConfig(
envs=[],
envs={Uri('wrap://ens/interface.eth'): {'environment_variable', 'test'}},
interfaces={
Uri("wrap://ens/interface.eth"):
[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()}'
Expand All @@ -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]'")
async def test_env():
uri_resolver = BaseUriResolver(
file_reader=SimpleFileReader(),
Expand All @@ -86,13 +86,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
7 changes: 4 additions & 3 deletions packages/polywrap-core/polywrap_core/types/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 is this a naive solution? the `Any` type should be more specific (str | Uri | int, etc.)
envs: Dict[Uri, Dict[str, Any]] = field(default_factory=dict)
interfaces: Dict[Uri, List[Uri]]
resolver: IUriResolver


Expand Down
2 changes: 1 addition & 1 deletion packages/polywrap-wasm/polywrap_wasm/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down