-#
-# 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, exclusive = True):
- """
- 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):
- if exclusive: locktype = LOCK_EX
- else: locktype = LOCK_SH
- flock(f, locktype)
- try: return func()
- finally: flock(f, LOCK_UN)
- return g
- return wrapper
+@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)