@@ -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