##// END OF EJS Templates
Proper fix for tab-completion bug reported by Alex Schmolck; patch by Dan Milstein
fperez -
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,2566 +1,2569 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 IPython -- An enhanced Interactive Python
4 4
5 5 Requires Python 2.3 or newer.
6 6
7 7 This file contains all the classes and helper functions specific to IPython.
8 8
9 $Id: iplib.py 2126 2007-03-02 06:51:02Z fperez $
9 $Id: iplib.py 2135 2007-03-10 09:26:25Z fperez $
10 10 """
11 11
12 12 #*****************************************************************************
13 13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
14 14 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #
19 19 # Note: this code originally subclassed code.InteractiveConsole from the
20 20 # Python standard library. Over time, all of that class has been copied
21 21 # verbatim here for modifications which could not be accomplished by
22 22 # subclassing. At this point, there are no dependencies at all on the code
23 23 # module anymore (it is not even imported). The Python License (sec. 2)
24 24 # allows for this, but it's always nice to acknowledge credit where credit is
25 25 # due.
26 26 #*****************************************************************************
27 27
28 28 #****************************************************************************
29 29 # Modules and globals
30 30
31 31 from IPython import Release
32 32 __author__ = '%s <%s>\n%s <%s>' % \
33 33 ( Release.authors['Janko'] + Release.authors['Fernando'] )
34 34 __license__ = Release.license
35 35 __version__ = Release.version
36 36
37 37 # Python standard modules
38 38 import __main__
39 39 import __builtin__
40 40 import StringIO
41 41 import bdb
42 42 import cPickle as pickle
43 43 import codeop
44 44 import exceptions
45 45 import glob
46 46 import inspect
47 47 import keyword
48 48 import new
49 49 import os
50 50 import pydoc
51 51 import re
52 52 import shutil
53 53 import string
54 54 import sys
55 55 import tempfile
56 56 import traceback
57 57 import types
58 58 import pickleshare
59 59 from sets import Set
60 60 from pprint import pprint, pformat
61 61
62 62 # IPython's own modules
63 63 import IPython
64 64 from IPython import OInspect,PyColorize,ultraTB
65 65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
66 66 from IPython.FakeModule import FakeModule
67 67 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
68 68 from IPython.Logger import Logger
69 69 from IPython.Magic import Magic
70 70 from IPython.Prompts import CachedOutput
71 71 from IPython.ipstruct import Struct
72 72 from IPython.background_jobs import BackgroundJobManager
73 73 from IPython.usage import cmd_line_usage,interactive_usage
74 74 from IPython.genutils import *
75 75 from IPython.strdispatch import StrDispatch
76 76 import IPython.ipapi
77 77
78 78 # Globals
79 79
80 80 # store the builtin raw_input globally, and use this always, in case user code
81 81 # overwrites it (like wx.py.PyShell does)
82 82 raw_input_original = raw_input
83 83
84 84 # compiled regexps for autoindent management
85 85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
86 86
87 87
88 88 #****************************************************************************
89 89 # Some utility function definitions
90 90
91 91 ini_spaces_re = re.compile(r'^(\s+)')
92 92
93 93 def num_ini_spaces(strng):
94 94 """Return the number of initial spaces in a string"""
95 95
96 96 ini_spaces = ini_spaces_re.match(strng)
97 97 if ini_spaces:
98 98 return ini_spaces.end()
99 99 else:
100 100 return 0
101 101
102 102 def softspace(file, newvalue):
103 103 """Copied from code.py, to remove the dependency"""
104 104
105 105 oldvalue = 0
106 106 try:
107 107 oldvalue = file.softspace
108 108 except AttributeError:
109 109 pass
110 110 try:
111 111 file.softspace = newvalue
112 112 except (AttributeError, TypeError):
113 113 # "attribute-less object" or "read-only attributes"
114 114 pass
115 115 return oldvalue
116 116
117 117
118 118 #****************************************************************************
119 119 # Local use exceptions
120 120 class SpaceInInput(exceptions.Exception): pass
121 121
122 122
123 123 #****************************************************************************
124 124 # Local use classes
125 125 class Bunch: pass
126 126
127 127 class Undefined: pass
128 128
129 129 class Quitter(object):
130 130 """Simple class to handle exit, similar to Python 2.5's.
131 131
132 132 It handles exiting in an ipython-safe manner, which the one in Python 2.5
133 133 doesn't do (obviously, since it doesn't know about ipython)."""
134 134
135 135 def __init__(self,shell,name):
136 136 self.shell = shell
137 137 self.name = name
138 138
139 139 def __repr__(self):
140 140 return 'Type %s() to exit.' % self.name
141 141 __str__ = __repr__
142 142
143 143 def __call__(self):
144 144 self.shell.exit()
145 145
146 146 class InputList(list):
147 147 """Class to store user input.
148 148
149 149 It's basically a list, but slices return a string instead of a list, thus
150 150 allowing things like (assuming 'In' is an instance):
151 151
152 152 exec In[4:7]
153 153
154 154 or
155 155
156 156 exec In[5:9] + In[14] + In[21:25]"""
157 157
158 158 def __getslice__(self,i,j):
159 159 return ''.join(list.__getslice__(self,i,j))
160 160
161 161 class SyntaxTB(ultraTB.ListTB):
162 162 """Extension which holds some state: the last exception value"""
163 163
164 164 def __init__(self,color_scheme = 'NoColor'):
165 165 ultraTB.ListTB.__init__(self,color_scheme)
166 166 self.last_syntax_error = None
167 167
168 168 def __call__(self, etype, value, elist):
169 169 self.last_syntax_error = value
170 170 ultraTB.ListTB.__call__(self,etype,value,elist)
171 171
172 172 def clear_err_state(self):
173 173 """Return the current error state and clear it"""
174 174 e = self.last_syntax_error
175 175 self.last_syntax_error = None
176 176 return e
177 177
178 178 #****************************************************************************
179 179 # Main IPython class
180 180
181 181 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
182 182 # until a full rewrite is made. I've cleaned all cross-class uses of
183 183 # attributes and methods, but too much user code out there relies on the
184 184 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
185 185 #
186 186 # But at least now, all the pieces have been separated and we could, in
187 187 # principle, stop using the mixin. This will ease the transition to the
188 188 # chainsaw branch.
189 189
190 190 # For reference, the following is the list of 'self.foo' uses in the Magic
191 191 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
192 192 # class, to prevent clashes.
193 193
194 194 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
195 195 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
196 196 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
197 197 # 'self.value']
198 198
199 199 class InteractiveShell(object,Magic):
200 200 """An enhanced console for Python."""
201 201
202 202 # class attribute to indicate whether the class supports threads or not.
203 203 # Subclasses with thread support should override this as needed.
204 204 isthreaded = False
205 205
206 206 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
207 207 user_ns = None,user_global_ns=None,banner2='',
208 208 custom_exceptions=((),None),embedded=False):
209 209
210 210 # log system
211 211 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
212 212
213 213 # some minimal strict typechecks. For some core data structures, I
214 214 # want actual basic python types, not just anything that looks like
215 215 # one. This is especially true for namespaces.
216 216 for ns in (user_ns,user_global_ns):
217 217 if ns is not None and type(ns) != types.DictType:
218 218 raise TypeError,'namespace must be a dictionary'
219 219
220 220 # Job manager (for jobs run as background threads)
221 221 self.jobs = BackgroundJobManager()
222 222
223 223 # Store the actual shell's name
224 224 self.name = name
225 225
226 226 # We need to know whether the instance is meant for embedding, since
227 227 # global/local namespaces need to be handled differently in that case
228 228 self.embedded = embedded
229 229
230 230 # command compiler
231 231 self.compile = codeop.CommandCompiler()
232 232
233 233 # User input buffer
234 234 self.buffer = []
235 235
236 236 # Default name given in compilation of code
237 237 self.filename = '<ipython console>'
238 238
239 239 # Install our own quitter instead of the builtins. For python2.3-2.4,
240 240 # this brings in behavior like 2.5, and for 2.5 it's identical.
241 241 __builtin__.exit = Quitter(self,'exit')
242 242 __builtin__.quit = Quitter(self,'quit')
243 243
244 244 # Make an empty namespace, which extension writers can rely on both
245 245 # existing and NEVER being used by ipython itself. This gives them a
246 246 # convenient location for storing additional information and state
247 247 # their extensions may require, without fear of collisions with other
248 248 # ipython names that may develop later.
249 249 self.meta = Struct()
250 250
251 251 # Create the namespace where the user will operate. user_ns is
252 252 # normally the only one used, and it is passed to the exec calls as
253 253 # the locals argument. But we do carry a user_global_ns namespace
254 254 # given as the exec 'globals' argument, This is useful in embedding
255 255 # situations where the ipython shell opens in a context where the
256 256 # distinction between locals and globals is meaningful.
257 257
258 258 # FIXME. For some strange reason, __builtins__ is showing up at user
259 259 # level as a dict instead of a module. This is a manual fix, but I
260 260 # should really track down where the problem is coming from. Alex
261 261 # Schmolck reported this problem first.
262 262
263 263 # A useful post by Alex Martelli on this topic:
264 264 # Re: inconsistent value from __builtins__
265 265 # Von: Alex Martelli <aleaxit@yahoo.com>
266 266 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
267 267 # Gruppen: comp.lang.python
268 268
269 269 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
270 270 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
271 271 # > <type 'dict'>
272 272 # > >>> print type(__builtins__)
273 273 # > <type 'module'>
274 274 # > Is this difference in return value intentional?
275 275
276 276 # Well, it's documented that '__builtins__' can be either a dictionary
277 277 # or a module, and it's been that way for a long time. Whether it's
278 278 # intentional (or sensible), I don't know. In any case, the idea is
279 279 # that if you need to access the built-in namespace directly, you
280 280 # should start with "import __builtin__" (note, no 's') which will
281 281 # definitely give you a module. Yeah, it's somewhat confusing:-(.
282 282
283 283 # These routines return properly built dicts as needed by the rest of
284 284 # the code, and can also be used by extension writers to generate
285 285 # properly initialized namespaces.
286 286 user_ns = IPython.ipapi.make_user_ns(user_ns)
287 287 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
288 288
289 289 # Assign namespaces
290 290 # This is the namespace where all normal user variables live
291 291 self.user_ns = user_ns
292 292 # Embedded instances require a separate namespace for globals.
293 293 # Normally this one is unused by non-embedded instances.
294 294 self.user_global_ns = user_global_ns
295 295 # A namespace to keep track of internal data structures to prevent
296 296 # them from cluttering user-visible stuff. Will be updated later
297 297 self.internal_ns = {}
298 298
299 299 # Namespace of system aliases. Each entry in the alias
300 300 # table must be a 2-tuple of the form (N,name), where N is the number
301 301 # of positional arguments of the alias.
302 302 self.alias_table = {}
303 303
304 304 # A table holding all the namespaces IPython deals with, so that
305 305 # introspection facilities can search easily.
306 306 self.ns_table = {'user':user_ns,
307 307 'user_global':user_global_ns,
308 308 'alias':self.alias_table,
309 309 'internal':self.internal_ns,
310 310 'builtin':__builtin__.__dict__
311 311 }
312 312
313 313 # The user namespace MUST have a pointer to the shell itself.
314 314 self.user_ns[name] = self
315 315
316 316 # We need to insert into sys.modules something that looks like a
317 317 # module but which accesses the IPython namespace, for shelve and
318 318 # pickle to work interactively. Normally they rely on getting
319 319 # everything out of __main__, but for embedding purposes each IPython
320 320 # instance has its own private namespace, so we can't go shoving
321 321 # everything into __main__.
322 322
323 323 # note, however, that we should only do this for non-embedded
324 324 # ipythons, which really mimic the __main__.__dict__ with their own
325 325 # namespace. Embedded instances, on the other hand, should not do
326 326 # this because they need to manage the user local/global namespaces
327 327 # only, but they live within a 'normal' __main__ (meaning, they
328 328 # shouldn't overtake the execution environment of the script they're
329 329 # embedded in).
330 330
331 331 if not embedded:
332 332 try:
333 333 main_name = self.user_ns['__name__']
334 334 except KeyError:
335 335 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
336 336 else:
337 337 #print "pickle hack in place" # dbg
338 338 #print 'main_name:',main_name # dbg
339 339 sys.modules[main_name] = FakeModule(self.user_ns)
340 340
341 341 # List of input with multi-line handling.
342 342 # Fill its zero entry, user counter starts at 1
343 343 self.input_hist = InputList(['\n'])
344 344 # This one will hold the 'raw' input history, without any
345 345 # pre-processing. This will allow users to retrieve the input just as
346 346 # it was exactly typed in by the user, with %hist -r.
347 347 self.input_hist_raw = InputList(['\n'])
348 348
349 349 # list of visited directories
350 350 try:
351 351 self.dir_hist = [os.getcwd()]
352 352 except IOError, e:
353 353 self.dir_hist = []
354 354
355 355 # dict of output history
356 356 self.output_hist = {}
357 357
358 358 # dict of things NOT to alias (keywords, builtins and some magics)
359 359 no_alias = {}
360 360 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
361 361 for key in keyword.kwlist + no_alias_magics:
362 362 no_alias[key] = 1
363 363 no_alias.update(__builtin__.__dict__)
364 364 self.no_alias = no_alias
365 365
366 366 # make global variables for user access to these
367 367 self.user_ns['_ih'] = self.input_hist
368 368 self.user_ns['_oh'] = self.output_hist
369 369 self.user_ns['_dh'] = self.dir_hist
370 370
371 371 # user aliases to input and output histories
372 372 self.user_ns['In'] = self.input_hist
373 373 self.user_ns['Out'] = self.output_hist
374 374
375 375 # Object variable to store code object waiting execution. This is
376 376 # used mainly by the multithreaded shells, but it can come in handy in
377 377 # other situations. No need to use a Queue here, since it's a single
378 378 # item which gets cleared once run.
379 379 self.code_to_run = None
380 380
381 381 # escapes for automatic behavior on the command line
382 382 self.ESC_SHELL = '!'
383 383 self.ESC_HELP = '?'
384 384 self.ESC_MAGIC = '%'
385 385 self.ESC_QUOTE = ','
386 386 self.ESC_QUOTE2 = ';'
387 387 self.ESC_PAREN = '/'
388 388
389 389 # And their associated handlers
390 390 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
391 391 self.ESC_QUOTE : self.handle_auto,
392 392 self.ESC_QUOTE2 : self.handle_auto,
393 393 self.ESC_MAGIC : self.handle_magic,
394 394 self.ESC_HELP : self.handle_help,
395 395 self.ESC_SHELL : self.handle_shell_escape,
396 396 }
397 397
398 398 # class initializations
399 399 Magic.__init__(self,self)
400 400
401 401 # Python source parser/formatter for syntax highlighting
402 402 pyformat = PyColorize.Parser().format
403 403 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
404 404
405 405 # hooks holds pointers used for user-side customizations
406 406 self.hooks = Struct()
407 407
408 408 self.strdispatchers = {}
409 409
410 410 # Set all default hooks, defined in the IPython.hooks module.
411 411 hooks = IPython.hooks
412 412 for hook_name in hooks.__all__:
413 413 # default hooks have priority 100, i.e. low; user hooks should have 0-100 priority
414 414 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
415 415 #print "bound hook",hook_name
416 416
417 417 # Flag to mark unconditional exit
418 418 self.exit_now = False
419 419
420 420 self.usage_min = """\
421 421 An enhanced console for Python.
422 422 Some of its features are:
423 423 - Readline support if the readline library is present.
424 424 - Tab completion in the local namespace.
425 425 - Logging of input, see command-line options.
426 426 - System shell escape via ! , eg !ls.
427 427 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
428 428 - Keeps track of locally defined variables via %who, %whos.
429 429 - Show object information with a ? eg ?x or x? (use ?? for more info).
430 430 """
431 431 if usage: self.usage = usage
432 432 else: self.usage = self.usage_min
433 433
434 434 # Storage
435 435 self.rc = rc # This will hold all configuration information
436 436 self.pager = 'less'
437 437 # temporary files used for various purposes. Deleted at exit.
438 438 self.tempfiles = []
439 439
440 440 # Keep track of readline usage (later set by init_readline)
441 441 self.has_readline = False
442 442
443 443 # template for logfile headers. It gets resolved at runtime by the
444 444 # logstart method.
445 445 self.loghead_tpl = \
446 446 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
447 447 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
448 448 #log# opts = %s
449 449 #log# args = %s
450 450 #log# It is safe to make manual edits below here.
451 451 #log#-----------------------------------------------------------------------
452 452 """
453 453 # for pushd/popd management
454 454 try:
455 455 self.home_dir = get_home_dir()
456 456 except HomeDirError,msg:
457 457 fatal(msg)
458 458
459 459 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
460 460
461 461 # Functions to call the underlying shell.
462 462
463 463 # The first is similar to os.system, but it doesn't return a value,
464 464 # and it allows interpolation of variables in the user's namespace.
465 465 self.system = lambda cmd: \
466 466 shell(self.var_expand(cmd,depth=2),
467 467 header=self.rc.system_header,
468 468 verbose=self.rc.system_verbose)
469 469
470 470 # These are for getoutput and getoutputerror:
471 471 self.getoutput = lambda cmd: \
472 472 getoutput(self.var_expand(cmd,depth=2),
473 473 header=self.rc.system_header,
474 474 verbose=self.rc.system_verbose)
475 475
476 476 self.getoutputerror = lambda cmd: \
477 477 getoutputerror(self.var_expand(cmd,depth=2),
478 478 header=self.rc.system_header,
479 479 verbose=self.rc.system_verbose)
480 480
481 481 # RegExp for splitting line contents into pre-char//first
482 482 # word-method//rest. For clarity, each group in on one line.
483 483
484 484 # WARNING: update the regexp if the above escapes are changed, as they
485 485 # are hardwired in.
486 486
487 487 # Don't get carried away with trying to make the autocalling catch too
488 488 # much: it's better to be conservative rather than to trigger hidden
489 489 # evals() somewhere and end up causing side effects.
490
491 self.line_split = re.compile(r'^([\s*,;/])'
490 self.line_split = re.compile(r'^(\s*[,;/]?\s*)'
492 491 r'([\?\w\.]+\w*\s*)'
493 492 r'(\(?.*$)')
494 493
495 494 # A simpler regexp used as a fallback if the above doesn't work. This
496 495 # one is more conservative in how it partitions the input. This code
497 496 # can probably be cleaned up to do everything with just one regexp, but
498 497 # I'm afraid of breaking something; do it once the unit tests are in
499 498 # place.
500 499 self.line_split_fallback = re.compile(r'^(\s*)'
501 500 r'([%\!\?\w\.]*)'
502 501 r'(.*)')
503 502
504 503 # Original re, keep around for a while in case changes break something
505 504 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
506 505 # r'(\s*[\?\w\.]+\w*\s*)'
507 506 # r'(\(?.*$)')
508 507
509 508 # RegExp to identify potential function names
510 509 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
511 510
512 511 # RegExp to exclude strings with this start from autocalling. In
513 512 # particular, all binary operators should be excluded, so that if foo
514 513 # is callable, foo OP bar doesn't become foo(OP bar), which is
515 514 # invalid. The characters '!=()' don't need to be checked for, as the
516 515 # _prefilter routine explicitely does so, to catch direct calls and
517 516 # rebindings of existing names.
518 517
519 518 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
520 519 # it affects the rest of the group in square brackets.
521 520 self.re_exclude_auto = re.compile(r'^[<>,&^\|\*/\+-]'
522 521 '|^is |^not |^in |^and |^or ')
523 522
524 523 # try to catch also methods for stuff in lists/tuples/dicts: off
525 524 # (experimental). For this to work, the line_split regexp would need
526 525 # to be modified so it wouldn't break things at '['. That line is
527 526 # nasty enough that I shouldn't change it until I can test it _well_.
528 527 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
529 528
530 529 # keep track of where we started running (mainly for crash post-mortem)
531 530 self.starting_dir = os.getcwd()
532 531
533 532 # Various switches which can be set
534 533 self.CACHELENGTH = 5000 # this is cheap, it's just text
535 534 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
536 535 self.banner2 = banner2
537 536
538 537 # TraceBack handlers:
539 538
540 539 # Syntax error handler.
541 540 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
542 541
543 542 # The interactive one is initialized with an offset, meaning we always
544 543 # want to remove the topmost item in the traceback, which is our own
545 544 # internal code. Valid modes: ['Plain','Context','Verbose']
546 545 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
547 546 color_scheme='NoColor',
548 547 tb_offset = 1)
549 548
550 549 # IPython itself shouldn't crash. This will produce a detailed
551 550 # post-mortem if it does. But we only install the crash handler for
552 551 # non-threaded shells, the threaded ones use a normal verbose reporter
553 552 # and lose the crash handler. This is because exceptions in the main
554 553 # thread (such as in GUI code) propagate directly to sys.excepthook,
555 554 # and there's no point in printing crash dumps for every user exception.
556 555 if self.isthreaded:
557 556 ipCrashHandler = ultraTB.FormattedTB()
558 557 else:
559 558 from IPython import CrashHandler
560 559 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
561 560 self.set_crash_handler(ipCrashHandler)
562 561
563 562 # and add any custom exception handlers the user may have specified
564 563 self.set_custom_exc(*custom_exceptions)
565 564
566 565 # indentation management
567 566 self.autoindent = False
568 567 self.indent_current_nsp = 0
569 568
570 569 # Make some aliases automatically
571 570 # Prepare list of shell aliases to auto-define
572 571 if os.name == 'posix':
573 572 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
574 573 'mv mv -i','rm rm -i','cp cp -i',
575 574 'cat cat','less less','clear clear',
576 575 # a better ls
577 576 'ls ls -F',
578 577 # long ls
579 578 'll ls -lF')
580 579 # Extra ls aliases with color, which need special treatment on BSD
581 580 # variants
582 581 ls_extra = ( # color ls
583 582 'lc ls -F -o --color',
584 583 # ls normal files only
585 584 'lf ls -F -o --color %l | grep ^-',
586 585 # ls symbolic links
587 586 'lk ls -F -o --color %l | grep ^l',
588 587 # directories or links to directories,
589 588 'ldir ls -F -o --color %l | grep /$',
590 589 # things which are executable
591 590 'lx ls -F -o --color %l | grep ^-..x',
592 591 )
593 592 # The BSDs don't ship GNU ls, so they don't understand the
594 593 # --color switch out of the box
595 594 if 'bsd' in sys.platform:
596 595 ls_extra = ( # ls normal files only
597 596 'lf ls -lF | grep ^-',
598 597 # ls symbolic links
599 598 'lk ls -lF | grep ^l',
600 599 # directories or links to directories,
601 600 'ldir ls -lF | grep /$',
602 601 # things which are executable
603 602 'lx ls -lF | grep ^-..x',
604 603 )
605 604 auto_alias = auto_alias + ls_extra
606 605 elif os.name in ['nt','dos']:
607 606 auto_alias = ('dir dir /on', 'ls dir /on',
608 607 'ddir dir /ad /on', 'ldir dir /ad /on',
609 608 'mkdir mkdir','rmdir rmdir','echo echo',
610 609 'ren ren','cls cls','copy copy')
611 610 else:
612 611 auto_alias = ()
613 612 self.auto_alias = [s.split(None,1) for s in auto_alias]
614 613 # Call the actual (public) initializer
615 614 self.init_auto_alias()
616 615
617 616 # Produce a public API instance
618 617 self.api = IPython.ipapi.IPApi(self)
619 618
620 619 # track which builtins we add, so we can clean up later
621 620 self.builtins_added = {}
622 621 # This method will add the necessary builtins for operation, but
623 622 # tracking what it did via the builtins_added dict.
624 623 self.add_builtins()
625 624
626 625 # end __init__
627 626
628 627 def var_expand(self,cmd,depth=0):
629 628 """Expand python variables in a string.
630 629
631 630 The depth argument indicates how many frames above the caller should
632 631 be walked to look for the local namespace where to expand variables.
633 632
634 633 The global namespace for expansion is always the user's interactive
635 634 namespace.
636 635 """
637 636
638 637 return str(ItplNS(cmd.replace('#','\#'),
639 638 self.user_ns, # globals
640 639 # Skip our own frame in searching for locals:
641 640 sys._getframe(depth+1).f_locals # locals
642 641 ))
643 642
644 643 def pre_config_initialization(self):
645 644 """Pre-configuration init method
646 645
647 646 This is called before the configuration files are processed to
648 647 prepare the services the config files might need.
649 648
650 649 self.rc already has reasonable default values at this point.
651 650 """
652 651 rc = self.rc
653 652
654 653 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
655 654
656 655 def post_config_initialization(self):
657 656 """Post configuration init method
658 657
659 658 This is called after the configuration files have been processed to
660 659 'finalize' the initialization."""
661 660
662 661 rc = self.rc
663 662
664 663 # Object inspector
665 664 self.inspector = OInspect.Inspector(OInspect.InspectColors,
666 665 PyColorize.ANSICodeColors,
667 666 'NoColor',
668 667 rc.object_info_string_level)
669 668
670 669 # Load readline proper
671 670 if rc.readline:
672 671 self.init_readline()
673 672
674 673 # local shortcut, this is used a LOT
675 674 self.log = self.logger.log
676 675
677 676 # Initialize cache, set in/out prompts and printing system
678 677 self.outputcache = CachedOutput(self,
679 678 rc.cache_size,
680 679 rc.pprint,
681 680 input_sep = rc.separate_in,
682 681 output_sep = rc.separate_out,
683 682 output_sep2 = rc.separate_out2,
684 683 ps1 = rc.prompt_in1,
685 684 ps2 = rc.prompt_in2,
686 685 ps_out = rc.prompt_out,
687 686 pad_left = rc.prompts_pad_left)
688 687
689 688 # user may have over-ridden the default print hook:
690 689 try:
691 690 self.outputcache.__class__.display = self.hooks.display
692 691 except AttributeError:
693 692 pass
694 693
695 694 # I don't like assigning globally to sys, because it means when
696 695 # embedding instances, each embedded instance overrides the previous
697 696 # choice. But sys.displayhook seems to be called internally by exec,
698 697 # so I don't see a way around it. We first save the original and then
699 698 # overwrite it.
700 699 self.sys_displayhook = sys.displayhook
701 700 sys.displayhook = self.outputcache
702 701
703 702 # Set user colors (don't do it in the constructor above so that it
704 703 # doesn't crash if colors option is invalid)
705 704 self.magic_colors(rc.colors)
706 705
707 706 # Set calling of pdb on exceptions
708 707 self.call_pdb = rc.pdb
709 708
710 709 # Load user aliases
711 710 for alias in rc.alias:
712 711 self.magic_alias(alias)
713 712 self.hooks.late_startup_hook()
714 713
715 714 batchrun = False
716 715 for batchfile in [path(arg) for arg in self.rc.args
717 716 if arg.lower().endswith('.ipy')]:
718 717 if not batchfile.isfile():
719 718 print "No such batch file:", batchfile
720 719 continue
721 720 self.api.runlines(batchfile.text())
722 721 batchrun = True
723 722 if batchrun:
724 723 self.exit_now = True
725 724
726 725 def add_builtins(self):
727 726 """Store ipython references into the builtin namespace.
728 727
729 728 Some parts of ipython operate via builtins injected here, which hold a
730 729 reference to IPython itself."""
731 730
732 731 # TODO: deprecate all except _ip; 'jobs' should be installed
733 732 # by an extension and the rest are under _ip, ipalias is redundant
734 733 builtins_new = dict(__IPYTHON__ = self,
735 734 ip_set_hook = self.set_hook,
736 735 jobs = self.jobs,
737 736 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
738 737 ipalias = wrap_deprecated(self.ipalias),
739 738 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
740 739 _ip = self.api
741 740 )
742 741 for biname,bival in builtins_new.items():
743 742 try:
744 743 # store the orignal value so we can restore it
745 744 self.builtins_added[biname] = __builtin__.__dict__[biname]
746 745 except KeyError:
747 746 # or mark that it wasn't defined, and we'll just delete it at
748 747 # cleanup
749 748 self.builtins_added[biname] = Undefined
750 749 __builtin__.__dict__[biname] = bival
751 750
752 751 # Keep in the builtins a flag for when IPython is active. We set it
753 752 # with setdefault so that multiple nested IPythons don't clobber one
754 753 # another. Each will increase its value by one upon being activated,
755 754 # which also gives us a way to determine the nesting level.
756 755 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
757 756
758 757 def clean_builtins(self):
759 758 """Remove any builtins which might have been added by add_builtins, or
760 759 restore overwritten ones to their previous values."""
761 760 for biname,bival in self.builtins_added.items():
762 761 if bival is Undefined:
763 762 del __builtin__.__dict__[biname]
764 763 else:
765 764 __builtin__.__dict__[biname] = bival
766 765 self.builtins_added.clear()
767 766
768 767 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
769 768 """set_hook(name,hook) -> sets an internal IPython hook.
770 769
771 770 IPython exposes some of its internal API as user-modifiable hooks. By
772 771 adding your function to one of these hooks, you can modify IPython's
773 772 behavior to call at runtime your own routines."""
774 773
775 774 # At some point in the future, this should validate the hook before it
776 775 # accepts it. Probably at least check that the hook takes the number
777 776 # of args it's supposed to.
778 777
779 778 f = new.instancemethod(hook,self,self.__class__)
780 779
781 780 # check if the hook is for strdispatcher first
782 781 if str_key is not None:
783 782 sdp = self.strdispatchers.get(name, StrDispatch())
784 783 sdp.add_s(str_key, f, priority )
785 784 self.strdispatchers[name] = sdp
786 785 return
787 786 if re_key is not None:
788 787 sdp = self.strdispatchers.get(name, StrDispatch())
789 788 sdp.add_re(re.compile(re_key), f, priority )
790 789 self.strdispatchers[name] = sdp
791 790 return
792 791
793 792 dp = getattr(self.hooks, name, None)
794 793 if name not in IPython.hooks.__all__:
795 794 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
796 795 if not dp:
797 796 dp = IPython.hooks.CommandChainDispatcher()
798 797
799 798 try:
800 799 dp.add(f,priority)
801 800 except AttributeError:
802 801 # it was not commandchain, plain old func - replace
803 802 dp = f
804 803
805 804 setattr(self.hooks,name, dp)
806 805
807 806
808 807 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
809 808
810 809 def set_crash_handler(self,crashHandler):
811 810 """Set the IPython crash handler.
812 811
813 812 This must be a callable with a signature suitable for use as
814 813 sys.excepthook."""
815 814
816 815 # Install the given crash handler as the Python exception hook
817 816 sys.excepthook = crashHandler
818 817
819 818 # The instance will store a pointer to this, so that runtime code
820 819 # (such as magics) can access it. This is because during the
821 820 # read-eval loop, it gets temporarily overwritten (to deal with GUI
822 821 # frameworks).
823 822 self.sys_excepthook = sys.excepthook
824 823
825 824
826 825 def set_custom_exc(self,exc_tuple,handler):
827 826 """set_custom_exc(exc_tuple,handler)
828 827
829 828 Set a custom exception handler, which will be called if any of the
830 829 exceptions in exc_tuple occur in the mainloop (specifically, in the
831 830 runcode() method.
832 831
833 832 Inputs:
834 833
835 834 - exc_tuple: a *tuple* of valid exceptions to call the defined
836 835 handler for. It is very important that you use a tuple, and NOT A
837 836 LIST here, because of the way Python's except statement works. If
838 837 you only want to trap a single exception, use a singleton tuple:
839 838
840 839 exc_tuple == (MyCustomException,)
841 840
842 841 - handler: this must be defined as a function with the following
843 842 basic interface: def my_handler(self,etype,value,tb).
844 843
845 844 This will be made into an instance method (via new.instancemethod)
846 845 of IPython itself, and it will be called if any of the exceptions
847 846 listed in the exc_tuple are caught. If the handler is None, an
848 847 internal basic one is used, which just prints basic info.
849 848
850 849 WARNING: by putting in your own exception handler into IPython's main
851 850 execution loop, you run a very good chance of nasty crashes. This
852 851 facility should only be used if you really know what you are doing."""
853 852
854 853 assert type(exc_tuple)==type(()) , \
855 854 "The custom exceptions must be given AS A TUPLE."
856 855
857 856 def dummy_handler(self,etype,value,tb):
858 857 print '*** Simple custom exception handler ***'
859 858 print 'Exception type :',etype
860 859 print 'Exception value:',value
861 860 print 'Traceback :',tb
862 861 print 'Source code :','\n'.join(self.buffer)
863 862
864 863 if handler is None: handler = dummy_handler
865 864
866 865 self.CustomTB = new.instancemethod(handler,self,self.__class__)
867 866 self.custom_exceptions = exc_tuple
868 867
869 868 def set_custom_completer(self,completer,pos=0):
870 869 """set_custom_completer(completer,pos=0)
871 870
872 871 Adds a new custom completer function.
873 872
874 873 The position argument (defaults to 0) is the index in the completers
875 874 list where you want the completer to be inserted."""
876 875
877 876 newcomp = new.instancemethod(completer,self.Completer,
878 877 self.Completer.__class__)
879 878 self.Completer.matchers.insert(pos,newcomp)
880 879
881 880 def _get_call_pdb(self):
882 881 return self._call_pdb
883 882
884 883 def _set_call_pdb(self,val):
885 884
886 885 if val not in (0,1,False,True):
887 886 raise ValueError,'new call_pdb value must be boolean'
888 887
889 888 # store value in instance
890 889 self._call_pdb = val
891 890
892 891 # notify the actual exception handlers
893 892 self.InteractiveTB.call_pdb = val
894 893 if self.isthreaded:
895 894 try:
896 895 self.sys_excepthook.call_pdb = val
897 896 except:
898 897 warn('Failed to activate pdb for threaded exception handler')
899 898
900 899 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
901 900 'Control auto-activation of pdb at exceptions')
902 901
903 902
904 903 # These special functions get installed in the builtin namespace, to
905 904 # provide programmatic (pure python) access to magics, aliases and system
906 905 # calls. This is important for logging, user scripting, and more.
907 906
908 907 # We are basically exposing, via normal python functions, the three
909 908 # mechanisms in which ipython offers special call modes (magics for
910 909 # internal control, aliases for direct system access via pre-selected
911 910 # names, and !cmd for calling arbitrary system commands).
912 911
913 912 def ipmagic(self,arg_s):
914 913 """Call a magic function by name.
915 914
916 915 Input: a string containing the name of the magic function to call and any
917 916 additional arguments to be passed to the magic.
918 917
919 918 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
920 919 prompt:
921 920
922 921 In[1]: %name -opt foo bar
923 922
924 923 To call a magic without arguments, simply use ipmagic('name').
925 924
926 925 This provides a proper Python function to call IPython's magics in any
927 926 valid Python code you can type at the interpreter, including loops and
928 927 compound statements. It is added by IPython to the Python builtin
929 928 namespace upon initialization."""
930 929
931 930 args = arg_s.split(' ',1)
932 931 magic_name = args[0]
933 932 magic_name = magic_name.lstrip(self.ESC_MAGIC)
934 933
935 934 try:
936 935 magic_args = args[1]
937 936 except IndexError:
938 937 magic_args = ''
939 938 fn = getattr(self,'magic_'+magic_name,None)
940 939 if fn is None:
941 940 error("Magic function `%s` not found." % magic_name)
942 941 else:
943 942 magic_args = self.var_expand(magic_args,1)
944 943 return fn(magic_args)
945 944
946 945 def ipalias(self,arg_s):
947 946 """Call an alias by name.
948 947
949 948 Input: a string containing the name of the alias to call and any
950 949 additional arguments to be passed to the magic.
951 950
952 951 ipalias('name -opt foo bar') is equivalent to typing at the ipython
953 952 prompt:
954 953
955 954 In[1]: name -opt foo bar
956 955
957 956 To call an alias without arguments, simply use ipalias('name').
958 957
959 958 This provides a proper Python function to call IPython's aliases in any
960 959 valid Python code you can type at the interpreter, including loops and
961 960 compound statements. It is added by IPython to the Python builtin
962 961 namespace upon initialization."""
963 962
964 963 args = arg_s.split(' ',1)
965 964 alias_name = args[0]
966 965 try:
967 966 alias_args = args[1]
968 967 except IndexError:
969 968 alias_args = ''
970 969 if alias_name in self.alias_table:
971 970 self.call_alias(alias_name,alias_args)
972 971 else:
973 972 error("Alias `%s` not found." % alias_name)
974 973
975 974 def ipsystem(self,arg_s):
976 975 """Make a system call, using IPython."""
977 976
978 977 self.system(arg_s)
979 978
980 979 def complete(self,text):
981 980 """Return a sorted list of all possible completions on text.
982 981
983 982 Inputs:
984 983
985 984 - text: a string of text to be completed on.
986 985
987 986 This is a wrapper around the completion mechanism, similar to what
988 987 readline does at the command line when the TAB key is hit. By
989 988 exposing it as a method, it can be used by other non-readline
990 989 environments (such as GUIs) for text completion.
991 990
992 991 Simple usage example:
993 992
994 993 In [1]: x = 'hello'
995 994
996 995 In [2]: __IP.complete('x.l')
997 996 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
998 997
999 998 complete = self.Completer.complete
1000 999 state = 0
1001 1000 # use a dict so we get unique keys, since ipyhton's multiple
1002 1001 # completers can return duplicates.
1003 1002 comps = {}
1004 1003 while True:
1005 1004 newcomp = complete(text,state)
1006 1005 if newcomp is None:
1007 1006 break
1008 1007 comps[newcomp] = 1
1009 1008 state += 1
1010 1009 outcomps = comps.keys()
1011 1010 outcomps.sort()
1012 1011 return outcomps
1013 1012
1014 1013 def set_completer_frame(self, frame=None):
1015 1014 if frame:
1016 1015 self.Completer.namespace = frame.f_locals
1017 1016 self.Completer.global_namespace = frame.f_globals
1018 1017 else:
1019 1018 self.Completer.namespace = self.user_ns
1020 1019 self.Completer.global_namespace = self.user_global_ns
1021 1020
1022 1021 def init_auto_alias(self):
1023 1022 """Define some aliases automatically.
1024 1023
1025 1024 These are ALL parameter-less aliases"""
1026 1025
1027 1026 for alias,cmd in self.auto_alias:
1028 1027 self.alias_table[alias] = (0,cmd)
1029 1028
1030 1029 def alias_table_validate(self,verbose=0):
1031 1030 """Update information about the alias table.
1032 1031
1033 1032 In particular, make sure no Python keywords/builtins are in it."""
1034 1033
1035 1034 no_alias = self.no_alias
1036 1035 for k in self.alias_table.keys():
1037 1036 if k in no_alias:
1038 1037 del self.alias_table[k]
1039 1038 if verbose:
1040 1039 print ("Deleting alias <%s>, it's a Python "
1041 1040 "keyword or builtin." % k)
1042 1041
1043 1042 def set_autoindent(self,value=None):
1044 1043 """Set the autoindent flag, checking for readline support.
1045 1044
1046 1045 If called with no arguments, it acts as a toggle."""
1047 1046
1048 1047 if not self.has_readline:
1049 1048 if os.name == 'posix':
1050 1049 warn("The auto-indent feature requires the readline library")
1051 1050 self.autoindent = 0
1052 1051 return
1053 1052 if value is None:
1054 1053 self.autoindent = not self.autoindent
1055 1054 else:
1056 1055 self.autoindent = value
1057 1056
1058 1057 def rc_set_toggle(self,rc_field,value=None):
1059 1058 """Set or toggle a field in IPython's rc config. structure.
1060 1059
1061 1060 If called with no arguments, it acts as a toggle.
1062 1061
1063 1062 If called with a non-existent field, the resulting AttributeError
1064 1063 exception will propagate out."""
1065 1064
1066 1065 rc_val = getattr(self.rc,rc_field)
1067 1066 if value is None:
1068 1067 value = not rc_val
1069 1068 setattr(self.rc,rc_field,value)
1070 1069
1071 1070 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1072 1071 """Install the user configuration directory.
1073 1072
1074 1073 Can be called when running for the first time or to upgrade the user's
1075 1074 .ipython/ directory with the mode parameter. Valid modes are 'install'
1076 1075 and 'upgrade'."""
1077 1076
1078 1077 def wait():
1079 1078 try:
1080 1079 raw_input("Please press <RETURN> to start IPython.")
1081 1080 except EOFError:
1082 1081 print >> Term.cout
1083 1082 print '*'*70
1084 1083
1085 1084 cwd = os.getcwd() # remember where we started
1086 1085 glb = glob.glob
1087 1086 print '*'*70
1088 1087 if mode == 'install':
1089 1088 print \
1090 1089 """Welcome to IPython. I will try to create a personal configuration directory
1091 1090 where you can customize many aspects of IPython's functionality in:\n"""
1092 1091 else:
1093 1092 print 'I am going to upgrade your configuration in:'
1094 1093
1095 1094 print ipythondir
1096 1095
1097 1096 rcdirend = os.path.join('IPython','UserConfig')
1098 1097 cfg = lambda d: os.path.join(d,rcdirend)
1099 1098 try:
1100 1099 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1101 1100 except IOError:
1102 1101 warning = """
1103 1102 Installation error. IPython's directory was not found.
1104 1103
1105 1104 Check the following:
1106 1105
1107 1106 The ipython/IPython directory should be in a directory belonging to your
1108 1107 PYTHONPATH environment variable (that is, it should be in a directory
1109 1108 belonging to sys.path). You can copy it explicitly there or just link to it.
1110 1109
1111 1110 IPython will proceed with builtin defaults.
1112 1111 """
1113 1112 warn(warning)
1114 1113 wait()
1115 1114 return
1116 1115
1117 1116 if mode == 'install':
1118 1117 try:
1119 1118 shutil.copytree(rcdir,ipythondir)
1120 1119 os.chdir(ipythondir)
1121 1120 rc_files = glb("ipythonrc*")
1122 1121 for rc_file in rc_files:
1123 1122 os.rename(rc_file,rc_file+rc_suffix)
1124 1123 except:
1125 1124 warning = """
1126 1125
1127 1126 There was a problem with the installation:
1128 1127 %s
1129 1128 Try to correct it or contact the developers if you think it's a bug.
1130 1129 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1131 1130 warn(warning)
1132 1131 wait()
1133 1132 return
1134 1133
1135 1134 elif mode == 'upgrade':
1136 1135 try:
1137 1136 os.chdir(ipythondir)
1138 1137 except:
1139 1138 print """
1140 1139 Can not upgrade: changing to directory %s failed. Details:
1141 1140 %s
1142 1141 """ % (ipythondir,sys.exc_info()[1])
1143 1142 wait()
1144 1143 return
1145 1144 else:
1146 1145 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1147 1146 for new_full_path in sources:
1148 1147 new_filename = os.path.basename(new_full_path)
1149 1148 if new_filename.startswith('ipythonrc'):
1150 1149 new_filename = new_filename + rc_suffix
1151 1150 # The config directory should only contain files, skip any
1152 1151 # directories which may be there (like CVS)
1153 1152 if os.path.isdir(new_full_path):
1154 1153 continue
1155 1154 if os.path.exists(new_filename):
1156 1155 old_file = new_filename+'.old'
1157 1156 if os.path.exists(old_file):
1158 1157 os.remove(old_file)
1159 1158 os.rename(new_filename,old_file)
1160 1159 shutil.copy(new_full_path,new_filename)
1161 1160 else:
1162 1161 raise ValueError,'unrecognized mode for install:',`mode`
1163 1162
1164 1163 # Fix line-endings to those native to each platform in the config
1165 1164 # directory.
1166 1165 try:
1167 1166 os.chdir(ipythondir)
1168 1167 except:
1169 1168 print """
1170 1169 Problem: changing to directory %s failed.
1171 1170 Details:
1172 1171 %s
1173 1172
1174 1173 Some configuration files may have incorrect line endings. This should not
1175 1174 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1176 1175 wait()
1177 1176 else:
1178 1177 for fname in glb('ipythonrc*'):
1179 1178 try:
1180 1179 native_line_ends(fname,backup=0)
1181 1180 except IOError:
1182 1181 pass
1183 1182
1184 1183 if mode == 'install':
1185 1184 print """
1186 1185 Successful installation!
1187 1186
1188 1187 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1189 1188 IPython manual (there are both HTML and PDF versions supplied with the
1190 1189 distribution) to make sure that your system environment is properly configured
1191 1190 to take advantage of IPython's features.
1192 1191
1193 1192 Important note: the configuration system has changed! The old system is
1194 1193 still in place, but its setting may be partly overridden by the settings in
1195 1194 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1196 1195 if some of the new settings bother you.
1197 1196
1198 1197 """
1199 1198 else:
1200 1199 print """
1201 1200 Successful upgrade!
1202 1201
1203 1202 All files in your directory:
1204 1203 %(ipythondir)s
1205 1204 which would have been overwritten by the upgrade were backed up with a .old
1206 1205 extension. If you had made particular customizations in those files you may
1207 1206 want to merge them back into the new files.""" % locals()
1208 1207 wait()
1209 1208 os.chdir(cwd)
1210 1209 # end user_setup()
1211 1210
1212 1211 def atexit_operations(self):
1213 1212 """This will be executed at the time of exit.
1214 1213
1215 1214 Saving of persistent data should be performed here. """
1216 1215
1217 1216 #print '*** IPython exit cleanup ***' # dbg
1218 1217 # input history
1219 1218 self.savehist()
1220 1219
1221 1220 # Cleanup all tempfiles left around
1222 1221 for tfile in self.tempfiles:
1223 1222 try:
1224 1223 os.unlink(tfile)
1225 1224 except OSError:
1226 1225 pass
1227 1226
1228 1227 # save the "persistent data" catch-all dictionary
1229 1228 self.hooks.shutdown_hook()
1230 1229
1231 1230 def savehist(self):
1232 1231 """Save input history to a file (via readline library)."""
1233 1232 try:
1234 1233 self.readline.write_history_file(self.histfile)
1235 1234 except:
1236 1235 print 'Unable to save IPython command history to file: ' + \
1237 1236 `self.histfile`
1238 1237
1239 1238 def history_saving_wrapper(self, func):
1240 1239 """ Wrap func for readline history saving
1241 1240
1242 1241 Convert func into callable that saves & restores
1243 1242 history around the call """
1244 1243
1245 1244 if not self.has_readline:
1246 1245 return func
1247 1246
1248 1247 def wrapper():
1249 1248 self.savehist()
1250 1249 try:
1251 1250 func()
1252 1251 finally:
1253 1252 readline.read_history_file(self.histfile)
1254 1253 return wrapper
1255 1254
1256 1255
1257 1256 def pre_readline(self):
1258 1257 """readline hook to be used at the start of each line.
1259 1258
1260 1259 Currently it handles auto-indent only."""
1261 1260
1262 1261 #debugx('self.indent_current_nsp','pre_readline:')
1263 1262 self.readline.insert_text(self.indent_current_str())
1264 1263
1265 1264 def init_readline(self):
1266 1265 """Command history completion/saving/reloading."""
1267 1266
1268 1267 import IPython.rlineimpl as readline
1269 1268 if not readline.have_readline:
1270 1269 self.has_readline = 0
1271 1270 self.readline = None
1272 1271 # no point in bugging windows users with this every time:
1273 1272 warn('Readline services not available on this platform.')
1274 1273 else:
1275 1274 sys.modules['readline'] = readline
1276 1275 import atexit
1277 1276 from IPython.completer import IPCompleter
1278 1277 self.Completer = IPCompleter(self,
1279 1278 self.user_ns,
1280 1279 self.user_global_ns,
1281 1280 self.rc.readline_omit__names,
1282 1281 self.alias_table)
1283 1282 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1284 1283 self.strdispatchers['complete_command'] = sdisp
1285 1284 self.Completer.custom_completers = sdisp
1286 1285 # Platform-specific configuration
1287 1286 if os.name == 'nt':
1288 1287 self.readline_startup_hook = readline.set_pre_input_hook
1289 1288 else:
1290 1289 self.readline_startup_hook = readline.set_startup_hook
1291 1290
1292 1291 # Load user's initrc file (readline config)
1293 1292 inputrc_name = os.environ.get('INPUTRC')
1294 1293 if inputrc_name is None:
1295 1294 home_dir = get_home_dir()
1296 1295 if home_dir is not None:
1297 1296 inputrc_name = os.path.join(home_dir,'.inputrc')
1298 1297 if os.path.isfile(inputrc_name):
1299 1298 try:
1300 1299 readline.read_init_file(inputrc_name)
1301 1300 except:
1302 1301 warn('Problems reading readline initialization file <%s>'
1303 1302 % inputrc_name)
1304 1303
1305 1304 self.has_readline = 1
1306 1305 self.readline = readline
1307 1306 # save this in sys so embedded copies can restore it properly
1308 1307 sys.ipcompleter = self.Completer.complete
1309 1308 readline.set_completer(self.Completer.complete)
1310 1309
1311 1310 # Configure readline according to user's prefs
1312 1311 for rlcommand in self.rc.readline_parse_and_bind:
1313 1312 readline.parse_and_bind(rlcommand)
1314 1313
1315 1314 # remove some chars from the delimiters list
1316 1315 delims = readline.get_completer_delims()
1317 1316 delims = delims.translate(string._idmap,
1318 1317 self.rc.readline_remove_delims)
1319 1318 readline.set_completer_delims(delims)
1320 1319 # otherwise we end up with a monster history after a while:
1321 1320 readline.set_history_length(1000)
1322 1321 try:
1323 1322 #print '*** Reading readline history' # dbg
1324 1323 readline.read_history_file(self.histfile)
1325 1324 except IOError:
1326 1325 pass # It doesn't exist yet.
1327 1326
1328 1327 atexit.register(self.atexit_operations)
1329 1328 del atexit
1330 1329
1331 1330 # Configure auto-indent for all platforms
1332 1331 self.set_autoindent(self.rc.autoindent)
1333 1332
1334 1333 def ask_yes_no(self,prompt,default=True):
1335 1334 if self.rc.quiet:
1336 1335 return True
1337 1336 return ask_yes_no(prompt,default)
1338 1337
1339 1338 def _should_recompile(self,e):
1340 1339 """Utility routine for edit_syntax_error"""
1341 1340
1342 1341 if e.filename in ('<ipython console>','<input>','<string>',
1343 1342 '<console>','<BackgroundJob compilation>',
1344 1343 None):
1345 1344
1346 1345 return False
1347 1346 try:
1348 1347 if (self.rc.autoedit_syntax and
1349 1348 not self.ask_yes_no('Return to editor to correct syntax error? '
1350 1349 '[Y/n] ','y')):
1351 1350 return False
1352 1351 except EOFError:
1353 1352 return False
1354 1353
1355 1354 def int0(x):
1356 1355 try:
1357 1356 return int(x)
1358 1357 except TypeError:
1359 1358 return 0
1360 1359 # always pass integer line and offset values to editor hook
1361 1360 self.hooks.fix_error_editor(e.filename,
1362 1361 int0(e.lineno),int0(e.offset),e.msg)
1363 1362 return True
1364 1363
1365 1364 def edit_syntax_error(self):
1366 1365 """The bottom half of the syntax error handler called in the main loop.
1367 1366
1368 1367 Loop until syntax error is fixed or user cancels.
1369 1368 """
1370 1369
1371 1370 while self.SyntaxTB.last_syntax_error:
1372 1371 # copy and clear last_syntax_error
1373 1372 err = self.SyntaxTB.clear_err_state()
1374 1373 if not self._should_recompile(err):
1375 1374 return
1376 1375 try:
1377 1376 # may set last_syntax_error again if a SyntaxError is raised
1378 1377 self.safe_execfile(err.filename,self.user_ns)
1379 1378 except:
1380 1379 self.showtraceback()
1381 1380 else:
1382 1381 try:
1383 1382 f = file(err.filename)
1384 1383 try:
1385 1384 sys.displayhook(f.read())
1386 1385 finally:
1387 1386 f.close()
1388 1387 except:
1389 1388 self.showtraceback()
1390 1389
1391 1390 def showsyntaxerror(self, filename=None):
1392 1391 """Display the syntax error that just occurred.
1393 1392
1394 1393 This doesn't display a stack trace because there isn't one.
1395 1394
1396 1395 If a filename is given, it is stuffed in the exception instead
1397 1396 of what was there before (because Python's parser always uses
1398 1397 "<string>" when reading from a string).
1399 1398 """
1400 1399 etype, value, last_traceback = sys.exc_info()
1401 1400
1402 1401 # See note about these variables in showtraceback() below
1403 1402 sys.last_type = etype
1404 1403 sys.last_value = value
1405 1404 sys.last_traceback = last_traceback
1406 1405
1407 1406 if filename and etype is SyntaxError:
1408 1407 # Work hard to stuff the correct filename in the exception
1409 1408 try:
1410 1409 msg, (dummy_filename, lineno, offset, line) = value
1411 1410 except:
1412 1411 # Not the format we expect; leave it alone
1413 1412 pass
1414 1413 else:
1415 1414 # Stuff in the right filename
1416 1415 try:
1417 1416 # Assume SyntaxError is a class exception
1418 1417 value = SyntaxError(msg, (filename, lineno, offset, line))
1419 1418 except:
1420 1419 # If that failed, assume SyntaxError is a string
1421 1420 value = msg, (filename, lineno, offset, line)
1422 1421 self.SyntaxTB(etype,value,[])
1423 1422
1424 1423 def debugger(self,force=False):
1425 1424 """Call the pydb/pdb debugger.
1426 1425
1427 1426 Keywords:
1428 1427
1429 1428 - force(False): by default, this routine checks the instance call_pdb
1430 1429 flag and does not actually invoke the debugger if the flag is false.
1431 1430 The 'force' option forces the debugger to activate even if the flag
1432 1431 is false.
1433 1432 """
1434 1433
1435 1434 if not (force or self.call_pdb):
1436 1435 return
1437 1436
1438 1437 if not hasattr(sys,'last_traceback'):
1439 1438 error('No traceback has been produced, nothing to debug.')
1440 1439 return
1441 1440
1442 1441 have_pydb = False
1443 1442 # use pydb if available
1444 1443 try:
1445 1444 from pydb import pm
1446 1445 have_pydb = True
1447 1446 except ImportError:
1448 1447 pass
1449 1448 if not have_pydb:
1450 1449 # fallback to our internal debugger
1451 1450 pm = lambda : self.InteractiveTB.debugger(force=True)
1452 1451 self.history_saving_wrapper(pm)()
1453 1452
1454 1453 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1455 1454 """Display the exception that just occurred.
1456 1455
1457 1456 If nothing is known about the exception, this is the method which
1458 1457 should be used throughout the code for presenting user tracebacks,
1459 1458 rather than directly invoking the InteractiveTB object.
1460 1459
1461 1460 A specific showsyntaxerror() also exists, but this method can take
1462 1461 care of calling it if needed, so unless you are explicitly catching a
1463 1462 SyntaxError exception, don't try to analyze the stack manually and
1464 1463 simply call this method."""
1465 1464
1466 1465 # Though this won't be called by syntax errors in the input line,
1467 1466 # there may be SyntaxError cases whith imported code.
1468 1467 if exc_tuple is None:
1469 1468 etype, value, tb = sys.exc_info()
1470 1469 else:
1471 1470 etype, value, tb = exc_tuple
1472 1471
1473 1472 if etype is SyntaxError:
1474 1473 self.showsyntaxerror(filename)
1475 1474 else:
1476 1475 # WARNING: these variables are somewhat deprecated and not
1477 1476 # necessarily safe to use in a threaded environment, but tools
1478 1477 # like pdb depend on their existence, so let's set them. If we
1479 1478 # find problems in the field, we'll need to revisit their use.
1480 1479 sys.last_type = etype
1481 1480 sys.last_value = value
1482 1481 sys.last_traceback = tb
1483 1482
1484 1483 if etype in self.custom_exceptions:
1485 1484 self.CustomTB(etype,value,tb)
1486 1485 else:
1487 1486 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1488 1487 if self.InteractiveTB.call_pdb and self.has_readline:
1489 1488 # pdb mucks up readline, fix it back
1490 1489 self.readline.set_completer(self.Completer.complete)
1491 1490
1492 1491 def mainloop(self,banner=None):
1493 1492 """Creates the local namespace and starts the mainloop.
1494 1493
1495 1494 If an optional banner argument is given, it will override the
1496 1495 internally created default banner."""
1497 1496
1498 1497 if self.rc.c: # Emulate Python's -c option
1499 1498 self.exec_init_cmd()
1500 1499 if banner is None:
1501 1500 if not self.rc.banner:
1502 1501 banner = ''
1503 1502 # banner is string? Use it directly!
1504 1503 elif isinstance(self.rc.banner,basestring):
1505 1504 banner = self.rc.banner
1506 1505 else:
1507 1506 banner = self.BANNER+self.banner2
1508 1507
1509 1508 self.interact(banner)
1510 1509
1511 1510 def exec_init_cmd(self):
1512 1511 """Execute a command given at the command line.
1513 1512
1514 1513 This emulates Python's -c option."""
1515 1514
1516 1515 #sys.argv = ['-c']
1517 1516 self.push(self.rc.c)
1518 1517
1519 1518 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1520 1519 """Embeds IPython into a running python program.
1521 1520
1522 1521 Input:
1523 1522
1524 1523 - header: An optional header message can be specified.
1525 1524
1526 1525 - local_ns, global_ns: working namespaces. If given as None, the
1527 1526 IPython-initialized one is updated with __main__.__dict__, so that
1528 1527 program variables become visible but user-specific configuration
1529 1528 remains possible.
1530 1529
1531 1530 - stack_depth: specifies how many levels in the stack to go to
1532 1531 looking for namespaces (when local_ns and global_ns are None). This
1533 1532 allows an intermediate caller to make sure that this function gets
1534 1533 the namespace from the intended level in the stack. By default (0)
1535 1534 it will get its locals and globals from the immediate caller.
1536 1535
1537 1536 Warning: it's possible to use this in a program which is being run by
1538 1537 IPython itself (via %run), but some funny things will happen (a few
1539 1538 globals get overwritten). In the future this will be cleaned up, as
1540 1539 there is no fundamental reason why it can't work perfectly."""
1541 1540
1542 1541 # Get locals and globals from caller
1543 1542 if local_ns is None or global_ns is None:
1544 1543 call_frame = sys._getframe(stack_depth).f_back
1545 1544
1546 1545 if local_ns is None:
1547 1546 local_ns = call_frame.f_locals
1548 1547 if global_ns is None:
1549 1548 global_ns = call_frame.f_globals
1550 1549
1551 1550 # Update namespaces and fire up interpreter
1552 1551
1553 1552 # The global one is easy, we can just throw it in
1554 1553 self.user_global_ns = global_ns
1555 1554
1556 1555 # but the user/local one is tricky: ipython needs it to store internal
1557 1556 # data, but we also need the locals. We'll copy locals in the user
1558 1557 # one, but will track what got copied so we can delete them at exit.
1559 1558 # This is so that a later embedded call doesn't see locals from a
1560 1559 # previous call (which most likely existed in a separate scope).
1561 1560 local_varnames = local_ns.keys()
1562 1561 self.user_ns.update(local_ns)
1563 1562
1564 1563 # Patch for global embedding to make sure that things don't overwrite
1565 1564 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1566 1565 # FIXME. Test this a bit more carefully (the if.. is new)
1567 1566 if local_ns is None and global_ns is None:
1568 1567 self.user_global_ns.update(__main__.__dict__)
1569 1568
1570 1569 # make sure the tab-completer has the correct frame information, so it
1571 1570 # actually completes using the frame's locals/globals
1572 1571 self.set_completer_frame()
1573 1572
1574 1573 # before activating the interactive mode, we need to make sure that
1575 1574 # all names in the builtin namespace needed by ipython point to
1576 1575 # ourselves, and not to other instances.
1577 1576 self.add_builtins()
1578 1577
1579 1578 self.interact(header)
1580 1579
1581 1580 # now, purge out the user namespace from anything we might have added
1582 1581 # from the caller's local namespace
1583 1582 delvar = self.user_ns.pop
1584 1583 for var in local_varnames:
1585 1584 delvar(var,None)
1586 1585 # and clean builtins we may have overridden
1587 1586 self.clean_builtins()
1588 1587
1589 1588 def interact(self, banner=None):
1590 1589 """Closely emulate the interactive Python console.
1591 1590
1592 1591 The optional banner argument specify the banner to print
1593 1592 before the first interaction; by default it prints a banner
1594 1593 similar to the one printed by the real Python interpreter,
1595 1594 followed by the current class name in parentheses (so as not
1596 1595 to confuse this with the real interpreter -- since it's so
1597 1596 close!).
1598 1597
1599 1598 """
1600 1599
1601 1600 if self.exit_now:
1602 1601 # batch run -> do not interact
1603 1602 return
1604 1603 cprt = 'Type "copyright", "credits" or "license" for more information.'
1605 1604 if banner is None:
1606 1605 self.write("Python %s on %s\n%s\n(%s)\n" %
1607 1606 (sys.version, sys.platform, cprt,
1608 1607 self.__class__.__name__))
1609 1608 else:
1610 1609 self.write(banner)
1611 1610
1612 1611 more = 0
1613 1612
1614 1613 # Mark activity in the builtins
1615 1614 __builtin__.__dict__['__IPYTHON__active'] += 1
1616 1615
1617 1616 # exit_now is set by a call to %Exit or %Quit
1618 1617 while not self.exit_now:
1619 1618 if more:
1620 1619 prompt = self.hooks.generate_prompt(True)
1621 1620 if self.autoindent:
1622 1621 self.readline_startup_hook(self.pre_readline)
1623 1622 else:
1624 1623 prompt = self.hooks.generate_prompt(False)
1625 1624 try:
1626 1625 line = self.raw_input(prompt,more)
1627 1626 if self.exit_now:
1628 1627 # quick exit on sys.std[in|out] close
1629 1628 break
1630 1629 if self.autoindent:
1631 1630 self.readline_startup_hook(None)
1632 1631 except KeyboardInterrupt:
1633 1632 self.write('\nKeyboardInterrupt\n')
1634 1633 self.resetbuffer()
1635 1634 # keep cache in sync with the prompt counter:
1636 1635 self.outputcache.prompt_count -= 1
1637 1636
1638 1637 if self.autoindent:
1639 1638 self.indent_current_nsp = 0
1640 1639 more = 0
1641 1640 except EOFError:
1642 1641 if self.autoindent:
1643 1642 self.readline_startup_hook(None)
1644 1643 self.write('\n')
1645 1644 self.exit()
1646 1645 except bdb.BdbQuit:
1647 1646 warn('The Python debugger has exited with a BdbQuit exception.\n'
1648 1647 'Because of how pdb handles the stack, it is impossible\n'
1649 1648 'for IPython to properly format this particular exception.\n'
1650 1649 'IPython will resume normal operation.')
1651 1650 except:
1652 1651 # exceptions here are VERY RARE, but they can be triggered
1653 1652 # asynchronously by signal handlers, for example.
1654 1653 self.showtraceback()
1655 1654 else:
1656 1655 more = self.push(line)
1657 1656 if (self.SyntaxTB.last_syntax_error and
1658 1657 self.rc.autoedit_syntax):
1659 1658 self.edit_syntax_error()
1660 1659
1661 1660 # We are off again...
1662 1661 __builtin__.__dict__['__IPYTHON__active'] -= 1
1663 1662
1664 1663 def excepthook(self, etype, value, tb):
1665 1664 """One more defense for GUI apps that call sys.excepthook.
1666 1665
1667 1666 GUI frameworks like wxPython trap exceptions and call
1668 1667 sys.excepthook themselves. I guess this is a feature that
1669 1668 enables them to keep running after exceptions that would
1670 1669 otherwise kill their mainloop. This is a bother for IPython
1671 1670 which excepts to catch all of the program exceptions with a try:
1672 1671 except: statement.
1673 1672
1674 1673 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1675 1674 any app directly invokes sys.excepthook, it will look to the user like
1676 1675 IPython crashed. In order to work around this, we can disable the
1677 1676 CrashHandler and replace it with this excepthook instead, which prints a
1678 1677 regular traceback using our InteractiveTB. In this fashion, apps which
1679 1678 call sys.excepthook will generate a regular-looking exception from
1680 1679 IPython, and the CrashHandler will only be triggered by real IPython
1681 1680 crashes.
1682 1681
1683 1682 This hook should be used sparingly, only in places which are not likely
1684 1683 to be true IPython errors.
1685 1684 """
1686 1685 self.showtraceback((etype,value,tb),tb_offset=0)
1687 1686
1688 1687 def expand_aliases(self,fn,rest):
1689 1688 """ Expand multiple levels of aliases:
1690 1689
1691 1690 if:
1692 1691
1693 1692 alias foo bar /tmp
1694 1693 alias baz foo
1695 1694
1696 1695 then:
1697 1696
1698 1697 baz huhhahhei -> bar /tmp huhhahhei
1699 1698
1700 1699 """
1701 1700 line = fn + " " + rest
1702 1701
1703 1702 done = Set()
1704 1703 while 1:
1705 1704 pre,fn,rest = self.split_user_input(line)
1706 1705 if fn in self.alias_table:
1707 1706 if fn in done:
1708 1707 warn("Cyclic alias definition, repeated '%s'" % fn)
1709 1708 return ""
1710 1709 done.add(fn)
1711 1710
1712 1711 l2 = self.transform_alias(fn,rest)
1713 1712 # dir -> dir
1714 1713 # print "alias",line, "->",l2 #dbg
1715 1714 if l2 == line:
1716 1715 break
1717 1716 # ls -> ls -F should not recurse forever
1718 1717 if l2.split(None,1)[0] == line.split(None,1)[0]:
1719 1718 line = l2
1720 1719 break
1721 1720
1722 1721 line=l2
1723 1722
1724 1723
1725 1724 # print "al expand to",line #dbg
1726 1725 else:
1727 1726 break
1728 1727
1729 1728 return line
1730 1729
1731 1730 def transform_alias(self, alias,rest=''):
1732 1731 """ Transform alias to system command string.
1733 1732 """
1734 1733 nargs,cmd = self.alias_table[alias]
1735 1734 if ' ' in cmd and os.path.isfile(cmd):
1736 1735 cmd = '"%s"' % cmd
1737 1736
1738 1737 # Expand the %l special to be the user's input line
1739 1738 if cmd.find('%l') >= 0:
1740 1739 cmd = cmd.replace('%l',rest)
1741 1740 rest = ''
1742 1741 if nargs==0:
1743 1742 # Simple, argument-less aliases
1744 1743 cmd = '%s %s' % (cmd,rest)
1745 1744 else:
1746 1745 # Handle aliases with positional arguments
1747 1746 args = rest.split(None,nargs)
1748 1747 if len(args)< nargs:
1749 1748 error('Alias <%s> requires %s arguments, %s given.' %
1750 1749 (alias,nargs,len(args)))
1751 1750 return None
1752 1751 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1753 1752 # Now call the macro, evaluating in the user's namespace
1754 1753 #print 'new command: <%r>' % cmd # dbg
1755 1754 return cmd
1756 1755
1757 1756 def call_alias(self,alias,rest=''):
1758 1757 """Call an alias given its name and the rest of the line.
1759 1758
1760 1759 This is only used to provide backwards compatibility for users of
1761 1760 ipalias(), use of which is not recommended for anymore."""
1762 1761
1763 1762 # Now call the macro, evaluating in the user's namespace
1764 1763 cmd = self.transform_alias(alias, rest)
1765 1764 try:
1766 1765 self.system(cmd)
1767 1766 except:
1768 1767 self.showtraceback()
1769 1768
1770 1769 def indent_current_str(self):
1771 1770 """return the current level of indentation as a string"""
1772 1771 return self.indent_current_nsp * ' '
1773 1772
1774 1773 def autoindent_update(self,line):
1775 1774 """Keep track of the indent level."""
1776 1775
1777 1776 #debugx('line')
1778 1777 #debugx('self.indent_current_nsp')
1779 1778 if self.autoindent:
1780 1779 if line:
1781 1780 inisp = num_ini_spaces(line)
1782 1781 if inisp < self.indent_current_nsp:
1783 1782 self.indent_current_nsp = inisp
1784 1783
1785 1784 if line[-1] == ':':
1786 1785 self.indent_current_nsp += 4
1787 1786 elif dedent_re.match(line):
1788 1787 self.indent_current_nsp -= 4
1789 1788 else:
1790 1789 self.indent_current_nsp = 0
1791 1790
1792 1791 def runlines(self,lines):
1793 1792 """Run a string of one or more lines of source.
1794 1793
1795 1794 This method is capable of running a string containing multiple source
1796 1795 lines, as if they had been entered at the IPython prompt. Since it
1797 1796 exposes IPython's processing machinery, the given strings can contain
1798 1797 magic calls (%magic), special shell access (!cmd), etc."""
1799 1798
1800 1799 # We must start with a clean buffer, in case this is run from an
1801 1800 # interactive IPython session (via a magic, for example).
1802 1801 self.resetbuffer()
1803 1802 lines = lines.split('\n')
1804 1803 more = 0
1805 1804 for line in lines:
1806 1805 # skip blank lines so we don't mess up the prompt counter, but do
1807 1806 # NOT skip even a blank line if we are in a code block (more is
1808 1807 # true)
1809 1808 if line or more:
1810 1809 more = self.push(self.prefilter(line,more))
1811 1810 # IPython's runsource returns None if there was an error
1812 1811 # compiling the code. This allows us to stop processing right
1813 1812 # away, so the user gets the error message at the right place.
1814 1813 if more is None:
1815 1814 break
1816 1815 # final newline in case the input didn't have it, so that the code
1817 1816 # actually does get executed
1818 1817 if more:
1819 1818 self.push('\n')
1820 1819
1821 1820 def runsource(self, source, filename='<input>', symbol='single'):
1822 1821 """Compile and run some source in the interpreter.
1823 1822
1824 1823 Arguments are as for compile_command().
1825 1824
1826 1825 One several things can happen:
1827 1826
1828 1827 1) The input is incorrect; compile_command() raised an
1829 1828 exception (SyntaxError or OverflowError). A syntax traceback
1830 1829 will be printed by calling the showsyntaxerror() method.
1831 1830
1832 1831 2) The input is incomplete, and more input is required;
1833 1832 compile_command() returned None. Nothing happens.
1834 1833
1835 1834 3) The input is complete; compile_command() returned a code
1836 1835 object. The code is executed by calling self.runcode() (which
1837 1836 also handles run-time exceptions, except for SystemExit).
1838 1837
1839 1838 The return value is:
1840 1839
1841 1840 - True in case 2
1842 1841
1843 1842 - False in the other cases, unless an exception is raised, where
1844 1843 None is returned instead. This can be used by external callers to
1845 1844 know whether to continue feeding input or not.
1846 1845
1847 1846 The return value can be used to decide whether to use sys.ps1 or
1848 1847 sys.ps2 to prompt the next line."""
1849 1848
1850 1849 # if the source code has leading blanks, add 'if 1:\n' to it
1851 1850 # this allows execution of indented pasted code. It is tempting
1852 1851 # to add '\n' at the end of source to run commands like ' a=1'
1853 1852 # directly, but this fails for more complicated scenarios
1854 1853 if source[:1] in [' ', '\t']:
1855 1854 source = 'if 1:\n%s' % source
1856 1855
1857 1856 try:
1858 1857 code = self.compile(source,filename,symbol)
1859 1858 except (OverflowError, SyntaxError, ValueError):
1860 1859 # Case 1
1861 1860 self.showsyntaxerror(filename)
1862 1861 return None
1863 1862
1864 1863 if code is None:
1865 1864 # Case 2
1866 1865 return True
1867 1866
1868 1867 # Case 3
1869 1868 # We store the code object so that threaded shells and
1870 1869 # custom exception handlers can access all this info if needed.
1871 1870 # The source corresponding to this can be obtained from the
1872 1871 # buffer attribute as '\n'.join(self.buffer).
1873 1872 self.code_to_run = code
1874 1873 # now actually execute the code object
1875 1874 if self.runcode(code) == 0:
1876 1875 return False
1877 1876 else:
1878 1877 return None
1879 1878
1880 1879 def runcode(self,code_obj):
1881 1880 """Execute a code object.
1882 1881
1883 1882 When an exception occurs, self.showtraceback() is called to display a
1884 1883 traceback.
1885 1884
1886 1885 Return value: a flag indicating whether the code to be run completed
1887 1886 successfully:
1888 1887
1889 1888 - 0: successful execution.
1890 1889 - 1: an error occurred.
1891 1890 """
1892 1891
1893 1892 # Set our own excepthook in case the user code tries to call it
1894 1893 # directly, so that the IPython crash handler doesn't get triggered
1895 1894 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1896 1895
1897 1896 # we save the original sys.excepthook in the instance, in case config
1898 1897 # code (such as magics) needs access to it.
1899 1898 self.sys_excepthook = old_excepthook
1900 1899 outflag = 1 # happens in more places, so it's easier as default
1901 1900 try:
1902 1901 try:
1903 1902 # Embedded instances require separate global/local namespaces
1904 1903 # so they can see both the surrounding (local) namespace and
1905 1904 # the module-level globals when called inside another function.
1906 1905 if self.embedded:
1907 1906 exec code_obj in self.user_global_ns, self.user_ns
1908 1907 # Normal (non-embedded) instances should only have a single
1909 1908 # namespace for user code execution, otherwise functions won't
1910 1909 # see interactive top-level globals.
1911 1910 else:
1912 1911 exec code_obj in self.user_ns
1913 1912 finally:
1914 1913 # Reset our crash handler in place
1915 1914 sys.excepthook = old_excepthook
1916 1915 except SystemExit:
1917 1916 self.resetbuffer()
1918 1917 self.showtraceback()
1919 1918 warn("Type %exit or %quit to exit IPython "
1920 1919 "(%Exit or %Quit do so unconditionally).",level=1)
1921 1920 except self.custom_exceptions:
1922 1921 etype,value,tb = sys.exc_info()
1923 1922 self.CustomTB(etype,value,tb)
1924 1923 except:
1925 1924 self.showtraceback()
1926 1925 else:
1927 1926 outflag = 0
1928 1927 if softspace(sys.stdout, 0):
1929 1928 print
1930 1929 # Flush out code object which has been run (and source)
1931 1930 self.code_to_run = None
1932 1931 return outflag
1933 1932
1934 1933 def push(self, line):
1935 1934 """Push a line to the interpreter.
1936 1935
1937 1936 The line should not have a trailing newline; it may have
1938 1937 internal newlines. The line is appended to a buffer and the
1939 1938 interpreter's runsource() method is called with the
1940 1939 concatenated contents of the buffer as source. If this
1941 1940 indicates that the command was executed or invalid, the buffer
1942 1941 is reset; otherwise, the command is incomplete, and the buffer
1943 1942 is left as it was after the line was appended. The return
1944 1943 value is 1 if more input is required, 0 if the line was dealt
1945 1944 with in some way (this is the same as runsource()).
1946 1945 """
1947 1946
1948 1947 # autoindent management should be done here, and not in the
1949 1948 # interactive loop, since that one is only seen by keyboard input. We
1950 1949 # need this done correctly even for code run via runlines (which uses
1951 1950 # push).
1952 1951
1953 1952 #print 'push line: <%s>' % line # dbg
1954 1953 for subline in line.splitlines():
1955 1954 self.autoindent_update(subline)
1956 1955 self.buffer.append(line)
1957 1956 more = self.runsource('\n'.join(self.buffer), self.filename)
1958 1957 if not more:
1959 1958 self.resetbuffer()
1960 1959 return more
1961 1960
1962 1961 def resetbuffer(self):
1963 1962 """Reset the input buffer."""
1964 1963 self.buffer[:] = []
1965 1964
1966 1965 def raw_input(self,prompt='',continue_prompt=False):
1967 1966 """Write a prompt and read a line.
1968 1967
1969 1968 The returned line does not include the trailing newline.
1970 1969 When the user enters the EOF key sequence, EOFError is raised.
1971 1970
1972 1971 Optional inputs:
1973 1972
1974 1973 - prompt(''): a string to be printed to prompt the user.
1975 1974
1976 1975 - continue_prompt(False): whether this line is the first one or a
1977 1976 continuation in a sequence of inputs.
1978 1977 """
1979 1978
1980 1979 try:
1981 1980 line = raw_input_original(prompt)
1982 1981 except ValueError:
1983 1982 warn("\n********\nYou or a %run:ed script called sys.stdin.close() or sys.stdout.close()!\nExiting IPython!")
1984 1983 self.exit_now = True
1985 1984 return ""
1986 1985
1987 1986
1988 1987 # Try to be reasonably smart about not re-indenting pasted input more
1989 1988 # than necessary. We do this by trimming out the auto-indent initial
1990 1989 # spaces, if the user's actual input started itself with whitespace.
1991 1990 #debugx('self.buffer[-1]')
1992 1991
1993 1992 if self.autoindent:
1994 1993 if num_ini_spaces(line) > self.indent_current_nsp:
1995 1994 line = line[self.indent_current_nsp:]
1996 1995 self.indent_current_nsp = 0
1997 1996
1998 1997 # store the unfiltered input before the user has any chance to modify
1999 1998 # it.
2000 1999 if line.strip():
2001 2000 if continue_prompt:
2002 2001 self.input_hist_raw[-1] += '%s\n' % line
2003 2002 if self.has_readline: # and some config option is set?
2004 2003 try:
2005 2004 histlen = self.readline.get_current_history_length()
2006 2005 newhist = self.input_hist_raw[-1].rstrip()
2007 2006 self.readline.remove_history_item(histlen-1)
2008 2007 self.readline.replace_history_item(histlen-2,newhist)
2009 2008 except AttributeError:
2010 2009 pass # re{move,place}_history_item are new in 2.4.
2011 2010 else:
2012 2011 self.input_hist_raw.append('%s\n' % line)
2013 2012
2014 2013 try:
2015 2014 lineout = self.prefilter(line,continue_prompt)
2016 2015 except:
2017 2016 # blanket except, in case a user-defined prefilter crashes, so it
2018 2017 # can't take all of ipython with it.
2019 2018 self.showtraceback()
2020 2019 return ''
2021 2020 else:
2022 2021 return lineout
2023 2022
2024 2023 def split_user_input(self,line):
2025 2024 """Split user input into pre-char, function part and rest."""
2026 2025
2027 2026 lsplit = self.line_split.match(line)
2028 2027 if lsplit is None: # no regexp match returns None
2028 #print "match failed for line '%s'" % line # dbg
2029 2029 try:
2030 2030 iFun,theRest = line.split(None,1)
2031 2031 except ValueError:
2032 #print "split failed for line '%s'" % line # dbg
2032 2033 iFun,theRest = line,''
2033 2034 pre = re.match('^(\s*)(.*)',line).groups()[0]
2034 2035 else:
2035 2036 pre,iFun,theRest = lsplit.groups()
2036 2037
2037 2038 #print 'line:<%s>' % line # dbg
2038 2039 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2039 2040 return pre,iFun.strip(),theRest
2040 2041
2041
2042 def split_user_inputTMP(self,line):
2042 # THIS VERSION IS BROKEN!!! It was intended to prevent spurious attribute
2043 # accesses with a more stringent check of inputs, but it introduced other
2044 # bugs. Disable it for now until I can properly fix it.
2045 def split_user_inputBROKEN(self,line):
2043 2046 """Split user input into pre-char, function part and rest."""
2044 2047
2045 2048 lsplit = self.line_split.match(line)
2046 2049 if lsplit is None: # no regexp match returns None
2047 2050 lsplit = self.line_split_fallback.match(line)
2048 2051
2049 2052 #pre,iFun,theRest = lsplit.groups() # dbg
2050 2053 #print 'line:<%s>' % line # dbg
2051 2054 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2052 2055 #return pre,iFun.strip(),theRest # dbg
2053 2056
2054 2057 return lsplit.groups()
2055 2058
2056 2059 def _prefilter(self, line, continue_prompt):
2057 2060 """Calls different preprocessors, depending on the form of line."""
2058 2061
2059 2062 # All handlers *must* return a value, even if it's blank ('').
2060 2063
2061 2064 # Lines are NOT logged here. Handlers should process the line as
2062 2065 # needed, update the cache AND log it (so that the input cache array
2063 2066 # stays synced).
2064 2067
2065 2068 # This function is _very_ delicate, and since it's also the one which
2066 2069 # determines IPython's response to user input, it must be as efficient
2067 2070 # as possible. For this reason it has _many_ returns in it, trying
2068 2071 # always to exit as quickly as it can figure out what it needs to do.
2069 2072
2070 2073 # This function is the main responsible for maintaining IPython's
2071 2074 # behavior respectful of Python's semantics. So be _very_ careful if
2072 2075 # making changes to anything here.
2073 2076
2074 2077 #.....................................................................
2075 2078 # Code begins
2076 2079
2077 2080 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2078 2081
2079 2082 # save the line away in case we crash, so the post-mortem handler can
2080 2083 # record it
2081 2084 self._last_input_line = line
2082 2085
2083 2086 #print '***line: <%s>' % line # dbg
2084 2087
2085 2088 # the input history needs to track even empty lines
2086 2089 stripped = line.strip()
2087 2090
2088 2091 if not stripped:
2089 2092 if not continue_prompt:
2090 2093 self.outputcache.prompt_count -= 1
2091 2094 return self.handle_normal(line,continue_prompt)
2092 2095 #return self.handle_normal('',continue_prompt)
2093 2096
2094 2097 # print '***cont',continue_prompt # dbg
2095 2098 # special handlers are only allowed for single line statements
2096 2099 if continue_prompt and not self.rc.multi_line_specials:
2097 2100 return self.handle_normal(line,continue_prompt)
2098 2101
2099 2102
2100 2103 # For the rest, we need the structure of the input
2101 2104 pre,iFun,theRest = self.split_user_input(line)
2102 2105
2103 2106 # See whether any pre-existing handler can take care of it
2104 2107
2105 2108 rewritten = self.hooks.input_prefilter(stripped)
2106 2109 if rewritten != stripped: # ok, some prefilter did something
2107 2110 rewritten = pre + rewritten # add indentation
2108 2111 return self.handle_normal(rewritten)
2109 2112
2110 2113 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2111 2114
2112 2115 # First check for explicit escapes in the last/first character
2113 2116 handler = None
2114 2117 if line[-1] == self.ESC_HELP:
2115 2118 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
2116 2119 if handler is None:
2117 2120 # look at the first character of iFun, NOT of line, so we skip
2118 2121 # leading whitespace in multiline input
2119 2122 handler = self.esc_handlers.get(iFun[0:1])
2120 2123 if handler is not None:
2121 2124 return handler(line,continue_prompt,pre,iFun,theRest)
2122 2125 # Emacs ipython-mode tags certain input lines
2123 2126 if line.endswith('# PYTHON-MODE'):
2124 2127 return self.handle_emacs(line,continue_prompt)
2125 2128
2126 2129 # Next, check if we can automatically execute this thing
2127 2130
2128 2131 # Allow ! in multi-line statements if multi_line_specials is on:
2129 2132 if continue_prompt and self.rc.multi_line_specials and \
2130 2133 iFun.startswith(self.ESC_SHELL):
2131 2134 return self.handle_shell_escape(line,continue_prompt,
2132 2135 pre=pre,iFun=iFun,
2133 2136 theRest=theRest)
2134 2137
2135 2138 # Let's try to find if the input line is a magic fn
2136 2139 oinfo = None
2137 2140 if hasattr(self,'magic_'+iFun):
2138 2141 # WARNING: _ofind uses getattr(), so it can consume generators and
2139 2142 # cause other side effects.
2140 2143 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2141 2144 if oinfo['ismagic']:
2142 2145 # Be careful not to call magics when a variable assignment is
2143 2146 # being made (ls='hi', for example)
2144 2147 if self.rc.automagic and \
2145 2148 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
2146 2149 (self.rc.multi_line_specials or not continue_prompt):
2147 2150 return self.handle_magic(line,continue_prompt,
2148 2151 pre,iFun,theRest)
2149 2152 else:
2150 2153 return self.handle_normal(line,continue_prompt)
2151 2154
2152 2155 # If the rest of the line begins with an (in)equality, assginment or
2153 2156 # function call, we should not call _ofind but simply execute it.
2154 2157 # This avoids spurious geattr() accesses on objects upon assignment.
2155 2158 #
2156 2159 # It also allows users to assign to either alias or magic names true
2157 2160 # python variables (the magic/alias systems always take second seat to
2158 2161 # true python code).
2159 2162 if theRest and theRest[0] in '!=()':
2160 2163 return self.handle_normal(line,continue_prompt)
2161 2164
2162 2165 if oinfo is None:
2163 2166 # let's try to ensure that _oinfo is ONLY called when autocall is
2164 2167 # on. Since it has inevitable potential side effects, at least
2165 2168 # having autocall off should be a guarantee to the user that no
2166 2169 # weird things will happen.
2167 2170
2168 2171 if self.rc.autocall:
2169 2172 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2170 2173 else:
2171 2174 # in this case, all that's left is either an alias or
2172 2175 # processing the line normally.
2173 2176 if iFun in self.alias_table:
2174 2177 # if autocall is off, by not running _ofind we won't know
2175 2178 # whether the given name may also exist in one of the
2176 2179 # user's namespace. At this point, it's best to do a
2177 2180 # quick check just to be sure that we don't let aliases
2178 2181 # shadow variables.
2179 2182 head = iFun.split('.',1)[0]
2180 2183 if head in self.user_ns or head in self.internal_ns \
2181 2184 or head in __builtin__.__dict__:
2182 2185 return self.handle_normal(line,continue_prompt)
2183 2186 else:
2184 2187 return self.handle_alias(line,continue_prompt,
2185 2188 pre,iFun,theRest)
2186 2189
2187 2190 else:
2188 2191 return self.handle_normal(line,continue_prompt)
2189 2192
2190 2193 if not oinfo['found']:
2191 2194 return self.handle_normal(line,continue_prompt)
2192 2195 else:
2193 2196 #print 'pre<%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2194 2197 if oinfo['isalias']:
2195 2198 return self.handle_alias(line,continue_prompt,
2196 2199 pre,iFun,theRest)
2197 2200
2198 2201 if (self.rc.autocall
2199 2202 and
2200 2203 (
2201 2204 #only consider exclusion re if not "," or ";" autoquoting
2202 2205 (pre == self.ESC_QUOTE or pre == self.ESC_QUOTE2
2203 2206 or pre == self.ESC_PAREN) or
2204 2207 (not self.re_exclude_auto.match(theRest)))
2205 2208 and
2206 2209 self.re_fun_name.match(iFun) and
2207 2210 callable(oinfo['obj'])) :
2208 2211 #print 'going auto' # dbg
2209 2212 return self.handle_auto(line,continue_prompt,
2210 2213 pre,iFun,theRest,oinfo['obj'])
2211 2214 else:
2212 2215 #print 'was callable?', callable(oinfo['obj']) # dbg
2213 2216 return self.handle_normal(line,continue_prompt)
2214 2217
2215 2218 # If we get here, we have a normal Python line. Log and return.
2216 2219 return self.handle_normal(line,continue_prompt)
2217 2220
2218 2221 def _prefilter_dumb(self, line, continue_prompt):
2219 2222 """simple prefilter function, for debugging"""
2220 2223 return self.handle_normal(line,continue_prompt)
2221 2224
2222 2225
2223 2226 def multiline_prefilter(self, line, continue_prompt):
2224 2227 """ Run _prefilter for each line of input
2225 2228
2226 2229 Covers cases where there are multiple lines in the user entry,
2227 2230 which is the case when the user goes back to a multiline history
2228 2231 entry and presses enter.
2229 2232
2230 2233 """
2231 2234 out = []
2232 2235 for l in line.rstrip('\n').split('\n'):
2233 2236 out.append(self._prefilter(l, continue_prompt))
2234 2237 return '\n'.join(out)
2235 2238
2236 2239 # Set the default prefilter() function (this can be user-overridden)
2237 2240 prefilter = multiline_prefilter
2238 2241
2239 2242 def handle_normal(self,line,continue_prompt=None,
2240 2243 pre=None,iFun=None,theRest=None):
2241 2244 """Handle normal input lines. Use as a template for handlers."""
2242 2245
2243 2246 # With autoindent on, we need some way to exit the input loop, and I
2244 2247 # don't want to force the user to have to backspace all the way to
2245 2248 # clear the line. The rule will be in this case, that either two
2246 2249 # lines of pure whitespace in a row, or a line of pure whitespace but
2247 2250 # of a size different to the indent level, will exit the input loop.
2248 2251
2249 2252 if (continue_prompt and self.autoindent and line.isspace() and
2250 2253 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2251 2254 (self.buffer[-1]).isspace() )):
2252 2255 line = ''
2253 2256
2254 2257 self.log(line,line,continue_prompt)
2255 2258 return line
2256 2259
2257 2260 def handle_alias(self,line,continue_prompt=None,
2258 2261 pre=None,iFun=None,theRest=None):
2259 2262 """Handle alias input lines. """
2260 2263
2261 2264 # pre is needed, because it carries the leading whitespace. Otherwise
2262 2265 # aliases won't work in indented sections.
2263 2266 transformed = self.expand_aliases(iFun, theRest)
2264 2267 line_out = '%s_ip.system(%s)' % (pre, make_quoted_expr( transformed ))
2265 2268 self.log(line,line_out,continue_prompt)
2266 2269 #print 'line out:',line_out # dbg
2267 2270 return line_out
2268 2271
2269 2272 def handle_shell_escape(self, line, continue_prompt=None,
2270 2273 pre=None,iFun=None,theRest=None):
2271 2274 """Execute the line in a shell, empty return value"""
2272 2275
2273 2276 #print 'line in :', `line` # dbg
2274 2277 # Example of a special handler. Others follow a similar pattern.
2275 2278 if line.lstrip().startswith('!!'):
2276 2279 # rewrite iFun/theRest to properly hold the call to %sx and
2277 2280 # the actual command to be executed, so handle_magic can work
2278 2281 # correctly
2279 2282 theRest = '%s %s' % (iFun[2:],theRest)
2280 2283 iFun = 'sx'
2281 2284 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
2282 2285 line.lstrip()[2:]),
2283 2286 continue_prompt,pre,iFun,theRest)
2284 2287 else:
2285 2288 cmd=line.lstrip().lstrip('!')
2286 2289 line_out = '%s_ip.system(%s)' % (pre,make_quoted_expr(cmd))
2287 2290 # update cache/log and return
2288 2291 self.log(line,line_out,continue_prompt)
2289 2292 return line_out
2290 2293
2291 2294 def handle_magic(self, line, continue_prompt=None,
2292 2295 pre=None,iFun=None,theRest=None):
2293 2296 """Execute magic functions."""
2294 2297
2295 2298
2296 2299 cmd = '%s_ip.magic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
2297 2300 self.log(line,cmd,continue_prompt)
2298 2301 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2299 2302 return cmd
2300 2303
2301 2304 def handle_auto(self, line, continue_prompt=None,
2302 2305 pre=None,iFun=None,theRest=None,obj=None):
2303 2306 """Hande lines which can be auto-executed, quoting if requested."""
2304 2307
2305 2308 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2306 2309
2307 2310 # This should only be active for single-line input!
2308 2311 if continue_prompt:
2309 2312 self.log(line,line,continue_prompt)
2310 2313 return line
2311 2314
2312 2315 auto_rewrite = True
2313 2316
2314 2317 if pre == self.ESC_QUOTE:
2315 2318 # Auto-quote splitting on whitespace
2316 2319 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2317 2320 elif pre == self.ESC_QUOTE2:
2318 2321 # Auto-quote whole string
2319 2322 newcmd = '%s("%s")' % (iFun,theRest)
2320 2323 elif pre == self.ESC_PAREN:
2321 2324 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2322 2325 else:
2323 2326 # Auto-paren.
2324 2327 # We only apply it to argument-less calls if the autocall
2325 2328 # parameter is set to 2. We only need to check that autocall is <
2326 2329 # 2, since this function isn't called unless it's at least 1.
2327 2330 if not theRest and (self.rc.autocall < 2):
2328 2331 newcmd = '%s %s' % (iFun,theRest)
2329 2332 auto_rewrite = False
2330 2333 else:
2331 2334 if theRest.startswith('['):
2332 2335 if hasattr(obj,'__getitem__'):
2333 2336 # Don't autocall in this case: item access for an object
2334 2337 # which is BOTH callable and implements __getitem__.
2335 2338 newcmd = '%s %s' % (iFun,theRest)
2336 2339 auto_rewrite = False
2337 2340 else:
2338 2341 # if the object doesn't support [] access, go ahead and
2339 2342 # autocall
2340 2343 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2341 2344 elif theRest.endswith(';'):
2342 2345 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2343 2346 else:
2344 2347 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2345 2348
2346 2349 if auto_rewrite:
2347 2350 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2348 2351 # log what is now valid Python, not the actual user input (without the
2349 2352 # final newline)
2350 2353 self.log(line,newcmd,continue_prompt)
2351 2354 return newcmd
2352 2355
2353 2356 def handle_help(self, line, continue_prompt=None,
2354 2357 pre=None,iFun=None,theRest=None):
2355 2358 """Try to get some help for the object.
2356 2359
2357 2360 obj? or ?obj -> basic information.
2358 2361 obj?? or ??obj -> more details.
2359 2362 """
2360 2363
2361 2364 # We need to make sure that we don't process lines which would be
2362 2365 # otherwise valid python, such as "x=1 # what?"
2363 2366 try:
2364 2367 codeop.compile_command(line)
2365 2368 except SyntaxError:
2366 2369 # We should only handle as help stuff which is NOT valid syntax
2367 2370 if line[0]==self.ESC_HELP:
2368 2371 line = line[1:]
2369 2372 elif line[-1]==self.ESC_HELP:
2370 2373 line = line[:-1]
2371 2374 self.log(line,'#?'+line,continue_prompt)
2372 2375 if line:
2373 2376 self.magic_pinfo(line)
2374 2377 else:
2375 2378 page(self.usage,screen_lines=self.rc.screen_length)
2376 2379 return '' # Empty string is needed here!
2377 2380 except:
2378 2381 # Pass any other exceptions through to the normal handler
2379 2382 return self.handle_normal(line,continue_prompt)
2380 2383 else:
2381 2384 # If the code compiles ok, we should handle it normally
2382 2385 return self.handle_normal(line,continue_prompt)
2383 2386
2384 2387 def getapi(self):
2385 2388 """ Get an IPApi object for this shell instance
2386 2389
2387 2390 Getting an IPApi object is always preferable to accessing the shell
2388 2391 directly, but this holds true especially for extensions.
2389 2392
2390 2393 It should always be possible to implement an extension with IPApi
2391 2394 alone. If not, contact maintainer to request an addition.
2392 2395
2393 2396 """
2394 2397 return self.api
2395 2398
2396 2399 def handle_emacs(self,line,continue_prompt=None,
2397 2400 pre=None,iFun=None,theRest=None):
2398 2401 """Handle input lines marked by python-mode."""
2399 2402
2400 2403 # Currently, nothing is done. Later more functionality can be added
2401 2404 # here if needed.
2402 2405
2403 2406 # The input cache shouldn't be updated
2404 2407
2405 2408 return line
2406 2409
2407 2410 def mktempfile(self,data=None):
2408 2411 """Make a new tempfile and return its filename.
2409 2412
2410 2413 This makes a call to tempfile.mktemp, but it registers the created
2411 2414 filename internally so ipython cleans it up at exit time.
2412 2415
2413 2416 Optional inputs:
2414 2417
2415 2418 - data(None): if data is given, it gets written out to the temp file
2416 2419 immediately, and the file is closed again."""
2417 2420
2418 2421 filename = tempfile.mktemp('.py','ipython_edit_')
2419 2422 self.tempfiles.append(filename)
2420 2423
2421 2424 if data:
2422 2425 tmp_file = open(filename,'w')
2423 2426 tmp_file.write(data)
2424 2427 tmp_file.close()
2425 2428 return filename
2426 2429
2427 2430 def write(self,data):
2428 2431 """Write a string to the default output"""
2429 2432 Term.cout.write(data)
2430 2433
2431 2434 def write_err(self,data):
2432 2435 """Write a string to the default error output"""
2433 2436 Term.cerr.write(data)
2434 2437
2435 2438 def exit(self):
2436 2439 """Handle interactive exit.
2437 2440
2438 2441 This method sets the exit_now attribute."""
2439 2442
2440 2443 if self.rc.confirm_exit:
2441 2444 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2442 2445 self.exit_now = True
2443 2446 else:
2444 2447 self.exit_now = True
2445 2448
2446 2449 def safe_execfile(self,fname,*where,**kw):
2447 2450 """A safe version of the builtin execfile().
2448 2451
2449 2452 This version will never throw an exception, and knows how to handle
2450 2453 ipython logs as well."""
2451 2454
2452 2455 def syspath_cleanup():
2453 2456 """Internal cleanup routine for sys.path."""
2454 2457 if add_dname:
2455 2458 try:
2456 2459 sys.path.remove(dname)
2457 2460 except ValueError:
2458 2461 # For some reason the user has already removed it, ignore.
2459 2462 pass
2460 2463
2461 2464 fname = os.path.expanduser(fname)
2462 2465
2463 2466 # Find things also in current directory. This is needed to mimic the
2464 2467 # behavior of running a script from the system command line, where
2465 2468 # Python inserts the script's directory into sys.path
2466 2469 dname = os.path.dirname(os.path.abspath(fname))
2467 2470 add_dname = False
2468 2471 if dname not in sys.path:
2469 2472 sys.path.insert(0,dname)
2470 2473 add_dname = True
2471 2474
2472 2475 try:
2473 2476 xfile = open(fname)
2474 2477 except:
2475 2478 print >> Term.cerr, \
2476 2479 'Could not open file <%s> for safe execution.' % fname
2477 2480 syspath_cleanup()
2478 2481 return None
2479 2482
2480 2483 kw.setdefault('islog',0)
2481 2484 kw.setdefault('quiet',1)
2482 2485 kw.setdefault('exit_ignore',0)
2483 2486 first = xfile.readline()
2484 2487 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2485 2488 xfile.close()
2486 2489 # line by line execution
2487 2490 if first.startswith(loghead) or kw['islog']:
2488 2491 print 'Loading log file <%s> one line at a time...' % fname
2489 2492 if kw['quiet']:
2490 2493 stdout_save = sys.stdout
2491 2494 sys.stdout = StringIO.StringIO()
2492 2495 try:
2493 2496 globs,locs = where[0:2]
2494 2497 except:
2495 2498 try:
2496 2499 globs = locs = where[0]
2497 2500 except:
2498 2501 globs = locs = globals()
2499 2502 badblocks = []
2500 2503
2501 2504 # we also need to identify indented blocks of code when replaying
2502 2505 # logs and put them together before passing them to an exec
2503 2506 # statement. This takes a bit of regexp and look-ahead work in the
2504 2507 # file. It's easiest if we swallow the whole thing in memory
2505 2508 # first, and manually walk through the lines list moving the
2506 2509 # counter ourselves.
2507 2510 indent_re = re.compile('\s+\S')
2508 2511 xfile = open(fname)
2509 2512 filelines = xfile.readlines()
2510 2513 xfile.close()
2511 2514 nlines = len(filelines)
2512 2515 lnum = 0
2513 2516 while lnum < nlines:
2514 2517 line = filelines[lnum]
2515 2518 lnum += 1
2516 2519 # don't re-insert logger status info into cache
2517 2520 if line.startswith('#log#'):
2518 2521 continue
2519 2522 else:
2520 2523 # build a block of code (maybe a single line) for execution
2521 2524 block = line
2522 2525 try:
2523 2526 next = filelines[lnum] # lnum has already incremented
2524 2527 except:
2525 2528 next = None
2526 2529 while next and indent_re.match(next):
2527 2530 block += next
2528 2531 lnum += 1
2529 2532 try:
2530 2533 next = filelines[lnum]
2531 2534 except:
2532 2535 next = None
2533 2536 # now execute the block of one or more lines
2534 2537 try:
2535 2538 exec block in globs,locs
2536 2539 except SystemExit:
2537 2540 pass
2538 2541 except:
2539 2542 badblocks.append(block.rstrip())
2540 2543 if kw['quiet']: # restore stdout
2541 2544 sys.stdout.close()
2542 2545 sys.stdout = stdout_save
2543 2546 print 'Finished replaying log file <%s>' % fname
2544 2547 if badblocks:
2545 2548 print >> sys.stderr, ('\nThe following lines/blocks in file '
2546 2549 '<%s> reported errors:' % fname)
2547 2550
2548 2551 for badline in badblocks:
2549 2552 print >> sys.stderr, badline
2550 2553 else: # regular file execution
2551 2554 try:
2552 2555 execfile(fname,*where)
2553 2556 except SyntaxError:
2554 2557 self.showsyntaxerror()
2555 2558 warn('Failure executing file: <%s>' % fname)
2556 2559 except SystemExit,status:
2557 2560 if not kw['exit_ignore']:
2558 2561 self.showtraceback()
2559 2562 warn('Failure executing file: <%s>' % fname)
2560 2563 except:
2561 2564 self.showtraceback()
2562 2565 warn('Failure executing file: <%s>' % fname)
2563 2566
2564 2567 syspath_cleanup()
2565 2568
2566 2569 #************************* end of file <iplib.py> *****************************
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,381 +1,383 b''
1 1 """
2 2 Test which prefilter transformations get called for various input lines.
3 3 Note that this does *not* test the transformations themselves -- it's just
4 4 verifying that a particular combination of, e.g. config options and escape
5 5 chars trigger the proper handle_X transform of the input line.
6 6
7 7 Usage: run from the command line with *normal* python, not ipython:
8 8 > python test_prefilter.py
9 9
10 10 Fairly quiet output by default. Pass in -v to get everyone's favorite dots.
11 11 """
12 12
13 13 # The prefilter always ends in a call to some self.handle_X method. We swap
14 14 # all of those out so that we can capture which one was called.
15 15
16 16 import sys
17 17 import IPython
18 18 import IPython.ipapi
19 19 import sys
20 20
21 21 verbose = False
22 22 if len(sys.argv) > 1:
23 23 if sys.argv[1] == '-v':
24 24 sys.argv = sys.argv[:-1] # IPython is confused by -v, apparently
25 25 verbose = True
26 26
27 27 IPython.Shell.start()
28 28
29 29 ip = IPython.ipapi.get()
30 30
31 31 # Collect failed tests + stats and print them at the end
32 32 failures = []
33 33 num_tests = 0
34 34
35 35 # Store the results in module vars as we go
36 36 last_line = None
37 37 handler_called = None
38 38 def install_mock_handler(name):
39 39 """Swap out one of the IP.handle_x methods with a function which can
40 40 record which handler was called and what line was produced. The mock
41 41 handler func always returns '', which causes ipython to cease handling
42 42 the string immediately. That way, that it doesn't echo output, raise
43 43 exceptions, etc. But do note that testing multiline strings thus gets
44 44 a bit hard."""
45 45 def mock_handler(self, line, continue_prompt=None,
46 46 pre=None,iFun=None,theRest=None,
47 47 obj=None):
48 48 #print "Inside %s with '%s'" % (name, line)
49 49 global last_line, handler_called
50 50 last_line = line
51 51 handler_called = name
52 52 return ''
53 53 mock_handler.name = name
54 54 setattr(IPython.iplib.InteractiveShell, name, mock_handler)
55 55
56 56 install_mock_handler('handle_normal')
57 57 install_mock_handler('handle_auto')
58 58 install_mock_handler('handle_magic')
59 59 install_mock_handler('handle_help')
60 60 install_mock_handler('handle_shell_escape')
61 61 install_mock_handler('handle_alias')
62 62 install_mock_handler('handle_emacs')
63 63
64 64
65 65 def reset_esc_handlers():
66 66 """The escape handlers are stored in a hash (as an attribute of the
67 67 InteractiveShell *instance*), so we have to rebuild that hash to get our
68 68 new handlers in there."""
69 69 s = ip.IP
70 70 s.esc_handlers = {s.ESC_PAREN : s.handle_auto,
71 71 s.ESC_QUOTE : s.handle_auto,
72 72 s.ESC_QUOTE2 : s.handle_auto,
73 73 s.ESC_MAGIC : s.handle_magic,
74 74 s.ESC_HELP : s.handle_help,
75 75 s.ESC_SHELL : s.handle_shell_escape,
76 76 }
77 77 reset_esc_handlers()
78 78
79 79 # This is so I don't have to quote over and over. Gotta be a better way.
80 80 handle_normal = 'handle_normal'
81 81 handle_auto = 'handle_auto'
82 82 handle_magic = 'handle_magic'
83 83 handle_help = 'handle_help'
84 84 handle_shell_escape = 'handle_shell_escape'
85 85 handle_alias = 'handle_alias'
86 86 handle_emacs = 'handle_emacs'
87 87
88 88 def check(assertion, failure_msg):
89 89 """Check a boolean assertion and fail with a message if necessary. Store
90 90 an error essage in module-level failures list in case of failure. Print
91 91 '.' or 'F' if module var Verbose is true.
92 92 """
93 93 global num_tests
94 94 num_tests += 1
95 95 if assertion:
96 96 if verbose:
97 97 sys.stdout.write('.')
98 98 sys.stdout.flush()
99 99 else:
100 100 if verbose:
101 101 sys.stdout.write('F')
102 102 sys.stdout.flush()
103 103 failures.append(failure_msg)
104 104
105 105
106 106 def check_handler(expected_handler, line):
107 107 """Verify that the expected hander was called (for the given line,
108 108 passed in for failure reporting).
109 109
110 110 Pulled out to its own function so that tests which don't use
111 111 run_handler_tests can still take advantage of it."""
112 112 check(handler_called == expected_handler,
113 113 "Expected %s to be called for %s, "
114 114 "instead %s called" % (expected_handler,
115 115 repr(line),
116 116 handler_called))
117 117
118 118
119 119 def run_handler_tests(h_tests):
120 120 """Loop through a series of (input_line, handler_name) pairs, verifying
121 121 that, for each ip calls the given handler for the given line.
122 122
123 123 The verbose complaint includes the line passed in, so if that line can
124 124 include enough info to find the error, the tests are modestly
125 125 self-documenting.
126 126 """
127 127 for ln, expected_handler in h_tests:
128 128 global handler_called
129 129 handler_called = None
130 130 ip.runlines(ln)
131 131 check_handler(expected_handler, ln)
132 132
133 133 def run_one_test(ln, expected_handler):
134 134 run_handler_tests([(ln, expected_handler)])
135 135
136 136
137 137 # =========================================
138 138 # Tests
139 139 # =========================================
140 140
141 141
142 142 # Fundamental escape characters + whitespace & misc
143 143 # =================================================
144 144 esc_handler_tests = [
145 145 ( '?thing', handle_help, ),
146 146 ( 'thing?', handle_help ), # '?' can trail...
147 147 ( 'thing!', handle_normal), # but only '?' can trail
148 148 ( '!thing?', handle_help), # trailing '?' wins if more than one
149 149 ( ' ?thing', handle_help), # ignore leading whitespace
150 150 ( '!ls', handle_shell_escape ),
151 151 ( '%magic', handle_magic),
152 152 # Possibly, add test for /,; once those are unhooked from %autocall
153 153 ( 'emacs_mode # PYTHON-MODE', handle_emacs ),
154 154 ( ' ', handle_normal),
155 155 ]
156 156 run_handler_tests(esc_handler_tests)
157 157
158 158
159 159
160 160 # Shell Escapes in Multi-line statements
161 161 # ======================================
162 162 #
163 163 # We can't test this via runlines, since the hacked over-handlers all
164 164 # return None, so continue_prompt never becomes true. Instead we drop
165 165 # into prefilter directly and pass in continue_prompt.
166 166
167 167 old_mls = ip.options.multi_line_specials
168 168 ln = '!ls $f multi_line_specials on'
169 169 ignore = ip.IP.prefilter(ln, continue_prompt=True)
170 170 check_handler(handle_shell_escape, ln)
171 171
172 172 ip.options.multi_line_specials = 0
173 173 ln = '!ls $f multi_line_specials off'
174 174 ignore = ip.IP.prefilter(ln, continue_prompt=True)
175 175 check_handler(handle_normal, ln)
176 176
177 177 ip.options.multi_line_specials = old_mls
178 178
179 179
180 180 # Automagic
181 181 # =========
182 182
183 183 # Pick one magic fun and one non_magic fun, make sure both exist
184 184 assert hasattr(ip.IP, "magic_cpaste")
185 185 assert not hasattr(ip.IP, "magic_does_not_exist")
186 186 ip.options.automagic = 0
187 187 run_handler_tests([
188 188 # Without automagic, only shows up with explicit escape
189 189 ( 'cpaste', handle_normal),
190 190 ( '%cpaste', handle_magic),
191 191 ( '%does_not_exist', handle_magic)
192 192 ])
193 193 ip.options.automagic = 1
194 194 run_handler_tests([
195 195 ( 'cpaste', handle_magic),
196 196 ( '%cpaste', handle_magic),
197 197 ( 'does_not_exist', handle_normal),
198 198 ( '%does_not_exist', handle_magic)])
199 199
200 200 # If next elt starts with anything that could be an assignment, func call,
201 201 # etc, we don't call the magic func, unless explicitly escaped to do so.
202 202 magic_killing_tests = []
203 203 for c in list('!=()<>,'):
204 204 magic_killing_tests.append(('cpaste %s killed_automagic' % c, handle_normal))
205 205 magic_killing_tests.append(('%%cpaste %s escaped_magic' % c, handle_magic))
206 206 run_handler_tests(magic_killing_tests)
207 207
208 208 # magic on indented continuation lines -- on iff multi_line_specials == 1
209 209 ip.options.multi_line_specials = 0
210 210 ln = 'cpaste multi_line off kills magic'
211 211 ignore = ip.IP.prefilter(ln, continue_prompt=True)
212 212 check_handler(handle_normal, ln)
213 213
214 214 ip.options.multi_line_specials = 1
215 215 ln = 'cpaste multi_line on enables magic'
216 216 ignore = ip.IP.prefilter(ln, continue_prompt=True)
217 217 check_handler(handle_magic, ln)
218 218
219 219 # user namespace shadows the magic one unless shell escaped
220 220 ip.user_ns['cpaste'] = 'user_ns'
221 221 run_handler_tests([
222 222 ( 'cpaste', handle_normal),
223 223 ( '%cpaste', handle_magic)])
224 224 del ip.user_ns['cpaste']
225 225
226 226
227 227 # Check for !=() turning off .ofind
228 228 # =================================
229 229 class AttributeMutator(object):
230 230 """A class which will be modified on attribute access, to test ofind"""
231 231 def __init__(self):
232 232 self.called = False
233 233
234 234 def getFoo(self): self.called = True
235 235 foo = property(getFoo)
236 236
237 237 attr_mutator = AttributeMutator()
238 238 ip.to_user_ns('attr_mutator')
239 239
240 240 ip.options.autocall = 1
241 241
242 242 run_one_test('attr_mutator.foo should mutate', handle_normal)
243 243 check(attr_mutator.called, 'ofind should be called in absence of assign characters')
244 244
245 245 for c in list('!=()'): # XXX What about <> -- they *are* important above
246 246 attr_mutator.called = False
247 247 run_one_test('attr_mutator.foo %s should *not* mutate' % c, handle_normal)
248 run_one_test('attr_mutator.foo%s should *not* mutate' % c, handle_normal)
249
248 250 check(not attr_mutator.called,
249 251 'ofind should not be called near character %s' % c)
250 252
251 253
252 254
253 255 # Alias expansion
254 256 # ===============
255 257
256 258 # With autocall on or off, aliases should be shadowed by user, internal and
257 259 # __builtin__ namespaces
258 260 #
259 261 # XXX Can aliases have '.' in their name? With autocall off, that works,
260 262 # with autocall on, it doesn't. Hmmm.
261 263 import __builtin__
262 264 for ac_state in [0,1]:
263 265 ip.options.autocall = ac_state
264 266 ip.IP.alias_table['alias_cmd'] = 'alias_result'
265 267 ip.IP.alias_table['alias_head.with_dot'] = 'alias_result'
266 268 run_handler_tests([
267 269 ("alias_cmd", handle_alias),
268 270 # XXX See note above
269 271 #("alias_head.with_dot unshadowed, autocall=%s" % ac_state, handle_alias),
270 272 ("alias_cmd.something aliases must match whole expr", handle_normal),
271 273 ])
272 274
273 275 for ns in [ip.user_ns, ip.IP.internal_ns, __builtin__.__dict__ ]:
274 276 ns['alias_cmd'] = 'a user value'
275 277 ns['alias_head'] = 'a user value'
276 278 run_handler_tests([
277 279 ("alias_cmd", handle_normal),
278 280 ("alias_head.with_dot", handle_normal)])
279 281 del ns['alias_cmd']
280 282 del ns['alias_head']
281 283
282 284 ip.options.autocall = 1
283 285
284 286
285 287
286 288
287 289 # Autocall
288 290 # ========
289 291
290 292 # First, with autocalling fully off
291 293 ip.options.autocall = 0
292 294 run_handler_tests( [
293 295 # Since len is callable, these *should* get auto-called
294 296
295 297 # XXX Except, at the moment, they're *not*, because the code is wrong
296 298 # XXX So I'm commenting 'em out to keep the tests quiet
297 299
298 300 #( '/len autocall_0', handle_auto),
299 301 #( ',len autocall_0 b0', handle_auto),
300 302 #( ';len autocall_0 b0', handle_auto),
301 303
302 304 # But these, since fun is not a callable, should *not* get auto-called
303 305 ( '/fun autocall_0', handle_normal),
304 306 ( ',fun autocall_0 b0', handle_normal),
305 307 ( ';fun autocall_0 b0', handle_normal),
306 308
307 309 # With no escapes, no autocalling should happen, callable or not
308 310 ( 'len autocall_0', handle_normal),
309 311 ( 'fun autocall_0', handle_normal),
310 312 ])
311 313
312 314
313 315 # Now, with autocall in default, 'smart' mode
314 316 ip.options.autocall = 1
315 317 run_handler_tests( [
316 318 # Since len is callable, these *do* get auto-called
317 319 ( '/len a1', handle_auto),
318 320 ( ',len a1 b1', handle_auto),
319 321 ( ';len a1 b1', handle_auto),
320 322 # But these, since fun is not a callable, should *not* get auto-called
321 323 ( '/fun a1', handle_normal),
322 324 ( ',fun a1 b1', handle_normal),
323 325 ( ';fun a1 b1', handle_normal),
324 326 # Autocalls without escapes
325 327 ( 'len a1', handle_auto),
326 328 ( 'fun a1', handle_normal), # Not callable -> no add
327 329 # Autocalls only happen on things which look like funcs, even if
328 330 # explicitly requested. Which, in this case means they look like a
329 331 # sequence of identifiers and . attribute references. So the second
330 332 # test should pass, but it's not at the moment (meaning, IPython is
331 333 # attempting to run an autocall). Though it does blow up in ipython
332 334 # later (because of how lines are split, I think).
333 335 ( '"abc".join range(4)', handle_normal),
334 336 # XXX ( '/"abc".join range(4)', handle_normal),
335 337 ])
336 338
337 339
338 340 # No tests for autocall = 2, since the extra magic there happens inside the
339 341 # handle_auto function, which our test doesn't examine.
340 342
341 343 # Note that we leave autocall in default, 1, 'smart' mode
342 344
343 345
344 346 # Autocall / Binary operators
345 347 # ==========================
346 348
347 349 # Even with autocall on, 'len in thing' won't transform.
348 350 # But ';len in thing' will
349 351
350 352 # Note, the tests below don't check for multi-char ops. It could.
351 353
352 354 # XXX % is a binary op and should be in the list, too, but fails
353 355 bin_ops = list(r'<>,&^|*/+-') + 'is not in and or'.split()
354 356 bin_tests = []
355 357 for b in bin_ops:
356 358 bin_tests.append(('len %s binop_autocall' % b, handle_normal))
357 359 bin_tests.append((';len %s binop_autocall' % b, handle_auto))
358 360 bin_tests.append((',len %s binop_autocall' % b, handle_auto))
359 361 bin_tests.append(('/len %s binop_autocall' % b, handle_auto))
360 362
361 363 # Who loves auto-generating tests?
362 364 run_handler_tests(bin_tests)
363 365
364 366
365 367 # Possibly add tests for namespace shadowing (really ofind's business?).
366 368 #
367 369 # user > ipython internal > python builtin > alias > magic
368 370
369 371
370 372 # ============
371 373 # Test Summary
372 374 # ============
373 375 num_f = len(failures)
374 376 if verbose:
375 377 print
376 378 print "%s tests run, %s failure%s" % (num_tests,
377 379 num_f,
378 380 num_f != 1 and "s" or "")
379 381 for f in failures:
380 382 print f
381 383
General Comments 0
You need to be logged in to leave comments. Login now