##// END OF EJS Templates
update shim to support .frontend.html.notebook->.html
MinRK -
Show More
@@ -1,73 +1,78 b''
1 1 """
2 2 Shim to maintain backwards compatibility with old frontend imports.
3 3
4 4 We have moved all contents of the old `frontend` subpackage into top-level
5 5 subpackages (`html`, `qt` and `terminal`).
6 6
7 7 This will let code that was making `from IPython.frontend...` calls continue
8 8 working, though a warning will be printed.
9 9 """
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Copyright (c) 2013, IPython Development Team.
13 13 #
14 14 # Distributed under the terms of the Modified BSD License.
15 15 #
16 16 # The full license is in the file COPYING.txt, distributed with this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22 from __future__ import print_function
23 23
24 24 # Stdlib
25 25 import sys
26 26 import types
27 27 from warnings import warn
28 28
29 29 warn("The top-level `frontend` package has been deprecated. "
30 30 "All its subpackages have been moved to the top `IPython` level.")
31 31
32 32 #-----------------------------------------------------------------------------
33 33 # Class declarations
34 34 #-----------------------------------------------------------------------------
35 35
36 36 class ShimModule(types.ModuleType):
37 37
38 def __getattribute__(self, key):
38 def __init__(self, *args, **kwargs):
39 self._mirror = kwargs.pop("mirror")
40 super(ShimModule, self).__init__(*args, **kwargs)
41
42 def __getattr__(self, key):
39 43 # Use the equivalent of import_item(name), see below
40 name = 'IPython.' + key
44 name = "%s.%s" % (self._mirror, key)
41 45
42 46 # NOTE: the code below is copied *verbatim* from
43 47 # importstring.import_item. For some very strange reason that makes no
44 48 # sense to me, if we call it *as a function*, it doesn't work. This
45 49 # has something to do with the deep bowels of the import machinery and
46 50 # I couldn't find a way to make the code work as a standard function
47 51 # call. But at least since it's an unmodified copy of import_item,
48 52 # which is used extensively and has a test suite, we can be reasonably
49 53 # confident this is OK. If anyone finds how to call the function, all
50 54 # the below could be replaced simply with:
51 55 #
52 56 # from IPython.utils.importstring import import_item
53 # return import_item('IPython.' + key)
57 # return import_item('MIRROR.' + key)
54 58
55 59 parts = name.rsplit('.', 1)
56 60 if len(parts) == 2:
57 61 # called with 'foo.bar....'
58 62 package, obj = parts
59 63 module = __import__(package, fromlist=[obj])
60 64 try:
61 65 pak = module.__dict__[obj]
62 66 except KeyError:
63 67 raise ImportError('No module named %s' % obj)
64 68 return pak
65 69 else:
66 70 # called with un-dotted string
67 71 return __import__(parts[0])
68 72
69 73
70 74 # Unconditionally insert the shim into sys.modules so that further import calls
71 75 # trigger the custom attribute access above
72 76
73 sys.modules['IPython.frontend'] = ShimModule('frontend')
77 sys.modules['IPython.frontend.html.notebook'] = ShimModule('notebook', mirror='IPython.html')
78 sys.modules['IPython.frontend'] = ShimModule('frontend', mirror='IPython')
General Comments 0
You need to be logged in to leave comments. Login now