forked from orbit-oss/flask
Added workaround for Python 3.3's frozen loader
This commit is contained in:
parent
696bffc9e9
commit
9554844e2a
2 changed files with 31 additions and 8 deletions
1
CHANGES
1
CHANGES
|
|
@ -23,6 +23,7 @@ Version 1.0
|
||||||
- Added ``TEMPLATES_AUTO_RELOAD`` config key. If disabled the
|
- Added ``TEMPLATES_AUTO_RELOAD`` config key. If disabled the
|
||||||
templates will be reloaded only if the application is running in
|
templates will be reloaded only if the application is running in
|
||||||
debug mode. For higher performance it’s possible to disable that.
|
debug mode. For higher performance it’s possible to disable that.
|
||||||
|
- Added a workaround for a limitation in Python 3.3's namespace loader.
|
||||||
|
|
||||||
Version 0.10.2
|
Version 0.10.2
|
||||||
--------------
|
--------------
|
||||||
|
|
|
||||||
|
|
@ -656,6 +656,29 @@ def get_root_path(import_name):
|
||||||
return os.path.dirname(os.path.abspath(filepath))
|
return os.path.dirname(os.path.abspath(filepath))
|
||||||
|
|
||||||
|
|
||||||
|
def _matching_loader_thinks_module_is_package(loader, mod_name):
|
||||||
|
"""Given the loader that loaded a module and the module this function
|
||||||
|
attempts to figure out if the given module is actually a package.
|
||||||
|
"""
|
||||||
|
# If the loader can tell us if something is a package, we can
|
||||||
|
# directly ask the loader.
|
||||||
|
if hasattr(loader, 'is_package'):
|
||||||
|
return loader.is_package(mod_name)
|
||||||
|
# importlib's namespace loaders do not have this functionality but
|
||||||
|
# all the modules it loads are packages, so we can take advantage of
|
||||||
|
# this information.
|
||||||
|
elif (loader.__module__ == '_frozen_importlib' and
|
||||||
|
loader.__name__ == 'NamespaceLoader'):
|
||||||
|
return True
|
||||||
|
# Otherwise we need to fail with an error that explains what went
|
||||||
|
# wrong.
|
||||||
|
raise AttributeError(
|
||||||
|
('%s.is_package() method is missing but is required by Flask of '
|
||||||
|
'PEP 302 import hooks. If you do not use import hooks and '
|
||||||
|
'you encounter this error please file a bug against Flask.') %
|
||||||
|
loader.__class__.__name__)
|
||||||
|
|
||||||
|
|
||||||
def find_package(import_name):
|
def find_package(import_name):
|
||||||
"""Finds a package and returns the prefix (or None if the package is
|
"""Finds a package and returns the prefix (or None if the package is
|
||||||
not installed) as well as the folder that contains the package or
|
not installed) as well as the folder that contains the package or
|
||||||
|
|
@ -685,14 +708,13 @@ def find_package(import_name):
|
||||||
__import__(import_name)
|
__import__(import_name)
|
||||||
filename = sys.modules[import_name].__file__
|
filename = sys.modules[import_name].__file__
|
||||||
package_path = os.path.abspath(os.path.dirname(filename))
|
package_path = os.path.abspath(os.path.dirname(filename))
|
||||||
# package_path ends with __init__.py for a package
|
|
||||||
if hasattr(loader, 'is_package'):
|
# In case the root module is a pcakage we need to chop of the
|
||||||
if loader.is_package(root_mod_name):
|
# rightmost part. This needs to go through a helper function
|
||||||
package_path = os.path.dirname(package_path)
|
# because of python 3.3 namespace packages.
|
||||||
else:
|
if _matching_loader_thinks_module_is_package(
|
||||||
raise AttributeError(
|
loader, root_mod_name):
|
||||||
('%s.is_package() method is missing but is '
|
package_path = os.path.dirname(package_path)
|
||||||
'required by Flask of PEP 302 import hooks') % loader.__class__.__name__)
|
|
||||||
|
|
||||||
site_parent, site_folder = os.path.split(package_path)
|
site_parent, site_folder = os.path.split(package_path)
|
||||||
py_prefix = os.path.abspath(sys.prefix)
|
py_prefix = os.path.abspath(sys.prefix)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue