##// END OF EJS Templates
use splitlines instead of StringIO.readline and rebase
Piti Ongmongkolkul -
Show More
@@ -1,981 +1,980 b''
1 1 """Word completion for IPython.
2 2
3 3 This module is a fork of the rlcompleter module in the Python standard
4 4 library. The original enhancements made to rlcompleter have been sent
5 5 upstream and were accepted as of Python 2.3, but we need a lot more
6 6 functionality specific to IPython, so this module will continue to live as an
7 7 IPython-specific utility.
8 8
9 9 Original rlcompleter documentation:
10 10
11 11 This requires the latest extension to the readline module (the
12 12 completes keywords, built-ins and globals in __main__; when completing
13 13 NAME.NAME..., it evaluates (!) the expression up to the last dot and
14 14 completes its attributes.
15 15
16 16 It's very cool to do "import string" type "string.", hit the
17 17 completion key (twice), and see the list of names defined by the
18 18 string module!
19 19
20 20 Tip: to use the tab key as the completion key, call
21 21
22 22 readline.parse_and_bind("tab: complete")
23 23
24 24 Notes:
25 25
26 26 - Exceptions raised by the completer function are *ignored* (and
27 27 generally cause the completion to fail). This is a feature -- since
28 28 readline sets the tty device in raw (or cbreak) mode, printing a
29 29 traceback wouldn't work well without some complicated hoopla to save,
30 30 reset and restore the tty state.
31 31
32 32 - The evaluation of the NAME.NAME... form may cause arbitrary
33 33 application defined code to be executed if an object with a
34 34 __getattr__ hook is found. Since it is the responsibility of the
35 35 application (or the user) to enable this feature, I consider this an
36 36 acceptable risk. More complicated expressions (e.g. function calls or
37 37 indexing operations) are *not* evaluated.
38 38
39 39 - GNU readline is also used by the built-in functions input() and
40 40 raw_input(), and thus these also benefit/suffer from the completer
41 41 features. Clearly an interactive application can benefit by
42 42 specifying its own completer function and using raw_input() for all
43 43 its input.
44 44
45 45 - When the original stdin is not a tty device, GNU readline is never
46 46 used, and this module (and the readline module) are silently inactive.
47 47 """
48 48
49 49 #*****************************************************************************
50 50 #
51 51 # Since this file is essentially a minimally modified copy of the rlcompleter
52 52 # module which is part of the standard Python distribution, I assume that the
53 53 # proper procedure is to maintain its copyright as belonging to the Python
54 54 # Software Foundation (in addition to my own, for all new code).
55 55 #
56 56 # Copyright (C) 2008 IPython Development Team
57 57 # Copyright (C) 2001 Fernando Perez. <fperez@colorado.edu>
58 58 # Copyright (C) 2001 Python Software Foundation, www.python.org
59 59 #
60 60 # Distributed under the terms of the BSD License. The full license is in
61 61 # the file COPYING, distributed as part of this software.
62 62 #
63 63 #*****************************************************************************
64 64
65 65 #-----------------------------------------------------------------------------
66 66 # Imports
67 67 #-----------------------------------------------------------------------------
68 68
69 69 import __builtin__
70 70 import __main__
71 71 import glob
72 72 import inspect
73 73 import itertools
74 74 import keyword
75 75 import os
76 76 import re
77 77 import shlex
78 78 import sys
79 import StringIO
80 79
81 80 from IPython.config.configurable import Configurable
82 81 from IPython.core.error import TryNext
83 82 from IPython.core.inputsplitter import ESC_MAGIC
84 83 from IPython.utils import generics
85 84 from IPython.utils import io
86 85 from IPython.utils.dir2 import dir2
87 86 from IPython.utils.process import arg_split
88 87 from IPython.utils.traitlets import CBool, Enum
89 88
90 89 #-----------------------------------------------------------------------------
91 90 # Globals
92 91 #-----------------------------------------------------------------------------
93 92
94 93 # Public API
95 94 __all__ = ['Completer','IPCompleter']
96 95
97 96 if sys.platform == 'win32':
98 97 PROTECTABLES = ' '
99 98 else:
100 99 PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&'
101 100
102 101 #-----------------------------------------------------------------------------
103 102 # Main functions and classes
104 103 #-----------------------------------------------------------------------------
105 104
106 105 def has_open_quotes(s):
107 106 """Return whether a string has open quotes.
108 107
109 108 This simply counts whether the number of quote characters of either type in
110 109 the string is odd.
111 110
112 111 Returns
113 112 -------
114 113 If there is an open quote, the quote character is returned. Else, return
115 114 False.
116 115 """
117 116 # We check " first, then ', so complex cases with nested quotes will get
118 117 # the " to take precedence.
119 118 if s.count('"') % 2:
120 119 return '"'
121 120 elif s.count("'") % 2:
122 121 return "'"
123 122 else:
124 123 return False
125 124
126 125
127 126 def protect_filename(s):
128 127 """Escape a string to protect certain characters."""
129 128
130 129 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
131 130 for ch in s])
132 131
133 132 def expand_user(path):
134 133 """Expand '~'-style usernames in strings.
135 134
136 135 This is similar to :func:`os.path.expanduser`, but it computes and returns
137 136 extra information that will be useful if the input was being used in
138 137 computing completions, and you wish to return the completions with the
139 138 original '~' instead of its expanded value.
140 139
141 140 Parameters
142 141 ----------
143 142 path : str
144 143 String to be expanded. If no ~ is present, the output is the same as the
145 144 input.
146 145
147 146 Returns
148 147 -------
149 148 newpath : str
150 149 Result of ~ expansion in the input path.
151 150 tilde_expand : bool
152 151 Whether any expansion was performed or not.
153 152 tilde_val : str
154 153 The value that ~ was replaced with.
155 154 """
156 155 # Default values
157 156 tilde_expand = False
158 157 tilde_val = ''
159 158 newpath = path
160 159
161 160 if path.startswith('~'):
162 161 tilde_expand = True
163 162 rest = len(path)-1
164 163 newpath = os.path.expanduser(path)
165 164 if rest:
166 165 tilde_val = newpath[:-rest]
167 166 else:
168 167 tilde_val = newpath
169 168
170 169 return newpath, tilde_expand, tilde_val
171 170
172 171
173 172 def compress_user(path, tilde_expand, tilde_val):
174 173 """Does the opposite of expand_user, with its outputs.
175 174 """
176 175 if tilde_expand:
177 176 return path.replace(tilde_val, '~')
178 177 else:
179 178 return path
180 179
181 180
182 181 class Bunch(object): pass
183 182
184 183
185 184 DELIMS = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?'
186 185 GREEDY_DELIMS = ' \r\n'
187 186
188 187
189 188 class CompletionSplitter(object):
190 189 """An object to split an input line in a manner similar to readline.
191 190
192 191 By having our own implementation, we can expose readline-like completion in
193 192 a uniform manner to all frontends. This object only needs to be given the
194 193 line of text to be split and the cursor position on said line, and it
195 194 returns the 'word' to be completed on at the cursor after splitting the
196 195 entire line.
197 196
198 197 What characters are used as splitting delimiters can be controlled by
199 198 setting the `delims` attribute (this is a property that internally
200 199 automatically builds the necessary regular expression)"""
201 200
202 201 # Private interface
203 202
204 203 # A string of delimiter characters. The default value makes sense for
205 204 # IPython's most typical usage patterns.
206 205 _delims = DELIMS
207 206
208 207 # The expression (a normal string) to be compiled into a regular expression
209 208 # for actual splitting. We store it as an attribute mostly for ease of
210 209 # debugging, since this type of code can be so tricky to debug.
211 210 _delim_expr = None
212 211
213 212 # The regular expression that does the actual splitting
214 213 _delim_re = None
215 214
216 215 def __init__(self, delims=None):
217 216 delims = CompletionSplitter._delims if delims is None else delims
218 217 self.delims = delims
219 218
220 219 @property
221 220 def delims(self):
222 221 """Return the string of delimiter characters."""
223 222 return self._delims
224 223
225 224 @delims.setter
226 225 def delims(self, delims):
227 226 """Set the delimiters for line splitting."""
228 227 expr = '[' + ''.join('\\'+ c for c in delims) + ']'
229 228 self._delim_re = re.compile(expr)
230 229 self._delims = delims
231 230 self._delim_expr = expr
232 231
233 232 def split_line(self, line, cursor_pos=None):
234 233 """Split a line of text with a cursor at the given position.
235 234 """
236 235 l = line if cursor_pos is None else line[:cursor_pos]
237 236 return self._delim_re.split(l)[-1]
238 237
239 238
240 239 class Completer(Configurable):
241 240
242 241 greedy = CBool(False, config=True,
243 242 help="""Activate greedy completion
244 243
245 244 This will enable completion on elements of lists, results of function calls, etc.,
246 245 but can be unsafe because the code is actually evaluated on TAB.
247 246 """
248 247 )
249 248
250 249
251 250 def __init__(self, namespace=None, global_namespace=None, config=None, **kwargs):
252 251 """Create a new completer for the command line.
253 252
254 253 Completer(namespace=ns,global_namespace=ns2) -> completer instance.
255 254
256 255 If unspecified, the default namespace where completions are performed
257 256 is __main__ (technically, __main__.__dict__). Namespaces should be
258 257 given as dictionaries.
259 258
260 259 An optional second namespace can be given. This allows the completer
261 260 to handle cases where both the local and global scopes need to be
262 261 distinguished.
263 262
264 263 Completer instances should be used as the completion mechanism of
265 264 readline via the set_completer() call:
266 265
267 266 readline.set_completer(Completer(my_namespace).complete)
268 267 """
269 268
270 269 # Don't bind to namespace quite yet, but flag whether the user wants a
271 270 # specific namespace or to use __main__.__dict__. This will allow us
272 271 # to bind to __main__.__dict__ at completion time, not now.
273 272 if namespace is None:
274 273 self.use_main_ns = 1
275 274 else:
276 275 self.use_main_ns = 0
277 276 self.namespace = namespace
278 277
279 278 # The global namespace, if given, can be bound directly
280 279 if global_namespace is None:
281 280 self.global_namespace = {}
282 281 else:
283 282 self.global_namespace = global_namespace
284 283
285 284 super(Completer, self).__init__(config=config, **kwargs)
286 285
287 286 def complete(self, text, state):
288 287 """Return the next possible completion for 'text'.
289 288
290 289 This is called successively with state == 0, 1, 2, ... until it
291 290 returns None. The completion should begin with 'text'.
292 291
293 292 """
294 293 if self.use_main_ns:
295 294 self.namespace = __main__.__dict__
296 295
297 296 if state == 0:
298 297 if "." in text:
299 298 self.matches = self.attr_matches(text)
300 299 else:
301 300 self.matches = self.global_matches(text)
302 301 try:
303 302 return self.matches[state]
304 303 except IndexError:
305 304 return None
306 305
307 306 def global_matches(self, text):
308 307 """Compute matches when text is a simple name.
309 308
310 309 Return a list of all keywords, built-in functions and names currently
311 310 defined in self.namespace or self.global_namespace that match.
312 311
313 312 """
314 313 #print 'Completer->global_matches, txt=%r' % text # dbg
315 314 matches = []
316 315 match_append = matches.append
317 316 n = len(text)
318 317 for lst in [keyword.kwlist,
319 318 __builtin__.__dict__.keys(),
320 319 self.namespace.keys(),
321 320 self.global_namespace.keys()]:
322 321 for word in lst:
323 322 if word[:n] == text and word != "__builtins__":
324 323 match_append(word)
325 324 return matches
326 325
327 326 def attr_matches(self, text):
328 327 """Compute matches when text contains a dot.
329 328
330 329 Assuming the text is of the form NAME.NAME....[NAME], and is
331 330 evaluatable in self.namespace or self.global_namespace, it will be
332 331 evaluated and its attributes (as revealed by dir()) are used as
333 332 possible completions. (For class instances, class members are are
334 333 also considered.)
335 334
336 335 WARNING: this can still invoke arbitrary C code, if an object
337 336 with a __getattr__ hook is evaluated.
338 337
339 338 """
340 339
341 340 #io.rprint('Completer->attr_matches, txt=%r' % text) # dbg
342 341 # Another option, seems to work great. Catches things like ''.<tab>
343 342 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
344 343
345 344 if m:
346 345 expr, attr = m.group(1, 3)
347 346 elif self.greedy:
348 347 m2 = re.match(r"(.+)\.(\w*)$", self.line_buffer)
349 348 if not m2:
350 349 return []
351 350 expr, attr = m2.group(1,2)
352 351 else:
353 352 return []
354 353
355 354 try:
356 355 obj = eval(expr, self.namespace)
357 356 except:
358 357 try:
359 358 obj = eval(expr, self.global_namespace)
360 359 except:
361 360 return []
362 361
363 362 if self.limit_to__all__ and hasattr(obj, '__all__'):
364 363 words = get__all__entries(obj)
365 364 else:
366 365 words = dir2(obj)
367 366
368 367 try:
369 368 words = generics.complete_object(obj, words)
370 369 except TryNext:
371 370 pass
372 371 except Exception:
373 372 # Silence errors from completion function
374 373 #raise # dbg
375 374 pass
376 375 # Build match list to return
377 376 n = len(attr)
378 377 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
379 378 return res
380 379
381 380
382 381 def get__all__entries(obj):
383 382 """returns the strings in the __all__ attribute"""
384 383 try:
385 384 words = getattr(obj, '__all__')
386 385 except:
387 386 return []
388 387
389 388 return [w for w in words if isinstance(w, basestring)]
390 389
391 390
392 391 class IPCompleter(Completer):
393 392 """Extension of the completer class with IPython-specific features"""
394 393
395 394 def _greedy_changed(self, name, old, new):
396 395 """update the splitter and readline delims when greedy is changed"""
397 396 if new:
398 397 self.splitter.delims = GREEDY_DELIMS
399 398 else:
400 399 self.splitter.delims = DELIMS
401 400
402 401 if self.readline:
403 402 self.readline.set_completer_delims(self.splitter.delims)
404 403
405 404 merge_completions = CBool(True, config=True,
406 405 help="""Whether to merge completion results into a single list
407 406
408 407 If False, only the completion results from the first non-empty
409 408 completer will be returned.
410 409 """
411 410 )
412 411 omit__names = Enum((0,1,2), default_value=2, config=True,
413 412 help="""Instruct the completer to omit private method names
414 413
415 414 Specifically, when completing on ``object.<tab>``.
416 415
417 416 When 2 [default]: all names that start with '_' will be excluded.
418 417
419 418 When 1: all 'magic' names (``__foo__``) will be excluded.
420 419
421 420 When 0: nothing will be excluded.
422 421 """
423 422 )
424 423 limit_to__all__ = CBool(default_value=False, config=True,
425 424 help="""Instruct the completer to use __all__ for the completion
426 425
427 426 Specifically, when completing on ``object.<tab>``.
428 427
429 428 When True: only those names in obj.__all__ will be included.
430 429
431 430 When False [default]: the __all__ attribute is ignored
432 431 """
433 432 )
434 433
435 434 def __init__(self, shell=None, namespace=None, global_namespace=None,
436 435 alias_table=None, use_readline=True,
437 436 config=None, **kwargs):
438 437 """IPCompleter() -> completer
439 438
440 439 Return a completer object suitable for use by the readline library
441 440 via readline.set_completer().
442 441
443 442 Inputs:
444 443
445 444 - shell: a pointer to the ipython shell itself. This is needed
446 445 because this completer knows about magic functions, and those can
447 446 only be accessed via the ipython instance.
448 447
449 448 - namespace: an optional dict where completions are performed.
450 449
451 450 - global_namespace: secondary optional dict for completions, to
452 451 handle cases (such as IPython embedded inside functions) where
453 452 both Python scopes are visible.
454 453
455 454 - If alias_table is supplied, it should be a dictionary of aliases
456 455 to complete.
457 456
458 457 use_readline : bool, optional
459 458 If true, use the readline library. This completer can still function
460 459 without readline, though in that case callers must provide some extra
461 460 information on each call about the current line."""
462 461
463 462 self.magic_escape = ESC_MAGIC
464 463 self.splitter = CompletionSplitter()
465 464
466 465 # Readline configuration, only used by the rlcompleter method.
467 466 if use_readline:
468 467 # We store the right version of readline so that later code
469 468 import IPython.utils.rlineimpl as readline
470 469 self.readline = readline
471 470 else:
472 471 self.readline = None
473 472
474 473 # _greedy_changed() depends on splitter and readline being defined:
475 474 Completer.__init__(self, namespace=namespace, global_namespace=global_namespace,
476 475 config=config, **kwargs)
477 476
478 477 # List where completion matches will be stored
479 478 self.matches = []
480 479 self.shell = shell
481 480 if alias_table is None:
482 481 alias_table = {}
483 482 self.alias_table = alias_table
484 483 # Regexp to split filenames with spaces in them
485 484 self.space_name_re = re.compile(r'([^\\] )')
486 485 # Hold a local ref. to glob.glob for speed
487 486 self.glob = glob.glob
488 487
489 488 # Determine if we are running on 'dumb' terminals, like (X)Emacs
490 489 # buffers, to avoid completion problems.
491 490 term = os.environ.get('TERM','xterm')
492 491 self.dumb_terminal = term in ['dumb','emacs']
493 492
494 493 # Special handling of backslashes needed in win32 platforms
495 494 if sys.platform == "win32":
496 495 self.clean_glob = self._clean_glob_win32
497 496 else:
498 497 self.clean_glob = self._clean_glob
499 498
500 499 #regexp to parse docstring for function signature
501 500 self.docstring_sig_re = re.compile(r'^[\w|\s.]+\(([^)]*)\).*')
502 501 self.docstring_kwd_re = re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)')
503 502 #use this if positional argument name is also needed
504 503 #= re.compile(r'[\s|\[]*(\w+)(?:\s*=?\s*.*)')
505 504
506 505 # All active matcher routines for completion
507 506 self.matchers = [self.python_matches,
508 507 self.file_matches,
509 508 self.magic_matches,
510 509 self.alias_matches,
511 510 self.python_func_kw_matches,
512 511 ]
513 512
514 513 def all_completions(self, text):
515 514 """
516 515 Wrapper around the complete method for the benefit of emacs
517 516 and pydb.
518 517 """
519 518 return self.complete(text)[1]
520 519
521 520 def _clean_glob(self,text):
522 521 return self.glob("%s*" % text)
523 522
524 523 def _clean_glob_win32(self,text):
525 524 return [f.replace("\\","/")
526 525 for f in self.glob("%s*" % text)]
527 526
528 527 def file_matches(self, text):
529 528 """Match filenames, expanding ~USER type strings.
530 529
531 530 Most of the seemingly convoluted logic in this completer is an
532 531 attempt to handle filenames with spaces in them. And yet it's not
533 532 quite perfect, because Python's readline doesn't expose all of the
534 533 GNU readline details needed for this to be done correctly.
535 534
536 535 For a filename with a space in it, the printed completions will be
537 536 only the parts after what's already been typed (instead of the
538 537 full completions, as is normally done). I don't think with the
539 538 current (as of Python 2.3) Python readline it's possible to do
540 539 better."""
541 540
542 541 #io.rprint('Completer->file_matches: <%r>' % text) # dbg
543 542
544 543 # chars that require escaping with backslash - i.e. chars
545 544 # that readline treats incorrectly as delimiters, but we
546 545 # don't want to treat as delimiters in filename matching
547 546 # when escaped with backslash
548 547 if text.startswith('!'):
549 548 text = text[1:]
550 549 text_prefix = '!'
551 550 else:
552 551 text_prefix = ''
553 552
554 553 text_until_cursor = self.text_until_cursor
555 554 # track strings with open quotes
556 555 open_quotes = has_open_quotes(text_until_cursor)
557 556
558 557 if '(' in text_until_cursor or '[' in text_until_cursor:
559 558 lsplit = text
560 559 else:
561 560 try:
562 561 # arg_split ~ shlex.split, but with unicode bugs fixed by us
563 562 lsplit = arg_split(text_until_cursor)[-1]
564 563 except ValueError:
565 564 # typically an unmatched ", or backslash without escaped char.
566 565 if open_quotes:
567 566 lsplit = text_until_cursor.split(open_quotes)[-1]
568 567 else:
569 568 return []
570 569 except IndexError:
571 570 # tab pressed on empty line
572 571 lsplit = ""
573 572
574 573 if not open_quotes and lsplit != protect_filename(lsplit):
575 574 # if protectables are found, do matching on the whole escaped name
576 575 has_protectables = True
577 576 text0,text = text,lsplit
578 577 else:
579 578 has_protectables = False
580 579 text = os.path.expanduser(text)
581 580
582 581 if text == "":
583 582 return [text_prefix + protect_filename(f) for f in self.glob("*")]
584 583
585 584 # Compute the matches from the filesystem
586 585 m0 = self.clean_glob(text.replace('\\',''))
587 586
588 587 if has_protectables:
589 588 # If we had protectables, we need to revert our changes to the
590 589 # beginning of filename so that we don't double-write the part
591 590 # of the filename we have so far
592 591 len_lsplit = len(lsplit)
593 592 matches = [text_prefix + text0 +
594 593 protect_filename(f[len_lsplit:]) for f in m0]
595 594 else:
596 595 if open_quotes:
597 596 # if we have a string with an open quote, we don't need to
598 597 # protect the names at all (and we _shouldn't_, as it
599 598 # would cause bugs when the filesystem call is made).
600 599 matches = m0
601 600 else:
602 601 matches = [text_prefix +
603 602 protect_filename(f) for f in m0]
604 603
605 604 #io.rprint('mm', matches) # dbg
606 605
607 606 # Mark directories in input list by appending '/' to their names.
608 607 matches = [x+'/' if os.path.isdir(x) else x for x in matches]
609 608 return matches
610 609
611 610 def magic_matches(self, text):
612 611 """Match magics"""
613 612 #print 'Completer->magic_matches:',text,'lb',self.text_until_cursor # dbg
614 613 # Get all shell magics now rather than statically, so magics loaded at
615 614 # runtime show up too.
616 615 lsm = self.shell.magics_manager.lsmagic()
617 616 line_magics = lsm['line']
618 617 cell_magics = lsm['cell']
619 618 pre = self.magic_escape
620 619 pre2 = pre+pre
621 620
622 621 # Completion logic:
623 622 # - user gives %%: only do cell magics
624 623 # - user gives %: do both line and cell magics
625 624 # - no prefix: do both
626 625 # In other words, line magics are skipped if the user gives %% explicitly
627 626 bare_text = text.lstrip(pre)
628 627 comp = [ pre2+m for m in cell_magics if m.startswith(bare_text)]
629 628 if not text.startswith(pre2):
630 629 comp += [ pre+m for m in line_magics if m.startswith(bare_text)]
631 630 return comp
632 631
633 632 def alias_matches(self, text):
634 633 """Match internal system aliases"""
635 634 #print 'Completer->alias_matches:',text,'lb',self.text_until_cursor # dbg
636 635
637 636 # if we are not in the first 'item', alias matching
638 637 # doesn't make sense - unless we are starting with 'sudo' command.
639 638 main_text = self.text_until_cursor.lstrip()
640 639 if ' ' in main_text and not main_text.startswith('sudo'):
641 640 return []
642 641 text = os.path.expanduser(text)
643 642 aliases = self.alias_table.keys()
644 643 if text == '':
645 644 return aliases
646 645 else:
647 646 return [a for a in aliases if a.startswith(text)]
648 647
649 648 def python_matches(self,text):
650 649 """Match attributes or global python names"""
651 650
652 651 #io.rprint('Completer->python_matches, txt=%r' % text) # dbg
653 652 if "." in text:
654 653 try:
655 654 matches = self.attr_matches(text)
656 655 if text.endswith('.') and self.omit__names:
657 656 if self.omit__names == 1:
658 657 # true if txt is _not_ a __ name, false otherwise:
659 658 no__name = (lambda txt:
660 659 re.match(r'.*\.__.*?__',txt) is None)
661 660 else:
662 661 # true if txt is _not_ a _ name, false otherwise:
663 662 no__name = (lambda txt:
664 663 re.match(r'.*\._.*?',txt) is None)
665 664 matches = filter(no__name, matches)
666 665 except NameError:
667 666 # catches <undefined attributes>.<tab>
668 667 matches = []
669 668 else:
670 669 matches = self.global_matches(text)
671 670
672 671 return matches
673 672
674 673 def _default_arguments_from_docstring(self, doc):
675 """Parse first line of docstring for call signature.
674 """Parse the first line of docstring for call signature.
676 675
677 676 Docstring should be of the form 'min(iterable[, key=func])\n'.
678 677 It can also parse cython docstring of the form
679 678 'Minuit.migrad(self, int ncall=10000, resume=True, int nsplit=1)'.
680 679 """
681 680 if doc is None:
682 681 return []
683 sio = StringIO.StringIO(doc.lstrip())
682
684 683 #care only the firstline
685 #docstring can be long
686 line = sio.readline()
684 line = doc.lstrip().splitlines()[0]
685
687 686 #p = re.compile(r'^[\w|\s.]+\(([^)]*)\).*')
688 687 #'min(iterable[, key=func])\n' -> 'iterable[, key=func]'
689 688 sig = self.docstring_sig_re.search(line)
690 689 if sig is None:
691 690 return []
692 691 # iterable[, key=func]' -> ['iterable[' ,' key=func]']
693 692 sig = sig.groups()[0].split(',')
694 693 ret = []
695 694 for s in sig:
696 695 #re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)')
697 696 ret += self.docstring_kwd_re.findall(s)
698 697 return ret
699 698
700 699 def _default_arguments(self, obj):
701 700 """Return the list of default arguments of obj if it is callable,
702 701 or empty list otherwise."""
703 702 call_obj = obj
704 703 ret = []
705 704 if inspect.isbuiltin(obj):
706 705 pass
707 706 elif not (inspect.isfunction(obj) or inspect.ismethod(obj)):
708 707 if inspect.isclass(obj):
709 708 #for cython embededsignature=True the constructor docstring
710 709 #belongs to the object itself not __init__
711 710 ret += self._default_arguments_from_docstring(
712 711 getattr(obj, '__doc__', ''))
713 712 # for classes, check for __init__,__new__
714 713 call_obj = (getattr(obj, '__init__', None) or
715 714 getattr(obj, '__new__', None))
716 715 # for all others, check if they are __call__able
717 716 elif hasattr(obj, '__call__'):
718 717 call_obj = obj.__call__
719 718
720 719 ret += self._default_arguments_from_docstring(
721 720 getattr(call_obj, '__doc__', ''))
722 721
723 722 try:
724 723 args,_,_1,defaults = inspect.getargspec(call_obj)
725 724 if defaults:
726 725 ret+=args[-len(defaults):]
727 726 except TypeError:
728 727 pass
729 728
730 729 return list(set(ret))
731 730
732 731 def python_func_kw_matches(self,text):
733 732 """Match named parameters (kwargs) of the last open function"""
734 733
735 734 if "." in text: # a parameter cannot be dotted
736 735 return []
737 736 try: regexp = self.__funcParamsRegex
738 737 except AttributeError:
739 738 regexp = self.__funcParamsRegex = re.compile(r'''
740 739 '.*?(?<!\\)' | # single quoted strings or
741 740 ".*?(?<!\\)" | # double quoted strings or
742 741 \w+ | # identifier
743 742 \S # other characters
744 743 ''', re.VERBOSE | re.DOTALL)
745 744 # 1. find the nearest identifier that comes before an unclosed
746 745 # parenthesis before the cursor
747 746 # e.g. for "foo (1+bar(x), pa<cursor>,a=1)", the candidate is "foo"
748 747 tokens = regexp.findall(self.text_until_cursor)
749 748 tokens.reverse()
750 749 iterTokens = iter(tokens); openPar = 0
751 750
752 751 for token in iterTokens:
753 752 if token == ')':
754 753 openPar -= 1
755 754 elif token == '(':
756 755 openPar += 1
757 756 if openPar > 0:
758 757 # found the last unclosed parenthesis
759 758 break
760 759 else:
761 760 return []
762 761 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
763 762 ids = []
764 763 isId = re.compile(r'\w+$').match
765 764
766 765 while True:
767 766 try:
768 767 ids.append(next(iterTokens))
769 768 if not isId(ids[-1]):
770 769 ids.pop(); break
771 770 if not next(iterTokens) == '.':
772 771 break
773 772 except StopIteration:
774 773 break
775 774 # lookup the candidate callable matches either using global_matches
776 775 # or attr_matches for dotted names
777 776 if len(ids) == 1:
778 777 callableMatches = self.global_matches(ids[0])
779 778 else:
780 779 callableMatches = self.attr_matches('.'.join(ids[::-1]))
781 780 argMatches = []
782 781 for callableMatch in callableMatches:
783 782 try:
784 783 namedArgs = self._default_arguments(eval(callableMatch,
785 784 self.namespace))
786 785 except:
787 786 continue
788 787
789 788 for namedArg in namedArgs:
790 789 if namedArg.startswith(text):
791 790 argMatches.append("%s=" %namedArg)
792 791 return argMatches
793 792
794 793 def dispatch_custom_completer(self, text):
795 794 #io.rprint("Custom! '%s' %s" % (text, self.custom_completers)) # dbg
796 795 line = self.line_buffer
797 796 if not line.strip():
798 797 return None
799 798
800 799 # Create a little structure to pass all the relevant information about
801 800 # the current completion to any custom completer.
802 801 event = Bunch()
803 802 event.line = line
804 803 event.symbol = text
805 804 cmd = line.split(None,1)[0]
806 805 event.command = cmd
807 806 event.text_until_cursor = self.text_until_cursor
808 807
809 808 #print "\ncustom:{%s]\n" % event # dbg
810 809
811 810 # for foo etc, try also to find completer for %foo
812 811 if not cmd.startswith(self.magic_escape):
813 812 try_magic = self.custom_completers.s_matches(
814 813 self.magic_escape + cmd)
815 814 else:
816 815 try_magic = []
817 816
818 817 for c in itertools.chain(self.custom_completers.s_matches(cmd),
819 818 try_magic,
820 819 self.custom_completers.flat_matches(self.text_until_cursor)):
821 820 #print "try",c # dbg
822 821 try:
823 822 res = c(event)
824 823 if res:
825 824 # first, try case sensitive match
826 825 withcase = [r for r in res if r.startswith(text)]
827 826 if withcase:
828 827 return withcase
829 828 # if none, then case insensitive ones are ok too
830 829 text_low = text.lower()
831 830 return [r for r in res if r.lower().startswith(text_low)]
832 831 except TryNext:
833 832 pass
834 833
835 834 return None
836 835
837 836 def complete(self, text=None, line_buffer=None, cursor_pos=None):
838 837 """Find completions for the given text and line context.
839 838
840 839 This is called successively with state == 0, 1, 2, ... until it
841 840 returns None. The completion should begin with 'text'.
842 841
843 842 Note that both the text and the line_buffer are optional, but at least
844 843 one of them must be given.
845 844
846 845 Parameters
847 846 ----------
848 847 text : string, optional
849 848 Text to perform the completion on. If not given, the line buffer
850 849 is split using the instance's CompletionSplitter object.
851 850
852 851 line_buffer : string, optional
853 852 If not given, the completer attempts to obtain the current line
854 853 buffer via readline. This keyword allows clients which are
855 854 requesting for text completions in non-readline contexts to inform
856 855 the completer of the entire text.
857 856
858 857 cursor_pos : int, optional
859 858 Index of the cursor in the full line buffer. Should be provided by
860 859 remote frontends where kernel has no access to frontend state.
861 860
862 861 Returns
863 862 -------
864 863 text : str
865 864 Text that was actually used in the completion.
866 865
867 866 matches : list
868 867 A list of completion matches.
869 868 """
870 869 #io.rprint('\nCOMP1 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
871 870
872 871 # if the cursor position isn't given, the only sane assumption we can
873 872 # make is that it's at the end of the line (the common case)
874 873 if cursor_pos is None:
875 874 cursor_pos = len(line_buffer) if text is None else len(text)
876 875
877 876 # if text is either None or an empty string, rely on the line buffer
878 877 if not text:
879 878 text = self.splitter.split_line(line_buffer, cursor_pos)
880 879
881 880 # If no line buffer is given, assume the input text is all there was
882 881 if line_buffer is None:
883 882 line_buffer = text
884 883
885 884 self.line_buffer = line_buffer
886 885 self.text_until_cursor = self.line_buffer[:cursor_pos]
887 886 #io.rprint('COMP2 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
888 887
889 888 # Start with a clean slate of completions
890 889 self.matches[:] = []
891 890 custom_res = self.dispatch_custom_completer(text)
892 891 if custom_res is not None:
893 892 # did custom completers produce something?
894 893 self.matches = custom_res
895 894 else:
896 895 # Extend the list of completions with the results of each
897 896 # matcher, so we return results to the user from all
898 897 # namespaces.
899 898 if self.merge_completions:
900 899 self.matches = []
901 900 for matcher in self.matchers:
902 901 try:
903 902 self.matches.extend(matcher(text))
904 903 except:
905 904 # Show the ugly traceback if the matcher causes an
906 905 # exception, but do NOT crash the kernel!
907 906 sys.excepthook(*sys.exc_info())
908 907 else:
909 908 for matcher in self.matchers:
910 909 self.matches = matcher(text)
911 910 if self.matches:
912 911 break
913 912 # FIXME: we should extend our api to return a dict with completions for
914 913 # different types of objects. The rlcomplete() method could then
915 914 # simply collapse the dict into a list for readline, but we'd have
916 915 # richer completion semantics in other evironments.
917 916 self.matches = sorted(set(self.matches))
918 917 #io.rprint('COMP TEXT, MATCHES: %r, %r' % (text, self.matches)) # dbg
919 918 return text, self.matches
920 919
921 920 def rlcomplete(self, text, state):
922 921 """Return the state-th possible completion for 'text'.
923 922
924 923 This is called successively with state == 0, 1, 2, ... until it
925 924 returns None. The completion should begin with 'text'.
926 925
927 926 Parameters
928 927 ----------
929 928 text : string
930 929 Text to perform the completion on.
931 930
932 931 state : int
933 932 Counter used by readline.
934 933 """
935 934 if state==0:
936 935
937 936 self.line_buffer = line_buffer = self.readline.get_line_buffer()
938 937 cursor_pos = self.readline.get_endidx()
939 938
940 939 #io.rprint("\nRLCOMPLETE: %r %r %r" %
941 940 # (text, line_buffer, cursor_pos) ) # dbg
942 941
943 942 # if there is only a tab on a line with only whitespace, instead of
944 943 # the mostly useless 'do you want to see all million completions'
945 944 # message, just do the right thing and give the user his tab!
946 945 # Incidentally, this enables pasting of tabbed text from an editor
947 946 # (as long as autoindent is off).
948 947
949 948 # It should be noted that at least pyreadline still shows file
950 949 # completions - is there a way around it?
951 950
952 951 # don't apply this on 'dumb' terminals, such as emacs buffers, so
953 952 # we don't interfere with their own tab-completion mechanism.
954 953 if not (self.dumb_terminal or line_buffer.strip()):
955 954 self.readline.insert_text('\t')
956 955 sys.stdout.flush()
957 956 return None
958 957
959 958 # Note: debugging exceptions that may occur in completion is very
960 959 # tricky, because readline unconditionally silences them. So if
961 960 # during development you suspect a bug in the completion code, turn
962 961 # this flag on temporarily by uncommenting the second form (don't
963 962 # flip the value in the first line, as the '# dbg' marker can be
964 963 # automatically detected and is used elsewhere).
965 964 DEBUG = False
966 965 #DEBUG = True # dbg
967 966 if DEBUG:
968 967 try:
969 968 self.complete(text, line_buffer, cursor_pos)
970 969 except:
971 970 import traceback; traceback.print_exc()
972 971 else:
973 972 # The normal production version is here
974 973
975 974 # This method computes the self.matches array
976 975 self.complete(text, line_buffer, cursor_pos)
977 976
978 977 try:
979 978 return self.matches[state]
980 979 except IndexError:
981 980 return None
General Comments 0
You need to be logged in to leave comments. Login now