X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/8bfea358c4a93a7c46efbefe0694036f38f390c4..a11a45e1b18add76f2a440412ef6379a9874b082:/files/usr/share/python-support/sipb-xen-base/invirt/common.py diff --git a/files/usr/share/python-support/sipb-xen-base/invirt/common.py b/files/usr/share/python-support/sipb-xen-base/invirt/common.py index 250078e..5f669ba 100644 --- a/files/usr/share/python-support/sipb-xen-base/invirt/common.py +++ b/files/usr/share/python-support/sipb-xen-base/invirt/common.py @@ -1,10 +1,12 @@ import unittest +from fcntl import flock, LOCK_EX, LOCK_UN class struct(object): 'A simple namespace object.' - def __init__(self, d = {}): + 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): """ @@ -18,10 +20,48 @@ def dicts2struct(x): else: return x -def wrap(rsrc, func): - "Utility to that emulates with Python 2.5's `with closing(rsrc)`." - try: return func(rsrc) - finally: rsrc.close() +# +# Hacks to work around lack of Python 2.5's `with` statement. +# + +def with_closing(rsrc): + """ + Utility to emulate Python 2.5's `with closing(rsrc)` context manager. + + E.g., + @with_closing(file('/tmp/foo')) + def contents(f): + return f.read() + # now 'contents' is the contents of /tmp/foo + """ + def wrapper(func): + try: return func(rsrc) + finally: rsrc.close() + return wrapper + +def with_lock_file(path): + """ + Context manager for lock files. Example: + + @with_lock_file('/tmp/mylock') + def input(): + print 'locked' + return raw_input() + # prints 'locked' + print input # prints what raw_input() returned + """ + def wrapper(func): + @with_closing(file(path, 'w')) + def g(f): + flock(f, LOCK_EX) + try: return func() + finally: flock(f, LOCK_UN) + return g + return wrapper + +# +# Tests. +# class common_tests(unittest.TestCase): def test_dicts2structs(self):