summaryrefslogtreecommitdiff
path: root/pecan/extensions.py
diff options
context:
space:
mode:
Diffstat (limited to 'pecan/extensions.py')
-rw-r--r--pecan/extensions.py83
1 files changed, 0 insertions, 83 deletions
diff --git a/pecan/extensions.py b/pecan/extensions.py
deleted file mode 100644
index 87b9925..0000000
--- a/pecan/extensions.py
+++ /dev/null
@@ -1,83 +0,0 @@
-import sys
-import pkg_resources
-import inspect
-import logging
-
-log = logging.getLogger(__name__)
-
-
-class PecanExtensionMissing(ImportError):
- pass
-
-
-class PecanExtensionImporter(object):
- """
- Short circuits imports for extensions.
-
- This is used in combination with ``pecan.ext`` so that when a user does
- ``from pecan.ext import foo``, it will attempt to map ``foo`` to a
- registered setuptools entry point in some other (Pecan extension) project.
-
- Conversely, an extension developer may define an entry point in his
- ``setup.py``, e.g.,
-
- setup(
- ...
- entry_points='''
- [pecan.extension]
- celery = pecancelery.lib.core
- '''
- )
-
- This is mostly for convenience and consistency. In this way, Pecan can
- maintain an ecosystem of extensions that share a common namespace,
- ``pecan.ext``, while still maintaining backwards compatibility for simple
- package names (e.g., ``pecancelery``).
- """
-
- extension_module = 'pecan.ext'
- prefix = extension_module + '.'
-
- def install(self):
- if self not in sys.meta_path:
- sys.meta_path.append(self)
-
- def __eq__(self, b):
- return self.__class__.__module__ == b.__class__.__module__ and \
- self.__class__.__name__ == b.__class__.__name__
-
- def __ne__(self, b):
- return not self.__eq__(b)
-
- def find_module(self, fullname, path=None):
- if fullname.startswith(self.prefix):
- return self
-
- def load_module(self, fullname):
- if fullname in sys.modules:
- return self
- extname = fullname.split(self.prefix)[1]
- module = self.find_module_for_extension(extname)
- realname = module.__name__
- try:
- __import__(realname)
- except ImportError:
- raise sys.exc_info()
- module = sys.modules[fullname] = sys.modules[realname]
- if '.' not in extname:
- setattr(sys.modules[self.extension_module], extname, module)
- return module
-
- def find_module_for_extension(self, name):
- for ep in pkg_resources.iter_entry_points('pecan.extension'):
- if ep.name != name:
- continue
- log.debug('%s loading extension %s', self.__class__.__name__, ep)
- module = ep.load()
- if not inspect.ismodule(module):
- log.debug('%s is not a module, skipping...' % module)
- continue
- return module
- raise PecanExtensionMissing(
- 'The `pecan.ext.%s` extension is not installed.' % name
- )