summaryrefslogtreecommitdiff
path: root/repoze/bfg/resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/resource.py')
-rw-r--r--repoze/bfg/resource.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/repoze/bfg/resource.py b/repoze/bfg/resource.py
index d11993e5b..4112925b4 100644
--- a/repoze/bfg/resource.py
+++ b/repoze/bfg/resource.py
@@ -48,9 +48,27 @@ class OverrideProvider(pkg_resources.DefaultProvider):
class PackageOverrides:
implements(IPackageOverrides)
- def __init__(self, overridden_package):
+ # pkg_resources arg in kw args below for testing
+ def __init__(self, package, pkg_resources=pkg_resources):
+ if hasattr(package, '__loader__'):
+ raise TypeError('Package %s already has a __loader__ '
+ '(probably a module in a zipped egg)' % package)
+ # We register ourselves as a __loader__ *only* to support the
+ # setuptools _find_adapter adapter lookup; this class doesn't
+ # actually support the PEP 302 loader "API". This is
+ # excusable due to the following statement in the spec:
+ # ... Loader objects are not
+ # required to offer any useful functionality (any such functionality,
+ # such as the zipimport get_data() method mentioned above, is
+ # optional)...
+ # A __loader__ attribute is basically metadata, and setuptools
+ # uses it as such.
+ package.__loader__ = self
+ # we call register_loader_type for every instantiation of this
+ # class; that's OK, it's idempotent to do it more than once.
+ pkg_resources.register_loader_type(self.__class__, OverrideProvider)
self.overrides = []
- self.overridden_package = overridden_package
+ self.overridden_package_name = package.__name__
def insert(self, path, package, prefix):
if not path or path.endswith('/'):