Skip to content

Commit

Permalink
Explicitly activate compat module
Browse files Browse the repository at this point in the history
  • Loading branch information
mitsuhiko committed Sep 19, 2011
1 parent 9c82840 commit 7997bae
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 37 deletions.
8 changes: 5 additions & 3 deletions docs/extensions.rst
Expand Up @@ -33,12 +33,14 @@ depending on how the extension is distributed.
We recommend importing from ``flask.ext`` even with older versions of
Flask however. If you have an application that needs to work with
versions of Flask older than 0.8 you should activate the
``flaskext_compat`` module which provides the ``flask.ext`` module. You
can download it from github: `flaskext_compat.py`_
``flaskext_compat`` module which provides the ``flask.ext`` module if
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
flaskext_compat.activate()

from flask.ext import foo

Once the ``flaskext_compat`` module is imported the :data:`flask.ext` will
Expand Down
56 changes: 22 additions & 34 deletions scripts/flaskext_compat.py
Expand Up @@ -14,60 +14,48 @@
:copyright: (c) 2011 by Armin Ronacher.
: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):
"""This importer redirects imports from this submodule to other locations.
This makes it possible to transition from the old flaskext.name to the
newer flask_name without people having a hard time.
"""This importer redirects imports from the flask.ext module to other
locations.
"""
_module_choices = ['flask_%s', 'flaskext.%s']

def __init__(self):
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]
prefix = ext_module.__name__ + '.'
prefix_cutoff = prefix.count('.')

def find_module(self, fullname, path=None):
if fullname.startswith(self.prefix):
return self

def load_module(self, fullname):
from sys import modules
if fullname in modules:
return modules[fullname]
if fullname in sys.modules:
return sys.modules[fullname]
modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff]
for path in self._module_choices:
realname = path % modname
try:
__import__(realname)
except ImportError:
continue
module = modules[fullname] = modules[realname]
module = sys.modules[fullname] = sys.modules[realname]
if '.' not in modname:
setattr(modules[__name__], modname, module)
setattr(ext_module, modname, module)
return module
raise ImportError(fullname)


import sys
import flask
try:
__import__('flask.ext')
except ImportError:
sys.modules['flask.ext'] = flask.ext = sys.modules[__name__]
__name__ = __package__ = 'flask.ext'
__path__ = []
_ExtensionImporter()
del _ExtensionImporter, sys, flask
def activate():
"""Activates the compatibility system."""
import flask
if hasattr(flask, 'ext'):
return
sys.modules['flask.ext'] = flask.ext = ext_module
sys.meta_path.append(_ExtensionImporter())

0 comments on commit 7997bae

Please sign in to comment.