Skip to content

Commit 726ca7b

Browse files
authored
feat: add tests for client-config-builder (#190)
1 parent 6fdbbcb commit 726ca7b

38 files changed

+1243
-87
lines changed

packages/polywrap-client-config-builder/poetry.lock

Lines changed: 129 additions & 65 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/polywrap-client-config-builder/polywrap_client_config_builder/configures/env_configure.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""This module contains the env configure class for the client config builder."""
22
from abc import ABC
3-
from typing import Any, Dict, List, Union
3+
from typing import Any, Dict, List, Union, cast
44

55
from polywrap_core import Uri
66

@@ -35,9 +35,9 @@ def add_env(self, uri: Uri, env: Any) -> ClientConfigBuilder:
3535
3636
If an Any is already associated with the uri, it is modified.
3737
"""
38-
if self.config.envs.get(uri):
39-
for key in self.config.envs[uri]:
40-
self.config.envs[uri][key] = env[key]
38+
if old_env := self.config.envs.get(uri):
39+
new_env = self._merge_envs(old_env, env)
40+
self.config.envs[uri] = new_env
4141
else:
4242
self.config.envs[uri] = env
4343
return self
@@ -58,3 +58,19 @@ def remove_envs(self, uris: List[Uri]) -> ClientConfigBuilder:
5858
for uri in uris:
5959
self.remove_env(uri)
6060
return self
61+
62+
@staticmethod
63+
def _merge_envs(env1: Dict[str, Any], env2: Dict[str, Any]) -> Dict[str, Any]:
64+
for key, val in env2.items():
65+
if key not in env1:
66+
env1[key] = val
67+
continue
68+
69+
if isinstance(val, dict):
70+
old_val = cast(Dict[str, Any], env1[key])
71+
new_val = cast(Dict[str, Any], val)
72+
73+
EnvConfigure._merge_envs(old_val, new_val)
74+
else:
75+
env1[key] = val
76+
return env1

packages/polywrap-client-config-builder/polywrap_client_config_builder/configures/interface_configure.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ def add_interface_implementations(
2626
) -> ClientConfigBuilder:
2727
"""Add a list of implementation URIs for the given interface URI to the builder's config."""
2828
if interface_uri in self.config.interfaces.keys():
29-
self.config.interfaces[interface_uri].extend(implementations_uris)
29+
existing_implementations = set(self.config.interfaces[interface_uri])
30+
for implementation_uri in implementations_uris:
31+
if implementation_uri not in existing_implementations:
32+
self.config.interfaces[interface_uri].append(implementation_uri)
3033
else:
3134
self.config.interfaces[interface_uri] = implementations_uris
3235
return self

packages/polywrap-client-config-builder/polywrap_client_config_builder/polywrap_client_config_builder.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,7 @@ def __init__(self):
5454

5555
def build(self, options: Optional[BuildOptions] = None) -> ClientConfig:
5656
"""Build the ClientConfig object from the builder's config."""
57-
static_resolver_like = cast(StaticResolverLike, self.config.redirects)
58-
59-
for uri, wrapper in self.config.wrappers.items():
60-
static_resolver_like[uri] = UriWrapper(uri=uri, wrapper=wrapper)
61-
62-
for uri, package in self.config.packages.items():
63-
static_resolver_like[uri] = UriPackage(uri=uri, package=package)
57+
static_resolver_like = self._build_static_resolver_like()
6458

6559
resolver = (
6660
options.resolver
@@ -87,5 +81,16 @@ def build(self, options: Optional[BuildOptions] = None) -> ClientConfig:
8781
resolver=resolver,
8882
)
8983

84+
def _build_static_resolver_like(self) -> StaticResolverLike:
85+
static_resolver_like = cast(StaticResolverLike, self.config.redirects)
86+
87+
for uri, wrapper in self.config.wrappers.items():
88+
static_resolver_like[uri] = UriWrapper(uri=uri, wrapper=wrapper)
89+
90+
for uri, package in self.config.packages.items():
91+
static_resolver_like[uri] = UriPackage(uri=uri, package=package)
92+
93+
return static_resolver_like
94+
9095

9196
__all__ = ["PolywrapClientConfigBuilder"]

packages/polywrap-client-config-builder/polywrap_client_config_builder/types/builder_config.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""This module contains the BuilderConfig class."""
2-
from dataclasses import dataclass
2+
from dataclasses import dataclass, field
33
from typing import Any, Dict, List
44

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

21-
envs: Dict[Uri, Any]
22-
interfaces: Dict[Uri, List[Uri]]
23-
wrappers: Dict[Uri, Wrapper]
24-
packages: Dict[Uri, WrapPackage]
25-
resolvers: List[UriResolver]
26-
redirects: Dict[Uri, Uri]
21+
envs: Dict[Uri, Any] = field(default_factory=dict)
22+
interfaces: Dict[Uri, List[Uri]] = field(default_factory=dict)
23+
wrappers: Dict[Uri, Wrapper] = field(default_factory=dict)
24+
packages: Dict[Uri, WrapPackage] = field(default_factory=dict)
25+
resolvers: List[UriResolver] = field(default_factory=list)
26+
redirects: Dict[Uri, Uri] = field(default_factory=dict)
2727

2828

2929
__all__ = ["BuilderConfig"]

packages/polywrap-client-config-builder/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ isort = "^5.10.1"
2525
pyright = "^1.1.275"
2626
pydocstyle = "^6.1.1"
2727

28+
[tool.poetry.group.dev.dependencies]
29+
hypothesis = "^6.76.0"
30+
2831
[tool.bandit]
2932
exclude_dirs = ["tests"]
3033

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
!env/

packages/polywrap-client-config-builder/tests/__init__.py

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
C_LONG_MIN = -9223372036854775808
2+
C_LONG_MAX = 9223372036854775807

packages/polywrap-client-config-builder/tests/env/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)