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