aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/ipython/py3/patches/01-arcadia.patch
blob: 9fee8bae7263e640c4518a2d98869542ac8f0eaa (plain) (blame)
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
--- contrib/python/ipython/py3/IPython/core/completer.py	(index)
+++ contrib/python/ipython/py3/IPython/core/completer.py	(working tree)
@@ -1362,6 +1362,7 @@ def _make_signature(completion)-> str:
 
     """
 
+    return '(%s)'% ', '.join([f for f in (_formatparamchildren(p) for p in completion.params) if f])
     # it looks like this might work on jedi 0.17
     if hasattr(completion, 'get_signatures'):
         signatures = completion.get_signatures()
@@ -1921,1 +1922,1 @@ class IPCompleter(Completer):
-        interpreter = jedi.Interpreter(text[:offset], namespaces)
+        interpreter = jedi.Interpreter(text[:offset], namespaces, column=cursor_column, line=cursor_line + 1)
@@ -1948,1 +1949,1 @@ class IPCompleter(Completer):
-            return filter(completion_filter, interpreter.complete(column=cursor_column, line=cursor_line + 1))
+            return filter(completion_filter, interpreter.completions())
--- contrib/python/ipython/py3/IPython/core/completerlib.py	(index)
+++ contrib/python/ipython/py3/IPython/core/completerlib.py	(working tree)
@@ -20,2 +20,3 @@ These are all loaded by default by IPython.
 import inspect
+import itertools
 import os
@@ -40,4 +41,6 @@ from IPython import get_ipython
 from typing import List
 
+from __res import importer
+
 #-----------------------------------------------------------------------------
 # Globals and constants
@@ -64,6 +67,50 @@ magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$')
 #-----------------------------------------------------------------------------
 
 
+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: str) -> List[str]:
     """
     Return the list containing the names of the modules available in the given
@@ -176,7 +223,8 @@ def try_import(mod: str, only_modules=False) -> List[str]:
     except:
         return []
 
-    m_is_init = '__init__' in (getattr(m, '__file__', '') or '')
+    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:
@@ -190,9 +238,10 @@ def try_import(mod: str, only_modules=False) -> List[str]:
         file_path = os.path.dirname(file_)  # type: ignore
         if file_path is not None:
             completions.extend(module_list(file_path))
+        completions.extend(arcadia_module_list(mod))
     completions_set = {c for c in completions if isinstance(c, str)}
     completions_set.discard('__init__')
-    return list(completions_set)
+    return sorted(completions_set)
 
 
 #-----------------------------------------------------------------------------
@@ -242,10 +290,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/py3/IPython/core/profiledir.py	(index)
+++ contrib/python/ipython/py3/IPython/core/profiledir.py	(working tree)
@@ -126,18 +126,12 @@ class ProfileDir(LoggingConfigurable):
     def check_startup_dir(self, change=None):
         if self._mkdir(self.startup_dir):
             readme = os.path.join(self.startup_dir, "README")
-            src = os.path.join(
-                get_ipython_package_dir(), "core", "profile", "README_STARTUP"
-            )
 
-            if os.path.exists(src):
-                if not os.path.exists(readme):
-                    shutil.copy(src, readme)
-            else:
-                self.log.warning(
-                    "Could not copy README_STARTUP to startup dir. Source file %s does not exist.",
-                    src,
-                )
+            if not os.path.exists(readme):
+                import pkgutil
+                with open(readme, "wb") as f:
+                    f.write(pkgutil.get_data(__name__, "profile/README_STARTUP"))
+                return
 
     @observe('security_dir')
     def check_security_dir(self, change=None):