##// END OF EJS Templates
Fix imports for plain terminal ipython and use a proper warn() call.
Fix imports for plain terminal ipython and use a proper warn() call.

File last commit:

r11020:3bf3158c
r11020:3bf3158c
Show More
frontend.py
72 lines | 2.8 KiB | text/x-python | PythonLexer
"""
Shim to maintain backwards compatibility with old frontend imports.
We have moved all contents of the old `frontend` subpackage into top-level
subpackages (`html`, `qt` and `terminal`). This will let code that was making
`from IPython.frontend...` calls continue working, though a warning will be
printed.
"""
#-----------------------------------------------------------------------------
# Copyright (c) 2013, IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
from __future__ import print_function
# Stdlib
import sys
import types
from warnings import warn
warn("The top-level `frontend` package has been deprecated. "
"All its subpackages have been moved to the top `IPython` level.")
#-----------------------------------------------------------------------------
# Class declarations
#-----------------------------------------------------------------------------
class ShimModule(types.ModuleType):
def __getattribute__(self, key):
# Use the equivalent of import_item(name), see below
name = 'IPython.' + key
# NOTE: the code below is copied *verbatim* from
# importstring.import_item. For some very strange reason that makes no
# sense to me, if we call it *as a function*, it doesn't work. This
# has something to do with the deep bowels of the import machinery and
# I couldn't find a way to make the code work as a standard function
# call. But at least since it's an unmodified copy of import_item,
# which is used extensively and has a test suite, we can be reasonably
# confident this is OK. If anyone finds how to call the function, all
# the below could be replaced simply with:
#
# from IPython.utils.importstring import import_item
# return import_item('IPython.' + key)
parts = name.rsplit('.', 1)
if len(parts) == 2:
# called with 'foo.bar....'
package, obj = parts
module = __import__(package, fromlist=[obj])
try:
pak = module.__dict__[obj]
except KeyError:
raise ImportError('No module named %s' % obj)
return pak
else:
# called with un-dotted string
return __import__(parts[0])
# Unconditionally insert the shim into sys.modules so that further import calls
# trigger the custom attribute access above
sys.modules['IPython.frontend'] = ShimModule('frontend')