Browse Source

Explicitly activate compat module

pull/327/head
Armin Ronacher 13 years ago
parent
commit
7997bae5bb
  1. 8
      docs/extensions.rst
  2. 56
      scripts/flaskext_compat.py

8
docs/extensions.rst

@ -33,12 +33,14 @@ depending on how the extension is distributed.
We recommend importing from ``flask.ext`` even with older versions of We recommend importing from ``flask.ext`` even with older versions of
Flask however. If you have an application that needs to work with Flask however. If you have an application that needs to work with
versions of Flask older than 0.8 you should activate the versions of Flask older than 0.8 you should activate the
``flaskext_compat`` module which provides the ``flask.ext`` module. You ``flaskext_compat`` module which provides the ``flask.ext`` module if
can download it from github: `flaskext_compat.py`_ you activate it. You can download it from github: `flaskext_compat.py`_
You can use it like this:: And here is how you can use it::
import flaskext_compat import flaskext_compat
flaskext_compat.activate()
from flask.ext import foo from flask.ext import foo
Once the ``flaskext_compat`` module is imported the :data:`flask.ext` will Once the ``flaskext_compat`` module is imported the :data:`flask.ext` will

56
scripts/flaskext_compat.py

@ -14,39 +14,30 @@
:copyright: (c) 2011 by Armin Ronacher. :copyright: (c) 2011 by Armin Ronacher.
:license: BSD, see LICENSE for more details. :license: BSD, see LICENSE for more details.
""" """
import sys
import imp
ext_module = imp.new_module('flask.ext')
ext_module.__path__ = []
ext_module.__package__ = ext_module.__name__
class _ExtensionImporter(object): class _ExtensionImporter(object):
"""This importer redirects imports from this submodule to other locations. """This importer redirects imports from the flask.ext module to other
This makes it possible to transition from the old flaskext.name to the locations.
newer flask_name without people having a hard time.
""" """
_module_choices = ['flask_%s', 'flaskext.%s'] _module_choices = ['flask_%s', 'flaskext.%s']
prefix = ext_module.__name__ + '.'
def __init__(self): prefix_cutoff = prefix.count('.')
from sys import meta_path
self.prefix = __name__ + '.'
self.prefix_cutoff = __name__.count('.') + 1
# since people might reload the flask.ext module (by accident or
# intentionally) we have to make sure to not add more than one
# import hook. We can't check class types here either since a new
# class will be created on reload. As a result of that we check
# the name of the class and remove stale instances.
def _name(x):
cls = type(x)
return cls.__module__ + '.' + cls.__name__
this = _name(self)
meta_path[:] = [x for x in meta_path if _name(x) != this] + [self]
def find_module(self, fullname, path=None): def find_module(self, fullname, path=None):
if fullname.startswith(self.prefix): if fullname.startswith(self.prefix):
return self return self
def load_module(self, fullname): def load_module(self, fullname):
from sys import modules if fullname in sys.modules:
if fullname in modules: return sys.modules[fullname]
return modules[fullname]
modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff] modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff]
for path in self._module_choices: for path in self._module_choices:
realname = path % modname realname = path % modname
@ -54,20 +45,17 @@ class _ExtensionImporter(object):
__import__(realname) __import__(realname)
except ImportError: except ImportError:
continue continue
module = modules[fullname] = modules[realname] module = sys.modules[fullname] = sys.modules[realname]
if '.' not in modname: if '.' not in modname:
setattr(modules[__name__], modname, module) setattr(ext_module, modname, module)
return module return module
raise ImportError(fullname) raise ImportError(fullname)
import sys def activate():
import flask """Activates the compatibility system."""
try: import flask
__import__('flask.ext') if hasattr(flask, 'ext'):
except ImportError: return
sys.modules['flask.ext'] = flask.ext = sys.modules[__name__] sys.modules['flask.ext'] = flask.ext = ext_module
__name__ = __package__ = 'flask.ext' sys.meta_path.append(_ExtensionImporter())
__path__ = []
_ExtensionImporter()
del _ExtensionImporter, sys, flask

Loading…
Cancel
Save