mirror of https://github.com/mitsuhiko/flask.git
Armin Ronacher
13 years ago
1 changed files with 73 additions and 0 deletions
@ -0,0 +1,73 @@
|
||||
# -*- coding: utf-8 -*- |
||||
""" |
||||
flaskext_compat |
||||
~~~~~~~~~~~~~~~ |
||||
|
||||
Implements the ``flask.ext`` virtual package for versions of Flask |
||||
older than 0.7. This module is a noop if Flask 0.8 was detected. |
||||
|
||||
Usage:: |
||||
|
||||
import flaskext_compat |
||||
from flask.ext import foo |
||||
|
||||
:copyright: (c) 2011 by Armin Ronacher. |
||||
:license: BSD, see LICENSE for more details. |
||||
""" |
||||
|
||||
|
||||
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. |
||||
""" |
||||
_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] |
||||
|
||||
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] |
||||
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] |
||||
if '.' not in modname: |
||||
setattr(modules[__name__], 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 |
Loading…
Reference in new issue