Switch sipb-xen-base to build using a setup.py script
[invirt/packages/invirt-base.git] / python / invirt / common.py
diff --git a/python/invirt/common.py b/python/invirt/common.py
new file mode 100644 (file)
index 0000000..77770a6
--- /dev/null
@@ -0,0 +1,58 @@
+from __future__ import with_statement
+
+import unittest
+from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
+import contextlib as clib
+
+class struct(object):
+    'A simple namespace object.'
+    def __init__(self, d = {}, **kwargs):
+        'd is the dictionary to update my __dict__ with.'
+        self.__dict__.update(d)
+        self.__dict__.update(kwargs)
+
+def dicts2struct(x):
+    """
+    Given a tree of lists/dicts, perform a deep traversal to transform all the
+    dicts to structs.
+    """
+    if type(x) == dict:
+        return struct((k, dicts2struct(v)) for k,v in x.iteritems())
+    elif type(x) == list:
+        return [dicts2struct(v) for v in x]
+    else:
+        return x
+
+@clib.contextmanager
+def lock_file(path, exclusive = True):
+    with clib.closing(file(path, 'w')) as f:
+        if exclusive:
+            locktype = LOCK_EX
+        else:
+            locktype = LOCK_SH
+        flock(f, locktype)
+        try:
+            yield
+        finally:
+            flock(f, LOCK_UN)
+
+#
+# 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'])
+
+if __name__ == '__main__':
+    unittest.main()