Skip to content

Commit 76bf954

Browse files
committed
feat:implemented_add_envs, added tests for add_envs and set_envs together.
1 parent fae0f54 commit 76bf954

6 files changed

Lines changed: 106 additions & 36 deletions

File tree

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
from .client_config_builder import *
2-
from .client_config import *

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

Lines changed: 0 additions & 2 deletions
This file was deleted.

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

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ClientConfig():
1111
"""
1212
envs: Dict[Uri, Dict[str, Any]]
1313
interfaces: Dict[Uri, List[Uri]]
14-
resolver: IUriResolver
14+
resolver: List[IUriResolver]
1515
wrappers: List[Uri]
1616

1717

@@ -23,7 +23,7 @@ class IClientConfigBuilder(ABC):
2323
"""
2424

2525
@abstractmethod
26-
def build() -> ClientConfig:
26+
def build(self) -> ClientConfig:
2727
"""Returns a sanitized config object from the builder's config."""
2828
pass
2929

@@ -32,15 +32,15 @@ def get_envs(self) -> Optional[Dict[Uri, Dict[str, Any]]]:
3232
pass
3333

3434
@abstractmethod
35-
def set_env(self, env: Dict[str, Any], uri: Uri):
35+
def set_env(self, env: Dict[str, Any], uri: Uri)-> ClientConfig:
3636
pass
3737

3838
@abstractmethod
39-
def add_env(self, env: Dict[str, Any], uri: Uri):
39+
def add_env(self, env: Dict[str, Any], uri: Uri) -> ClientConfig:
4040
pass
4141

4242
@abstractmethod
43-
def add_envs(self, envs: List[Env], uri: Uri):
43+
def add_envs(self, envs: List[Env], uri: Uri) -> ClientConfig:
4444
pass
4545

4646
@abstractmethod
@@ -56,15 +56,22 @@ def add_wrappers(self, wrapper_uris: Optional[List[Uri]]) -> ClientConfig:
5656
pass
5757

5858
@abstractmethod
59-
def set_resolver(self) -> ClientConfig:
59+
def set_resolver(self, resolver: IUriResolver) -> ClientConfig:
6060
pass
6161

62+
@abstractmethod
63+
def add_resolver(self, resolver: IUriResolver) -> ClientConfig:
64+
pass
65+
66+
@abstractmethod
67+
def add_resolvers(self, resolvers_list: List[IUriResolver]) -> ClientConfig:
68+
pass
6269
class BaseClientConfigBuilder(IClientConfigBuilder):
6370
"""A concrete class of the Client Config Builder, which uses the IClientConfigBuilder Abstract Base Class"""
6471
# config: ClientConfig
6572

6673
def __init__(self):
67-
self.config = ClientConfig(envs={}, interfaces={}, resolver=None, wrappers= [])
74+
self.config = ClientConfig(envs={}, interfaces={}, resolver=[], wrappers= [])
6875

6976
def build(self)-> ClientConfig:
7077
"""
@@ -75,33 +82,33 @@ def build(self)-> ClientConfig:
7582
def get_envs(self)-> Dict[Uri, Dict[str, Any]]:
7683
return self.config.envs
7784

78-
def set_env(self, env: Env={'test':'tested'}, uri=Uri("wrap://ens/eth.plugin.one"))-> IClientConfigBuilder:
85+
def set_env(self, env: Env={'test':'tested'}, uri: Uri=Uri("wrap://ens/eth.plugin.one"))-> IClientConfigBuilder:
7986
# TODO: This is a temporary solution to the problem of the Uri / Env not being able to pass as None initially
8087
# should be (self, env: Env=None, uri: Uri=None): but that causes an error
8188
if (env or uri) is None:
8289
raise KeyError("Must provide both an env or uri")
8390
self.config.envs[uri] = env
8491
return self
8592

86-
# for key in self.config.envs[uri].keys():
87-
# if key in env.keys():
88-
# self.config.envs[uri][key] = env[key]
89-
# else:
90-
# self.config.envs[uri][key] = None
91-
# return self
92-
9393
def add_env(self, env: Env = None , uri: Uri = None)-> IClientConfigBuilder:
94+
"""Adds an environment (in the form of an `Env`) for a given uri, without overwriting existing environments,
95+
unless the env key already exists in the environment, then it will overwrite the existing value"""
9496
if (env or uri) is None:
9597
raise KeyError("Must provide both an env or uri")
96-
self.config.envs[uri] = env
98+
99+
if uri in self.config.envs.keys():
100+
for key in env.keys():
101+
self.config.envs[uri][key] = env[key]
102+
else:
103+
self.config.envs[uri] = env
97104
return self
98105

99-
def add_envs(self, envs: List[Env]) -> IClientConfigBuilder:
106+
def add_envs(self, envs: List[Env], uri: Uri = None) -> IClientConfigBuilder:
100107
"""
101108
Adds a list of environments (each in the form of an `Env`) for a given uri
102109
"""
103110
for env in envs:
104-
self.add_env(env)
111+
self.add_env(env, uri )
105112
return self
106113

107114
def add_interface_implementations(self, interface_uri: Uri, implementations_uris: List[Uri]) -> IClientConfigBuilder:
@@ -142,7 +149,25 @@ def set_resolver(self, uri_resolver) -> IClientConfigBuilder:
142149
"""
143150
Sets a single resolver for the `ClientConfig` object before it is built
144151
"""
145-
self.config.resolver = uri_resolver
152+
self.config.resolver = [uri_resolver]
153+
return self
154+
155+
def add_resolver(self, resolver: IUriResolver) -> IClientConfigBuilder:
156+
"""
157+
Adds a resolver to the list of resolvers
158+
"""
159+
160+
if self.config.resolver is None:
161+
raise ValueError("This resolver is not set. Please set a resolver before adding resolvers.")
162+
self.config.resolver.append(resolver)
163+
return self
164+
165+
def add_resolvers(self, resolvers_list: List[IUriResolver]) -> IClientConfigBuilder:
166+
"""
167+
Adds a list of resolvers to the list of resolvers
168+
"""
169+
for resolver in resolvers_list:
170+
self.add_resolver(resolver)
146171
return self
147172

148173
class ClientConfigBuilder(BaseClientConfigBuilder):

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ readme = "README.md"
1111

1212
[tool.poetry.dependencies]
1313
python = "^3.10"
14-
wasmtime = "^1.0.1"
1514
polywrap-core = { path = "../polywrap-core", develop = true }
16-
polywrap-wasm = { path = "../polywrap-wasm", develop = true }
1715
polywrap-result = { path = "../polywrap-result", develop = true }
1816

1917
[tool.poetry.dev-dependencies]

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

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212

1313
env_varA = { 'color': "yellow", 'size': "large" }
1414
env_varB = { 'color': "red", 'size': "small" }
15+
env_varN = { 'dog': "poodle", 'season': "summer" }
1516
env_varM = { 'dog': "corgi", 'season': "autumn" }
1617
env_varN = { 'dog': "poodle", 'season': "summer" }
18+
env_varS = { 'vehicle': "scooter"}
1719
env_uriX = Uri("wrap://ens/eth.plugin.one")
1820
env_uriY = Uri("wrap://ipfs/filecoin.wrapper.two")
1921

@@ -25,23 +27,49 @@ def test_client_config_builder_set_env():
2527
envs = { env_uriX: env_varA }
2628
ccb = ccb.set_env( env_varA, env_uriX)
2729
client_config = ccb.build()
28-
assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = None, wrappers=[]))
30+
assert asdict(client_config) == asdict(ClientConfig(envs=envs, interfaces={}, resolver = [], wrappers=[]))
2931

3032
def test_client_config_builder_add_env():
3133
ccb = ClientConfigBuilder() # instantiate new client config builder
3234
ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder
3335
client_config: ClientConfig = ccb.build() # build a client config object
3436
print(client_config)
35-
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = None, wrappers=[]))
37+
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[]))
3638

3739
def test_client_config_builder_add_env_updates_env_value():
3840
ccb = ClientConfigBuilder() # instantiate new client config builder
3941
ccb = ccb.add_env(env = env_varA, uri = env_uriX) # add env to client config builder
4042
client_config: ClientConfig = ccb.build() # build a client config object
41-
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = None, wrappers=[]))
43+
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[]))
4244
ccb = ccb.add_env(env = env_varB, uri = env_uriX) # update value of env var on client config builder
4345
client_config: ClientConfig = ccb.build() # build a new client config object
44-
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = None, wrappers=[]))
46+
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[]))
47+
48+
def test_client_config_builder_set_env_and_add_env_updates_and_add_values():
49+
ccb = ClientConfigBuilder()
50+
ccb = ccb.set_env(env_varA, env_uriX) # set the environment variables A
51+
client_config: ClientConfig = ccb.build()
52+
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varA}, interfaces={}, resolver = [], wrappers=[]))
53+
54+
ccb = ccb.set_env(env_varB, env_uriX) # set new vars on the same Uri
55+
client_config: ClientConfig = ccb.build()
56+
assert asdict(client_config) == asdict(ClientConfig(envs={env_uriX: env_varB}, interfaces={}, resolver = [], wrappers=[]))
57+
58+
ccb = ccb.add_env(env_varM, env_uriY) # add new env vars on a new Uri
59+
client_config: ClientConfig = ccb.build()
60+
assert asdict(client_config) == asdict(ClientConfig(
61+
envs={
62+
env_uriX: env_varB,
63+
env_uriY: env_varM
64+
},
65+
interfaces={}, resolver = [], wrappers=[]))
66+
67+
# add new env vars on the second Uri, while also updating the Env vars of dog and season
68+
ccb = ccb.add_envs([env_varN, env_varS], env_uriY)
69+
new_envs = {**env_varM, **env_varN, **env_varS}
70+
print(new_envs)
71+
client_config = ccb.build()
72+
assert asdict(client_config) == asdict(ClientConfig(envs = {env_uriX: env_varB, env_uriY: new_envs}, interfaces={}, resolver = [], wrappers=[]))
4573

4674
# INTERFACES AND IMPLEMENTATIONS
4775

@@ -51,7 +79,7 @@ def test_client_config_builder_adds_interface_implementations():
5179
implementations_uris = [Uri("wrap://ens/eth.plugin.one"), Uri("wrap://ens/eth.plugin.two")]
5280
ccb = ccb.add_interface_implementations(interfaces_uri, implementations_uris)
5381
client_config = ccb.build()
54-
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = None, wrappers=[]))
82+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={interfaces_uri: implementations_uris}, resolver = [], wrappers=[]))
5583

5684
# WRAPPERS AND PLUGINS
5785

@@ -60,24 +88,24 @@ def test_client_config_builder_add_wrapper():
6088
wrapper = Uri("wrap://ens/uni.wrapper.eth")
6189
ccb = ccb.add_wrapper(wrapper)
6290
client_config = ccb.build()
63-
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[wrapper]))
91+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper]))
6492

6593
def test_client_config_builder_adds_multiple_wrappers():
6694
ccb = ClientConfigBuilder()
6795
wrappers = [Uri("wrap://ens/uni.wrapper.eth"), Uri("wrap://ens/https.plugin.eth")]
6896
ccb = ccb.add_wrappers(wrappers)
6997
client_config = ccb.build()
70-
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=wrappers))
98+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=wrappers))
7199

72100
def test_client_config_builder_removes_wrapper():
73101
ccb = ClientConfigBuilder()
74102
wrapper = Uri("wrap://ens/uni.wrapper.eth")
75103
ccb = ccb.add_wrapper(wrapper)
76104
client_config = ccb.build()
77-
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[wrapper]))
105+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[wrapper]))
78106
ccb = ccb.remove_wrapper(wrapper)
79107
client_config = ccb.build()
80-
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = None, wrappers=[]))
108+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver = [], wrappers=[]))
81109

82110
# RESOLVER
83111

@@ -89,4 +117,26 @@ def test_client_config_builder_set_uri_resolver():
89117
ccb = ccb.set_resolver()
90118
client_config = ccb.build()
91119
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolver, wrappers=[]))
92-
120+
121+
def test_client_config_builder_add_resolver():
122+
123+
# set a first resolver
124+
ccb = ClientConfigBuilder()
125+
resolverA = Uri("wrap://ens/eth.resolver.one")
126+
ccb: ClientConfigBuilder = ccb.set_resolver(resolverA)
127+
client_config: ClientConfig = ccb.build()
128+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA], wrappers=[]))
129+
130+
# add a second resolver
131+
resolverB = Uri("wrap://ens/eth.resolver.two")
132+
ccb = ccb.add_resolver(resolverB)
133+
client_config: ClientConfig = ccb.build()
134+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=[resolverA, resolverB], wrappers=[]))
135+
136+
# add a third and fourth resolver
137+
resolverC = Uri("wrap://ens/eth.resolver.three")
138+
resolverD = Uri("wrap://ens/eth.resolver.four")
139+
ccb = ccb.add_resolvers([resolverC, resolverD])
140+
client_config: ClientConfig = ccb.build()
141+
resolvers = [resolverA, resolverB, resolverC, resolverD]
142+
assert asdict(client_config) == asdict(ClientConfig(envs={}, interfaces={}, resolver=resolvers, wrappers=[]))

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def test_client_config_structure_starts_empty():
99
result = ClientConfig(
1010
envs={},
1111
interfaces={},
12-
resolver = None,
12+
resolver = [],
1313
wrappers = []
1414
)
1515
assert asdict(client_config) == asdict(result)
@@ -24,5 +24,5 @@ def test_client_config_structure_sets_env():
2424
env = env
2525
)
2626
client_config = ccb.build()
27-
assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = None, wrappers=[]))
27+
assert asdict(client_config) == asdict(ClientConfig(envs={uri: env}, interfaces={}, resolver = [], wrappers=[]))
2828

0 commit comments

Comments
 (0)