##// END OF EJS Templates
speedup completion of unicode names
Matthias Bussonnier -
Show More
@@ -156,6 +156,14 b' except ImportError:'
156 156 # Globals
157 157 #-----------------------------------------------------------------------------
158 158
159 # ranges where we have most of the valid unicode names. We could be more finer
160 # grained but is it worth it for performace While unicode have character in the
161 # rage 0, 0x110000, we seem to have name for about 10% of those. (131808 as I
162 # write this). With below range we cover them all, with a density of ~67%
163 # biggest next gap we consider only adds up about 1% density and there are 600
164 # gaps that would need hard coding.
165 _UNICODE_RANGES = [(32, 0x2fa1e), (0xe0001, 0xe01f0)]
166
159 167 # Public API
160 168 __all__ = ['Completer','IPCompleter']
161 169
@@ -2092,7 +2100,7 b' class IPCompleter(Completer):'
2092 2100 full_text = line_buffer
2093 2101 completions = self._jedi_matches(
2094 2102 cursor_pos, cursor_line, full_text)
2095
2103
2096 2104 if self.merge_completions:
2097 2105 matches = []
2098 2106 for matcher in self.matchers:
@@ -2195,6 +2203,16 b' class IPCompleter(Completer):'
2195 2203 names.append(unicodedata.name(chr(c)))
2196 2204 except ValueError:
2197 2205 pass
2198 self._unicode_names = names
2206 self._unicode_names = _unicode_name_compute(_UNICODE_RANGES)
2199 2207
2200 2208 return self._unicode_names
2209
2210 def _unicode_name_compute(ranges:List[Tuple[int,int]]) -> List[str]:
2211 names = []
2212 for start,stop in ranges:
2213 for c in range(start, stop) :
2214 try:
2215 names.append(unicodedata.name(chr(c)))
2216 except ValueError:
2217 pass
2218 return names
@@ -33,6 +33,19 b' from nose.tools import assert_in, assert_not_in'
33 33 # Test functions
34 34 # -----------------------------------------------------------------------------
35 35
36 def test_unicode_range():
37 """
38 Test that the ranges we test for unicode names give the same number of
39 results than testing the full length.
40 """
41 from IPython.core.completer import _unicode_name_compute, _UNICODE_RANGES
42
43 expected_list = _unicode_name_compute([(0, 0x110000)])
44 test = _unicode_name_compute(_UNICODE_RANGES)
45
46 assert len(expected_list) == len(test)
47 assert len(expected_list) == 131808
48
36 49
37 50 @contextmanager
38 51 def greedy_completion():
@@ -230,7 +243,7 b' class TestCompleter(unittest.TestCase):'
230 243 ip = get_ipython()
231 244 text, matches = ip.Completer.latex_matches("\\really_i_should_match_nothing")
232 245 nt.assert_equal(text, "")
233 nt.assert_equal(matches, [])
246 nt.assert_equal(matches, ())
234 247
235 248 def test_back_latex_completion(self):
236 249 ip = get_ipython()
General Comments 0
You need to be logged in to leave comments. Login now