""" 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 import sys import types #----------------------------------------------------------------------------- # Class declarations #----------------------------------------------------------------------------- class ShimModule(types.ModuleType): def __getattribute__(self, key): m = ("*** WARNING*** : The top-level `frontend` module has been deprecated.\n" "Please import %s directly from the `IPython` level." % key) # FIXME: I don't understand why, but if the print statement below is # redirected to stderr, this shim module stops working. It seems the # Python import machinery has problem with redirected prints happening # during the import process. If we can't figure out a solution, we may # need to leave it to print to default stdout. print(m) # FIXME: this seems to work fine, but we should replace it with an # __import__ call instead of using exec/eval. exec 'from IPython import %s' % key return eval(key) # Unconditionally insert the shim into sys.modules so that further import calls # trigger the custom attribute access above sys.modules['IPython.frontend'] = ShimModule('frontend')