flask/scripts/flaskext_compat.py

62 lines
1.7 KiB
Python
Raw Normal View History

# -*- 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.
"""
2011-09-20 03:00:28 +08:00
import sys
import imp
ext_module = imp.new_module('flask.ext')
ext_module.__path__ = []
ext_module.__package__ = ext_module.__name__
class _ExtensionImporter(object):
2011-09-20 03:00:28 +08:00
"""This importer redirects imports from the flask.ext module to other
locations.
"""
_module_choices = ['flask_%s', 'flaskext.%s']
2011-09-20 03:00:28 +08:00
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):
2011-09-20 03:00:28 +08:00
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
2011-09-20 03:00:28 +08:00
module = sys.modules[fullname] = sys.modules[realname]
if '.' not in modname:
2011-09-20 03:00:28 +08:00
setattr(ext_module, modname, module)
return module
raise ImportError(fullname)
2011-09-20 03:00:28 +08:00
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())