summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-30 23:09:17 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-30 23:09:17 +0000
commitb6c867e7d8f8c34138efadc5efd0c9f30bff9ecb (patch)
tree1923a3ff04976cfb031b00b2b78d7625cb6a4dcc
parentcc0bc9b032d59c740dbf27fdb46cd6a541f8df47 (diff)
downloadpyramid-b6c867e7d8f8c34138efadc5efd0c9f30bff9ecb.tar.gz
pyramid-b6c867e7d8f8c34138efadc5efd0c9f30bff9ecb.tar.bz2
pyramid-b6c867e7d8f8c34138efadc5efd0c9f30bff9ecb.zip
- Bug fix: when a ``repoze.bfg.resource.PackageOverrides`` class was
instantiated, and the package it was overriding already had a ``__loader__`` attribute, it would fail at startup time, even if the ``__loader__`` attribute was another PackageOverrides instance. We now replace any ``__loader__`` that is also a PackageOverrides instance. Symptom: ``ConfigurationExecutionError: <type 'exceptions.TypeError'>: Package <module 'karl.views' from '/Users/chrism/projects/osi/bfgenv/src/karl/karl/views/__init__.pyc'> already has a __loader__ (probably a module in a zipped egg)``.
-rw-r--r--CHANGES.txt10
-rw-r--r--repoze/bfg/resource.py8
-rw-r--r--repoze/bfg/tests/test_resource.py9
3 files changed, 22 insertions, 5 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 61458163c..3a3c39495 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,7 +1,15 @@
Next release
============
-- ...
+- Bug fix: when a ``repoze.bfg.resource.PackageOverrides`` class was
+ instantiated, and the package it was overriding already had a
+ ``__loader__`` attribute, it would fail at startup time, even if the
+ ``__loader__`` attribute was another PackageOverrides instance. We
+ now replace any ``__loader__`` that is also a PackageOverrides
+ instance. Symptom: ``ConfigurationExecutionError: <type
+ 'exceptions.TypeError'>: Package <module 'karl.views' from
+ '/Users/chrism/projects/osi/bfgenv/src/karl/karl/views/__init__.pyc'>
+ already has a __loader__ (probably a module in a zipped egg)``.
1.0a7 (2009-06-30)
==================
diff --git a/repoze/bfg/resource.py b/repoze/bfg/resource.py
index 4112925b4..276c52878 100644
--- a/repoze/bfg/resource.py
+++ b/repoze/bfg/resource.py
@@ -50,9 +50,11 @@ class PackageOverrides:
implements(IPackageOverrides)
# 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)
+ if hasattr(package, '__loader__') and not isinstance(package.__loader__,
+ self.__class__):
+ raise TypeError('Package %s already has a non-%s __loader__ '
+ '(probably a module in a zipped egg)' %
+ (package, self.__class__))
# 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
diff --git a/repoze/bfg/tests/test_resource.py b/repoze/bfg/tests/test_resource.py
index 9f466b002..5bc1be152 100644
--- a/repoze/bfg/tests/test_resource.py
+++ b/repoze/bfg/tests/test_resource.py
@@ -123,11 +123,18 @@ class TestPackageOverrides(unittest.TestCase):
pkg_resources = DummyPkgResources()
return klass(package, pkg_resources=pkg_resources)
- def test_ctor_package_already_has_loader(self):
+ def test_ctor_package_already_has_loader_of_different_type(self):
package = DummyPackage('package')
package.__loader__ = True
self.assertRaises(TypeError, self._makeOne, package)
+ def test_ctor_package_already_has_loader_of_same_type(self):
+ dummy_pkg_resources = DummyPkgResources()
+ package = DummyPackage('package')
+ package.__loader__ = self._makeOne(package)
+ po = self._makeOne(package)
+ self.assertEqual(package.__loader__, po)
+
def test_ctor_sets_loader(self):
package = DummyPackage('package')
po = self._makeOne(package)