Skip to content

Commit a3dccbb

Browse files
committed
Parse nested assumes expressions
Fixes #938
1 parent 6536b48 commit a3dccbb

1 file changed

Lines changed: 21 additions & 10 deletions

File tree

juju/client/facade.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,26 @@ async def rpc(self, msg):
661661

662662
@classmethod
663663
def from_json(cls, data):
664+
def _parse_nested_list_entry(expr, result_dict):
665+
if isinstance(expr, str):
666+
if '>' in expr or '>=' in expr:
667+
# something like juju >= 2.9.31
668+
i = expr.index('>')
669+
_key = expr[:i].strip()
670+
_value = expr[i:].strip()
671+
result_dict[_key] = _value
672+
else:
673+
# this is a simple entry
674+
result_dict[expr] = ''
675+
elif isinstance(expr, dict):
676+
for _, v in expr.items():
677+
_parse_nested_list_entry(v, result_dict)
678+
elif isinstance(expr, list):
679+
for v in expr:
680+
_parse_nested_list_entry(v, result_dict)
681+
else:
682+
raise TypeError(f"Unexpected type of entry in assumes expression: {expr}")
683+
664684
if isinstance(data, cls):
665685
return data
666686
if isinstance(data, str):
@@ -680,16 +700,7 @@ def from_json(cls, data):
680700
# check: https://juju.is/docs/sdk/assumes
681701
# assumes are in the form of a list
682702
d = {}
683-
for entry in data:
684-
if '>' in entry or '>=' in entry:
685-
# something like juju >= 2.9.31
686-
i = entry.index('>')
687-
key = entry[:i].strip()
688-
value = entry[i:].strip()
689-
d[key] = value
690-
else:
691-
# this is a simple entry
692-
d[entry] = ''
703+
_parse_nested_list_entry(data, d)
693704
return cls(**d)
694705
return None
695706

0 commit comments

Comments
 (0)