Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
48be658
refactor: polywrap-msgpack package
Niraj-Kamdar Jun 3, 2023
a83969a
refactor: polywrap-manifest package
Niraj-Kamdar Jun 3, 2023
f8d7853
refactor: polywrap-core package
Niraj-Kamdar Jun 3, 2023
011ebf9
refactor: polywrap-core docs
Niraj-Kamdar Jun 5, 2023
773f10b
refactor: polywrap-wasm package
Niraj-Kamdar Jun 5, 2023
c7a6317
refactor: polywrap-plugin package
Niraj-Kamdar Jun 5, 2023
5df78c1
feat: add unit-tests for remaining functions
Niraj-Kamdar Jun 6, 2023
febebb3
feat: add wrap test harness
Niraj-Kamdar Jun 5, 2023
082c1de
fix: skipping trivial CVE for now
Niraj-Kamdar Jun 5, 2023
ca863de
fix: test-cases tests
Niraj-Kamdar Jun 5, 2023
743fd8a
refactor: polywrap-uri-resolvers
Niraj-Kamdar Jun 5, 2023
6a9a173
refactor: polywrap-client
Niraj-Kamdar Jun 5, 2023
8b9c164
refactor: polywrap-client-config-builder package
Niraj-Kamdar Jun 6, 2023
c66bfeb
fix: typing issue
Niraj-Kamdar Jun 5, 2023
5147e6a
wip: config-builder tests
Niraj-Kamdar Jun 7, 2023
b885018
feat(client-config-builder): add env tests
Niraj-Kamdar Jun 8, 2023
a9ff0e9
wip: add interface tests
Niraj-Kamdar Jun 8, 2023
7bb7700
feat: complete interface tests
Niraj-Kamdar Jun 8, 2023
bf83473
feat: add package tests
Niraj-Kamdar Jun 8, 2023
f4ffd1d
feat: add wrapper tests
Niraj-Kamdar Jun 8, 2023
16939d6
feat: add redirect tests
Niraj-Kamdar Jun 8, 2023
58fe236
feat: add resolver tests
Niraj-Kamdar Jun 10, 2023
a1e7421
refactor: black fixes
Niraj-Kamdar Jun 10, 2023
bba3a07
debug: try adjusting examples produced with strategies
Niraj-Kamdar Jun 10, 2023
970903f
debug: adjusting assumptions
Niraj-Kamdar Jun 10, 2023
d4c19f9
Merge remote-tracking branch 'origin/dev' into nk/test-config-builder
Niraj-Kamdar Jun 14, 2023
f0f80f1
fix: issues in hypothesis strategy
Niraj-Kamdar Jun 14, 2023
b6c6966
fix: issue
Niraj-Kamdar Jun 14, 2023
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
194 changes: 129 additions & 65 deletions packages/polywrap-client-config-builder/poetry.lock

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""This module contains the env configure class for the client config builder."""
from abc import ABC
from typing import Any, Dict, List, Union
from typing import Any, Dict, List, Union, cast

from polywrap_core import Uri

Expand Down Expand Up @@ -35,9 +35,9 @@ def add_env(self, uri: Uri, env: Any) -> ClientConfigBuilder:

If an Any is already associated with the uri, it is modified.
"""
if self.config.envs.get(uri):
for key in self.config.envs[uri]:
self.config.envs[uri][key] = env[key]
if old_env := self.config.envs.get(uri):
new_env = self._merge_envs(old_env, env)
self.config.envs[uri] = new_env
else:
self.config.envs[uri] = env
return self
Expand All @@ -58,3 +58,19 @@ def remove_envs(self, uris: List[Uri]) -> ClientConfigBuilder:
for uri in uris:
self.remove_env(uri)
return self

@staticmethod
def _merge_envs(env1: Dict[str, Any], env2: Dict[str, Any]) -> Dict[str, Any]:
for key, val in env2.items():
if key not in env1:
env1[key] = val
continue

if isinstance(val, dict):
old_val = cast(Dict[str, Any], env1[key])
new_val = cast(Dict[str, Any], val)

EnvConfigure._merge_envs(old_val, new_val)
else:
env1[key] = val
return env1
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ def add_interface_implementations(
) -> ClientConfigBuilder:
"""Add a list of implementation URIs for the given interface URI to the builder's config."""
if interface_uri in self.config.interfaces.keys():
self.config.interfaces[interface_uri].extend(implementations_uris)
existing_implementations = set(self.config.interfaces[interface_uri])
for implementation_uri in implementations_uris:
if implementation_uri not in existing_implementations:
self.config.interfaces[interface_uri].append(implementation_uri)
else:
self.config.interfaces[interface_uri] = implementations_uris
return self
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,7 @@ def __init__(self):

def build(self, options: Optional[BuildOptions] = None) -> ClientConfig:
"""Build the ClientConfig object from the builder's config."""
static_resolver_like = cast(StaticResolverLike, self.config.redirects)

for uri, wrapper in self.config.wrappers.items():
static_resolver_like[uri] = UriWrapper(uri=uri, wrapper=wrapper)

for uri, package in self.config.packages.items():
static_resolver_like[uri] = UriPackage(uri=uri, package=package)
static_resolver_like = self._build_static_resolver_like()

resolver = (
options.resolver
Expand All @@ -87,5 +81,16 @@ def build(self, options: Optional[BuildOptions] = None) -> ClientConfig:
resolver=resolver,
)

def _build_static_resolver_like(self) -> StaticResolverLike:
static_resolver_like = cast(StaticResolverLike, self.config.redirects)

for uri, wrapper in self.config.wrappers.items():
static_resolver_like[uri] = UriWrapper(uri=uri, wrapper=wrapper)

for uri, package in self.config.packages.items():
static_resolver_like[uri] = UriPackage(uri=uri, package=package)

return static_resolver_like


__all__ = ["PolywrapClientConfigBuilder"]
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""This module contains the BuilderConfig class."""
from dataclasses import dataclass
from dataclasses import dataclass, field
from typing import Any, Dict, List

from polywrap_core import Uri, UriResolver, WrapPackage, Wrapper
Expand All @@ -18,12 +18,12 @@ class BuilderConfig:
redirects (Dict[Uri, Uri]): The URI redirects.
"""

envs: Dict[Uri, Any]
interfaces: Dict[Uri, List[Uri]]
wrappers: Dict[Uri, Wrapper]
packages: Dict[Uri, WrapPackage]
resolvers: List[UriResolver]
redirects: Dict[Uri, Uri]
envs: Dict[Uri, Any] = field(default_factory=dict)
interfaces: Dict[Uri, List[Uri]] = field(default_factory=dict)
wrappers: Dict[Uri, Wrapper] = field(default_factory=dict)
packages: Dict[Uri, WrapPackage] = field(default_factory=dict)
resolvers: List[UriResolver] = field(default_factory=list)
redirects: Dict[Uri, Uri] = field(default_factory=dict)


__all__ = ["BuilderConfig"]
3 changes: 3 additions & 0 deletions packages/polywrap-client-config-builder/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ isort = "^5.10.1"
pyright = "^1.1.275"
pydocstyle = "^6.1.1"

[tool.poetry.group.dev.dependencies]
hypothesis = "^6.76.0"

[tool.bandit]
exclude_dirs = ["tests"]

Expand Down
1 change: 1 addition & 0 deletions packages/polywrap-client-config-builder/tests/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
!env/
Empty file.
2 changes: 2 additions & 0 deletions packages/polywrap-client-config-builder/tests/consts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
C_LONG_MIN = -9223372036854775808
C_LONG_MAX = 9223372036854775807
Empty file.
27 changes: 27 additions & 0 deletions packages/polywrap-client-config-builder/tests/env/test_add_env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from typing import Any
from hypothesis import given, settings

from polywrap_client_config_builder import (
ClientConfigBuilder,
PolywrapClientConfigBuilder,
)
from polywrap_core import Uri

from ..strategies import uri_strategy, env_strategy


@settings(max_examples=100)
@given(uri=uri_strategy, old_env=env_strategy, new_env=env_strategy)
def test_add_env(uri: Uri, old_env: Any, new_env: Any):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {uri: {"common": old_env, "unique_1": "unique_env_1"}}

builder.add_env(uri, {"common": new_env, "unique_2": "unique_env_2"})

updated_env = {**old_env, **new_env}

assert builder.config.envs[uri] == {
"common": updated_env,
"unique_1": "unique_env_1",
"unique_2": "unique_env_2",
}
40 changes: 40 additions & 0 deletions packages/polywrap-client-config-builder/tests/env/test_get_env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from typing import Any, Dict
from hypothesis import given, settings

from polywrap_client_config_builder import (
ClientConfigBuilder,
PolywrapClientConfigBuilder,
)
from polywrap_core import Uri

from ..strategies import envs_strategy


@settings(max_examples=100)
@given(envs=envs_strategy)
def test_get_env_exists(
envs: Dict[Uri, Any]
):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = envs

for uri in envs:
assert builder.get_env(uri) == envs[uri]
assert builder.get_env(Uri.from_str("test/not-exists")) is None


def test_get_env_not_exists():
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
assert builder.get_env(Uri.from_str("test/not-exists")) is None


@settings(max_examples=100)
@given(envs=envs_strategy)
def test_get_envs(
envs: Dict[Uri, Any]
):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
assert builder.get_envs() == {}

builder.config.envs = envs
assert builder.get_envs() == envs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from typing import Any, Dict
from random import randint
from hypothesis import assume, event, given, settings

from polywrap_client_config_builder import (
ClientConfigBuilder,
PolywrapClientConfigBuilder,
)
from polywrap_core import Uri

from ..strategies import envs_strategy


@settings(max_examples=100)
@given(envs=envs_strategy)
def test_remove_env(envs: Dict[Uri, Any]):
assume(envs)
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {**envs}

uris = list(envs.keys())
uri_index = randint(0, len(uris) - 1)
remove_uri = uris[uri_index]
event(f"Uri to remove: {remove_uri}")

builder.remove_env(remove_uri)
assert len(builder.config.envs) == len(envs) - 1
assert remove_uri not in builder.config.envs


@settings(max_examples=100)
@given(envs=envs_strategy)
def test_remove_non_existent_env(envs: Dict[Uri, Any]):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {**envs}

builder.remove_env(Uri("test", "non-existent"))
assert builder.config.envs == envs


@settings(max_examples=100)
@given(envs=envs_strategy)
def test_remove_envs(envs: Dict[Uri, Any]):
assume(envs)
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {**envs}

uris = list(envs.keys())
uri_indices = [
randint(0, len(uris) - 1) for _ in range(randint(0, len(uris) - 1))
]
remove_uris = list({uris[uri_index] for uri_index in uri_indices})
event(f"Uris to remove: {remove_uris}")

builder.remove_envs(remove_uris)
assert len(builder.config.envs) == len(envs) - len(remove_uris)
assert set(remove_uris) & set(builder.config.envs.keys()) == set()


50 changes: 50 additions & 0 deletions packages/polywrap-client-config-builder/tests/env/test_set_env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from typing import Any, Dict
from hypothesis import assume, given, settings

from polywrap_client_config_builder import (
ClientConfigBuilder,
PolywrapClientConfigBuilder,
)
from polywrap_core import Uri

from ..strategies import envs_strategy, uri_strategy, env_strategy


@settings(max_examples=100)
@given(envs=envs_strategy, new_uri=uri_strategy, new_env=env_strategy)
def test_set_env(envs: Dict[Uri, Any], new_uri: Uri, new_env: Any):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {**envs}

existing_uris = set(builder.config.envs.keys())
assume(new_uri not in existing_uris)

builder.set_env(new_uri, new_env)

assert len(builder.config.envs) == len(existing_uris) + 1
assert builder.config.envs[new_uri] == new_env


@settings(max_examples=100)
@given(uri=uri_strategy, old_env=env_strategy, new_env=env_strategy)
def test_set_env_overwrite(uri: Uri, old_env: Any, new_env: Any):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {uri: old_env}

builder.set_env(uri, new_env)

assert builder.config.envs == {uri: new_env}


@settings(max_examples=100)
@given(initial_envs=envs_strategy, new_envs=envs_strategy)
def test_set_envs(
initial_envs: Dict[Uri, Any],
new_envs: Dict[Uri, Any],
):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.envs = {**initial_envs}

builder.set_envs(new_envs)

assert len(builder.config.envs) <= len(initial_envs) + len(new_envs)
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from typing import List
from hypothesis import given, settings, strategies as st

from polywrap_client_config_builder import (
ClientConfigBuilder,
PolywrapClientConfigBuilder,
)
from polywrap_core import Uri

from ..strategies import uri_strategy


@settings(max_examples=100)
@given(uri=uri_strategy, old_impls=st.lists(uri_strategy), new_impls=st.lists(uri_strategy))
def test_add_implementations_to_existing_interface(uri: Uri, old_impls: List[Uri], new_impls: List[Uri]):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.interfaces = {uri: old_impls}

builder.add_interface_implementations(uri, new_impls)

updated_impls = {*old_impls, *new_impls}

assert set(builder.config.interfaces[uri]) == updated_impls


Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from typing import Any, Dict, List
from hypothesis import given, settings

from polywrap_client_config_builder import (
ClientConfigBuilder,
PolywrapClientConfigBuilder,
)
from polywrap_core import Uri

from ..strategies import interfaces_strategy


@settings(max_examples=100)
@given(interfaces=interfaces_strategy)
def test_get_interface_implementations(
interfaces: Dict[Uri, List[Uri]]
):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
builder.config.interfaces = interfaces

for uri in interfaces:
assert builder.get_interface_implementations(uri) == interfaces[uri]
assert builder.get_interface_implementations(Uri.from_str("test/not-exists")) is None


def test_get_implementations_not_exists():
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
assert builder.get_interface_implementations(Uri.from_str("test/not-exists")) is None


@settings(max_examples=100)
@given(interfaces=interfaces_strategy)
def test_get_interfaces(
interfaces: Dict[Uri, List[Uri]]
):
builder: ClientConfigBuilder = PolywrapClientConfigBuilder()
assert builder.get_interfaces() == {}

builder.config.interfaces = interfaces
assert builder.get_interfaces() == interfaces
Loading