home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_332 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  2.6 KB  |  109 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. from functools import wraps
  6. __all__ = [
  7.     'contextmanager',
  8.     'nested',
  9.     'closing']
  10.  
  11. class GeneratorContextManager(object):
  12.     
  13.     def __init__(self, gen):
  14.         self.gen = gen
  15.  
  16.     
  17.     def __enter__(self):
  18.         
  19.         try:
  20.             return self.gen.next()
  21.         except StopIteration:
  22.             raise RuntimeError("generator didn't yield")
  23.  
  24.  
  25.     
  26.     def __exit__(self, type, value, traceback):
  27.         if type is None:
  28.             
  29.             try:
  30.                 self.gen.next()
  31.             except StopIteration:
  32.                 return None
  33.  
  34.             raise RuntimeError("generator didn't stop")
  35.         type is None
  36.         if value is None:
  37.             value = type()
  38.         
  39.         
  40.         try:
  41.             self.gen.throw(type, value, traceback)
  42.             raise RuntimeError("generator didn't stop after throw()")
  43.         except StopIteration:
  44.             exc = None
  45.             return exc is not value
  46.             if sys.exc_info()[1] is not value:
  47.                 raise 
  48.             sys.exc_info()[1] is not value
  49.  
  50.  
  51.  
  52.  
  53. def contextmanager(func):
  54.     
  55.     def helper(*args, **kwds):
  56.         return GeneratorContextManager(func(*args, **kwds))
  57.  
  58.     helper = (wraps(func),)(helper)
  59.     return helper
  60.  
  61.  
  62. def nested(*managers):
  63.     exits = []
  64.     vars = []
  65.     exc = (None, None, None)
  66.     
  67.     try:
  68.         for mgr in managers:
  69.             exit = mgr.__exit__
  70.             enter = mgr.__enter__
  71.             vars.append(enter())
  72.             exits.append(exit)
  73.         
  74.         yield vars
  75.     except:
  76.         exc = sys.exc_info()
  77.     finally:
  78.         while exits:
  79.             exit = exits.pop()
  80.             
  81.             try:
  82.                 if exit(*exc):
  83.                     exc = (None, None, None)
  84.             continue
  85.             exc = sys.exc_info()
  86.             continue
  87.  
  88.         if exc != (None, None, None):
  89.             raise exc[0], exc[1], exc[2]
  90.         exc != (None, None, None)
  91.  
  92.  
  93. nested = contextmanager(nested)
  94.  
  95. class closing(object):
  96.     
  97.     def __init__(self, thing):
  98.         self.thing = thing
  99.  
  100.     
  101.     def __enter__(self):
  102.         return self.thing
  103.  
  104.     
  105.     def __exit__(self, *exc_info):
  106.         self.thing.close()
  107.  
  108.  
  109.