In invirt.authz.locker, deal with getting tokens and
[invirt/packages/invirt-base.git] / python / invirt / common.py
index f228a33..603b7f3 100644 (file)
@@ -12,8 +12,11 @@ class struct(object):
     'A simple namespace object.'
     def __init__(self, d = {}, __prefix = None, **kwargs):
         'd is the dictionary or the items-iterable to update my __dict__ with.'
-        self.__dict__.update(d)
-        self.__dict__.update(kwargs)
+        dct = {}
+        dct.update(d)
+        dct.update(kwargs)
+        self.__dict__.update(dct)
+        self.__keys = set(dct)
         self.__prefix = __prefix
     def __getattr__(self, key):
         # XX ideally these would point a frame higher on the stack.
@@ -24,6 +27,9 @@ class struct(object):
         else:
             raise AttributeError("anonymous struct has no member '%s'"
                                  % (key,))
+    def __iter__(self):
+        for i in self.__keys:
+            yield i
 
 def dicts2struct(x, prefix = None):
     """
@@ -118,6 +124,7 @@ class common_tests(unittest.TestCase):
         self.assertEqual(structs.dict.list,   dicts['dict']['list'])
         self.assertEqual(structs.list[0],     dicts['list'][0])
         self.assertEqual(structs.list[1].key, dicts['list'][1]['key'])
+        self.assertEqual(set(structs), set(['atom', 'dict', 'list']))
 
 if __name__ == '__main__':
     unittest.main()