diff options
Diffstat (limited to 'indra/viewer_components/updater/scripts/darwin/janitor.py')
-rw-r--r-- | indra/viewer_components/updater/scripts/darwin/janitor.py | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/indra/viewer_components/updater/scripts/darwin/janitor.py b/indra/viewer_components/updater/scripts/darwin/janitor.py deleted file mode 100644 index cdf33df731..0000000000 --- a/indra/viewer_components/updater/scripts/darwin/janitor.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/python -"""\ -@file janitor.py -@author Nat Goodspeed -@date 2011-09-14 -@brief Janitor class to clean up arbitrary resources - -2013-01-04 cloned from vita because it's exactly what update_install.py needs. - -$LicenseInfo:firstyear=2011&license=viewerlgpl$ -Copyright (c) 2011, Linden Research, Inc. -$/LicenseInfo$ -""" - -import sys -import functools -import itertools - -class Janitor(object): - """ - Usage: - - Basic: - self.janitor = Janitor(sys.stdout) # report cleanup actions on stdout - ... - self.janitor.later(os.remove, some_temp_file) - self.janitor.later(os.remove, some_other_file) - ... - self.janitor.cleanup() # perform cleanup actions - - Context Manager: - with Janitor() as janitor: # clean up quietly - ... - janitor.later(shutil.rmtree, some_temp_directory) - ... - # exiting 'with' block performs cleanup - - Test Class: - class TestMySoftware(unittest.TestCase, Janitor): - def __init__(self): - Janitor.__init__(self) # quiet cleanup - ... - - def setUp(self): - ... - self.later(os.rename, saved_file, original_location) - ... - - def tearDown(self): - Janitor.tearDown(self) # calls cleanup() - ... - # Or, if you have no other tearDown() logic for - # TestMySoftware, you can omit the TestMySoftware.tearDown() - # def entirely and let it inherit Janitor.tearDown(). - """ - def __init__(self, stream=None): - """ - If you pass stream= (e.g.) sys.stdout or sys.stderr, Janitor will - report its cleanup operations as it performs them. If you don't, it - will perform them quietly -- unless one or more of the actions throws - an exception, in which case you'll get output on stderr. - """ - self.stream = stream - self.cleanups = [] - - def later(self, func, *args, **kwds): - """ - Pass the callable you want to call at cleanup() time, plus any - positional or keyword args you want to pass it. - """ - # Get a name string for 'func' - try: - # A free function has a __name__ - name = func.__name__ - except AttributeError: - try: - # A class object (even builtin objects like ints!) support - # __class__.__name__ - name = func.__class__.__name__ - except AttributeError: - # Shrug! Just use repr() to get a string describing this func. - name = repr(func) - # Construct a description of this operation in Python syntax from - # args, kwds. - desc = "%s(%s)" % \ - (name, ", ".join(itertools.chain((repr(a) for a in args), - ("%s=%r" % (k, v) for (k, v) in kwds.iteritems())))) - # Use functools.partial() to bind passed args and keywords to the - # passed func so we get a nullary callable that does what caller - # wants. - bound = functools.partial(func, *args, **kwds) - self.cleanups.append((desc, bound)) - - def cleanup(self): - """ - Perform all the actions saved with later() calls. - """ - # Typically one allocates resource A, then allocates resource B that - # depends on it. In such a scenario it's appropriate to delete B - # before A -- so perform cleanup actions in reverse order. (This is - # the same strategy used by atexit().) - while self.cleanups: - # Until our list is empty, pop the last pair. - desc, bound = self.cleanups.pop(-1) - - # If requested, report the action. - if self.stream is not None: - print >>self.stream, desc - - try: - # Call the bound callable - bound() - except Exception, err: - # This is cleanup. Report the problem but continue. - print >>(self.stream or sys.stderr), "Calling %s\nraised %s: %s" % \ - (desc, err.__class__.__name__, err) - - def tearDown(self): - """ - If a unittest.TestCase subclass (or a nose test class) adds Janitor as - one of its base classes, and has no other tearDown() logic, let it - inherit Janitor.tearDown(). - """ - self.cleanup() - - def __enter__(self): - return self - - def __exit__(self, type, value, tb): - # Perform cleanup no matter how we exit this 'with' statement - self.cleanup() - # Propagate any exception from the 'with' statement, don't swallow it - return False |