|
9 | 9 | working, though a warning will be printed. |
10 | 10 | """ |
11 | 11 |
|
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. |
19 | 14 |
|
20 | | -#----------------------------------------------------------------------------- |
21 | | -# Imports |
22 | | -#----------------------------------------------------------------------------- |
23 | 15 | from __future__ import print_function |
24 | 16 |
|
25 | 17 | # Stdlib |
|
30 | 22 | warn("The top-level `frontend` package has been deprecated. " |
31 | 23 | "All its subpackages have been moved to the top `IPython` level.") |
32 | 24 |
|
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 |
74 | 26 |
|
75 | 27 | # Unconditionally insert the shim into sys.modules so that further import calls |
76 | 28 | # trigger the custom attribute access above |
|
0 commit comments