class InvirtConfigError(AttributeError):
pass
-class struct(dict):
- 'A simple namespace object.'
- def __init__(self, d = {}, __prefix = None, __default=None, **kwargs):
- super(struct, self).__init__(d)
- self.__prefix = __prefix
- self.__default = __default
- self.update(kwargs)
- def __getattr__(self, key):
- try:
- return self[key]
- except KeyError:
- if self.__default is None:
- # XX ideally these would point a frame higher on the stack.
- prefix = self.__prefix
- if prefix is not None:
- raise InvirtConfigError('missing configuration variable '
- '%s%s' % (prefix, key))
- else:
- raise AttributeError("anonymous struct has no member '%s'"
- % (key,))
- else:
- return struct({}, '', self.__default)
-
-def dicts2struct(x, prefix = None, default = None):
- """
- Given a tree of lists/dicts, perform a deep traversal to transform all the
- dicts to structs.
- """
- if prefix is not None:
- def newprefix(k): return prefix + str(k) + '.'
- else:
- def newprefix(k): return prefix
- if type(x) == dict:
- return struct(((k, dicts2struct(v, newprefix(k), default))
- for k,v in x.iteritems()),
- prefix,
- default)
- elif type(x) == list:
- return [dicts2struct(v, newprefix(i), default)
- for i, v in enumerate(x)]
- elif x is None:
- return struct({}, prefix, default)
- else:
- return x
@clib.contextmanager
def lock_file(path, exclusive = True):
# Tests.
#
-class common_tests(unittest.TestCase):
- def test_dicts2structs(self):
- dicts = {
- 'atom': 0,
- 'dict': { 'atom': 'atom', 'list': [1,2,3] },
- 'list': [ 'atom', {'key': 'value'} ]
- }
- structs = dicts2struct(dicts, '')
- self.assertEqual(structs.atom, dicts['atom'])
- self.assertEqual(structs.dict.atom, dicts['dict']['atom'])
- 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()