| Index: third_party/twisted_8_1/twisted/plugin.py
|
| diff --git a/third_party/twisted_8_1/twisted/plugin.py b/third_party/twisted_8_1/twisted/plugin.py
|
| deleted file mode 100644
|
| index 0b33a701481651a75e7dd7c3f1ecfd7dc7e22c6a..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/plugin.py
|
| +++ /dev/null
|
| @@ -1,246 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_plugin -*-
|
| -# Copyright (c) 2005 Divmod, Inc.
|
| -# Copyright (c) 2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Plugin system for Twisted.
|
| -
|
| -@author: U{Jp Calderone<mailto:exarkun@twistedmatrix.com>}
|
| -@author: U{Glyph Lefkowitz<mailto:glyph@twistedmatrix.com>}
|
| -"""
|
| -
|
| -import os
|
| -import sys
|
| -
|
| -from zope.interface import Interface, providedBy
|
| -
|
| -def _determinePickleModule():
|
| - """
|
| - Determine which 'pickle' API module to use.
|
| - """
|
| - try:
|
| - import cPickle
|
| - return cPickle
|
| - except ImportError:
|
| - import pickle
|
| - return pickle
|
| -
|
| -pickle = _determinePickleModule()
|
| -
|
| -from twisted.python.components import getAdapterFactory
|
| -from twisted.python.reflect import namedAny
|
| -from twisted.python import log
|
| -from twisted.python.modules import getModule
|
| -
|
| -
|
| -
|
| -class IPlugin(Interface):
|
| - """
|
| - Interface that must be implemented by all plugins.
|
| -
|
| - Only objects which implement this interface will be considered for return
|
| - by C{getPlugins}. To be useful, plugins should also implement some other
|
| - application-specific interface.
|
| - """
|
| -
|
| -
|
| -
|
| -class CachedPlugin(object):
|
| - def __init__(self, dropin, name, description, provided):
|
| - self.dropin = dropin
|
| - self.name = name
|
| - self.description = description
|
| - self.provided = provided
|
| - self.dropin.plugins.append(self)
|
| -
|
| - def __repr__(self):
|
| - return '<CachedPlugin %r/%r (provides %r)>' % (
|
| - self.name, self.dropin.moduleName,
|
| - ', '.join([i.__name__ for i in self.provided]))
|
| -
|
| - def load(self):
|
| - return namedAny(self.dropin.moduleName + '.' + self.name)
|
| -
|
| - def __conform__(self, interface, registry=None, default=None):
|
| - for providedInterface in self.provided:
|
| - if providedInterface.isOrExtends(interface):
|
| - return self.load()
|
| - if getAdapterFactory(providedInterface, interface, None) is not None:
|
| - return interface(self.load(), default)
|
| - return default
|
| -
|
| - # backwards compat HOORJ
|
| - getComponent = __conform__
|
| -
|
| -
|
| -
|
| -class CachedDropin(object):
|
| - """
|
| - A collection of L{CachedPlugin} instances from a particular module in a
|
| - plugin package.
|
| -
|
| - @type moduleName: C{str}
|
| - @ivar moduleName: The fully qualified name of the plugin module this
|
| - represents.
|
| -
|
| - @type description: C{str} or C{NoneType}
|
| - @ivar description: A brief explanation of this collection of plugins
|
| - (probably the plugin module's docstring).
|
| -
|
| - @type plugins: C{list}
|
| - @ivar plugins: The L{CachedPlugin} instances which were loaded from this
|
| - dropin.
|
| - """
|
| - def __init__(self, moduleName, description):
|
| - self.moduleName = moduleName
|
| - self.description = description
|
| - self.plugins = []
|
| -
|
| -
|
| -
|
| -def _generateCacheEntry(provider):
|
| - dropin = CachedDropin(provider.__name__,
|
| - provider.__doc__)
|
| - for k, v in provider.__dict__.iteritems():
|
| - plugin = IPlugin(v, None)
|
| - if plugin is not None:
|
| - cachedPlugin = CachedPlugin(dropin, k, v.__doc__, list(providedBy(plugin)))
|
| - return dropin
|
| -
|
| -try:
|
| - fromkeys = dict.fromkeys
|
| -except AttributeError:
|
| - def fromkeys(keys, value=None):
|
| - d = {}
|
| - for k in keys:
|
| - d[k] = value
|
| - return d
|
| -
|
| -def getCache(module):
|
| - """
|
| - Compute all the possible loadable plugins, while loading as few as
|
| - possible and hitting the filesystem as little as possible.
|
| -
|
| - @param module: a Python module object. This represents a package to search
|
| - for plugins.
|
| -
|
| - @return: a dictionary mapping module names to CachedDropin instances.
|
| - """
|
| - allCachesCombined = {}
|
| - mod = getModule(module.__name__)
|
| - # don't want to walk deep, only immediate children.
|
| - lastPath = None
|
| - buckets = {}
|
| - # Fill buckets with modules by related entry on the given package's
|
| - # __path__. There's an abstraction inversion going on here, because this
|
| - # information is already represented internally in twisted.python.modules,
|
| - # but it's simple enough that I'm willing to live with it. If anyone else
|
| - # wants to fix up this iteration so that it's one path segment at a time,
|
| - # be my guest. --glyph
|
| - for plugmod in mod.iterModules():
|
| - fpp = plugmod.filePath.parent()
|
| - if fpp not in buckets:
|
| - buckets[fpp] = []
|
| - bucket = buckets[fpp]
|
| - bucket.append(plugmod)
|
| - for pseudoPackagePath, bucket in buckets.iteritems():
|
| - dropinPath = pseudoPackagePath.child('dropin.cache')
|
| - try:
|
| - lastCached = dropinPath.getModificationTime()
|
| - dropinDotCache = pickle.load(dropinPath.open('rb'))
|
| - except:
|
| - dropinDotCache = {}
|
| - lastCached = 0
|
| -
|
| - needsWrite = False
|
| - existingKeys = {}
|
| - for pluginModule in bucket:
|
| - pluginKey = pluginModule.name.split('.')[-1]
|
| - existingKeys[pluginKey] = True
|
| - if ((pluginKey not in dropinDotCache) or
|
| - (pluginModule.filePath.getModificationTime() >= lastCached)):
|
| - needsWrite = True
|
| - try:
|
| - provider = pluginModule.load()
|
| - except:
|
| - # dropinDotCache.pop(pluginKey, None)
|
| - log.err()
|
| - else:
|
| - entry = _generateCacheEntry(provider)
|
| - dropinDotCache[pluginKey] = entry
|
| - # Make sure that the cache doesn't contain any stale plugins.
|
| - for pluginKey in dropinDotCache.keys():
|
| - if pluginKey not in existingKeys:
|
| - del dropinDotCache[pluginKey]
|
| - needsWrite = True
|
| - if needsWrite:
|
| - try:
|
| - dropinPath.setContent(pickle.dumps(dropinDotCache))
|
| - except:
|
| - log.err()
|
| - allCachesCombined.update(dropinDotCache)
|
| - return allCachesCombined
|
| -
|
| -
|
| -def getPlugins(interface, package=None):
|
| - """
|
| - Retrieve all plugins implementing the given interface beneath the given module.
|
| -
|
| - @param interface: An interface class. Only plugins which implement this
|
| - interface will be returned.
|
| -
|
| - @param package: A package beneath which plugins are installed. For
|
| - most uses, the default value is correct.
|
| -
|
| - @return: An iterator of plugins.
|
| - """
|
| - if package is None:
|
| - import twisted.plugins as package
|
| - allDropins = getCache(package)
|
| - for dropin in allDropins.itervalues():
|
| - for plugin in dropin.plugins:
|
| - try:
|
| - adapted = interface(plugin, None)
|
| - except:
|
| - log.err()
|
| - else:
|
| - if adapted is not None:
|
| - yield adapted
|
| -
|
| -
|
| -# Old, backwards compatible name. Don't use this.
|
| -getPlugIns = getPlugins
|
| -
|
| -
|
| -def pluginPackagePaths(name):
|
| - """
|
| - Return a list of additional directories which should be searched for
|
| - modules to be included as part of the named plugin package.
|
| -
|
| - @type name: C{str}
|
| - @param name: The fully-qualified Python name of a plugin package, eg
|
| - C{'twisted.plugins'}.
|
| -
|
| - @rtype: C{list} of C{str}
|
| - @return: The absolute paths to other directories which may contain plugin
|
| - modules for the named plugin package.
|
| - """
|
| - package = name.split('.')
|
| - # Note that this may include directories which do not exist. It may be
|
| - # preferable to remove such directories at this point, rather than allow
|
| - # them to be searched later on.
|
| - #
|
| - # Note as well that only '__init__.py' will be considered to make a
|
| - # directory a package (and thus exclude it from this list). This means
|
| - # that if you create a master plugin package which has some other kind of
|
| - # __init__ (eg, __init__.pyc) it will be incorrectly treated as a
|
| - # supplementary plugin directory.
|
| - return [
|
| - os.path.abspath(os.path.join(x, *package))
|
| - for x
|
| - in sys.path
|
| - if
|
| - not os.path.exists(os.path.join(x, *package + ['__init__.py']))]
|
| -
|
| -__all__ = ['getPlugins', 'pluginPackagePaths']
|
|
|