home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / platlib / win / peak / util / addons.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  6.1 KB  |  202 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from peak.util.decorators import decorate, decorate_class, enclosing_frame, classy
  5. from weakref import ref
  6. import sys
  7. __all__ = [
  8.     'AddOn',
  9.     'ClassAddOn',
  10.     'Registry',
  11.     'addons_for']
  12. _addons = { }
  13.  
  14. def addons_for(ob):
  15.     
  16.     try:
  17.         d = ob.__dict__
  18.         sd = d.setdefault
  19.         return d
  20.     except (AttributeError, TypeError):
  21.         r = ref(ob)
  22.         
  23.         try:
  24.             return _addons[r]
  25.         except KeyError:
  26.             return _addons.setdefault(ref(ob, _addons.__delitem__), { })
  27.         except:
  28.             None<EXCEPTION MATCH>KeyError
  29.         
  30.  
  31.         None<EXCEPTION MATCH>KeyError
  32.  
  33.  
  34.  
  35. def additional_tests():
  36.     import doctest
  37.     return doctest.DocFileSuite('README.txt', package = '__main__', optionflags = doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE)
  38.  
  39.  
  40. class AddOn(classy):
  41.     __slots__ = ()
  42.     decorate(classmethod)
  43.     
  44.     def __class_call__(cls, ob, *data):
  45.         a = addons_for(ob)
  46.         addon_key = cls.addon_key(*data)
  47.         
  48.         try:
  49.             return a[addon_key]
  50.         except KeyError:
  51.             ob = a.setdefault(addon_key, super(AddOn, cls).__class_call__(ob, *data))
  52.             return ob
  53.  
  54.  
  55.     decorate(classmethod)
  56.     
  57.     def addon_key(cls, *args):
  58.         if args:
  59.             return (cls,) + args
  60.         
  61.         return cls
  62.  
  63.     decorate(classmethod)
  64.     
  65.     def exists_for(cls, ob, *key):
  66.         return cls.addon_key(*key) in addons_for(ob)
  67.  
  68.     decorate(classmethod)
  69.     
  70.     def delete_from(cls, ob, *key):
  71.         a = addons_for(ob)
  72.         
  73.         try:
  74.             del a[cls.addon_key(*key)]
  75.         except KeyError:
  76.             pass
  77.  
  78.  
  79.     
  80.     def __init__(self, subject):
  81.         pass
  82.  
  83.  
  84.  
  85. class ClassAddOn(AddOn):
  86.     __slots__ = ()
  87.     decorate(classmethod)
  88.     
  89.     def __class_call__(cls, ob, *data):
  90.         addon_key = cls.addon_key(*data)
  91.         d = ob.__dict__
  92.         if addon_key in d:
  93.             return d[addon_key]
  94.         
  95.         d2 = addons_for(ob)
  96.         
  97.         try:
  98.             return d2[addon_key]
  99.         except KeyError:
  100.             ob = d2.setdefault(addon_key, super(ClassAddOn, cls).__class_call__(ob, *data))
  101.             return ob
  102.  
  103.  
  104.     decorate(classmethod)
  105.     
  106.     def for_enclosing_class(cls, *args, **kw):
  107.         if 'frame' in kw:
  108.             frame = kw.pop('frame')
  109.         elif 'level' in kw:
  110.             level = kw.pop('level')
  111.         else:
  112.             level = 2
  113.         frame = sys._getframe(level)
  114.         if kw:
  115.             raise TypeError('Unexpected keyword arguments', kw)
  116.         
  117.         return cls.for_frame(frame, *args)
  118.  
  119.     decorate(classmethod)
  120.     
  121.     def for_frame(cls, frame, *args):
  122.         a = enclosing_frame(frame).f_locals
  123.         addon_key = cls.addon_key(*args)
  124.         
  125.         try:
  126.             return a[addon_key]
  127.         except KeyError:
  128.             ob = a.setdefault(addon_key, type.__call__(cls, None, *args))
  129.             (decorate_class,)((lambda c: ob._ClassAddOn__decorate(c)), frame = frame)
  130.             return ob
  131.  
  132.  
  133.     decorate(classmethod)
  134.     
  135.     def exists_for(cls, ob, *key):
  136.         addon_key = cls.addon_key(*key)
  137.         if not addon_key in ob.__dict__:
  138.             pass
  139.         return addon_key in addons_for(ob)
  140.  
  141.     decorate(classmethod)
  142.     
  143.     def delete_from(cls, ob, *key):
  144.         raise TypeError('ClassAddOns cannot be deleted')
  145.  
  146.     
  147.     def __decorate(self, cls):
  148.         self.created_for(cls)
  149.         return cls
  150.  
  151.     
  152.     def created_for(self, cls):
  153.         pass
  154.  
  155.     
  156.     def __init__(self, subject):
  157.         if subject is not None:
  158.             self.created_for(subject)
  159.         
  160.  
  161.  
  162.  
  163. class Registry(ClassAddOn, dict):
  164.     __slots__ = ()
  165.     
  166.     def __new__(cls, subject):
  167.         if cls is Registry:
  168.             raise TypeError('You must subclass Registry to use it')
  169.         
  170.         return super(Registry, cls).__new__(cls)
  171.  
  172.     
  173.     def __init__(self, subject):
  174.         dict.__init__(self)
  175.         super(Registry, self).__init__(subject)
  176.  
  177.     
  178.     def created_for(self, cls):
  179.         
  180.         try:
  181.             mro = cls.__mro__[::-1]
  182.         except AttributeError:
  183.             mro = type(cls.__name__, (cls, object), { }).__mro__[1:][::-1]
  184.  
  185.         data = { }
  186.         self.defined_in_class = dict(self)
  187.         mytype = type(self)
  188.         for base in mro[:-1]:
  189.             data.update(mytype(base))
  190.         
  191.         data.update(self)
  192.         self.update(data)
  193.  
  194.     
  195.     def set(self, key, value):
  196.         if key in self and self[key] != value:
  197.             raise ValueError("%s[%r] already contains %r; can't set to %r" % (self.__class__.__name__, key, self[key], value))
  198.         
  199.         self[key] = value
  200.  
  201.  
  202.