Index: third_party/twisted_8_1/twisted/python/components.py |
diff --git a/third_party/twisted_8_1/twisted/python/components.py b/third_party/twisted_8_1/twisted/python/components.py |
deleted file mode 100644 |
index 54af395b342761c09e15d11fbe878e5e40367e82..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/python/components.py |
+++ /dev/null |
@@ -1,445 +0,0 @@ |
-# -*- test-case-name: twisted.python.test.test_components -*- |
- |
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-""" |
-Component architecture for Twisted, based on Zope3 components. |
- |
-Using the Zope3 API directly is strongly recommended. Everything |
-you need is in the top-level of the zope.interface package, e.g.:: |
- |
- from zope.interface import Interface, implements |
- |
- class IFoo(Interface): |
- pass |
- |
- class Foo: |
- implements(IFoo) |
- |
- print IFoo.implementedBy(Foo) # True |
- print IFoo.providedBy(Foo()) # True |
- |
-The one exception is L{twisted.python.components.registerAdapter}, which is |
-still the way to register adapters (at least, if you want Twisted's global |
-adapter registry). |
-""" |
- |
-# twisted imports |
-from twisted.python import reflect |
-from twisted.persisted import styles |
- |
-# system imports |
-import warnings |
- |
-# zope3 imports |
-from zope.interface import directlyProvides, interface, declarations |
-from zope.interface.adapter import AdapterRegistry |
- |
- |
- |
-class ComponentsDeprecationWarning(DeprecationWarning): |
- """Nothing emits this warning anymore.""" |
- pass |
- |
-# Twisted's global adapter registry |
-globalRegistry = AdapterRegistry() |
- |
-# Attribute that registerAdapter looks at. Is this supposed to be public? |
-ALLOW_DUPLICATES = 0 |
- |
-# Define a function to find the registered adapter factory, using either a |
-# version of Zope Interface which has the `registered' method or an older |
-# version which does not. |
-if getattr(AdapterRegistry, 'registered', None) is None: |
- def _registered(registry, required, provided): |
- """ |
- Return the adapter factory for the given parameters in the given |
- registry, or None if there is not one. |
- """ |
- return registry.get(required).selfImplied.get(provided, {}).get('') |
-else: |
- def _registered(registry, required, provided): |
- """ |
- Return the adapter factory for the given parameters in the given |
- registry, or None if there is not one. |
- """ |
- return registry.registered([required], provided) |
- |
- |
-def registerAdapter(adapterFactory, origInterface, *interfaceClasses): |
- """Register an adapter class. |
- |
- An adapter class is expected to implement the given interface, by |
- adapting instances implementing 'origInterface'. An adapter class's |
- __init__ method should accept one parameter, an instance implementing |
- 'origInterface'. |
- """ |
- self = globalRegistry |
- assert interfaceClasses, "You need to pass an Interface" |
- global ALLOW_DUPLICATES |
- |
- # deal with class->interface adapters: |
- if not isinstance(origInterface, interface.InterfaceClass): |
- origInterface = declarations.implementedBy(origInterface) |
- |
- for interfaceClass in interfaceClasses: |
- factory = _registered(self, origInterface, interfaceClass) |
- if factory is not None and not ALLOW_DUPLICATES: |
- raise ValueError("an adapter (%s) was already registered." % (factory, )) |
- for interfaceClass in interfaceClasses: |
- self.register([origInterface], interfaceClass, '', adapterFactory) |
- |
- |
-def getAdapterFactory(fromInterface, toInterface, default): |
- """Return registered adapter for a given class and interface. |
- |
- Note that is tied to the *Twisted* global registry, and will |
- thus not find adapters registered elsewhere. |
- """ |
- self = globalRegistry |
- if not isinstance(fromInterface, interface.InterfaceClass): |
- fromInterface = declarations.implementedBy(fromInterface) |
- factory = self.lookup1(fromInterface, toInterface) |
- if factory is None: |
- factory = default |
- return factory |
- |
- |
-# add global adapter lookup hook for our newly created registry |
-def _hook(iface, ob, lookup=globalRegistry.lookup1): |
- factory = lookup(declarations.providedBy(ob), iface) |
- if factory is None: |
- return None |
- else: |
- return factory(ob) |
-interface.adapter_hooks.append(_hook) |
- |
-## backwardsCompatImplements and fixClassImplements should probably stick around for another |
-## release cycle. No harm doing so in any case. |
- |
-def backwardsCompatImplements(klass): |
- """DEPRECATED. |
- |
- Does nothing. Previously handled backwards compat from a |
- zope.interface using class to a class wanting old twisted |
- components interface behaviors. |
- """ |
- warnings.warn("components.backwardsCompatImplements doesn't do anything in Twisted 2.3, stop calling it.", ComponentsDeprecationWarning, stacklevel=2) |
- |
-def fixClassImplements(klass): |
- """DEPRECATED. |
- |
- Does nothing. Previously converted class from __implements__ to |
- zope implementation. |
- """ |
- warnings.warn("components.fixClassImplements doesn't do anything in Twisted 2.3, stop calling it.", ComponentsDeprecationWarning, stacklevel=2) |
- |
- |
-def getRegistry(): |
- """Returns the Twisted global |
- C{zope.interface.adapter.AdapterRegistry} instance. |
- """ |
- return globalRegistry |
- |
-# FIXME: deprecate attribute somehow? |
-CannotAdapt = TypeError |
- |
-class Adapter: |
- """I am the default implementation of an Adapter for some interface. |
- |
- This docstring contains a limerick, by popular demand:: |
- |
- Subclassing made Zope and TR |
- much harder to work with by far. |
- So before you inherit, |
- be sure to declare it |
- Adapter, not PyObject* |
- |
- @cvar temporaryAdapter: If this is True, the adapter will not be |
- persisted on the Componentized. |
- @cvar multiComponent: If this adapter is persistent, should it be |
- automatically registered for all appropriate interfaces. |
- """ |
- |
- # These attributes are used with Componentized. |
- |
- temporaryAdapter = 0 |
- multiComponent = 1 |
- |
- def __init__(self, original): |
- """Set my 'original' attribute to be the object I am adapting. |
- """ |
- self.original = original |
- |
- def __conform__(self, interface): |
- """ |
- I forward __conform__ to self.original if it has it, otherwise I |
- simply return None. |
- """ |
- if hasattr(self.original, "__conform__"): |
- return self.original.__conform__(interface) |
- return None |
- |
- def isuper(self, iface, adapter): |
- """ |
- Forward isuper to self.original |
- """ |
- return self.original.isuper(iface, adapter) |
- |
- |
-class Componentized(styles.Versioned): |
- """I am a mixin to allow you to be adapted in various ways persistently. |
- |
- I define a list of persistent adapters. This is to allow adapter classes |
- to store system-specific state, and initialized on demand. The |
- getComponent method implements this. You must also register adapters for |
- this class for the interfaces that you wish to pass to getComponent. |
- |
- Many other classes and utilities listed here are present in Zope3; this one |
- is specific to Twisted. |
- """ |
- |
- persistenceVersion = 1 |
- |
- def __init__(self): |
- self._adapterCache = {} |
- |
- def locateAdapterClass(self, klass, interfaceClass, default): |
- return getAdapterFactory(klass, interfaceClass, default) |
- |
- def setAdapter(self, interfaceClass, adapterClass): |
- self.setComponent(interfaceClass, adapterClass(self)) |
- |
- def addAdapter(self, adapterClass, ignoreClass=0): |
- """Utility method that calls addComponent. I take an adapter class and |
- instantiate it with myself as the first argument. |
- |
- @return: The adapter instantiated. |
- """ |
- adapt = adapterClass(self) |
- self.addComponent(adapt, ignoreClass) |
- return adapt |
- |
- def setComponent(self, interfaceClass, component): |
- """ |
- """ |
- self._adapterCache[reflect.qual(interfaceClass)] = component |
- |
- def addComponent(self, component, ignoreClass=0): |
- """ |
- Add a component to me, for all appropriate interfaces. |
- |
- In order to determine which interfaces are appropriate, the component's |
- provided interfaces will be scanned. |
- |
- If the argument 'ignoreClass' is True, then all interfaces are |
- considered appropriate. |
- |
- Otherwise, an 'appropriate' interface is one for which its class has |
- been registered as an adapter for my class according to the rules of |
- getComponent. |
- |
- @return: the list of appropriate interfaces |
- """ |
- for iface in declarations.providedBy(component): |
- if (ignoreClass or |
- (self.locateAdapterClass(self.__class__, iface, None) |
- == component.__class__)): |
- self._adapterCache[reflect.qual(iface)] = component |
- |
- def unsetComponent(self, interfaceClass): |
- """Remove my component specified by the given interface class.""" |
- del self._adapterCache[reflect.qual(interfaceClass)] |
- |
- def removeComponent(self, component): |
- """ |
- Remove the given component from me entirely, for all interfaces for which |
- it has been registered. |
- |
- @return: a list of the interfaces that were removed. |
- """ |
- l = [] |
- for k, v in self._adapterCache.items(): |
- if v is component: |
- del self._adapterCache[k] |
- l.append(reflect.namedObject(k)) |
- return l |
- |
- def getComponent(self, interface, default=None): |
- """Create or retrieve an adapter for the given interface. |
- |
- If such an adapter has already been created, retrieve it from the cache |
- that this instance keeps of all its adapters. Adapters created through |
- this mechanism may safely store system-specific state. |
- |
- If you want to register an adapter that will be created through |
- getComponent, but you don't require (or don't want) your adapter to be |
- cached and kept alive for the lifetime of this Componentized object, |
- set the attribute 'temporaryAdapter' to True on your adapter class. |
- |
- If you want to automatically register an adapter for all appropriate |
- interfaces (with addComponent), set the attribute 'multiComponent' to |
- True on your adapter class. |
- """ |
- k = reflect.qual(interface) |
- if self._adapterCache.has_key(k): |
- return self._adapterCache[k] |
- else: |
- adapter = interface.__adapt__(self) |
- if adapter is not None and not ( |
- hasattr(adapter, "temporaryAdapter") and |
- adapter.temporaryAdapter): |
- self._adapterCache[k] = adapter |
- if (hasattr(adapter, "multiComponent") and |
- adapter.multiComponent): |
- self.addComponent(adapter) |
- if adapter is None: |
- return default |
- return adapter |
- |
- |
- def __conform__(self, interface): |
- return self.getComponent(interface) |
- |
- |
-class ReprableComponentized(Componentized): |
- def __init__(self): |
- Componentized.__init__(self) |
- |
- def __repr__(self): |
- from cStringIO import StringIO |
- from pprint import pprint |
- sio = StringIO() |
- pprint(self._adapterCache, sio) |
- return sio.getvalue() |
- |
- |
- |
-def proxyForInterface(iface, originalAttribute='original'): |
- """ |
- Create a class which proxies all method calls which adhere to an interface |
- to another provider of that interface. |
- |
- This function is intended for creating specialized proxies. The typical way |
- to use it is by subclassing the result:: |
- |
- class MySpecializedProxy(proxyForInterface(IFoo)): |
- def someInterfaceMethod(self, arg): |
- if arg == 3: |
- return 3 |
- return self.original.someInterfaceMethod(arg) |
- |
- @param iface: The Interface to which the resulting object will conform, and |
- which the wrapped object must provide. |
- |
- @param originalAttribute: name of the attribute used to save the original |
- object in the resulting class. Default to C{original}. |
- @type originalAttribute: C{str} |
- |
- @return: A class whose constructor takes the original object as its only |
- argument. Constructing the class creates the proxy. |
- """ |
- def __init__(self, original): |
- setattr(self, originalAttribute, original) |
- contents = {"__init__": __init__} |
- for name in iface: |
- contents[name] = _ProxyDescriptor(name, originalAttribute) |
- proxy = type("(Proxy for %s)" |
- % (reflect.qual(iface),), (object,), contents) |
- directlyProvides(proxy, iface) |
- return proxy |
- |
- |
- |
-class _ProxiedClassMethod(object): |
- """ |
- A proxied class method. |
- |
- @ivar methodName: the name of the method which this should invoke when |
- called. |
- @type methodName: C{str} |
- |
- @ivar originalAttribute: name of the attribute of the proxy where the |
- original object is stored. |
- @type orginalAttribute: C{str} |
- """ |
- def __init__(self, methodName, originalAttribute): |
- self.methodName = methodName |
- self.originalAttribute = originalAttribute |
- |
- |
- def __call__(self, oself, *args, **kw): |
- """ |
- Invoke the specified L{methodName} method of the C{original} attribute |
- for proxyForInterface. |
- |
- @param oself: an instance of a L{proxyForInterface} object. |
- |
- @return: the result of the underlying method. |
- """ |
- original = getattr(oself, self.originalAttribute) |
- actualMethod = getattr(original, self.methodName) |
- return actualMethod(*args, **kw) |
- |
- |
- |
-class _ProxyDescriptor(object): |
- """ |
- A descriptor which will proxy attribute access, mutation, and |
- deletion to the L{original} attribute of the object it is being accessed |
- from. |
- |
- @ivar attributeName: the name of the attribute which this descriptor will |
- retrieve from instances' C{original} attribute. |
- @type attributeName: C{str} |
- |
- @ivar originalAttribute: name of the attribute of the proxy where the |
- original object is stored. |
- @type orginalAttribute: C{str} |
- """ |
- def __init__(self, attributeName, originalAttribute): |
- self.attributeName = attributeName |
- self.originalAttribute = originalAttribute |
- |
- |
- def __get__(self, oself, type=None): |
- """ |
- Retrieve the C{self.attributeName} property from L{oself}. |
- """ |
- if oself is None: |
- return _ProxiedClassMethod(self.attributeName, |
- self.originalAttribute) |
- original = getattr(oself, self.originalAttribute) |
- return getattr(original, self.attributeName) |
- |
- |
- def __set__(self, oself, value): |
- """ |
- Set the C{self.attributeName} property of L{oself}. |
- """ |
- original = getattr(oself, self.originalAttribute) |
- setattr(original, self.attributeName, value) |
- |
- |
- def __delete__(self, oself): |
- """ |
- Delete the C{self.attributeName} property of L{oself}. |
- """ |
- original = getattr(oself, self.originalAttribute) |
- delattr(original, self.attributeName) |
- |
- |
- |
-__all__ = [ |
- # Sticking around: |
- "ComponentsDeprecationWarning", |
- "registerAdapter", "getAdapterFactory", |
- "Adapter", "Componentized", "ReprableComponentized", "getRegistry", |
- "proxyForInterface", |
- |
- # Deprecated: |
- "backwardsCompatImplements", |
- "fixClassImplements", |
-] |