1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
--- contrib/python/ipython/py2/IPython/core/completerlib.py (index)
+++ contrib/python/ipython/py2/IPython/core/completerlib.py (working tree)
@@ -19,6 +19,7 @@ from __future__ import print_function
# Stdlib imports
import glob
import inspect
+import itertools
import os
import re
import sys
@@ -44,6 +45,8 @@ from IPython.utils.py3compat import string_types
# FIXME: this should be pulled in with the right call via the component system
from IPython import get_ipython
+from __res import importer
+
#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------
@@ -68,6 +71,51 @@ magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$')
# Local utilities
#-----------------------------------------------------------------------------
+arcadia_rootmodules_cache = None
+arcadia_modules_cache = None
+
+
+def arcadia_init_cache():
+ global arcadia_rootmodules_cache, arcadia_modules_cache
+ arcadia_rootmodules_cache = set()
+ arcadia_modules_cache = {}
+
+ all_modules = itertools.chain(
+ sys.builtin_module_names,
+ importer.memory
+ )
+
+ for name in all_modules:
+ path = name.split('.')
+ arcadia_rootmodules_cache.add(path[0])
+
+ prefix = path[0]
+ for element in path[1:]:
+ if element == '__init__':
+ continue
+
+ arcadia_modules_cache.setdefault(prefix, set()).add(element)
+ prefix += '.' + element
+
+ arcadia_rootmodules_cache = sorted(arcadia_rootmodules_cache)
+ arcadia_modules_cache = {k: sorted(v) for k, v in arcadia_modules_cache.items()}
+
+
+def arcadia_module_list(mod):
+ if arcadia_modules_cache is None:
+ arcadia_init_cache()
+
+ return arcadia_modules_cache.get(mod, ())
+
+
+def arcadia_get_root_modules():
+ if arcadia_rootmodules_cache is None:
+ arcadia_init_cache()
+
+ return arcadia_rootmodules_cache
+
+
+
def module_list(path):
"""
Return the list containing the names of the modules available in the given
@@ -168,7 +216,8 @@ def try_import(mod, only_modules=False):
for module in mods[1:]:
m = getattr(m, module)
- m_is_init = hasattr(m, '__file__') and '__init__' in m.__file__
+ filename = getattr(m, '__file__', '')
+ m_is_init = '__init__' in (filename or '') or filename == mod
completions = []
if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
@@ -177,10 +226,10 @@ def try_import(mod, only_modules=False):
completions.extend(getattr(m, '__all__', []))
if m_is_init:
- completions.extend(module_list(os.path.dirname(m.__file__)))
+ completions.extend(arcadia_module_list(mod))
completions = {c for c in completions if isinstance(c, string_types)}
completions.discard('__init__')
- return list(completions)
+ return sorted(completions)
#-----------------------------------------------------------------------------
@@ -229,10 +278,10 @@ def module_completion(line):
# 'from xy<tab>' or 'import xy<tab>'
if nwords < 3 and (words[0] in {'%aimport', 'import', 'from'}) :
if nwords == 1:
- return get_root_modules()
+ return arcadia_get_root_modules()
mod = words[1].split('.')
if len(mod) < 2:
- return get_root_modules()
+ return arcadia_get_root_modules()
completion_list = try_import('.'.join(mod[:-1]), True)
return ['.'.join(mod[:-1] + [el]) for el in completion_list]
--- contrib/python/ipython/py2/IPython/core/extensions.py (index)
+++ contrib/python/ipython/py2/IPython/core/extensions.py (working tree)
@@ -75,11 +75,11 @@ class ExtensionManager(Configurable):
if module_str in self.loaded:
return "already loaded"
- from IPython.utils.syspathcontext import prepended_to_syspath
-
with self.shell.builtin_trap:
if module_str not in sys.modules:
- with prepended_to_syspath(self.ipython_extension_dir):
+ try:
+ sys.modules[module_str] = __import__('IPython.extensions.' + module_str)
+ except ImportError:
__import__(module_str)
mod = sys.modules[module_str]
if self._call_load_ipython_extension(mod):
--- contrib/python/ipython/py2/IPython/core/profiledir.py (index)
+++ contrib/python/ipython/py2/IPython/core/profiledir.py (working tree)
@@ -112,13 +112,11 @@ class ProfileDir(LoggingConfigurable):
self._mkdir(self.startup_dir)
readme = os.path.join(self.startup_dir, 'README')
- src = os.path.join(get_ipython_package_dir(), u'core', u'profile', u'README_STARTUP')
- if not os.path.exists(src):
- self.log.warning("Could not copy README_STARTUP to startup dir. Source file %s does not exist.", src)
-
- if os.path.exists(src) and not os.path.exists(readme):
- shutil.copy(src, readme)
+ if not os.path.exists(readme):
+ import pkgutil
+ with open(readme, 'wb') as f:
+ f.write(pkgutil.get_data(__name__, 'profile/README_STARTUP'))
@observe('security_dir')
def check_security_dir(self, change=None):
|