Skip to content

Commit 6eb1b87

Browse files
authored
Merge pull request #41 from polywrap/feat/uri-resolution-impl
feat: Static Resolver implementation
2 parents 0f46d50 + 11f5726 commit 6eb1b87

34 files changed

Lines changed: 725 additions & 74 deletions

packages/polywrap-client/polywrap_client/client.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
ClientConfig,
1010
GetFileOptions,
1111
GetManifestOptions,
12-
GetUriResolversOptions,
1312
InvokerOptions,
1413
IUriResolutionContext,
1514
IUriResolver,
@@ -44,9 +43,7 @@ def __init__(self, config: Optional[PolywrapClientConfig] = None):
4443
def get_config(self):
4544
return self._config
4645

47-
def get_uri_resolver(
48-
self, options: Optional[GetUriResolversOptions] = None
49-
) -> IUriResolver:
46+
def get_uri_resolver(self) -> IUriResolver:
5047
return self._config.resolver
5148

5249
def get_envs(self) -> Dict[Uri, Env]:
@@ -98,9 +95,9 @@ async def load_wrapper(
9895
result = await self.try_resolve_uri(
9996
TryResolveUriOptions(uri=uri, resolution_context=resolution_context)
10097
)
101-
if result.is_err() == True:
98+
if result.is_err():
10299
return cast(Err, result)
103-
if result.is_ok() == True and result.ok is None:
100+
if result.is_ok() and result.ok is None:
104101
# FIXME: add resolution stack
105102
return Err.from_str(
106103
dedent(

packages/polywrap-client/tests/test_client.py

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,44 @@
1+
import pytest
12
from pathlib import Path
23
import pytest
3-
from polywrap_client import PolywrapClient
4-
from polywrap_core import Uri, InvokerOptions
5-
from polywrap_uri_resolvers import BaseUriResolver, SimpleFileReader
6-
from polywrap_result import Ok
7-
from polywrap_client.client import PolywrapClientConfig
8-
9-
10-
async def test_invoke():
4+
from polywrap_client import PolywrapClient, PolywrapClientConfig
5+
from polywrap_manifest import deserialize_wrap_manifest
6+
from polywrap_core import Uri, InvokerOptions, UriWrapper
7+
from polywrap_uri_resolvers import BaseUriResolver, SimpleFileReader, StaticResolver
8+
from polywrap_result import Result, Ok, Err
9+
from polywrap_wasm import WRAP_MANIFEST_PATH, WRAP_MODULE_PATH, IFileReader, WasmWrapper
10+
11+
@pytest.fixture
12+
def simple_wrap_module():
13+
wrap_path = Path(__file__).parent / "cases" / "simple-invoke" / "wrap.wasm"
14+
with open(wrap_path, "rb") as f:
15+
yield f.read()
16+
17+
18+
@pytest.fixture
19+
def simple_wrap_manifest():
20+
wrap_path = Path(__file__).parent / "cases" / "simple-invoke" / "wrap.info"
21+
with open(wrap_path, "rb") as f:
22+
yield f.read()
23+
24+
@pytest.fixture
25+
def simple_file_reader(simple_wrap_module: bytes, simple_wrap_manifest: bytes):
26+
class FileReader(IFileReader):
27+
async def read_file(self, file_path: str) -> Result[bytes]:
28+
if file_path == WRAP_MODULE_PATH:
29+
return Ok(simple_wrap_module)
30+
if file_path == WRAP_MANIFEST_PATH:
31+
return Ok(simple_wrap_manifest)
32+
return Err.from_str(f"FileNotFound: {file_path}")
33+
34+
yield FileReader()
35+
36+
@pytest.mark.asyncio
37+
async def test_invoke(
38+
simple_file_reader: IFileReader,
39+
simple_wrap_module: bytes,
40+
simple_wrap_manifest: bytes
41+
):
1142
client = PolywrapClient()
1243
uri = Uri(
1344
f'fs/{Path(__file__).parent.joinpath("cases", "simple-invoke").absolute()}'
@@ -20,6 +51,29 @@ async def test_invoke():
2051

2152
assert result.unwrap() == args["arg"]
2253

54+
manifest = deserialize_wrap_manifest(simple_wrap_manifest).unwrap()
55+
56+
wrapper = WasmWrapper(
57+
file_reader=simple_file_reader,
58+
wasm_module=simple_wrap_module,
59+
manifest=manifest
60+
)
61+
uri_wrapper = UriWrapper(uri=Uri("ens/wrapper.eth"), wrapper=wrapper)
62+
resolver = StaticResolver.from_list([uri_wrapper]).unwrap()
63+
64+
config = PolywrapClientConfig(resolver=resolver)
65+
client = PolywrapClient(config=config)
66+
67+
args = {"arg": "hello polywrap"}
68+
options = InvokerOptions(
69+
uri=Uri("ens/wrapper.eth"),
70+
method="simpleMethod",
71+
args=args,
72+
encode_result=False
73+
)
74+
result = await client.invoke(options)
75+
76+
assert result.unwrap() == args["arg"]
2377

2478
async def test_subinvoke():
2579
uri_resolver = BaseUriResolver(
@@ -108,4 +162,4 @@ async def test_env():
108162

109163
result = await client.invoke(options)
110164

111-
assert result.unwrap() == env
165+
assert result.unwrap() == env

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
from .uri_resolver import *
1010
from .uri_resolver_handler import *
1111
from .uri_wrapper import *
12+
from .wrap_package import *
1213
from .wasm_package import *
1314
from .wrapper import *

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,6 @@ class ClientConfig:
2020
resolver: IUriResolver
2121

2222

23-
@dataclass(slots=True, kw_only=True)
24-
class GetUriResolversOptions:
25-
pass
26-
27-
2823
@dataclass(slots=True, kw_only=True)
2924
class GetFileOptions:
3025
path: str
@@ -52,9 +47,7 @@ def get_env_by_uri(
5247
pass
5348

5449
@abstractmethod
55-
def get_uri_resolver(
56-
self, options: Optional[GetUriResolversOptions] = None
57-
) -> IUriResolver:
50+
def get_uri_resolver(self) -> IUriResolver:
5851
pass
5952

6053
@abstractmethod

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

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

33
import re
44
from dataclasses import dataclass
5+
from functools import total_ordering
56
from typing import Any, List, Optional, Tuple, Union
67

78

@@ -14,6 +15,7 @@ class UriConfig:
1415
uri: str
1516

1617

18+
@total_ordering
1719
class Uri:
1820
"""
1921
A Polywrap URI.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
from dataclasses import dataclass
44

55
from .uri import Uri
6-
from .wasm_package import IWasmPackage
6+
from .wrap_package import IWrapPackage
77

88

99
@dataclass(slots=True, kw_only=True)
1010
class UriPackage:
1111
uri: Uri
12-
package: IWasmPackage
12+
package: IWrapPackage

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass
4-
from typing import TYPE_CHECKING, Optional
4+
from typing import TYPE_CHECKING, List, Optional
55

66
from polywrap_result import Result
77

@@ -16,4 +16,4 @@ class IUriResolutionStep:
1616
source_uri: Uri
1717
result: Result["UriPackageOrWrapper"]
1818
description: Optional[str] = None
19-
sub_history: Optional["IUriResolutionStep"] = None
19+
sub_history: Optional[List["IUriResolutionStep"]] = None
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
11
from abc import ABC, abstractmethod
2-
from typing import Optional
32

4-
from polywrap_manifest import AnyWrapManifest
53
from polywrap_result import Result
4+
from .wrap_package import IWrapPackage
65

7-
from .client import GetManifestOptions
8-
from .wrapper import Wrapper
9-
10-
11-
class IWasmPackage(ABC):
12-
@abstractmethod
13-
async def create_wrapper(self) -> Result[Wrapper]:
14-
pass
156

7+
class IWasmPackage(IWrapPackage, ABC):
168
@abstractmethod
17-
async def get_manifest(
18-
self, options: Optional[GetManifestOptions] = None
19-
) -> Result[AnyWrapManifest]:
9+
async def get_wasm_module() -> Result[bytes]:
2010
pass
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from abc import ABC, abstractmethod
2+
from typing import Optional
3+
4+
from polywrap_manifest import AnyWrapManifest
5+
from polywrap_result import Result
6+
7+
from .client import GetManifestOptions
8+
from .wrapper import Wrapper
9+
10+
11+
class IWrapPackage(ABC):
12+
@abstractmethod
13+
async def create_wrapper(self) -> Result[Wrapper]:
14+
pass
15+
16+
@abstractmethod
17+
async def get_manifest(
18+
self, options: Optional[GetManifestOptions] = None
19+
) -> Result[AnyWrapManifest]:
20+
pass

packages/polywrap-core/polywrap_core/uri_resolution/uri_resolution_result.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from ..types import (
66
IUriResolutionStep,
7-
IWasmPackage,
7+
IWrapPackage,
88
Uri,
99
UriPackage,
1010
UriPackageOrWrapper,
@@ -20,7 +20,7 @@ class UriResolutionResult:
2020
@staticmethod
2121
def ok(
2222
uri: Uri,
23-
package: Optional[IWasmPackage] = None,
23+
package: Optional[IWrapPackage] = None,
2424
wrapper: Optional[Wrapper] = None,
2525
) -> Result[UriPackageOrWrapper]:
2626
if wrapper:

0 commit comments

Comments
 (0)