##// END OF EJS Templates
Merge pull request #11855 from tonyfast/completer_ordering...
Matthias Bussonnier -
r25240:f6b22ccf merge
parent child Browse files
Show More
@@ -2014,7 +2014,7 b' class IPCompleter(Completer):'
2014 2014
2015 2015 # Start with a clean slate of completions
2016 2016 matches = []
2017 custom_res = self.dispatch_custom_completer(text)
2017
2018 2018 # FIXME: we should extend our api to return a dict with completions for
2019 2019 # different types of objects. The rlcomplete() method could then
2020 2020 # simply collapse the dict into a list for readline, but we'd have
@@ -2025,29 +2025,24 b' class IPCompleter(Completer):'
2025 2025 full_text = line_buffer
2026 2026 completions = self._jedi_matches(
2027 2027 cursor_pos, cursor_line, full_text)
2028 if custom_res is not None:
2029 # did custom completers produce something?
2030 matches = [(m, 'custom') for m in custom_res]
2028
2029 if self.merge_completions:
2030 matches = []
2031 for matcher in self.matchers:
2032 try:
2033 matches.extend([(m, matcher.__qualname__)
2034 for m in matcher(text)])
2035 except:
2036 # Show the ugly traceback if the matcher causes an
2037 # exception, but do NOT crash the kernel!
2038 sys.excepthook(*sys.exc_info())
2031 2039 else:
2032 # Extend the list of completions with the results of each
2033 # matcher, so we return results to the user from all
2034 # namespaces.
2035 if self.merge_completions:
2036 matches = []
2037 for matcher in self.matchers:
2038 try:
2039 matches.extend([(m, matcher.__qualname__)
2040 for m in matcher(text)])
2041 except:
2042 # Show the ugly traceback if the matcher causes an
2043 # exception, but do NOT crash the kernel!
2044 sys.excepthook(*sys.exc_info())
2045 else:
2046 for matcher in self.matchers:
2047 matches = [(m, matcher.__qualname__)
2048 for m in matcher(text)]
2049 if matches:
2050 break
2040 for matcher in self.matchers:
2041 matches = [(m, matcher.__qualname__)
2042 for m in matcher(text)]
2043 if matches:
2044 break
2045
2051 2046 seen = set()
2052 2047 filtered_matches = set()
2053 2048 for m in matches:
@@ -2056,17 +2051,20 b' class IPCompleter(Completer):'
2056 2051 filtered_matches.add(m)
2057 2052 seen.add(t)
2058 2053
2059 _filtered_matches = sorted(
2060 set(filtered_matches), key=lambda x: completions_sorting_key(x[0]))\
2061 [:MATCHES_LIMIT]
2054 _filtered_matches = sorted(filtered_matches, key=lambda x: completions_sorting_key(x[0]))
2062 2055
2056 custom_res = [(m, 'custom') for m in self.dispatch_custom_completer(text) or []]
2057
2058 _filtered_matches = custom_res or _filtered_matches
2059
2060 _filtered_matches = _filtered_matches[:MATCHES_LIMIT]
2063 2061 _matches = [m[0] for m in _filtered_matches]
2064 2062 origins = [m[1] for m in _filtered_matches]
2065 2063
2066 2064 self.matches = _matches
2067 2065
2068 2066 return text, _matches, origins, completions
2069
2067
2070 2068 def fwd_unicode_match(self, text:str) -> Tuple[str, list]:
2071 2069 if self._names is None:
2072 2070 self._names = []
@@ -175,6 +175,20 b' class TestCompleter(unittest.TestCase):'
175 175
176 176 ip.complete("x.")
177 177
178 def test_custom_completion_ordering(self):
179 """Test that errors from custom attribute completers are silenced."""
180 ip = get_ipython()
181
182 _, matches = ip.complete('in')
183 assert matches.index('input') < matches.index('int')
184
185 def complete_example(a):
186 return ['example2', 'example1']
187
188 ip.Completer.custom_completers.add_re('ex*', complete_example)
189 _, matches = ip.complete('ex')
190 assert matches.index('example2') < matches.index('example1')
191
178 192 def test_unicode_completions(self):
179 193 ip = get_ipython()
180 194 # Some strings that trigger different types of completion. Check them both
General Comments 0
You need to be logged in to leave comments. Login now