1 from __future__ import with_statement
4 from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
5 import contextlib as clib
8 'A simple namespace object.'
9 def __init__(self, d = {}, **kwargs):
10 'd is the dictionary to update my __dict__ with.'
11 self.__dict__.update(d)
12 self.__dict__.update(kwargs)
16 Given a tree of lists/dicts, perform a deep traversal to transform all the
20 return struct((k, dicts2struct(v)) for k,v in x.iteritems())
22 return [dicts2struct(v) for v in x]
27 def lock_file(path, exclusive = True):
28 with clib.closing(file(path, 'w')) as f:
43 class InvalidInput(Exception):
44 """Exception for user-provided input is invalid but maybe in good faith.
46 This would include setting memory to negative (which might be a
47 typo) but not setting an invalid boot CD (which requires bypassing
50 def __init__(self, err_field, err_value, expl=None):
51 MyException.__init__(self, expl)
52 self.err_field = err_field
53 self.err_value = err_value
55 class CodeError(Exception):
56 """Exception for internal errors or bad faith input."""
63 class common_tests(unittest.TestCase):
64 def test_dicts2structs(self):
67 'dict': { 'atom': 'atom', 'list': [1,2,3] },
68 'list': [ 'atom', {'key': 'value'} ]
70 structs = dicts2struct(dicts)
71 self.assertEqual(structs.atom, dicts['atom'])
72 self.assertEqual(structs.dict.atom, dicts['dict']['atom'])
73 self.assertEqual(structs.dict.list, dicts['dict']['list'])
74 self.assertEqual(structs.list[0], dicts['list'][0])
75 self.assertEqual(structs.list[1].key, dicts['list'][1]['key'])
77 if __name__ == '__main__':