11import json
2+ from types import NoneType
23from typing import Optional , Union
34
45__INDEXES_TYPES__ = {}
@@ -85,13 +86,15 @@ def __contains__(self, item: str or ComponentIndex):
8586 return True
8687 return False
8788
89+
8890class ArgumentIndex (SpeasyIndex ):
8991 def __init__ (self , name : str , provider : str , uid : str , meta : Optional [dict ] = None ):
9092 super ().__init__ (name , provider , uid , meta )
9193
9294 def __repr__ (self ):
9395 return f'<ArgumentIndex: { self .spz_name ()} >'
9496
97+
9598class ArgumentListIndex (SpeasyIndex ):
9699 def __init__ (self , name : str , provider : str , uid : str , meta : Optional [dict ] = None ):
97100 super ().__init__ (name , provider , uid , meta )
@@ -103,7 +106,7 @@ def _arguments(self):
103106 def __repr__ (self ):
104107 return f'<ArgumentListIndex: { self .spz_name ()} >'
105108
106- def __getitem__ (self , item )-> ArgumentIndex :
109+ def __getitem__ (self , item ) -> ArgumentIndex :
107110 return self ._arguments [item ]
108111
109112 def __len__ (self ):
@@ -112,6 +115,7 @@ def __len__(self):
112115 def __iter__ (self ):
113116 return self ._arguments .__iter__ ()
114117
118+
115119class TemplatedParameterIndex (ParameterIndex ):
116120 __spz_arguments__ : ArgumentListIndex
117121
@@ -145,33 +149,48 @@ def __contains__(self, item: str or ParameterIndex):
145149 return False
146150
147151
148- def to_dict (inventory_tree : SpeasyIndex or str ):
152+ def to_dict (inventory_tree : SpeasyIndex or str , version : int = 1 ):
149153 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 )
154+ return {key : to_dict (value , version = version ) for key , value in inventory_tree .__dict__ .items ()}
155+ elif version <= 1 :
156+ if type (inventory_tree ) is not str :
157+ inventory_tree = str (inventory_tree )
158+ else :
159+ if type (inventory_tree ) in [list , tuple , set ]:
160+ return type (inventory_tree )([to_dict (value , version ) for value in inventory_tree ])
161+ if type (inventory_tree ) is dict :
162+ return {key : to_dict (value , version ) for key , value in inventory_tree .items ()}
163+ if type (inventory_tree ) not in [str , int , float , bool , type (None )]:
164+ return str (inventory_tree )
165+
153166 return inventory_tree
154167
155168
156- def from_dict (inventory_tree : dict or str ):
157- if type (inventory_tree ) is str :
158- return inventory_tree
169+ def from_dict (inventory_tree : dict or str , version : int = 1 ):
170+ if version <= 1 :
171+ if type (inventory_tree ) is str :
172+ return inventory_tree
173+ else :
174+ if type (inventory_tree ) in [str , int , float , bool , type (None ), list , tuple , set ]:
175+ return inventory_tree
176+ if type (inventory_tree ) is dict and "__spz_type__" not in inventory_tree :
177+ return inventory_tree
159178 idx_type = inventory_tree .pop ("__spz_type__" )
160179 idx_name = inventory_tree .pop ("__spz_name__" )
161180 idx_provider = inventory_tree .pop ("__spz_provider__" )
162181 idx_uid = inventory_tree .pop ("__spz_uid__" )
163- idx_meta = {key : from_dict (value ) for key , value in inventory_tree .items ()}
182+ idx_meta = {key : from_dict (value , version ) for key , value in inventory_tree .items ()}
164183 root = __INDEXES_TYPES__ .get (idx_type , SpeasyIndex )(name = idx_name , provider = idx_provider , uid = idx_uid ,
165184 meta = idx_meta )
166185 return root
167186
168187
169- def to_json (inventory_tree : SpeasyIndex , sort_keys = True ):
170- return json .dumps (to_dict (inventory_tree ), sort_keys = sort_keys )
188+ def to_json (inventory_tree : SpeasyIndex , sort_keys = True , version : int = 1 ):
189+ return json .dumps (to_dict (inventory_tree , version ), sort_keys = sort_keys )
171190
172191
173- def from_json (inventory_tree : str ):
174- return from_dict (json .loads (inventory_tree ))
192+ def from_json (inventory_tree : str , version : int = 1 ):
193+ return from_dict (json .loads (inventory_tree ), version )
175194
176195
177196def make_inventory_node (parent , ctor , name , provider , uid , ** meta ):
@@ -191,4 +210,6 @@ def inventory_has_changed(orig, new):
191210 return True
192211 return False
193212
194- AnyProductIndex = Union [ParameterIndex , TemplatedParameterIndex , DatasetIndex , TimetableIndex , CatalogIndex , ComponentIndex ]
213+
214+ AnyProductIndex = Union [
215+ ParameterIndex , TemplatedParameterIndex , DatasetIndex , TimetableIndex , CatalogIndex , ComponentIndex ]
0 commit comments