--- 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' or 'import xy' 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):