@@ -85,13 +85,15 @@ def __contains__(self, item: str or ComponentIndex):
8585 return True
8686 return False
8787
88+
8889class ArgumentIndex (SpeasyIndex ):
8990 def __init__ (self , name : str , provider : str , uid : str , meta : Optional [dict ] = None ):
9091 super ().__init__ (name , provider , uid , meta )
9192
9293 def __repr__ (self ):
9394 return f'<ArgumentIndex: { self .spz_name ()} >'
9495
96+
9597class ArgumentListIndex (SpeasyIndex ):
9698 def __init__ (self , name : str , provider : str , uid : str , meta : Optional [dict ] = None ):
9799 super ().__init__ (name , provider , uid , meta )
@@ -103,7 +105,7 @@ def _arguments(self):
103105 def __repr__ (self ):
104106 return f'<ArgumentListIndex: { self .spz_name ()} >'
105107
106- def __getitem__ (self , item )-> ArgumentIndex :
108+ def __getitem__ (self , item ) -> ArgumentIndex :
107109 return self ._arguments [item ]
108110
109111 def __len__ (self ):
@@ -112,6 +114,7 @@ def __len__(self):
112114 def __iter__ (self ):
113115 return self ._arguments .__iter__ ()
114116
117+
115118class TemplatedParameterIndex (ParameterIndex ):
116119 __spz_arguments__ : ArgumentListIndex
117120
@@ -145,33 +148,48 @@ def __contains__(self, item: str or ParameterIndex):
145148 return False
146149
147150
148- def to_dict (inventory_tree : SpeasyIndex or str ):
151+ def to_dict (inventory_tree : SpeasyIndex or str , version : int = 1 ):
149152 if isinstance (inventory_tree , SpeasyIndex ):
150- return {key : to_dict (value ) for key , value in inventory_tree .__dict__ .items ()}
151- elif type (inventory_tree ) is not str :
152- return str (inventory_tree )
153+ return {key : to_dict (value , version = version ) for key , value in inventory_tree .__dict__ .items ()}
154+ elif version <= 1 :
155+ if type (inventory_tree ) is not str :
156+ inventory_tree = str (inventory_tree )
157+ else :
158+ if type (inventory_tree ) in [list , tuple , set ]:
159+ return type (inventory_tree )([to_dict (value , version ) for value in inventory_tree ])
160+ if type (inventory_tree ) is dict :
161+ return {key : to_dict (value , version ) for key , value in inventory_tree .items ()}
162+ if type (inventory_tree ) not in [str , int , float , bool , type (None )]:
163+ return str (inventory_tree )
164+
153165 return inventory_tree
154166
155167
156- def from_dict (inventory_tree : dict or str ):
157- if type (inventory_tree ) is str :
158- return inventory_tree
168+ def from_dict (inventory_tree : dict or str , version : int = 1 ):
169+ if version <= 1 :
170+ if type (inventory_tree ) is str :
171+ return inventory_tree
172+ else :
173+ if type (inventory_tree ) in [str , int , float , bool , type (None ), list , tuple , set ]:
174+ return inventory_tree
175+ if type (inventory_tree ) is dict and "__spz_type__" not in inventory_tree :
176+ return inventory_tree
159177 idx_type = inventory_tree .pop ("__spz_type__" )
160178 idx_name = inventory_tree .pop ("__spz_name__" )
161179 idx_provider = inventory_tree .pop ("__spz_provider__" )
162180 idx_uid = inventory_tree .pop ("__spz_uid__" )
163- idx_meta = {key : from_dict (value ) for key , value in inventory_tree .items ()}
181+ idx_meta = {key : from_dict (value , version ) for key , value in inventory_tree .items ()}
164182 root = __INDEXES_TYPES__ .get (idx_type , SpeasyIndex )(name = idx_name , provider = idx_provider , uid = idx_uid ,
165183 meta = idx_meta )
166184 return root
167185
168186
169- def to_json (inventory_tree : SpeasyIndex , sort_keys = True ):
170- return json .dumps (to_dict (inventory_tree ), sort_keys = sort_keys )
187+ def to_json (inventory_tree : SpeasyIndex , sort_keys = True , version : int = 1 ):
188+ return json .dumps (to_dict (inventory_tree , version ), sort_keys = sort_keys )
171189
172190
173- def from_json (inventory_tree : str ):
174- return from_dict (json .loads (inventory_tree ))
191+ def from_json (inventory_tree : str , version : int = 1 ):
192+ return from_dict (json .loads (inventory_tree ), version )
175193
176194
177195def make_inventory_node (parent , ctor , name , provider , uid , ** meta ):
@@ -191,4 +209,6 @@ def inventory_has_changed(orig, new):
191209 return True
192210 return False
193211
194- AnyProductIndex = Union [ParameterIndex , TemplatedParameterIndex , DatasetIndex , TimetableIndex , CatalogIndex , ComponentIndex ]
212+
213+ AnyProductIndex = Union [
214+ ParameterIndex , TemplatedParameterIndex , DatasetIndex , TimetableIndex , CatalogIndex , ComponentIndex ]
0 commit comments