Browse Source

Explain is_package AttributeError in find_package

When a PEP 302 import hook is used that doesn't implement .is_package()
an AttributeError is raised. This looks like a bug in Flask. This change
fixes that problem in the sense that it explains, that the
AttributeError is intentional.
pull/1208/head
Daniel Neuhäuser 11 years ago
parent
commit
94f4360137
  1. 3
      CHANGES
  2. 9
      flask/helpers.py
  3. 13
      flask/testsuite/config.py

3
CHANGES

@ -9,6 +9,9 @@ Version 0.10.2
(bugfix release, release date to be announced)
- Fixed broken `test_appcontext_signals()` test case.
- Raise an :exc:`AttributeError` in :func:`flask.helpers.find_package` with a
useful message explaining why it is raised when a PEP 302 import hook is used
without an `is_package()` method.
Version 0.10.1
--------------

9
flask/helpers.py

@ -679,8 +679,13 @@ def find_package(import_name):
filename = sys.modules[import_name].__file__
package_path = os.path.abspath(os.path.dirname(filename))
# package_path ends with __init__.py for a package
if loader.is_package(root_mod_name):
package_path = os.path.dirname(package_path)
if hasattr(loader, 'is_package'):
if loader.is_package(root_mod_name):
package_path = os.path.dirname(package_path)
else:
raise AttributeError(
('%s.is_package() method is missing but is '
'required by Flask of PEP 302 import hooks') % loader.__class__.__name__)
site_parent, site_folder = os.path.split(package_path)
py_prefix = os.path.abspath(sys.prefix)

13
flask/testsuite/config.py

@ -16,6 +16,7 @@ import pkgutil
import unittest
from contextlib import contextmanager
from flask.testsuite import FlaskTestCase
from flask._compat import PY2
# config keys used for the ConfigTestCase
@ -291,6 +292,18 @@ class InstanceTestCase(FlaskTestCase):
if 'site_egg' in sys.modules:
del sys.modules['site_egg']
if PY2:
def test_meta_path_loader_without_is_package(self):
class Loader(object):
def find_module(self, name):
return self
sys.meta_path.append(Loader())
try:
with self.assert_raises(AttributeError):
flask.Flask(__name__)
finally:
sys.meta_path.pop()
def suite():
suite = unittest.TestSuite()

Loading…
Cancel
Save