aboutsummaryrefslogblamecommitdiffstats
path: root/contrib/python/ipython/py2/patches/01-arcadia.patch
blob: 3a14077574ec9af7dbca111744414d4a314ef5d0 (plain) (tree)














































































































































                                                                                                                  
--- 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):