Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 38991ca

Browse files
committed
Add shim to preserve IPython.qt imports
1 parent 849943d commit 38991ca

3 files changed

Lines changed: 74 additions & 51 deletions

File tree

IPython/frontend.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,9 @@
99
working, though a warning will be printed.
1010
"""
1111

12-
#-----------------------------------------------------------------------------
13-
# Copyright (c) 2013, IPython Development Team.
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-
#-----------------------------------------------------------------------------
12+
# Copyright (c) IPython Development Team.
13+
# Distributed under the terms of the Modified BSD License.
1914

20-
#-----------------------------------------------------------------------------
21-
# Imports
22-
#-----------------------------------------------------------------------------
2315
from __future__ import print_function
2416

2517
# Stdlib
@@ -30,47 +22,7 @@
3022
warn("The top-level `frontend` package has been deprecated. "
3123
"All its subpackages have been moved to the top `IPython` level.")
3224

33-
#-----------------------------------------------------------------------------
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-
25+
from IPython.utils.shimmodule import ShimModule
7426

7527
# Unconditionally insert the shim into sys.modules so that further import calls
7628
# trigger the custom attribute access above

IPython/qt.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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')

IPython/utils/shimmodule.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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__

0 commit comments

Comments
 (0)