@@ -550,7 +550,7 @@ def require_group(self, name):
550
550
raise TypeError ("Incompatible object (%s) already exists" % grp .__class__ .__name__ )
551
551
return grp
552
552
553
- def getObjByUuid (self , uuid , collection_type = None ):
553
+ def getObjByUuid (self , uuid , collection_type = None , track_order = False ):
554
554
""" Utility method to get an obj based on collection type and uuid """
555
555
self .log .debug (f"getObjByUuid({ uuid } )" )
556
556
obj_json = None
@@ -585,10 +585,10 @@ def getObjByUuid(self, uuid, collection_type=None):
585
585
# will need to get JSON from server
586
586
req = f"/{ collection_type } /{ uuid } "
587
587
# make server request
588
- obj_json = self .GET (req , params = {"CreateOrder" : "1" if self . _track_order else "0" })
588
+ obj_json = self .GET (req , params = {"CreateOrder" : "1" if track_order else "0" })
589
589
590
590
if collection_type == 'groups' :
591
- tgt = Group (GroupID (self , obj_json ))
591
+ tgt = Group (GroupID (self , obj_json ), track_order = track_order )
592
592
elif collection_type == 'datatypes' :
593
593
tgt = Datatype (TypeID (self , obj_json ))
594
594
elif collection_type == 'datasets' :
@@ -598,13 +598,13 @@ def getObjByUuid(self, uuid, collection_type=None):
598
598
if "dims" in shape_json and len (shape_json ["dims" ]) == 1 and dtype_json ["class" ] == 'H5T_COMPOUND' :
599
599
tgt = Table (DatasetID (self , obj_json ))
600
600
else :
601
- tgt = Dataset (DatasetID (self , obj_json ))
601
+ tgt = Dataset (DatasetID (self , obj_json ), track_order = track_order )
602
602
else :
603
603
raise IOError (f"Unexpected collection_type: { collection_type } " )
604
604
605
605
return tgt
606
606
607
- def __getitem__ (self , name ):
607
+ def __getitem__ (self , name , track_order = False ):
608
608
""" Open an object in the file """
609
609
# convert bytes to str for PY3
610
610
if isinstance (name , bytes ):
@@ -617,11 +617,11 @@ def __getitem__(self, name):
617
617
if tgt is not None :
618
618
return tgt # ref'd object has not been deleted
619
619
if isinstance (name .id , GroupID ):
620
- tgt = self .getObjByUuid (name .id .uuid , collection_type = "groups" )
620
+ tgt = self .getObjByUuid (name .id .uuid , collection_type = "groups" , track_order = track_order )
621
621
elif isinstance (name .id , DatasetID ):
622
- tgt = self .getObjByUuid (name .id .uuid , collection_type = "datasets" )
622
+ tgt = self .getObjByUuid (name .id .uuid , collection_type = "datasets" , track_order = track_order )
623
623
elif isinstance (name .id , TypeID ):
624
- tgt = self .getObjByUuid (name .id .uuid , collection_type = "datasets" )
624
+ tgt = self .getObjByUuid (name .id .uuid , collection_type = "datasets" , track_order = track_order )
625
625
else :
626
626
raise IOError ("Unexpected Error - ObjectID type: " + name .__class__ .__name__ )
627
627
return tgt
@@ -634,11 +634,11 @@ def __getitem__(self, name):
634
634
link_class = link_json ['class' ]
635
635
636
636
if link_class == 'H5L_TYPE_HARD' :
637
- tgt = self .getObjByUuid (link_json ['id' ], collection_type = link_json ['collection' ])
637
+ tgt = self .getObjByUuid (link_json ['id' ], collection_type = link_json ['collection' ], track_order = track_order )
638
638
elif link_class == 'H5L_TYPE_SOFT' :
639
639
h5path = link_json ['h5path' ]
640
640
soft_parent_uuid , soft_json = self ._get_link_json (h5path )
641
- tgt = self .getObjByUuid (soft_json ['id' ], collection_type = soft_json ['collection' ])
641
+ tgt = self .getObjByUuid (soft_json ['id' ], collection_type = soft_json ['collection' ], track_order = track_order )
642
642
643
643
elif link_class == 'H5L_TYPE_EXTERNAL' :
644
644
# try to get a handle to the file and return the linked object...
@@ -654,7 +654,8 @@ def __getitem__(self, name):
654
654
endpoint = self .id .http_conn .endpoint
655
655
username = self .id .http_conn .username
656
656
password = self .id .http_conn .password
657
- f = File (external_domain , endpoint = endpoint , username = username , password = password , mode = 'r' )
657
+ f = File (external_domain , endpoint = endpoint , username = username , password = password , mode = 'r' ,
658
+ track_order = track_order )
658
659
except IOError :
659
660
# unable to find external link
660
661
raise KeyError ("Unable to open file: " + link_json ['h5domain' ])
@@ -678,7 +679,7 @@ def __getitem__(self, name):
678
679
tgt ._name = name
679
680
return tgt
680
681
681
- def get (self , name , default = None , getclass = False , getlink = False ):
682
+ def get (self , name , default = None , getclass = False , getlink = False , track_order = False ):
682
683
""" Retrieve an item or other information.
683
684
684
685
"name" given only:
@@ -702,18 +703,17 @@ def get(self, name, default=None, getclass=False, getlink=False):
702
703
>>> if cls == SoftLink:
703
704
... print '"foo" is a soft link!'
704
705
"""
705
-
706
706
if not (getclass or getlink ):
707
707
try :
708
- return self [ name ]
708
+ return self . __getitem__ ( name , track_order )
709
709
except KeyError :
710
710
return default
711
711
712
712
if name not in self :
713
713
return default
714
714
715
715
elif getclass and not getlink :
716
- obj = self .__getitem__ (name )
716
+ obj = self .__getitem__ (name , track_order )
717
717
if obj is None :
718
718
return None
719
719
if obj .id .__class__ is GroupID :
@@ -891,7 +891,16 @@ def __iter__(self):
891
891
for x in links :
892
892
yield x ['title' ]
893
893
else :
894
- for name in links :
894
+ if self ._track_order :
895
+ links = sorted (links .items (), key = lambda x : x [1 ]['created' ])
896
+ else :
897
+ links = sorted (links .items ())
898
+
899
+ ordered_links = {}
900
+ for link in links :
901
+ ordered_links [link [0 ]] = link [1 ]
902
+
903
+ for name in ordered_links :
895
904
yield name
896
905
897
906
def __contains__ (self , name ):
@@ -1151,14 +1160,23 @@ def __reversed__(self):
1151
1160
1152
1161
# reset the link cache
1153
1162
self ._link_db = {}
1154
- for link in reversed ( links ) :
1163
+ for link in links :
1155
1164
name = link ["title" ]
1156
1165
self ._link_db [name ] = link
1157
1166
1158
1167
for x in reversed (links ):
1159
1168
yield x ['title' ]
1160
1169
else :
1161
- for name in links :
1170
+ if self ._track_order :
1171
+ links = sorted (links .items (), key = lambda x : x [1 ]['created' ])
1172
+ else :
1173
+ links = sorted (links .items ())
1174
+
1175
+ ordered_links = {}
1176
+ for link in links :
1177
+ ordered_links [link [0 ]] = link [1 ]
1178
+
1179
+ for name in reversed (ordered_links ):
1162
1180
yield name
1163
1181
1164
1182
0 commit comments