diff options
Diffstat (limited to 'repoze/bfg/resource.py')
| -rw-r--r-- | repoze/bfg/resource.py | 22 |
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('/'): |
