##// END OF EJS Templates
always use StringIO, never cStringIO...
MinRK -
Show More
@@ -0,0 +1,34 b''
1 """Test suite for our color utilities.
2
3 Authors
4 -------
5
6 * Min RK
7 """
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2011 The IPython Development Team
10 #
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING.txt, distributed as part of this software.
13 #-----------------------------------------------------------------------------
14
15 #-----------------------------------------------------------------------------
16 # Imports
17 #-----------------------------------------------------------------------------
18
19 # third party
20 import nose.tools as nt
21
22 # our own
23 from IPython.utils.PyColorize import Parser
24
25 #-----------------------------------------------------------------------------
26 # Test functions
27 #-----------------------------------------------------------------------------
28
29 def test_unicode_colorize():
30 p = Parser()
31 f1 = p.format('1/0', 'str')
32 f2 = p.format(u'1/0', 'str')
33 nt.assert_equals(f1, f2)
34
@@ -1,3579 +1,3579 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4
4
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2008-2009 The IPython Development Team
8 # Copyright (C) 2008-2009 The IPython Development Team
9
9
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 import __builtin__ as builtin_mod
18 import __builtin__ as builtin_mod
19 import __future__
19 import __future__
20 import bdb
20 import bdb
21 import inspect
21 import inspect
22 import os
22 import os
23 import sys
23 import sys
24 import shutil
24 import shutil
25 import re
25 import re
26 import time
26 import time
27 import textwrap
27 import textwrap
28 from cStringIO import StringIO
28 from StringIO import StringIO
29 from getopt import getopt,GetoptError
29 from getopt import getopt,GetoptError
30 from pprint import pformat
30 from pprint import pformat
31 from xmlrpclib import ServerProxy
31 from xmlrpclib import ServerProxy
32
32
33 # cProfile was added in Python2.5
33 # cProfile was added in Python2.5
34 try:
34 try:
35 import cProfile as profile
35 import cProfile as profile
36 import pstats
36 import pstats
37 except ImportError:
37 except ImportError:
38 # profile isn't bundled by default in Debian for license reasons
38 # profile isn't bundled by default in Debian for license reasons
39 try:
39 try:
40 import profile,pstats
40 import profile,pstats
41 except ImportError:
41 except ImportError:
42 profile = pstats = None
42 profile = pstats = None
43
43
44 import IPython
44 import IPython
45 from IPython.core import debugger, oinspect
45 from IPython.core import debugger, oinspect
46 from IPython.core.error import TryNext
46 from IPython.core.error import TryNext
47 from IPython.core.error import UsageError
47 from IPython.core.error import UsageError
48 from IPython.core.fakemodule import FakeModule
48 from IPython.core.fakemodule import FakeModule
49 from IPython.core.profiledir import ProfileDir
49 from IPython.core.profiledir import ProfileDir
50 from IPython.core.macro import Macro
50 from IPython.core.macro import Macro
51 from IPython.core import magic_arguments, page
51 from IPython.core import magic_arguments, page
52 from IPython.core.prefilter import ESC_MAGIC
52 from IPython.core.prefilter import ESC_MAGIC
53 from IPython.lib.pylabtools import mpl_runner
53 from IPython.lib.pylabtools import mpl_runner
54 from IPython.testing.skipdoctest import skip_doctest
54 from IPython.testing.skipdoctest import skip_doctest
55 from IPython.utils import py3compat
55 from IPython.utils import py3compat
56 from IPython.utils.io import file_read, nlprint
56 from IPython.utils.io import file_read, nlprint
57 from IPython.utils.path import get_py_filename, unquote_filename
57 from IPython.utils.path import get_py_filename, unquote_filename
58 from IPython.utils.process import arg_split, abbrev_cwd
58 from IPython.utils.process import arg_split, abbrev_cwd
59 from IPython.utils.terminal import set_term_title
59 from IPython.utils.terminal import set_term_title
60 from IPython.utils.text import LSString, SList, format_screen
60 from IPython.utils.text import LSString, SList, format_screen
61 from IPython.utils.timing import clock, clock2
61 from IPython.utils.timing import clock, clock2
62 from IPython.utils.warn import warn, error
62 from IPython.utils.warn import warn, error
63 from IPython.utils.ipstruct import Struct
63 from IPython.utils.ipstruct import Struct
64 from IPython.config.application import Application
64 from IPython.config.application import Application
65
65
66 #-----------------------------------------------------------------------------
66 #-----------------------------------------------------------------------------
67 # Utility functions
67 # Utility functions
68 #-----------------------------------------------------------------------------
68 #-----------------------------------------------------------------------------
69
69
70 def on_off(tag):
70 def on_off(tag):
71 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
71 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
72 return ['OFF','ON'][tag]
72 return ['OFF','ON'][tag]
73
73
74 class Bunch: pass
74 class Bunch: pass
75
75
76 def compress_dhist(dh):
76 def compress_dhist(dh):
77 head, tail = dh[:-10], dh[-10:]
77 head, tail = dh[:-10], dh[-10:]
78
78
79 newhead = []
79 newhead = []
80 done = set()
80 done = set()
81 for h in head:
81 for h in head:
82 if h in done:
82 if h in done:
83 continue
83 continue
84 newhead.append(h)
84 newhead.append(h)
85 done.add(h)
85 done.add(h)
86
86
87 return newhead + tail
87 return newhead + tail
88
88
89 def needs_local_scope(func):
89 def needs_local_scope(func):
90 """Decorator to mark magic functions which need to local scope to run."""
90 """Decorator to mark magic functions which need to local scope to run."""
91 func.needs_local_scope = True
91 func.needs_local_scope = True
92 return func
92 return func
93
93
94 # Used for exception handling in magic_edit
94 # Used for exception handling in magic_edit
95 class MacroToEdit(ValueError): pass
95 class MacroToEdit(ValueError): pass
96
96
97 #***************************************************************************
97 #***************************************************************************
98 # Main class implementing Magic functionality
98 # Main class implementing Magic functionality
99
99
100 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
100 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
101 # on construction of the main InteractiveShell object. Something odd is going
101 # on construction of the main InteractiveShell object. Something odd is going
102 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
102 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
103 # eventually this needs to be clarified.
103 # eventually this needs to be clarified.
104 # BG: This is because InteractiveShell inherits from this, but is itself a
104 # BG: This is because InteractiveShell inherits from this, but is itself a
105 # Configurable. This messes up the MRO in some way. The fix is that we need to
105 # Configurable. This messes up the MRO in some way. The fix is that we need to
106 # make Magic a configurable that InteractiveShell does not subclass.
106 # make Magic a configurable that InteractiveShell does not subclass.
107
107
108 class Magic:
108 class Magic:
109 """Magic functions for InteractiveShell.
109 """Magic functions for InteractiveShell.
110
110
111 Shell functions which can be reached as %function_name. All magic
111 Shell functions which can be reached as %function_name. All magic
112 functions should accept a string, which they can parse for their own
112 functions should accept a string, which they can parse for their own
113 needs. This can make some functions easier to type, eg `%cd ../`
113 needs. This can make some functions easier to type, eg `%cd ../`
114 vs. `%cd("../")`
114 vs. `%cd("../")`
115
115
116 ALL definitions MUST begin with the prefix magic_. The user won't need it
116 ALL definitions MUST begin with the prefix magic_. The user won't need it
117 at the command line, but it is is needed in the definition. """
117 at the command line, but it is is needed in the definition. """
118
118
119 # class globals
119 # class globals
120 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
120 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
121 'Automagic is ON, % prefix NOT needed for magic functions.']
121 'Automagic is ON, % prefix NOT needed for magic functions.']
122
122
123 #......................................................................
123 #......................................................................
124 # some utility functions
124 # some utility functions
125
125
126 def __init__(self,shell):
126 def __init__(self,shell):
127
127
128 self.options_table = {}
128 self.options_table = {}
129 if profile is None:
129 if profile is None:
130 self.magic_prun = self.profile_missing_notice
130 self.magic_prun = self.profile_missing_notice
131 self.shell = shell
131 self.shell = shell
132
132
133 # namespace for holding state we may need
133 # namespace for holding state we may need
134 self._magic_state = Bunch()
134 self._magic_state = Bunch()
135
135
136 def profile_missing_notice(self, *args, **kwargs):
136 def profile_missing_notice(self, *args, **kwargs):
137 error("""\
137 error("""\
138 The profile module could not be found. It has been removed from the standard
138 The profile module could not be found. It has been removed from the standard
139 python packages because of its non-free license. To use profiling, install the
139 python packages because of its non-free license. To use profiling, install the
140 python-profiler package from non-free.""")
140 python-profiler package from non-free.""")
141
141
142 def default_option(self,fn,optstr):
142 def default_option(self,fn,optstr):
143 """Make an entry in the options_table for fn, with value optstr"""
143 """Make an entry in the options_table for fn, with value optstr"""
144
144
145 if fn not in self.lsmagic():
145 if fn not in self.lsmagic():
146 error("%s is not a magic function" % fn)
146 error("%s is not a magic function" % fn)
147 self.options_table[fn] = optstr
147 self.options_table[fn] = optstr
148
148
149 def lsmagic(self):
149 def lsmagic(self):
150 """Return a list of currently available magic functions.
150 """Return a list of currently available magic functions.
151
151
152 Gives a list of the bare names after mangling (['ls','cd', ...], not
152 Gives a list of the bare names after mangling (['ls','cd', ...], not
153 ['magic_ls','magic_cd',...]"""
153 ['magic_ls','magic_cd',...]"""
154
154
155 # FIXME. This needs a cleanup, in the way the magics list is built.
155 # FIXME. This needs a cleanup, in the way the magics list is built.
156
156
157 # magics in class definition
157 # magics in class definition
158 class_magic = lambda fn: fn.startswith('magic_') and \
158 class_magic = lambda fn: fn.startswith('magic_') and \
159 callable(Magic.__dict__[fn])
159 callable(Magic.__dict__[fn])
160 # in instance namespace (run-time user additions)
160 # in instance namespace (run-time user additions)
161 inst_magic = lambda fn: fn.startswith('magic_') and \
161 inst_magic = lambda fn: fn.startswith('magic_') and \
162 callable(self.__dict__[fn])
162 callable(self.__dict__[fn])
163 # and bound magics by user (so they can access self):
163 # and bound magics by user (so they can access self):
164 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
164 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
165 callable(self.__class__.__dict__[fn])
165 callable(self.__class__.__dict__[fn])
166 magics = filter(class_magic,Magic.__dict__.keys()) + \
166 magics = filter(class_magic,Magic.__dict__.keys()) + \
167 filter(inst_magic,self.__dict__.keys()) + \
167 filter(inst_magic,self.__dict__.keys()) + \
168 filter(inst_bound_magic,self.__class__.__dict__.keys())
168 filter(inst_bound_magic,self.__class__.__dict__.keys())
169 out = []
169 out = []
170 for fn in set(magics):
170 for fn in set(magics):
171 out.append(fn.replace('magic_','',1))
171 out.append(fn.replace('magic_','',1))
172 out.sort()
172 out.sort()
173 return out
173 return out
174
174
175 def extract_input_lines(self, range_str, raw=False):
175 def extract_input_lines(self, range_str, raw=False):
176 """Return as a string a set of input history slices.
176 """Return as a string a set of input history slices.
177
177
178 Inputs:
178 Inputs:
179
179
180 - range_str: the set of slices is given as a string, like
180 - range_str: the set of slices is given as a string, like
181 "~5/6-~4/2 4:8 9", since this function is for use by magic functions
181 "~5/6-~4/2 4:8 9", since this function is for use by magic functions
182 which get their arguments as strings. The number before the / is the
182 which get their arguments as strings. The number before the / is the
183 session number: ~n goes n back from the current session.
183 session number: ~n goes n back from the current session.
184
184
185 Optional inputs:
185 Optional inputs:
186
186
187 - raw(False): by default, the processed input is used. If this is
187 - raw(False): by default, the processed input is used. If this is
188 true, the raw input history is used instead.
188 true, the raw input history is used instead.
189
189
190 Note that slices can be called with two notations:
190 Note that slices can be called with two notations:
191
191
192 N:M -> standard python form, means including items N...(M-1).
192 N:M -> standard python form, means including items N...(M-1).
193
193
194 N-M -> include items N..M (closed endpoint)."""
194 N-M -> include items N..M (closed endpoint)."""
195 lines = self.shell.history_manager.\
195 lines = self.shell.history_manager.\
196 get_range_by_str(range_str, raw=raw)
196 get_range_by_str(range_str, raw=raw)
197 return "\n".join(x for _, _, x in lines)
197 return "\n".join(x for _, _, x in lines)
198
198
199 def arg_err(self,func):
199 def arg_err(self,func):
200 """Print docstring if incorrect arguments were passed"""
200 """Print docstring if incorrect arguments were passed"""
201 print 'Error in arguments:'
201 print 'Error in arguments:'
202 print oinspect.getdoc(func)
202 print oinspect.getdoc(func)
203
203
204 def format_latex(self,strng):
204 def format_latex(self,strng):
205 """Format a string for latex inclusion."""
205 """Format a string for latex inclusion."""
206
206
207 # Characters that need to be escaped for latex:
207 # Characters that need to be escaped for latex:
208 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
208 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
209 # Magic command names as headers:
209 # Magic command names as headers:
210 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
210 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
211 re.MULTILINE)
211 re.MULTILINE)
212 # Magic commands
212 # Magic commands
213 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
213 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
214 re.MULTILINE)
214 re.MULTILINE)
215 # Paragraph continue
215 # Paragraph continue
216 par_re = re.compile(r'\\$',re.MULTILINE)
216 par_re = re.compile(r'\\$',re.MULTILINE)
217
217
218 # The "\n" symbol
218 # The "\n" symbol
219 newline_re = re.compile(r'\\n')
219 newline_re = re.compile(r'\\n')
220
220
221 # Now build the string for output:
221 # Now build the string for output:
222 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
222 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
223 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
223 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
224 strng)
224 strng)
225 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
225 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
226 strng = par_re.sub(r'\\\\',strng)
226 strng = par_re.sub(r'\\\\',strng)
227 strng = escape_re.sub(r'\\\1',strng)
227 strng = escape_re.sub(r'\\\1',strng)
228 strng = newline_re.sub(r'\\textbackslash{}n',strng)
228 strng = newline_re.sub(r'\\textbackslash{}n',strng)
229 return strng
229 return strng
230
230
231 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
231 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
232 """Parse options passed to an argument string.
232 """Parse options passed to an argument string.
233
233
234 The interface is similar to that of getopt(), but it returns back a
234 The interface is similar to that of getopt(), but it returns back a
235 Struct with the options as keys and the stripped argument string still
235 Struct with the options as keys and the stripped argument string still
236 as a string.
236 as a string.
237
237
238 arg_str is quoted as a true sys.argv vector by using shlex.split.
238 arg_str is quoted as a true sys.argv vector by using shlex.split.
239 This allows us to easily expand variables, glob files, quote
239 This allows us to easily expand variables, glob files, quote
240 arguments, etc.
240 arguments, etc.
241
241
242 Options:
242 Options:
243 -mode: default 'string'. If given as 'list', the argument string is
243 -mode: default 'string'. If given as 'list', the argument string is
244 returned as a list (split on whitespace) instead of a string.
244 returned as a list (split on whitespace) instead of a string.
245
245
246 -list_all: put all option values in lists. Normally only options
246 -list_all: put all option values in lists. Normally only options
247 appearing more than once are put in a list.
247 appearing more than once are put in a list.
248
248
249 -posix (True): whether to split the input line in POSIX mode or not,
249 -posix (True): whether to split the input line in POSIX mode or not,
250 as per the conventions outlined in the shlex module from the
250 as per the conventions outlined in the shlex module from the
251 standard library."""
251 standard library."""
252
252
253 # inject default options at the beginning of the input line
253 # inject default options at the beginning of the input line
254 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
254 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
255 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
255 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
256
256
257 mode = kw.get('mode','string')
257 mode = kw.get('mode','string')
258 if mode not in ['string','list']:
258 if mode not in ['string','list']:
259 raise ValueError,'incorrect mode given: %s' % mode
259 raise ValueError,'incorrect mode given: %s' % mode
260 # Get options
260 # Get options
261 list_all = kw.get('list_all',0)
261 list_all = kw.get('list_all',0)
262 posix = kw.get('posix', os.name == 'posix')
262 posix = kw.get('posix', os.name == 'posix')
263
263
264 # Check if we have more than one argument to warrant extra processing:
264 # Check if we have more than one argument to warrant extra processing:
265 odict = {} # Dictionary with options
265 odict = {} # Dictionary with options
266 args = arg_str.split()
266 args = arg_str.split()
267 if len(args) >= 1:
267 if len(args) >= 1:
268 # If the list of inputs only has 0 or 1 thing in it, there's no
268 # If the list of inputs only has 0 or 1 thing in it, there's no
269 # need to look for options
269 # need to look for options
270 argv = arg_split(arg_str,posix)
270 argv = arg_split(arg_str,posix)
271 # Do regular option processing
271 # Do regular option processing
272 try:
272 try:
273 opts,args = getopt(argv,opt_str,*long_opts)
273 opts,args = getopt(argv,opt_str,*long_opts)
274 except GetoptError,e:
274 except GetoptError,e:
275 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
275 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
276 " ".join(long_opts)))
276 " ".join(long_opts)))
277 for o,a in opts:
277 for o,a in opts:
278 if o.startswith('--'):
278 if o.startswith('--'):
279 o = o[2:]
279 o = o[2:]
280 else:
280 else:
281 o = o[1:]
281 o = o[1:]
282 try:
282 try:
283 odict[o].append(a)
283 odict[o].append(a)
284 except AttributeError:
284 except AttributeError:
285 odict[o] = [odict[o],a]
285 odict[o] = [odict[o],a]
286 except KeyError:
286 except KeyError:
287 if list_all:
287 if list_all:
288 odict[o] = [a]
288 odict[o] = [a]
289 else:
289 else:
290 odict[o] = a
290 odict[o] = a
291
291
292 # Prepare opts,args for return
292 # Prepare opts,args for return
293 opts = Struct(odict)
293 opts = Struct(odict)
294 if mode == 'string':
294 if mode == 'string':
295 args = ' '.join(args)
295 args = ' '.join(args)
296
296
297 return opts,args
297 return opts,args
298
298
299 #......................................................................
299 #......................................................................
300 # And now the actual magic functions
300 # And now the actual magic functions
301
301
302 # Functions for IPython shell work (vars,funcs, config, etc)
302 # Functions for IPython shell work (vars,funcs, config, etc)
303 def magic_lsmagic(self, parameter_s = ''):
303 def magic_lsmagic(self, parameter_s = ''):
304 """List currently available magic functions."""
304 """List currently available magic functions."""
305 mesc = ESC_MAGIC
305 mesc = ESC_MAGIC
306 print 'Available magic functions:\n'+mesc+\
306 print 'Available magic functions:\n'+mesc+\
307 (' '+mesc).join(self.lsmagic())
307 (' '+mesc).join(self.lsmagic())
308 print '\n' + Magic.auto_status[self.shell.automagic]
308 print '\n' + Magic.auto_status[self.shell.automagic]
309 return None
309 return None
310
310
311 def magic_magic(self, parameter_s = ''):
311 def magic_magic(self, parameter_s = ''):
312 """Print information about the magic function system.
312 """Print information about the magic function system.
313
313
314 Supported formats: -latex, -brief, -rest
314 Supported formats: -latex, -brief, -rest
315 """
315 """
316
316
317 mode = ''
317 mode = ''
318 try:
318 try:
319 if parameter_s.split()[0] == '-latex':
319 if parameter_s.split()[0] == '-latex':
320 mode = 'latex'
320 mode = 'latex'
321 if parameter_s.split()[0] == '-brief':
321 if parameter_s.split()[0] == '-brief':
322 mode = 'brief'
322 mode = 'brief'
323 if parameter_s.split()[0] == '-rest':
323 if parameter_s.split()[0] == '-rest':
324 mode = 'rest'
324 mode = 'rest'
325 rest_docs = []
325 rest_docs = []
326 except:
326 except:
327 pass
327 pass
328
328
329 magic_docs = []
329 magic_docs = []
330 for fname in self.lsmagic():
330 for fname in self.lsmagic():
331 mname = 'magic_' + fname
331 mname = 'magic_' + fname
332 for space in (Magic,self,self.__class__):
332 for space in (Magic,self,self.__class__):
333 try:
333 try:
334 fn = space.__dict__[mname]
334 fn = space.__dict__[mname]
335 except KeyError:
335 except KeyError:
336 pass
336 pass
337 else:
337 else:
338 break
338 break
339 if mode == 'brief':
339 if mode == 'brief':
340 # only first line
340 # only first line
341 if fn.__doc__:
341 if fn.__doc__:
342 fndoc = fn.__doc__.split('\n',1)[0]
342 fndoc = fn.__doc__.split('\n',1)[0]
343 else:
343 else:
344 fndoc = 'No documentation'
344 fndoc = 'No documentation'
345 else:
345 else:
346 if fn.__doc__:
346 if fn.__doc__:
347 fndoc = fn.__doc__.rstrip()
347 fndoc = fn.__doc__.rstrip()
348 else:
348 else:
349 fndoc = 'No documentation'
349 fndoc = 'No documentation'
350
350
351
351
352 if mode == 'rest':
352 if mode == 'rest':
353 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
353 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
354 fname,fndoc))
354 fname,fndoc))
355
355
356 else:
356 else:
357 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
357 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
358 fname,fndoc))
358 fname,fndoc))
359
359
360 magic_docs = ''.join(magic_docs)
360 magic_docs = ''.join(magic_docs)
361
361
362 if mode == 'rest':
362 if mode == 'rest':
363 return "".join(rest_docs)
363 return "".join(rest_docs)
364
364
365 if mode == 'latex':
365 if mode == 'latex':
366 print self.format_latex(magic_docs)
366 print self.format_latex(magic_docs)
367 return
367 return
368 else:
368 else:
369 magic_docs = format_screen(magic_docs)
369 magic_docs = format_screen(magic_docs)
370 if mode == 'brief':
370 if mode == 'brief':
371 return magic_docs
371 return magic_docs
372
372
373 outmsg = """
373 outmsg = """
374 IPython's 'magic' functions
374 IPython's 'magic' functions
375 ===========================
375 ===========================
376
376
377 The magic function system provides a series of functions which allow you to
377 The magic function system provides a series of functions which allow you to
378 control the behavior of IPython itself, plus a lot of system-type
378 control the behavior of IPython itself, plus a lot of system-type
379 features. All these functions are prefixed with a % character, but parameters
379 features. All these functions are prefixed with a % character, but parameters
380 are given without parentheses or quotes.
380 are given without parentheses or quotes.
381
381
382 NOTE: If you have 'automagic' enabled (via the command line option or with the
382 NOTE: If you have 'automagic' enabled (via the command line option or with the
383 %automagic function), you don't need to type in the % explicitly. By default,
383 %automagic function), you don't need to type in the % explicitly. By default,
384 IPython ships with automagic on, so you should only rarely need the % escape.
384 IPython ships with automagic on, so you should only rarely need the % escape.
385
385
386 Example: typing '%cd mydir' (without the quotes) changes you working directory
386 Example: typing '%cd mydir' (without the quotes) changes you working directory
387 to 'mydir', if it exists.
387 to 'mydir', if it exists.
388
388
389 For a list of the available magic functions, use %lsmagic. For a description
389 For a list of the available magic functions, use %lsmagic. For a description
390 of any of them, type %magic_name?, e.g. '%cd?'.
390 of any of them, type %magic_name?, e.g. '%cd?'.
391
391
392 Currently the magic system has the following functions:\n"""
392 Currently the magic system has the following functions:\n"""
393
393
394 mesc = ESC_MAGIC
394 mesc = ESC_MAGIC
395 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
395 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
396 "\n\n%s%s\n\n%s" % (outmsg,
396 "\n\n%s%s\n\n%s" % (outmsg,
397 magic_docs,mesc,mesc,
397 magic_docs,mesc,mesc,
398 (' '+mesc).join(self.lsmagic()),
398 (' '+mesc).join(self.lsmagic()),
399 Magic.auto_status[self.shell.automagic] ) )
399 Magic.auto_status[self.shell.automagic] ) )
400 page.page(outmsg)
400 page.page(outmsg)
401
401
402 def magic_automagic(self, parameter_s = ''):
402 def magic_automagic(self, parameter_s = ''):
403 """Make magic functions callable without having to type the initial %.
403 """Make magic functions callable without having to type the initial %.
404
404
405 Without argumentsl toggles on/off (when off, you must call it as
405 Without argumentsl toggles on/off (when off, you must call it as
406 %automagic, of course). With arguments it sets the value, and you can
406 %automagic, of course). With arguments it sets the value, and you can
407 use any of (case insensitive):
407 use any of (case insensitive):
408
408
409 - on,1,True: to activate
409 - on,1,True: to activate
410
410
411 - off,0,False: to deactivate.
411 - off,0,False: to deactivate.
412
412
413 Note that magic functions have lowest priority, so if there's a
413 Note that magic functions have lowest priority, so if there's a
414 variable whose name collides with that of a magic fn, automagic won't
414 variable whose name collides with that of a magic fn, automagic won't
415 work for that function (you get the variable instead). However, if you
415 work for that function (you get the variable instead). However, if you
416 delete the variable (del var), the previously shadowed magic function
416 delete the variable (del var), the previously shadowed magic function
417 becomes visible to automagic again."""
417 becomes visible to automagic again."""
418
418
419 arg = parameter_s.lower()
419 arg = parameter_s.lower()
420 if parameter_s in ('on','1','true'):
420 if parameter_s in ('on','1','true'):
421 self.shell.automagic = True
421 self.shell.automagic = True
422 elif parameter_s in ('off','0','false'):
422 elif parameter_s in ('off','0','false'):
423 self.shell.automagic = False
423 self.shell.automagic = False
424 else:
424 else:
425 self.shell.automagic = not self.shell.automagic
425 self.shell.automagic = not self.shell.automagic
426 print '\n' + Magic.auto_status[self.shell.automagic]
426 print '\n' + Magic.auto_status[self.shell.automagic]
427
427
428 @skip_doctest
428 @skip_doctest
429 def magic_autocall(self, parameter_s = ''):
429 def magic_autocall(self, parameter_s = ''):
430 """Make functions callable without having to type parentheses.
430 """Make functions callable without having to type parentheses.
431
431
432 Usage:
432 Usage:
433
433
434 %autocall [mode]
434 %autocall [mode]
435
435
436 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
436 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
437 value is toggled on and off (remembering the previous state).
437 value is toggled on and off (remembering the previous state).
438
438
439 In more detail, these values mean:
439 In more detail, these values mean:
440
440
441 0 -> fully disabled
441 0 -> fully disabled
442
442
443 1 -> active, but do not apply if there are no arguments on the line.
443 1 -> active, but do not apply if there are no arguments on the line.
444
444
445 In this mode, you get:
445 In this mode, you get:
446
446
447 In [1]: callable
447 In [1]: callable
448 Out[1]: <built-in function callable>
448 Out[1]: <built-in function callable>
449
449
450 In [2]: callable 'hello'
450 In [2]: callable 'hello'
451 ------> callable('hello')
451 ------> callable('hello')
452 Out[2]: False
452 Out[2]: False
453
453
454 2 -> Active always. Even if no arguments are present, the callable
454 2 -> Active always. Even if no arguments are present, the callable
455 object is called:
455 object is called:
456
456
457 In [2]: float
457 In [2]: float
458 ------> float()
458 ------> float()
459 Out[2]: 0.0
459 Out[2]: 0.0
460
460
461 Note that even with autocall off, you can still use '/' at the start of
461 Note that even with autocall off, you can still use '/' at the start of
462 a line to treat the first argument on the command line as a function
462 a line to treat the first argument on the command line as a function
463 and add parentheses to it:
463 and add parentheses to it:
464
464
465 In [8]: /str 43
465 In [8]: /str 43
466 ------> str(43)
466 ------> str(43)
467 Out[8]: '43'
467 Out[8]: '43'
468
468
469 # all-random (note for auto-testing)
469 # all-random (note for auto-testing)
470 """
470 """
471
471
472 if parameter_s:
472 if parameter_s:
473 arg = int(parameter_s)
473 arg = int(parameter_s)
474 else:
474 else:
475 arg = 'toggle'
475 arg = 'toggle'
476
476
477 if not arg in (0,1,2,'toggle'):
477 if not arg in (0,1,2,'toggle'):
478 error('Valid modes: (0->Off, 1->Smart, 2->Full')
478 error('Valid modes: (0->Off, 1->Smart, 2->Full')
479 return
479 return
480
480
481 if arg in (0,1,2):
481 if arg in (0,1,2):
482 self.shell.autocall = arg
482 self.shell.autocall = arg
483 else: # toggle
483 else: # toggle
484 if self.shell.autocall:
484 if self.shell.autocall:
485 self._magic_state.autocall_save = self.shell.autocall
485 self._magic_state.autocall_save = self.shell.autocall
486 self.shell.autocall = 0
486 self.shell.autocall = 0
487 else:
487 else:
488 try:
488 try:
489 self.shell.autocall = self._magic_state.autocall_save
489 self.shell.autocall = self._magic_state.autocall_save
490 except AttributeError:
490 except AttributeError:
491 self.shell.autocall = self._magic_state.autocall_save = 1
491 self.shell.autocall = self._magic_state.autocall_save = 1
492
492
493 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
493 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
494
494
495
495
496 def magic_page(self, parameter_s=''):
496 def magic_page(self, parameter_s=''):
497 """Pretty print the object and display it through a pager.
497 """Pretty print the object and display it through a pager.
498
498
499 %page [options] OBJECT
499 %page [options] OBJECT
500
500
501 If no object is given, use _ (last output).
501 If no object is given, use _ (last output).
502
502
503 Options:
503 Options:
504
504
505 -r: page str(object), don't pretty-print it."""
505 -r: page str(object), don't pretty-print it."""
506
506
507 # After a function contributed by Olivier Aubert, slightly modified.
507 # After a function contributed by Olivier Aubert, slightly modified.
508
508
509 # Process options/args
509 # Process options/args
510 opts,args = self.parse_options(parameter_s,'r')
510 opts,args = self.parse_options(parameter_s,'r')
511 raw = 'r' in opts
511 raw = 'r' in opts
512
512
513 oname = args and args or '_'
513 oname = args and args or '_'
514 info = self._ofind(oname)
514 info = self._ofind(oname)
515 if info['found']:
515 if info['found']:
516 txt = (raw and str or pformat)( info['obj'] )
516 txt = (raw and str or pformat)( info['obj'] )
517 page.page(txt)
517 page.page(txt)
518 else:
518 else:
519 print 'Object `%s` not found' % oname
519 print 'Object `%s` not found' % oname
520
520
521 def magic_profile(self, parameter_s=''):
521 def magic_profile(self, parameter_s=''):
522 """Print your currently active IPython profile."""
522 """Print your currently active IPython profile."""
523 print self.shell.profile
523 print self.shell.profile
524
524
525 def magic_pinfo(self, parameter_s='', namespaces=None):
525 def magic_pinfo(self, parameter_s='', namespaces=None):
526 """Provide detailed information about an object.
526 """Provide detailed information about an object.
527
527
528 '%pinfo object' is just a synonym for object? or ?object."""
528 '%pinfo object' is just a synonym for object? or ?object."""
529
529
530 #print 'pinfo par: <%s>' % parameter_s # dbg
530 #print 'pinfo par: <%s>' % parameter_s # dbg
531
531
532
532
533 # detail_level: 0 -> obj? , 1 -> obj??
533 # detail_level: 0 -> obj? , 1 -> obj??
534 detail_level = 0
534 detail_level = 0
535 # We need to detect if we got called as 'pinfo pinfo foo', which can
535 # We need to detect if we got called as 'pinfo pinfo foo', which can
536 # happen if the user types 'pinfo foo?' at the cmd line.
536 # happen if the user types 'pinfo foo?' at the cmd line.
537 pinfo,qmark1,oname,qmark2 = \
537 pinfo,qmark1,oname,qmark2 = \
538 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
538 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
539 if pinfo or qmark1 or qmark2:
539 if pinfo or qmark1 or qmark2:
540 detail_level = 1
540 detail_level = 1
541 if "*" in oname:
541 if "*" in oname:
542 self.magic_psearch(oname)
542 self.magic_psearch(oname)
543 else:
543 else:
544 self.shell._inspect('pinfo', oname, detail_level=detail_level,
544 self.shell._inspect('pinfo', oname, detail_level=detail_level,
545 namespaces=namespaces)
545 namespaces=namespaces)
546
546
547 def magic_pinfo2(self, parameter_s='', namespaces=None):
547 def magic_pinfo2(self, parameter_s='', namespaces=None):
548 """Provide extra detailed information about an object.
548 """Provide extra detailed information about an object.
549
549
550 '%pinfo2 object' is just a synonym for object?? or ??object."""
550 '%pinfo2 object' is just a synonym for object?? or ??object."""
551 self.shell._inspect('pinfo', parameter_s, detail_level=1,
551 self.shell._inspect('pinfo', parameter_s, detail_level=1,
552 namespaces=namespaces)
552 namespaces=namespaces)
553
553
554 @skip_doctest
554 @skip_doctest
555 def magic_pdef(self, parameter_s='', namespaces=None):
555 def magic_pdef(self, parameter_s='', namespaces=None):
556 """Print the definition header for any callable object.
556 """Print the definition header for any callable object.
557
557
558 If the object is a class, print the constructor information.
558 If the object is a class, print the constructor information.
559
559
560 Examples
560 Examples
561 --------
561 --------
562 ::
562 ::
563
563
564 In [3]: %pdef urllib.urlopen
564 In [3]: %pdef urllib.urlopen
565 urllib.urlopen(url, data=None, proxies=None)
565 urllib.urlopen(url, data=None, proxies=None)
566 """
566 """
567 self._inspect('pdef',parameter_s, namespaces)
567 self._inspect('pdef',parameter_s, namespaces)
568
568
569 def magic_pdoc(self, parameter_s='', namespaces=None):
569 def magic_pdoc(self, parameter_s='', namespaces=None):
570 """Print the docstring for an object.
570 """Print the docstring for an object.
571
571
572 If the given object is a class, it will print both the class and the
572 If the given object is a class, it will print both the class and the
573 constructor docstrings."""
573 constructor docstrings."""
574 self._inspect('pdoc',parameter_s, namespaces)
574 self._inspect('pdoc',parameter_s, namespaces)
575
575
576 def magic_psource(self, parameter_s='', namespaces=None):
576 def magic_psource(self, parameter_s='', namespaces=None):
577 """Print (or run through pager) the source code for an object."""
577 """Print (or run through pager) the source code for an object."""
578 self._inspect('psource',parameter_s, namespaces)
578 self._inspect('psource',parameter_s, namespaces)
579
579
580 def magic_pfile(self, parameter_s=''):
580 def magic_pfile(self, parameter_s=''):
581 """Print (or run through pager) the file where an object is defined.
581 """Print (or run through pager) the file where an object is defined.
582
582
583 The file opens at the line where the object definition begins. IPython
583 The file opens at the line where the object definition begins. IPython
584 will honor the environment variable PAGER if set, and otherwise will
584 will honor the environment variable PAGER if set, and otherwise will
585 do its best to print the file in a convenient form.
585 do its best to print the file in a convenient form.
586
586
587 If the given argument is not an object currently defined, IPython will
587 If the given argument is not an object currently defined, IPython will
588 try to interpret it as a filename (automatically adding a .py extension
588 try to interpret it as a filename (automatically adding a .py extension
589 if needed). You can thus use %pfile as a syntax highlighting code
589 if needed). You can thus use %pfile as a syntax highlighting code
590 viewer."""
590 viewer."""
591
591
592 # first interpret argument as an object name
592 # first interpret argument as an object name
593 out = self._inspect('pfile',parameter_s)
593 out = self._inspect('pfile',parameter_s)
594 # if not, try the input as a filename
594 # if not, try the input as a filename
595 if out == 'not found':
595 if out == 'not found':
596 try:
596 try:
597 filename = get_py_filename(parameter_s)
597 filename = get_py_filename(parameter_s)
598 except IOError,msg:
598 except IOError,msg:
599 print msg
599 print msg
600 return
600 return
601 page.page(self.shell.inspector.format(file(filename).read()))
601 page.page(self.shell.inspector.format(file(filename).read()))
602
602
603 def magic_psearch(self, parameter_s=''):
603 def magic_psearch(self, parameter_s=''):
604 """Search for object in namespaces by wildcard.
604 """Search for object in namespaces by wildcard.
605
605
606 %psearch [options] PATTERN [OBJECT TYPE]
606 %psearch [options] PATTERN [OBJECT TYPE]
607
607
608 Note: ? can be used as a synonym for %psearch, at the beginning or at
608 Note: ? can be used as a synonym for %psearch, at the beginning or at
609 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
609 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
610 rest of the command line must be unchanged (options come first), so
610 rest of the command line must be unchanged (options come first), so
611 for example the following forms are equivalent
611 for example the following forms are equivalent
612
612
613 %psearch -i a* function
613 %psearch -i a* function
614 -i a* function?
614 -i a* function?
615 ?-i a* function
615 ?-i a* function
616
616
617 Arguments:
617 Arguments:
618
618
619 PATTERN
619 PATTERN
620
620
621 where PATTERN is a string containing * as a wildcard similar to its
621 where PATTERN is a string containing * as a wildcard similar to its
622 use in a shell. The pattern is matched in all namespaces on the
622 use in a shell. The pattern is matched in all namespaces on the
623 search path. By default objects starting with a single _ are not
623 search path. By default objects starting with a single _ are not
624 matched, many IPython generated objects have a single
624 matched, many IPython generated objects have a single
625 underscore. The default is case insensitive matching. Matching is
625 underscore. The default is case insensitive matching. Matching is
626 also done on the attributes of objects and not only on the objects
626 also done on the attributes of objects and not only on the objects
627 in a module.
627 in a module.
628
628
629 [OBJECT TYPE]
629 [OBJECT TYPE]
630
630
631 Is the name of a python type from the types module. The name is
631 Is the name of a python type from the types module. The name is
632 given in lowercase without the ending type, ex. StringType is
632 given in lowercase without the ending type, ex. StringType is
633 written string. By adding a type here only objects matching the
633 written string. By adding a type here only objects matching the
634 given type are matched. Using all here makes the pattern match all
634 given type are matched. Using all here makes the pattern match all
635 types (this is the default).
635 types (this is the default).
636
636
637 Options:
637 Options:
638
638
639 -a: makes the pattern match even objects whose names start with a
639 -a: makes the pattern match even objects whose names start with a
640 single underscore. These names are normally ommitted from the
640 single underscore. These names are normally ommitted from the
641 search.
641 search.
642
642
643 -i/-c: make the pattern case insensitive/sensitive. If neither of
643 -i/-c: make the pattern case insensitive/sensitive. If neither of
644 these options are given, the default is read from your configuration
644 these options are given, the default is read from your configuration
645 file, with the option ``InteractiveShell.wildcards_case_sensitive``.
645 file, with the option ``InteractiveShell.wildcards_case_sensitive``.
646 If this option is not specified in your configuration file, IPython's
646 If this option is not specified in your configuration file, IPython's
647 internal default is to do a case sensitive search.
647 internal default is to do a case sensitive search.
648
648
649 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
649 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
650 specifiy can be searched in any of the following namespaces:
650 specifiy can be searched in any of the following namespaces:
651 'builtin', 'user', 'user_global','internal', 'alias', where
651 'builtin', 'user', 'user_global','internal', 'alias', where
652 'builtin' and 'user' are the search defaults. Note that you should
652 'builtin' and 'user' are the search defaults. Note that you should
653 not use quotes when specifying namespaces.
653 not use quotes when specifying namespaces.
654
654
655 'Builtin' contains the python module builtin, 'user' contains all
655 'Builtin' contains the python module builtin, 'user' contains all
656 user data, 'alias' only contain the shell aliases and no python
656 user data, 'alias' only contain the shell aliases and no python
657 objects, 'internal' contains objects used by IPython. The
657 objects, 'internal' contains objects used by IPython. The
658 'user_global' namespace is only used by embedded IPython instances,
658 'user_global' namespace is only used by embedded IPython instances,
659 and it contains module-level globals. You can add namespaces to the
659 and it contains module-level globals. You can add namespaces to the
660 search with -s or exclude them with -e (these options can be given
660 search with -s or exclude them with -e (these options can be given
661 more than once).
661 more than once).
662
662
663 Examples:
663 Examples:
664
664
665 %psearch a* -> objects beginning with an a
665 %psearch a* -> objects beginning with an a
666 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
666 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
667 %psearch a* function -> all functions beginning with an a
667 %psearch a* function -> all functions beginning with an a
668 %psearch re.e* -> objects beginning with an e in module re
668 %psearch re.e* -> objects beginning with an e in module re
669 %psearch r*.e* -> objects that start with e in modules starting in r
669 %psearch r*.e* -> objects that start with e in modules starting in r
670 %psearch r*.* string -> all strings in modules beginning with r
670 %psearch r*.* string -> all strings in modules beginning with r
671
671
672 Case sensitve search:
672 Case sensitve search:
673
673
674 %psearch -c a* list all object beginning with lower case a
674 %psearch -c a* list all object beginning with lower case a
675
675
676 Show objects beginning with a single _:
676 Show objects beginning with a single _:
677
677
678 %psearch -a _* list objects beginning with a single underscore"""
678 %psearch -a _* list objects beginning with a single underscore"""
679 try:
679 try:
680 parameter_s.encode('ascii')
680 parameter_s.encode('ascii')
681 except UnicodeEncodeError:
681 except UnicodeEncodeError:
682 print 'Python identifiers can only contain ascii characters.'
682 print 'Python identifiers can only contain ascii characters.'
683 return
683 return
684
684
685 # default namespaces to be searched
685 # default namespaces to be searched
686 def_search = ['user','builtin']
686 def_search = ['user','builtin']
687
687
688 # Process options/args
688 # Process options/args
689 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
689 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
690 opt = opts.get
690 opt = opts.get
691 shell = self.shell
691 shell = self.shell
692 psearch = shell.inspector.psearch
692 psearch = shell.inspector.psearch
693
693
694 # select case options
694 # select case options
695 if opts.has_key('i'):
695 if opts.has_key('i'):
696 ignore_case = True
696 ignore_case = True
697 elif opts.has_key('c'):
697 elif opts.has_key('c'):
698 ignore_case = False
698 ignore_case = False
699 else:
699 else:
700 ignore_case = not shell.wildcards_case_sensitive
700 ignore_case = not shell.wildcards_case_sensitive
701
701
702 # Build list of namespaces to search from user options
702 # Build list of namespaces to search from user options
703 def_search.extend(opt('s',[]))
703 def_search.extend(opt('s',[]))
704 ns_exclude = ns_exclude=opt('e',[])
704 ns_exclude = ns_exclude=opt('e',[])
705 ns_search = [nm for nm in def_search if nm not in ns_exclude]
705 ns_search = [nm for nm in def_search if nm not in ns_exclude]
706
706
707 # Call the actual search
707 # Call the actual search
708 try:
708 try:
709 psearch(args,shell.ns_table,ns_search,
709 psearch(args,shell.ns_table,ns_search,
710 show_all=opt('a'),ignore_case=ignore_case)
710 show_all=opt('a'),ignore_case=ignore_case)
711 except:
711 except:
712 shell.showtraceback()
712 shell.showtraceback()
713
713
714 @skip_doctest
714 @skip_doctest
715 def magic_who_ls(self, parameter_s=''):
715 def magic_who_ls(self, parameter_s=''):
716 """Return a sorted list of all interactive variables.
716 """Return a sorted list of all interactive variables.
717
717
718 If arguments are given, only variables of types matching these
718 If arguments are given, only variables of types matching these
719 arguments are returned.
719 arguments are returned.
720
720
721 Examples
721 Examples
722 --------
722 --------
723
723
724 Define two variables and list them with who_ls::
724 Define two variables and list them with who_ls::
725
725
726 In [1]: alpha = 123
726 In [1]: alpha = 123
727
727
728 In [2]: beta = 'test'
728 In [2]: beta = 'test'
729
729
730 In [3]: %who_ls
730 In [3]: %who_ls
731 Out[3]: ['alpha', 'beta']
731 Out[3]: ['alpha', 'beta']
732
732
733 In [4]: %who_ls int
733 In [4]: %who_ls int
734 Out[4]: ['alpha']
734 Out[4]: ['alpha']
735
735
736 In [5]: %who_ls str
736 In [5]: %who_ls str
737 Out[5]: ['beta']
737 Out[5]: ['beta']
738 """
738 """
739
739
740 user_ns = self.shell.user_ns
740 user_ns = self.shell.user_ns
741 internal_ns = self.shell.internal_ns
741 internal_ns = self.shell.internal_ns
742 user_ns_hidden = self.shell.user_ns_hidden
742 user_ns_hidden = self.shell.user_ns_hidden
743 out = [ i for i in user_ns
743 out = [ i for i in user_ns
744 if not i.startswith('_') \
744 if not i.startswith('_') \
745 and not (i in internal_ns or i in user_ns_hidden) ]
745 and not (i in internal_ns or i in user_ns_hidden) ]
746
746
747 typelist = parameter_s.split()
747 typelist = parameter_s.split()
748 if typelist:
748 if typelist:
749 typeset = set(typelist)
749 typeset = set(typelist)
750 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
750 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
751
751
752 out.sort()
752 out.sort()
753 return out
753 return out
754
754
755 @skip_doctest
755 @skip_doctest
756 def magic_who(self, parameter_s=''):
756 def magic_who(self, parameter_s=''):
757 """Print all interactive variables, with some minimal formatting.
757 """Print all interactive variables, with some minimal formatting.
758
758
759 If any arguments are given, only variables whose type matches one of
759 If any arguments are given, only variables whose type matches one of
760 these are printed. For example:
760 these are printed. For example:
761
761
762 %who function str
762 %who function str
763
763
764 will only list functions and strings, excluding all other types of
764 will only list functions and strings, excluding all other types of
765 variables. To find the proper type names, simply use type(var) at a
765 variables. To find the proper type names, simply use type(var) at a
766 command line to see how python prints type names. For example:
766 command line to see how python prints type names. For example:
767
767
768 In [1]: type('hello')\\
768 In [1]: type('hello')\\
769 Out[1]: <type 'str'>
769 Out[1]: <type 'str'>
770
770
771 indicates that the type name for strings is 'str'.
771 indicates that the type name for strings is 'str'.
772
772
773 %who always excludes executed names loaded through your configuration
773 %who always excludes executed names loaded through your configuration
774 file and things which are internal to IPython.
774 file and things which are internal to IPython.
775
775
776 This is deliberate, as typically you may load many modules and the
776 This is deliberate, as typically you may load many modules and the
777 purpose of %who is to show you only what you've manually defined.
777 purpose of %who is to show you only what you've manually defined.
778
778
779 Examples
779 Examples
780 --------
780 --------
781
781
782 Define two variables and list them with who::
782 Define two variables and list them with who::
783
783
784 In [1]: alpha = 123
784 In [1]: alpha = 123
785
785
786 In [2]: beta = 'test'
786 In [2]: beta = 'test'
787
787
788 In [3]: %who
788 In [3]: %who
789 alpha beta
789 alpha beta
790
790
791 In [4]: %who int
791 In [4]: %who int
792 alpha
792 alpha
793
793
794 In [5]: %who str
794 In [5]: %who str
795 beta
795 beta
796 """
796 """
797
797
798 varlist = self.magic_who_ls(parameter_s)
798 varlist = self.magic_who_ls(parameter_s)
799 if not varlist:
799 if not varlist:
800 if parameter_s:
800 if parameter_s:
801 print 'No variables match your requested type.'
801 print 'No variables match your requested type.'
802 else:
802 else:
803 print 'Interactive namespace is empty.'
803 print 'Interactive namespace is empty.'
804 return
804 return
805
805
806 # if we have variables, move on...
806 # if we have variables, move on...
807 count = 0
807 count = 0
808 for i in varlist:
808 for i in varlist:
809 print i+'\t',
809 print i+'\t',
810 count += 1
810 count += 1
811 if count > 8:
811 if count > 8:
812 count = 0
812 count = 0
813 print
813 print
814 print
814 print
815
815
816 @skip_doctest
816 @skip_doctest
817 def magic_whos(self, parameter_s=''):
817 def magic_whos(self, parameter_s=''):
818 """Like %who, but gives some extra information about each variable.
818 """Like %who, but gives some extra information about each variable.
819
819
820 The same type filtering of %who can be applied here.
820 The same type filtering of %who can be applied here.
821
821
822 For all variables, the type is printed. Additionally it prints:
822 For all variables, the type is printed. Additionally it prints:
823
823
824 - For {},[],(): their length.
824 - For {},[],(): their length.
825
825
826 - For numpy arrays, a summary with shape, number of
826 - For numpy arrays, a summary with shape, number of
827 elements, typecode and size in memory.
827 elements, typecode and size in memory.
828
828
829 - Everything else: a string representation, snipping their middle if
829 - Everything else: a string representation, snipping their middle if
830 too long.
830 too long.
831
831
832 Examples
832 Examples
833 --------
833 --------
834
834
835 Define two variables and list them with whos::
835 Define two variables and list them with whos::
836
836
837 In [1]: alpha = 123
837 In [1]: alpha = 123
838
838
839 In [2]: beta = 'test'
839 In [2]: beta = 'test'
840
840
841 In [3]: %whos
841 In [3]: %whos
842 Variable Type Data/Info
842 Variable Type Data/Info
843 --------------------------------
843 --------------------------------
844 alpha int 123
844 alpha int 123
845 beta str test
845 beta str test
846 """
846 """
847
847
848 varnames = self.magic_who_ls(parameter_s)
848 varnames = self.magic_who_ls(parameter_s)
849 if not varnames:
849 if not varnames:
850 if parameter_s:
850 if parameter_s:
851 print 'No variables match your requested type.'
851 print 'No variables match your requested type.'
852 else:
852 else:
853 print 'Interactive namespace is empty.'
853 print 'Interactive namespace is empty.'
854 return
854 return
855
855
856 # if we have variables, move on...
856 # if we have variables, move on...
857
857
858 # for these types, show len() instead of data:
858 # for these types, show len() instead of data:
859 seq_types = ['dict', 'list', 'tuple']
859 seq_types = ['dict', 'list', 'tuple']
860
860
861 # for numpy/Numeric arrays, display summary info
861 # for numpy/Numeric arrays, display summary info
862 try:
862 try:
863 import numpy
863 import numpy
864 except ImportError:
864 except ImportError:
865 ndarray_type = None
865 ndarray_type = None
866 else:
866 else:
867 ndarray_type = numpy.ndarray.__name__
867 ndarray_type = numpy.ndarray.__name__
868 try:
868 try:
869 import Numeric
869 import Numeric
870 except ImportError:
870 except ImportError:
871 array_type = None
871 array_type = None
872 else:
872 else:
873 array_type = Numeric.ArrayType.__name__
873 array_type = Numeric.ArrayType.__name__
874
874
875 # Find all variable names and types so we can figure out column sizes
875 # Find all variable names and types so we can figure out column sizes
876 def get_vars(i):
876 def get_vars(i):
877 return self.shell.user_ns[i]
877 return self.shell.user_ns[i]
878
878
879 # some types are well known and can be shorter
879 # some types are well known and can be shorter
880 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
880 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
881 def type_name(v):
881 def type_name(v):
882 tn = type(v).__name__
882 tn = type(v).__name__
883 return abbrevs.get(tn,tn)
883 return abbrevs.get(tn,tn)
884
884
885 varlist = map(get_vars,varnames)
885 varlist = map(get_vars,varnames)
886
886
887 typelist = []
887 typelist = []
888 for vv in varlist:
888 for vv in varlist:
889 tt = type_name(vv)
889 tt = type_name(vv)
890
890
891 if tt=='instance':
891 if tt=='instance':
892 typelist.append( abbrevs.get(str(vv.__class__),
892 typelist.append( abbrevs.get(str(vv.__class__),
893 str(vv.__class__)))
893 str(vv.__class__)))
894 else:
894 else:
895 typelist.append(tt)
895 typelist.append(tt)
896
896
897 # column labels and # of spaces as separator
897 # column labels and # of spaces as separator
898 varlabel = 'Variable'
898 varlabel = 'Variable'
899 typelabel = 'Type'
899 typelabel = 'Type'
900 datalabel = 'Data/Info'
900 datalabel = 'Data/Info'
901 colsep = 3
901 colsep = 3
902 # variable format strings
902 # variable format strings
903 vformat = "{0:<{varwidth}}{1:<{typewidth}}"
903 vformat = "{0:<{varwidth}}{1:<{typewidth}}"
904 aformat = "%s: %s elems, type `%s`, %s bytes"
904 aformat = "%s: %s elems, type `%s`, %s bytes"
905 # find the size of the columns to format the output nicely
905 # find the size of the columns to format the output nicely
906 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
906 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
907 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
907 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
908 # table header
908 # table header
909 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
909 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
910 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
910 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
911 # and the table itself
911 # and the table itself
912 kb = 1024
912 kb = 1024
913 Mb = 1048576 # kb**2
913 Mb = 1048576 # kb**2
914 for vname,var,vtype in zip(varnames,varlist,typelist):
914 for vname,var,vtype in zip(varnames,varlist,typelist):
915 print vformat.format(vname, vtype, varwidth=varwidth, typewidth=typewidth),
915 print vformat.format(vname, vtype, varwidth=varwidth, typewidth=typewidth),
916 if vtype in seq_types:
916 if vtype in seq_types:
917 print "n="+str(len(var))
917 print "n="+str(len(var))
918 elif vtype in [array_type,ndarray_type]:
918 elif vtype in [array_type,ndarray_type]:
919 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
919 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
920 if vtype==ndarray_type:
920 if vtype==ndarray_type:
921 # numpy
921 # numpy
922 vsize = var.size
922 vsize = var.size
923 vbytes = vsize*var.itemsize
923 vbytes = vsize*var.itemsize
924 vdtype = var.dtype
924 vdtype = var.dtype
925 else:
925 else:
926 # Numeric
926 # Numeric
927 vsize = Numeric.size(var)
927 vsize = Numeric.size(var)
928 vbytes = vsize*var.itemsize()
928 vbytes = vsize*var.itemsize()
929 vdtype = var.typecode()
929 vdtype = var.typecode()
930
930
931 if vbytes < 100000:
931 if vbytes < 100000:
932 print aformat % (vshape,vsize,vdtype,vbytes)
932 print aformat % (vshape,vsize,vdtype,vbytes)
933 else:
933 else:
934 print aformat % (vshape,vsize,vdtype,vbytes),
934 print aformat % (vshape,vsize,vdtype,vbytes),
935 if vbytes < Mb:
935 if vbytes < Mb:
936 print '(%s kb)' % (vbytes/kb,)
936 print '(%s kb)' % (vbytes/kb,)
937 else:
937 else:
938 print '(%s Mb)' % (vbytes/Mb,)
938 print '(%s Mb)' % (vbytes/Mb,)
939 else:
939 else:
940 try:
940 try:
941 vstr = str(var)
941 vstr = str(var)
942 except UnicodeEncodeError:
942 except UnicodeEncodeError:
943 vstr = unicode(var).encode(sys.getdefaultencoding(),
943 vstr = unicode(var).encode(sys.getdefaultencoding(),
944 'backslashreplace')
944 'backslashreplace')
945 vstr = vstr.replace('\n','\\n')
945 vstr = vstr.replace('\n','\\n')
946 if len(vstr) < 50:
946 if len(vstr) < 50:
947 print vstr
947 print vstr
948 else:
948 else:
949 print vstr[:25] + "<...>" + vstr[-25:]
949 print vstr[:25] + "<...>" + vstr[-25:]
950
950
951 def magic_reset(self, parameter_s=''):
951 def magic_reset(self, parameter_s=''):
952 """Resets the namespace by removing all names defined by the user.
952 """Resets the namespace by removing all names defined by the user.
953
953
954 Parameters
954 Parameters
955 ----------
955 ----------
956 -f : force reset without asking for confirmation.
956 -f : force reset without asking for confirmation.
957
957
958 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
958 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
959 References to objects may be kept. By default (without this option),
959 References to objects may be kept. By default (without this option),
960 we do a 'hard' reset, giving you a new session and removing all
960 we do a 'hard' reset, giving you a new session and removing all
961 references to objects from the current session.
961 references to objects from the current session.
962
962
963 Examples
963 Examples
964 --------
964 --------
965 In [6]: a = 1
965 In [6]: a = 1
966
966
967 In [7]: a
967 In [7]: a
968 Out[7]: 1
968 Out[7]: 1
969
969
970 In [8]: 'a' in _ip.user_ns
970 In [8]: 'a' in _ip.user_ns
971 Out[8]: True
971 Out[8]: True
972
972
973 In [9]: %reset -f
973 In [9]: %reset -f
974
974
975 In [1]: 'a' in _ip.user_ns
975 In [1]: 'a' in _ip.user_ns
976 Out[1]: False
976 Out[1]: False
977 """
977 """
978 opts, args = self.parse_options(parameter_s,'sf')
978 opts, args = self.parse_options(parameter_s,'sf')
979 if 'f' in opts:
979 if 'f' in opts:
980 ans = True
980 ans = True
981 else:
981 else:
982 ans = self.shell.ask_yes_no(
982 ans = self.shell.ask_yes_no(
983 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
983 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
984 if not ans:
984 if not ans:
985 print 'Nothing done.'
985 print 'Nothing done.'
986 return
986 return
987
987
988 if 's' in opts: # Soft reset
988 if 's' in opts: # Soft reset
989 user_ns = self.shell.user_ns
989 user_ns = self.shell.user_ns
990 for i in self.magic_who_ls():
990 for i in self.magic_who_ls():
991 del(user_ns[i])
991 del(user_ns[i])
992
992
993 else: # Hard reset
993 else: # Hard reset
994 self.shell.reset(new_session = False)
994 self.shell.reset(new_session = False)
995
995
996
996
997
997
998 def magic_reset_selective(self, parameter_s=''):
998 def magic_reset_selective(self, parameter_s=''):
999 """Resets the namespace by removing names defined by the user.
999 """Resets the namespace by removing names defined by the user.
1000
1000
1001 Input/Output history are left around in case you need them.
1001 Input/Output history are left around in case you need them.
1002
1002
1003 %reset_selective [-f] regex
1003 %reset_selective [-f] regex
1004
1004
1005 No action is taken if regex is not included
1005 No action is taken if regex is not included
1006
1006
1007 Options
1007 Options
1008 -f : force reset without asking for confirmation.
1008 -f : force reset without asking for confirmation.
1009
1009
1010 Examples
1010 Examples
1011 --------
1011 --------
1012
1012
1013 We first fully reset the namespace so your output looks identical to
1013 We first fully reset the namespace so your output looks identical to
1014 this example for pedagogical reasons; in practice you do not need a
1014 this example for pedagogical reasons; in practice you do not need a
1015 full reset.
1015 full reset.
1016
1016
1017 In [1]: %reset -f
1017 In [1]: %reset -f
1018
1018
1019 Now, with a clean namespace we can make a few variables and use
1019 Now, with a clean namespace we can make a few variables and use
1020 %reset_selective to only delete names that match our regexp:
1020 %reset_selective to only delete names that match our regexp:
1021
1021
1022 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1022 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1023
1023
1024 In [3]: who_ls
1024 In [3]: who_ls
1025 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1025 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1026
1026
1027 In [4]: %reset_selective -f b[2-3]m
1027 In [4]: %reset_selective -f b[2-3]m
1028
1028
1029 In [5]: who_ls
1029 In [5]: who_ls
1030 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1030 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1031
1031
1032 In [6]: %reset_selective -f d
1032 In [6]: %reset_selective -f d
1033
1033
1034 In [7]: who_ls
1034 In [7]: who_ls
1035 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1035 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1036
1036
1037 In [8]: %reset_selective -f c
1037 In [8]: %reset_selective -f c
1038
1038
1039 In [9]: who_ls
1039 In [9]: who_ls
1040 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1040 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1041
1041
1042 In [10]: %reset_selective -f b
1042 In [10]: %reset_selective -f b
1043
1043
1044 In [11]: who_ls
1044 In [11]: who_ls
1045 Out[11]: ['a']
1045 Out[11]: ['a']
1046 """
1046 """
1047
1047
1048 opts, regex = self.parse_options(parameter_s,'f')
1048 opts, regex = self.parse_options(parameter_s,'f')
1049
1049
1050 if opts.has_key('f'):
1050 if opts.has_key('f'):
1051 ans = True
1051 ans = True
1052 else:
1052 else:
1053 ans = self.shell.ask_yes_no(
1053 ans = self.shell.ask_yes_no(
1054 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1054 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1055 if not ans:
1055 if not ans:
1056 print 'Nothing done.'
1056 print 'Nothing done.'
1057 return
1057 return
1058 user_ns = self.shell.user_ns
1058 user_ns = self.shell.user_ns
1059 if not regex:
1059 if not regex:
1060 print 'No regex pattern specified. Nothing done.'
1060 print 'No regex pattern specified. Nothing done.'
1061 return
1061 return
1062 else:
1062 else:
1063 try:
1063 try:
1064 m = re.compile(regex)
1064 m = re.compile(regex)
1065 except TypeError:
1065 except TypeError:
1066 raise TypeError('regex must be a string or compiled pattern')
1066 raise TypeError('regex must be a string or compiled pattern')
1067 for i in self.magic_who_ls():
1067 for i in self.magic_who_ls():
1068 if m.search(i):
1068 if m.search(i):
1069 del(user_ns[i])
1069 del(user_ns[i])
1070
1070
1071 def magic_xdel(self, parameter_s=''):
1071 def magic_xdel(self, parameter_s=''):
1072 """Delete a variable, trying to clear it from anywhere that
1072 """Delete a variable, trying to clear it from anywhere that
1073 IPython's machinery has references to it. By default, this uses
1073 IPython's machinery has references to it. By default, this uses
1074 the identity of the named object in the user namespace to remove
1074 the identity of the named object in the user namespace to remove
1075 references held under other names. The object is also removed
1075 references held under other names. The object is also removed
1076 from the output history.
1076 from the output history.
1077
1077
1078 Options
1078 Options
1079 -n : Delete the specified name from all namespaces, without
1079 -n : Delete the specified name from all namespaces, without
1080 checking their identity.
1080 checking their identity.
1081 """
1081 """
1082 opts, varname = self.parse_options(parameter_s,'n')
1082 opts, varname = self.parse_options(parameter_s,'n')
1083 try:
1083 try:
1084 self.shell.del_var(varname, ('n' in opts))
1084 self.shell.del_var(varname, ('n' in opts))
1085 except (NameError, ValueError) as e:
1085 except (NameError, ValueError) as e:
1086 print type(e).__name__ +": "+ str(e)
1086 print type(e).__name__ +": "+ str(e)
1087
1087
1088 def magic_logstart(self,parameter_s=''):
1088 def magic_logstart(self,parameter_s=''):
1089 """Start logging anywhere in a session.
1089 """Start logging anywhere in a session.
1090
1090
1091 %logstart [-o|-r|-t] [log_name [log_mode]]
1091 %logstart [-o|-r|-t] [log_name [log_mode]]
1092
1092
1093 If no name is given, it defaults to a file named 'ipython_log.py' in your
1093 If no name is given, it defaults to a file named 'ipython_log.py' in your
1094 current directory, in 'rotate' mode (see below).
1094 current directory, in 'rotate' mode (see below).
1095
1095
1096 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1096 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1097 history up to that point and then continues logging.
1097 history up to that point and then continues logging.
1098
1098
1099 %logstart takes a second optional parameter: logging mode. This can be one
1099 %logstart takes a second optional parameter: logging mode. This can be one
1100 of (note that the modes are given unquoted):\\
1100 of (note that the modes are given unquoted):\\
1101 append: well, that says it.\\
1101 append: well, that says it.\\
1102 backup: rename (if exists) to name~ and start name.\\
1102 backup: rename (if exists) to name~ and start name.\\
1103 global: single logfile in your home dir, appended to.\\
1103 global: single logfile in your home dir, appended to.\\
1104 over : overwrite existing log.\\
1104 over : overwrite existing log.\\
1105 rotate: create rotating logs name.1~, name.2~, etc.
1105 rotate: create rotating logs name.1~, name.2~, etc.
1106
1106
1107 Options:
1107 Options:
1108
1108
1109 -o: log also IPython's output. In this mode, all commands which
1109 -o: log also IPython's output. In this mode, all commands which
1110 generate an Out[NN] prompt are recorded to the logfile, right after
1110 generate an Out[NN] prompt are recorded to the logfile, right after
1111 their corresponding input line. The output lines are always
1111 their corresponding input line. The output lines are always
1112 prepended with a '#[Out]# ' marker, so that the log remains valid
1112 prepended with a '#[Out]# ' marker, so that the log remains valid
1113 Python code.
1113 Python code.
1114
1114
1115 Since this marker is always the same, filtering only the output from
1115 Since this marker is always the same, filtering only the output from
1116 a log is very easy, using for example a simple awk call:
1116 a log is very easy, using for example a simple awk call:
1117
1117
1118 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1118 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1119
1119
1120 -r: log 'raw' input. Normally, IPython's logs contain the processed
1120 -r: log 'raw' input. Normally, IPython's logs contain the processed
1121 input, so that user lines are logged in their final form, converted
1121 input, so that user lines are logged in their final form, converted
1122 into valid Python. For example, %Exit is logged as
1122 into valid Python. For example, %Exit is logged as
1123 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1123 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1124 exactly as typed, with no transformations applied.
1124 exactly as typed, with no transformations applied.
1125
1125
1126 -t: put timestamps before each input line logged (these are put in
1126 -t: put timestamps before each input line logged (these are put in
1127 comments)."""
1127 comments)."""
1128
1128
1129 opts,par = self.parse_options(parameter_s,'ort')
1129 opts,par = self.parse_options(parameter_s,'ort')
1130 log_output = 'o' in opts
1130 log_output = 'o' in opts
1131 log_raw_input = 'r' in opts
1131 log_raw_input = 'r' in opts
1132 timestamp = 't' in opts
1132 timestamp = 't' in opts
1133
1133
1134 logger = self.shell.logger
1134 logger = self.shell.logger
1135
1135
1136 # if no args are given, the defaults set in the logger constructor by
1136 # if no args are given, the defaults set in the logger constructor by
1137 # ipytohn remain valid
1137 # ipytohn remain valid
1138 if par:
1138 if par:
1139 try:
1139 try:
1140 logfname,logmode = par.split()
1140 logfname,logmode = par.split()
1141 except:
1141 except:
1142 logfname = par
1142 logfname = par
1143 logmode = 'backup'
1143 logmode = 'backup'
1144 else:
1144 else:
1145 logfname = logger.logfname
1145 logfname = logger.logfname
1146 logmode = logger.logmode
1146 logmode = logger.logmode
1147 # put logfname into rc struct as if it had been called on the command
1147 # put logfname into rc struct as if it had been called on the command
1148 # line, so it ends up saved in the log header Save it in case we need
1148 # line, so it ends up saved in the log header Save it in case we need
1149 # to restore it...
1149 # to restore it...
1150 old_logfile = self.shell.logfile
1150 old_logfile = self.shell.logfile
1151 if logfname:
1151 if logfname:
1152 logfname = os.path.expanduser(logfname)
1152 logfname = os.path.expanduser(logfname)
1153 self.shell.logfile = logfname
1153 self.shell.logfile = logfname
1154
1154
1155 loghead = '# IPython log file\n\n'
1155 loghead = '# IPython log file\n\n'
1156 try:
1156 try:
1157 started = logger.logstart(logfname,loghead,logmode,
1157 started = logger.logstart(logfname,loghead,logmode,
1158 log_output,timestamp,log_raw_input)
1158 log_output,timestamp,log_raw_input)
1159 except:
1159 except:
1160 self.shell.logfile = old_logfile
1160 self.shell.logfile = old_logfile
1161 warn("Couldn't start log: %s" % sys.exc_info()[1])
1161 warn("Couldn't start log: %s" % sys.exc_info()[1])
1162 else:
1162 else:
1163 # log input history up to this point, optionally interleaving
1163 # log input history up to this point, optionally interleaving
1164 # output if requested
1164 # output if requested
1165
1165
1166 if timestamp:
1166 if timestamp:
1167 # disable timestamping for the previous history, since we've
1167 # disable timestamping for the previous history, since we've
1168 # lost those already (no time machine here).
1168 # lost those already (no time machine here).
1169 logger.timestamp = False
1169 logger.timestamp = False
1170
1170
1171 if log_raw_input:
1171 if log_raw_input:
1172 input_hist = self.shell.history_manager.input_hist_raw
1172 input_hist = self.shell.history_manager.input_hist_raw
1173 else:
1173 else:
1174 input_hist = self.shell.history_manager.input_hist_parsed
1174 input_hist = self.shell.history_manager.input_hist_parsed
1175
1175
1176 if log_output:
1176 if log_output:
1177 log_write = logger.log_write
1177 log_write = logger.log_write
1178 output_hist = self.shell.history_manager.output_hist
1178 output_hist = self.shell.history_manager.output_hist
1179 for n in range(1,len(input_hist)-1):
1179 for n in range(1,len(input_hist)-1):
1180 log_write(input_hist[n].rstrip() + '\n')
1180 log_write(input_hist[n].rstrip() + '\n')
1181 if n in output_hist:
1181 if n in output_hist:
1182 log_write(repr(output_hist[n]),'output')
1182 log_write(repr(output_hist[n]),'output')
1183 else:
1183 else:
1184 logger.log_write('\n'.join(input_hist[1:]))
1184 logger.log_write('\n'.join(input_hist[1:]))
1185 logger.log_write('\n')
1185 logger.log_write('\n')
1186 if timestamp:
1186 if timestamp:
1187 # re-enable timestamping
1187 # re-enable timestamping
1188 logger.timestamp = True
1188 logger.timestamp = True
1189
1189
1190 print ('Activating auto-logging. '
1190 print ('Activating auto-logging. '
1191 'Current session state plus future input saved.')
1191 'Current session state plus future input saved.')
1192 logger.logstate()
1192 logger.logstate()
1193
1193
1194 def magic_logstop(self,parameter_s=''):
1194 def magic_logstop(self,parameter_s=''):
1195 """Fully stop logging and close log file.
1195 """Fully stop logging and close log file.
1196
1196
1197 In order to start logging again, a new %logstart call needs to be made,
1197 In order to start logging again, a new %logstart call needs to be made,
1198 possibly (though not necessarily) with a new filename, mode and other
1198 possibly (though not necessarily) with a new filename, mode and other
1199 options."""
1199 options."""
1200 self.logger.logstop()
1200 self.logger.logstop()
1201
1201
1202 def magic_logoff(self,parameter_s=''):
1202 def magic_logoff(self,parameter_s=''):
1203 """Temporarily stop logging.
1203 """Temporarily stop logging.
1204
1204
1205 You must have previously started logging."""
1205 You must have previously started logging."""
1206 self.shell.logger.switch_log(0)
1206 self.shell.logger.switch_log(0)
1207
1207
1208 def magic_logon(self,parameter_s=''):
1208 def magic_logon(self,parameter_s=''):
1209 """Restart logging.
1209 """Restart logging.
1210
1210
1211 This function is for restarting logging which you've temporarily
1211 This function is for restarting logging which you've temporarily
1212 stopped with %logoff. For starting logging for the first time, you
1212 stopped with %logoff. For starting logging for the first time, you
1213 must use the %logstart function, which allows you to specify an
1213 must use the %logstart function, which allows you to specify an
1214 optional log filename."""
1214 optional log filename."""
1215
1215
1216 self.shell.logger.switch_log(1)
1216 self.shell.logger.switch_log(1)
1217
1217
1218 def magic_logstate(self,parameter_s=''):
1218 def magic_logstate(self,parameter_s=''):
1219 """Print the status of the logging system."""
1219 """Print the status of the logging system."""
1220
1220
1221 self.shell.logger.logstate()
1221 self.shell.logger.logstate()
1222
1222
1223 def magic_pdb(self, parameter_s=''):
1223 def magic_pdb(self, parameter_s=''):
1224 """Control the automatic calling of the pdb interactive debugger.
1224 """Control the automatic calling of the pdb interactive debugger.
1225
1225
1226 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1226 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1227 argument it works as a toggle.
1227 argument it works as a toggle.
1228
1228
1229 When an exception is triggered, IPython can optionally call the
1229 When an exception is triggered, IPython can optionally call the
1230 interactive pdb debugger after the traceback printout. %pdb toggles
1230 interactive pdb debugger after the traceback printout. %pdb toggles
1231 this feature on and off.
1231 this feature on and off.
1232
1232
1233 The initial state of this feature is set in your configuration
1233 The initial state of this feature is set in your configuration
1234 file (the option is ``InteractiveShell.pdb``).
1234 file (the option is ``InteractiveShell.pdb``).
1235
1235
1236 If you want to just activate the debugger AFTER an exception has fired,
1236 If you want to just activate the debugger AFTER an exception has fired,
1237 without having to type '%pdb on' and rerunning your code, you can use
1237 without having to type '%pdb on' and rerunning your code, you can use
1238 the %debug magic."""
1238 the %debug magic."""
1239
1239
1240 par = parameter_s.strip().lower()
1240 par = parameter_s.strip().lower()
1241
1241
1242 if par:
1242 if par:
1243 try:
1243 try:
1244 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1244 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1245 except KeyError:
1245 except KeyError:
1246 print ('Incorrect argument. Use on/1, off/0, '
1246 print ('Incorrect argument. Use on/1, off/0, '
1247 'or nothing for a toggle.')
1247 'or nothing for a toggle.')
1248 return
1248 return
1249 else:
1249 else:
1250 # toggle
1250 # toggle
1251 new_pdb = not self.shell.call_pdb
1251 new_pdb = not self.shell.call_pdb
1252
1252
1253 # set on the shell
1253 # set on the shell
1254 self.shell.call_pdb = new_pdb
1254 self.shell.call_pdb = new_pdb
1255 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1255 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1256
1256
1257 def magic_debug(self, parameter_s=''):
1257 def magic_debug(self, parameter_s=''):
1258 """Activate the interactive debugger in post-mortem mode.
1258 """Activate the interactive debugger in post-mortem mode.
1259
1259
1260 If an exception has just occurred, this lets you inspect its stack
1260 If an exception has just occurred, this lets you inspect its stack
1261 frames interactively. Note that this will always work only on the last
1261 frames interactively. Note that this will always work only on the last
1262 traceback that occurred, so you must call this quickly after an
1262 traceback that occurred, so you must call this quickly after an
1263 exception that you wish to inspect has fired, because if another one
1263 exception that you wish to inspect has fired, because if another one
1264 occurs, it clobbers the previous one.
1264 occurs, it clobbers the previous one.
1265
1265
1266 If you want IPython to automatically do this on every exception, see
1266 If you want IPython to automatically do this on every exception, see
1267 the %pdb magic for more details.
1267 the %pdb magic for more details.
1268 """
1268 """
1269 self.shell.debugger(force=True)
1269 self.shell.debugger(force=True)
1270
1270
1271 @skip_doctest
1271 @skip_doctest
1272 def magic_prun(self, parameter_s ='',user_mode=1,
1272 def magic_prun(self, parameter_s ='',user_mode=1,
1273 opts=None,arg_lst=None,prog_ns=None):
1273 opts=None,arg_lst=None,prog_ns=None):
1274
1274
1275 """Run a statement through the python code profiler.
1275 """Run a statement through the python code profiler.
1276
1276
1277 Usage:
1277 Usage:
1278 %prun [options] statement
1278 %prun [options] statement
1279
1279
1280 The given statement (which doesn't require quote marks) is run via the
1280 The given statement (which doesn't require quote marks) is run via the
1281 python profiler in a manner similar to the profile.run() function.
1281 python profiler in a manner similar to the profile.run() function.
1282 Namespaces are internally managed to work correctly; profile.run
1282 Namespaces are internally managed to work correctly; profile.run
1283 cannot be used in IPython because it makes certain assumptions about
1283 cannot be used in IPython because it makes certain assumptions about
1284 namespaces which do not hold under IPython.
1284 namespaces which do not hold under IPython.
1285
1285
1286 Options:
1286 Options:
1287
1287
1288 -l <limit>: you can place restrictions on what or how much of the
1288 -l <limit>: you can place restrictions on what or how much of the
1289 profile gets printed. The limit value can be:
1289 profile gets printed. The limit value can be:
1290
1290
1291 * A string: only information for function names containing this string
1291 * A string: only information for function names containing this string
1292 is printed.
1292 is printed.
1293
1293
1294 * An integer: only these many lines are printed.
1294 * An integer: only these many lines are printed.
1295
1295
1296 * A float (between 0 and 1): this fraction of the report is printed
1296 * A float (between 0 and 1): this fraction of the report is printed
1297 (for example, use a limit of 0.4 to see the topmost 40% only).
1297 (for example, use a limit of 0.4 to see the topmost 40% only).
1298
1298
1299 You can combine several limits with repeated use of the option. For
1299 You can combine several limits with repeated use of the option. For
1300 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1300 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1301 information about class constructors.
1301 information about class constructors.
1302
1302
1303 -r: return the pstats.Stats object generated by the profiling. This
1303 -r: return the pstats.Stats object generated by the profiling. This
1304 object has all the information about the profile in it, and you can
1304 object has all the information about the profile in it, and you can
1305 later use it for further analysis or in other functions.
1305 later use it for further analysis or in other functions.
1306
1306
1307 -s <key>: sort profile by given key. You can provide more than one key
1307 -s <key>: sort profile by given key. You can provide more than one key
1308 by using the option several times: '-s key1 -s key2 -s key3...'. The
1308 by using the option several times: '-s key1 -s key2 -s key3...'. The
1309 default sorting key is 'time'.
1309 default sorting key is 'time'.
1310
1310
1311 The following is copied verbatim from the profile documentation
1311 The following is copied verbatim from the profile documentation
1312 referenced below:
1312 referenced below:
1313
1313
1314 When more than one key is provided, additional keys are used as
1314 When more than one key is provided, additional keys are used as
1315 secondary criteria when the there is equality in all keys selected
1315 secondary criteria when the there is equality in all keys selected
1316 before them.
1316 before them.
1317
1317
1318 Abbreviations can be used for any key names, as long as the
1318 Abbreviations can be used for any key names, as long as the
1319 abbreviation is unambiguous. The following are the keys currently
1319 abbreviation is unambiguous. The following are the keys currently
1320 defined:
1320 defined:
1321
1321
1322 Valid Arg Meaning
1322 Valid Arg Meaning
1323 "calls" call count
1323 "calls" call count
1324 "cumulative" cumulative time
1324 "cumulative" cumulative time
1325 "file" file name
1325 "file" file name
1326 "module" file name
1326 "module" file name
1327 "pcalls" primitive call count
1327 "pcalls" primitive call count
1328 "line" line number
1328 "line" line number
1329 "name" function name
1329 "name" function name
1330 "nfl" name/file/line
1330 "nfl" name/file/line
1331 "stdname" standard name
1331 "stdname" standard name
1332 "time" internal time
1332 "time" internal time
1333
1333
1334 Note that all sorts on statistics are in descending order (placing
1334 Note that all sorts on statistics are in descending order (placing
1335 most time consuming items first), where as name, file, and line number
1335 most time consuming items first), where as name, file, and line number
1336 searches are in ascending order (i.e., alphabetical). The subtle
1336 searches are in ascending order (i.e., alphabetical). The subtle
1337 distinction between "nfl" and "stdname" is that the standard name is a
1337 distinction between "nfl" and "stdname" is that the standard name is a
1338 sort of the name as printed, which means that the embedded line
1338 sort of the name as printed, which means that the embedded line
1339 numbers get compared in an odd way. For example, lines 3, 20, and 40
1339 numbers get compared in an odd way. For example, lines 3, 20, and 40
1340 would (if the file names were the same) appear in the string order
1340 would (if the file names were the same) appear in the string order
1341 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1341 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1342 line numbers. In fact, sort_stats("nfl") is the same as
1342 line numbers. In fact, sort_stats("nfl") is the same as
1343 sort_stats("name", "file", "line").
1343 sort_stats("name", "file", "line").
1344
1344
1345 -T <filename>: save profile results as shown on screen to a text
1345 -T <filename>: save profile results as shown on screen to a text
1346 file. The profile is still shown on screen.
1346 file. The profile is still shown on screen.
1347
1347
1348 -D <filename>: save (via dump_stats) profile statistics to given
1348 -D <filename>: save (via dump_stats) profile statistics to given
1349 filename. This data is in a format understod by the pstats module, and
1349 filename. This data is in a format understod by the pstats module, and
1350 is generated by a call to the dump_stats() method of profile
1350 is generated by a call to the dump_stats() method of profile
1351 objects. The profile is still shown on screen.
1351 objects. The profile is still shown on screen.
1352
1352
1353 If you want to run complete programs under the profiler's control, use
1353 If you want to run complete programs under the profiler's control, use
1354 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1354 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1355 contains profiler specific options as described here.
1355 contains profiler specific options as described here.
1356
1356
1357 You can read the complete documentation for the profile module with::
1357 You can read the complete documentation for the profile module with::
1358
1358
1359 In [1]: import profile; profile.help()
1359 In [1]: import profile; profile.help()
1360 """
1360 """
1361
1361
1362 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1362 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1363 # protect user quote marks
1363 # protect user quote marks
1364 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1364 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1365
1365
1366 if user_mode: # regular user call
1366 if user_mode: # regular user call
1367 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1367 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1368 list_all=1)
1368 list_all=1)
1369 namespace = self.shell.user_ns
1369 namespace = self.shell.user_ns
1370 else: # called to run a program by %run -p
1370 else: # called to run a program by %run -p
1371 try:
1371 try:
1372 filename = get_py_filename(arg_lst[0])
1372 filename = get_py_filename(arg_lst[0])
1373 except IOError,msg:
1373 except IOError,msg:
1374 error(msg)
1374 error(msg)
1375 return
1375 return
1376
1376
1377 arg_str = 'execfile(filename,prog_ns)'
1377 arg_str = 'execfile(filename,prog_ns)'
1378 namespace = locals()
1378 namespace = locals()
1379
1379
1380 opts.merge(opts_def)
1380 opts.merge(opts_def)
1381
1381
1382 prof = profile.Profile()
1382 prof = profile.Profile()
1383 try:
1383 try:
1384 prof = prof.runctx(arg_str,namespace,namespace)
1384 prof = prof.runctx(arg_str,namespace,namespace)
1385 sys_exit = ''
1385 sys_exit = ''
1386 except SystemExit:
1386 except SystemExit:
1387 sys_exit = """*** SystemExit exception caught in code being profiled."""
1387 sys_exit = """*** SystemExit exception caught in code being profiled."""
1388
1388
1389 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1389 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1390
1390
1391 lims = opts.l
1391 lims = opts.l
1392 if lims:
1392 if lims:
1393 lims = [] # rebuild lims with ints/floats/strings
1393 lims = [] # rebuild lims with ints/floats/strings
1394 for lim in opts.l:
1394 for lim in opts.l:
1395 try:
1395 try:
1396 lims.append(int(lim))
1396 lims.append(int(lim))
1397 except ValueError:
1397 except ValueError:
1398 try:
1398 try:
1399 lims.append(float(lim))
1399 lims.append(float(lim))
1400 except ValueError:
1400 except ValueError:
1401 lims.append(lim)
1401 lims.append(lim)
1402
1402
1403 # Trap output.
1403 # Trap output.
1404 stdout_trap = StringIO()
1404 stdout_trap = StringIO()
1405
1405
1406 if hasattr(stats,'stream'):
1406 if hasattr(stats,'stream'):
1407 # In newer versions of python, the stats object has a 'stream'
1407 # In newer versions of python, the stats object has a 'stream'
1408 # attribute to write into.
1408 # attribute to write into.
1409 stats.stream = stdout_trap
1409 stats.stream = stdout_trap
1410 stats.print_stats(*lims)
1410 stats.print_stats(*lims)
1411 else:
1411 else:
1412 # For older versions, we manually redirect stdout during printing
1412 # For older versions, we manually redirect stdout during printing
1413 sys_stdout = sys.stdout
1413 sys_stdout = sys.stdout
1414 try:
1414 try:
1415 sys.stdout = stdout_trap
1415 sys.stdout = stdout_trap
1416 stats.print_stats(*lims)
1416 stats.print_stats(*lims)
1417 finally:
1417 finally:
1418 sys.stdout = sys_stdout
1418 sys.stdout = sys_stdout
1419
1419
1420 output = stdout_trap.getvalue()
1420 output = stdout_trap.getvalue()
1421 output = output.rstrip()
1421 output = output.rstrip()
1422
1422
1423 page.page(output)
1423 page.page(output)
1424 print sys_exit,
1424 print sys_exit,
1425
1425
1426 dump_file = opts.D[0]
1426 dump_file = opts.D[0]
1427 text_file = opts.T[0]
1427 text_file = opts.T[0]
1428 if dump_file:
1428 if dump_file:
1429 dump_file = unquote_filename(dump_file)
1429 dump_file = unquote_filename(dump_file)
1430 prof.dump_stats(dump_file)
1430 prof.dump_stats(dump_file)
1431 print '\n*** Profile stats marshalled to file',\
1431 print '\n*** Profile stats marshalled to file',\
1432 `dump_file`+'.',sys_exit
1432 `dump_file`+'.',sys_exit
1433 if text_file:
1433 if text_file:
1434 text_file = unquote_filename(text_file)
1434 text_file = unquote_filename(text_file)
1435 pfile = file(text_file,'w')
1435 pfile = file(text_file,'w')
1436 pfile.write(output)
1436 pfile.write(output)
1437 pfile.close()
1437 pfile.close()
1438 print '\n*** Profile printout saved to text file',\
1438 print '\n*** Profile printout saved to text file',\
1439 `text_file`+'.',sys_exit
1439 `text_file`+'.',sys_exit
1440
1440
1441 if opts.has_key('r'):
1441 if opts.has_key('r'):
1442 return stats
1442 return stats
1443 else:
1443 else:
1444 return None
1444 return None
1445
1445
1446 @skip_doctest
1446 @skip_doctest
1447 def magic_run(self, parameter_s ='',runner=None,
1447 def magic_run(self, parameter_s ='',runner=None,
1448 file_finder=get_py_filename):
1448 file_finder=get_py_filename):
1449 """Run the named file inside IPython as a program.
1449 """Run the named file inside IPython as a program.
1450
1450
1451 Usage:\\
1451 Usage:\\
1452 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1452 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1453
1453
1454 Parameters after the filename are passed as command-line arguments to
1454 Parameters after the filename are passed as command-line arguments to
1455 the program (put in sys.argv). Then, control returns to IPython's
1455 the program (put in sys.argv). Then, control returns to IPython's
1456 prompt.
1456 prompt.
1457
1457
1458 This is similar to running at a system prompt:\\
1458 This is similar to running at a system prompt:\\
1459 $ python file args\\
1459 $ python file args\\
1460 but with the advantage of giving you IPython's tracebacks, and of
1460 but with the advantage of giving you IPython's tracebacks, and of
1461 loading all variables into your interactive namespace for further use
1461 loading all variables into your interactive namespace for further use
1462 (unless -p is used, see below).
1462 (unless -p is used, see below).
1463
1463
1464 The file is executed in a namespace initially consisting only of
1464 The file is executed in a namespace initially consisting only of
1465 __name__=='__main__' and sys.argv constructed as indicated. It thus
1465 __name__=='__main__' and sys.argv constructed as indicated. It thus
1466 sees its environment as if it were being run as a stand-alone program
1466 sees its environment as if it were being run as a stand-alone program
1467 (except for sharing global objects such as previously imported
1467 (except for sharing global objects such as previously imported
1468 modules). But after execution, the IPython interactive namespace gets
1468 modules). But after execution, the IPython interactive namespace gets
1469 updated with all variables defined in the program (except for __name__
1469 updated with all variables defined in the program (except for __name__
1470 and sys.argv). This allows for very convenient loading of code for
1470 and sys.argv). This allows for very convenient loading of code for
1471 interactive work, while giving each program a 'clean sheet' to run in.
1471 interactive work, while giving each program a 'clean sheet' to run in.
1472
1472
1473 Options:
1473 Options:
1474
1474
1475 -n: __name__ is NOT set to '__main__', but to the running file's name
1475 -n: __name__ is NOT set to '__main__', but to the running file's name
1476 without extension (as python does under import). This allows running
1476 without extension (as python does under import). This allows running
1477 scripts and reloading the definitions in them without calling code
1477 scripts and reloading the definitions in them without calling code
1478 protected by an ' if __name__ == "__main__" ' clause.
1478 protected by an ' if __name__ == "__main__" ' clause.
1479
1479
1480 -i: run the file in IPython's namespace instead of an empty one. This
1480 -i: run the file in IPython's namespace instead of an empty one. This
1481 is useful if you are experimenting with code written in a text editor
1481 is useful if you are experimenting with code written in a text editor
1482 which depends on variables defined interactively.
1482 which depends on variables defined interactively.
1483
1483
1484 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1484 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1485 being run. This is particularly useful if IPython is being used to
1485 being run. This is particularly useful if IPython is being used to
1486 run unittests, which always exit with a sys.exit() call. In such
1486 run unittests, which always exit with a sys.exit() call. In such
1487 cases you are interested in the output of the test results, not in
1487 cases you are interested in the output of the test results, not in
1488 seeing a traceback of the unittest module.
1488 seeing a traceback of the unittest module.
1489
1489
1490 -t: print timing information at the end of the run. IPython will give
1490 -t: print timing information at the end of the run. IPython will give
1491 you an estimated CPU time consumption for your script, which under
1491 you an estimated CPU time consumption for your script, which under
1492 Unix uses the resource module to avoid the wraparound problems of
1492 Unix uses the resource module to avoid the wraparound problems of
1493 time.clock(). Under Unix, an estimate of time spent on system tasks
1493 time.clock(). Under Unix, an estimate of time spent on system tasks
1494 is also given (for Windows platforms this is reported as 0.0).
1494 is also given (for Windows platforms this is reported as 0.0).
1495
1495
1496 If -t is given, an additional -N<N> option can be given, where <N>
1496 If -t is given, an additional -N<N> option can be given, where <N>
1497 must be an integer indicating how many times you want the script to
1497 must be an integer indicating how many times you want the script to
1498 run. The final timing report will include total and per run results.
1498 run. The final timing report will include total and per run results.
1499
1499
1500 For example (testing the script uniq_stable.py):
1500 For example (testing the script uniq_stable.py):
1501
1501
1502 In [1]: run -t uniq_stable
1502 In [1]: run -t uniq_stable
1503
1503
1504 IPython CPU timings (estimated):\\
1504 IPython CPU timings (estimated):\\
1505 User : 0.19597 s.\\
1505 User : 0.19597 s.\\
1506 System: 0.0 s.\\
1506 System: 0.0 s.\\
1507
1507
1508 In [2]: run -t -N5 uniq_stable
1508 In [2]: run -t -N5 uniq_stable
1509
1509
1510 IPython CPU timings (estimated):\\
1510 IPython CPU timings (estimated):\\
1511 Total runs performed: 5\\
1511 Total runs performed: 5\\
1512 Times : Total Per run\\
1512 Times : Total Per run\\
1513 User : 0.910862 s, 0.1821724 s.\\
1513 User : 0.910862 s, 0.1821724 s.\\
1514 System: 0.0 s, 0.0 s.
1514 System: 0.0 s, 0.0 s.
1515
1515
1516 -d: run your program under the control of pdb, the Python debugger.
1516 -d: run your program under the control of pdb, the Python debugger.
1517 This allows you to execute your program step by step, watch variables,
1517 This allows you to execute your program step by step, watch variables,
1518 etc. Internally, what IPython does is similar to calling:
1518 etc. Internally, what IPython does is similar to calling:
1519
1519
1520 pdb.run('execfile("YOURFILENAME")')
1520 pdb.run('execfile("YOURFILENAME")')
1521
1521
1522 with a breakpoint set on line 1 of your file. You can change the line
1522 with a breakpoint set on line 1 of your file. You can change the line
1523 number for this automatic breakpoint to be <N> by using the -bN option
1523 number for this automatic breakpoint to be <N> by using the -bN option
1524 (where N must be an integer). For example:
1524 (where N must be an integer). For example:
1525
1525
1526 %run -d -b40 myscript
1526 %run -d -b40 myscript
1527
1527
1528 will set the first breakpoint at line 40 in myscript.py. Note that
1528 will set the first breakpoint at line 40 in myscript.py. Note that
1529 the first breakpoint must be set on a line which actually does
1529 the first breakpoint must be set on a line which actually does
1530 something (not a comment or docstring) for it to stop execution.
1530 something (not a comment or docstring) for it to stop execution.
1531
1531
1532 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1532 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1533 first enter 'c' (without qoutes) to start execution up to the first
1533 first enter 'c' (without qoutes) to start execution up to the first
1534 breakpoint.
1534 breakpoint.
1535
1535
1536 Entering 'help' gives information about the use of the debugger. You
1536 Entering 'help' gives information about the use of the debugger. You
1537 can easily see pdb's full documentation with "import pdb;pdb.help()"
1537 can easily see pdb's full documentation with "import pdb;pdb.help()"
1538 at a prompt.
1538 at a prompt.
1539
1539
1540 -p: run program under the control of the Python profiler module (which
1540 -p: run program under the control of the Python profiler module (which
1541 prints a detailed report of execution times, function calls, etc).
1541 prints a detailed report of execution times, function calls, etc).
1542
1542
1543 You can pass other options after -p which affect the behavior of the
1543 You can pass other options after -p which affect the behavior of the
1544 profiler itself. See the docs for %prun for details.
1544 profiler itself. See the docs for %prun for details.
1545
1545
1546 In this mode, the program's variables do NOT propagate back to the
1546 In this mode, the program's variables do NOT propagate back to the
1547 IPython interactive namespace (because they remain in the namespace
1547 IPython interactive namespace (because they remain in the namespace
1548 where the profiler executes them).
1548 where the profiler executes them).
1549
1549
1550 Internally this triggers a call to %prun, see its documentation for
1550 Internally this triggers a call to %prun, see its documentation for
1551 details on the options available specifically for profiling.
1551 details on the options available specifically for profiling.
1552
1552
1553 There is one special usage for which the text above doesn't apply:
1553 There is one special usage for which the text above doesn't apply:
1554 if the filename ends with .ipy, the file is run as ipython script,
1554 if the filename ends with .ipy, the file is run as ipython script,
1555 just as if the commands were written on IPython prompt.
1555 just as if the commands were written on IPython prompt.
1556 """
1556 """
1557
1557
1558 # get arguments and set sys.argv for program to be run.
1558 # get arguments and set sys.argv for program to be run.
1559 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1559 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1560 mode='list',list_all=1)
1560 mode='list',list_all=1)
1561
1561
1562 try:
1562 try:
1563 filename = file_finder(arg_lst[0])
1563 filename = file_finder(arg_lst[0])
1564 except IndexError:
1564 except IndexError:
1565 warn('you must provide at least a filename.')
1565 warn('you must provide at least a filename.')
1566 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1566 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1567 return
1567 return
1568 except IOError,msg:
1568 except IOError,msg:
1569 error(msg)
1569 error(msg)
1570 return
1570 return
1571
1571
1572 if filename.lower().endswith('.ipy'):
1572 if filename.lower().endswith('.ipy'):
1573 self.shell.safe_execfile_ipy(filename)
1573 self.shell.safe_execfile_ipy(filename)
1574 return
1574 return
1575
1575
1576 # Control the response to exit() calls made by the script being run
1576 # Control the response to exit() calls made by the script being run
1577 exit_ignore = opts.has_key('e')
1577 exit_ignore = opts.has_key('e')
1578
1578
1579 # Make sure that the running script gets a proper sys.argv as if it
1579 # Make sure that the running script gets a proper sys.argv as if it
1580 # were run from a system shell.
1580 # were run from a system shell.
1581 save_argv = sys.argv # save it for later restoring
1581 save_argv = sys.argv # save it for later restoring
1582
1582
1583 # simulate shell expansion on arguments, at least tilde expansion
1583 # simulate shell expansion on arguments, at least tilde expansion
1584 args = [ os.path.expanduser(a) for a in arg_lst[1:] ]
1584 args = [ os.path.expanduser(a) for a in arg_lst[1:] ]
1585
1585
1586 sys.argv = [filename]+ args # put in the proper filename
1586 sys.argv = [filename]+ args # put in the proper filename
1587
1587
1588 if opts.has_key('i'):
1588 if opts.has_key('i'):
1589 # Run in user's interactive namespace
1589 # Run in user's interactive namespace
1590 prog_ns = self.shell.user_ns
1590 prog_ns = self.shell.user_ns
1591 __name__save = self.shell.user_ns['__name__']
1591 __name__save = self.shell.user_ns['__name__']
1592 prog_ns['__name__'] = '__main__'
1592 prog_ns['__name__'] = '__main__'
1593 main_mod = self.shell.new_main_mod(prog_ns)
1593 main_mod = self.shell.new_main_mod(prog_ns)
1594 else:
1594 else:
1595 # Run in a fresh, empty namespace
1595 # Run in a fresh, empty namespace
1596 if opts.has_key('n'):
1596 if opts.has_key('n'):
1597 name = os.path.splitext(os.path.basename(filename))[0]
1597 name = os.path.splitext(os.path.basename(filename))[0]
1598 else:
1598 else:
1599 name = '__main__'
1599 name = '__main__'
1600
1600
1601 main_mod = self.shell.new_main_mod()
1601 main_mod = self.shell.new_main_mod()
1602 prog_ns = main_mod.__dict__
1602 prog_ns = main_mod.__dict__
1603 prog_ns['__name__'] = name
1603 prog_ns['__name__'] = name
1604
1604
1605 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1605 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1606 # set the __file__ global in the script's namespace
1606 # set the __file__ global in the script's namespace
1607 prog_ns['__file__'] = filename
1607 prog_ns['__file__'] = filename
1608
1608
1609 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1609 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1610 # that, if we overwrite __main__, we replace it at the end
1610 # that, if we overwrite __main__, we replace it at the end
1611 main_mod_name = prog_ns['__name__']
1611 main_mod_name = prog_ns['__name__']
1612
1612
1613 if main_mod_name == '__main__':
1613 if main_mod_name == '__main__':
1614 restore_main = sys.modules['__main__']
1614 restore_main = sys.modules['__main__']
1615 else:
1615 else:
1616 restore_main = False
1616 restore_main = False
1617
1617
1618 # This needs to be undone at the end to prevent holding references to
1618 # This needs to be undone at the end to prevent holding references to
1619 # every single object ever created.
1619 # every single object ever created.
1620 sys.modules[main_mod_name] = main_mod
1620 sys.modules[main_mod_name] = main_mod
1621
1621
1622 try:
1622 try:
1623 stats = None
1623 stats = None
1624 with self.readline_no_record:
1624 with self.readline_no_record:
1625 if opts.has_key('p'):
1625 if opts.has_key('p'):
1626 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1626 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1627 else:
1627 else:
1628 if opts.has_key('d'):
1628 if opts.has_key('d'):
1629 deb = debugger.Pdb(self.shell.colors)
1629 deb = debugger.Pdb(self.shell.colors)
1630 # reset Breakpoint state, which is moronically kept
1630 # reset Breakpoint state, which is moronically kept
1631 # in a class
1631 # in a class
1632 bdb.Breakpoint.next = 1
1632 bdb.Breakpoint.next = 1
1633 bdb.Breakpoint.bplist = {}
1633 bdb.Breakpoint.bplist = {}
1634 bdb.Breakpoint.bpbynumber = [None]
1634 bdb.Breakpoint.bpbynumber = [None]
1635 # Set an initial breakpoint to stop execution
1635 # Set an initial breakpoint to stop execution
1636 maxtries = 10
1636 maxtries = 10
1637 bp = int(opts.get('b',[1])[0])
1637 bp = int(opts.get('b',[1])[0])
1638 checkline = deb.checkline(filename,bp)
1638 checkline = deb.checkline(filename,bp)
1639 if not checkline:
1639 if not checkline:
1640 for bp in range(bp+1,bp+maxtries+1):
1640 for bp in range(bp+1,bp+maxtries+1):
1641 if deb.checkline(filename,bp):
1641 if deb.checkline(filename,bp):
1642 break
1642 break
1643 else:
1643 else:
1644 msg = ("\nI failed to find a valid line to set "
1644 msg = ("\nI failed to find a valid line to set "
1645 "a breakpoint\n"
1645 "a breakpoint\n"
1646 "after trying up to line: %s.\n"
1646 "after trying up to line: %s.\n"
1647 "Please set a valid breakpoint manually "
1647 "Please set a valid breakpoint manually "
1648 "with the -b option." % bp)
1648 "with the -b option." % bp)
1649 error(msg)
1649 error(msg)
1650 return
1650 return
1651 # if we find a good linenumber, set the breakpoint
1651 # if we find a good linenumber, set the breakpoint
1652 deb.do_break('%s:%s' % (filename,bp))
1652 deb.do_break('%s:%s' % (filename,bp))
1653 # Start file run
1653 # Start file run
1654 print "NOTE: Enter 'c' at the",
1654 print "NOTE: Enter 'c' at the",
1655 print "%s prompt to start your script." % deb.prompt
1655 print "%s prompt to start your script." % deb.prompt
1656 try:
1656 try:
1657 deb.run('execfile("%s")' % filename,prog_ns)
1657 deb.run('execfile("%s")' % filename,prog_ns)
1658
1658
1659 except:
1659 except:
1660 etype, value, tb = sys.exc_info()
1660 etype, value, tb = sys.exc_info()
1661 # Skip three frames in the traceback: the %run one,
1661 # Skip three frames in the traceback: the %run one,
1662 # one inside bdb.py, and the command-line typed by the
1662 # one inside bdb.py, and the command-line typed by the
1663 # user (run by exec in pdb itself).
1663 # user (run by exec in pdb itself).
1664 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1664 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1665 else:
1665 else:
1666 if runner is None:
1666 if runner is None:
1667 runner = self.shell.safe_execfile
1667 runner = self.shell.safe_execfile
1668 if opts.has_key('t'):
1668 if opts.has_key('t'):
1669 # timed execution
1669 # timed execution
1670 try:
1670 try:
1671 nruns = int(opts['N'][0])
1671 nruns = int(opts['N'][0])
1672 if nruns < 1:
1672 if nruns < 1:
1673 error('Number of runs must be >=1')
1673 error('Number of runs must be >=1')
1674 return
1674 return
1675 except (KeyError):
1675 except (KeyError):
1676 nruns = 1
1676 nruns = 1
1677 twall0 = time.time()
1677 twall0 = time.time()
1678 if nruns == 1:
1678 if nruns == 1:
1679 t0 = clock2()
1679 t0 = clock2()
1680 runner(filename,prog_ns,prog_ns,
1680 runner(filename,prog_ns,prog_ns,
1681 exit_ignore=exit_ignore)
1681 exit_ignore=exit_ignore)
1682 t1 = clock2()
1682 t1 = clock2()
1683 t_usr = t1[0]-t0[0]
1683 t_usr = t1[0]-t0[0]
1684 t_sys = t1[1]-t0[1]
1684 t_sys = t1[1]-t0[1]
1685 print "\nIPython CPU timings (estimated):"
1685 print "\nIPython CPU timings (estimated):"
1686 print " User : %10.2f s." % t_usr
1686 print " User : %10.2f s." % t_usr
1687 print " System : %10.2f s." % t_sys
1687 print " System : %10.2f s." % t_sys
1688 else:
1688 else:
1689 runs = range(nruns)
1689 runs = range(nruns)
1690 t0 = clock2()
1690 t0 = clock2()
1691 for nr in runs:
1691 for nr in runs:
1692 runner(filename,prog_ns,prog_ns,
1692 runner(filename,prog_ns,prog_ns,
1693 exit_ignore=exit_ignore)
1693 exit_ignore=exit_ignore)
1694 t1 = clock2()
1694 t1 = clock2()
1695 t_usr = t1[0]-t0[0]
1695 t_usr = t1[0]-t0[0]
1696 t_sys = t1[1]-t0[1]
1696 t_sys = t1[1]-t0[1]
1697 print "\nIPython CPU timings (estimated):"
1697 print "\nIPython CPU timings (estimated):"
1698 print "Total runs performed:",nruns
1698 print "Total runs performed:",nruns
1699 print " Times : %10.2f %10.2f" % ('Total','Per run')
1699 print " Times : %10.2f %10.2f" % ('Total','Per run')
1700 print " User : %10.2f s, %10.2f s." % (t_usr,t_usr/nruns)
1700 print " User : %10.2f s, %10.2f s." % (t_usr,t_usr/nruns)
1701 print " System : %10.2f s, %10.2f s." % (t_sys,t_sys/nruns)
1701 print " System : %10.2f s, %10.2f s." % (t_sys,t_sys/nruns)
1702 twall1 = time.time()
1702 twall1 = time.time()
1703 print "Wall time: %10.2f s." % (twall1-twall0)
1703 print "Wall time: %10.2f s." % (twall1-twall0)
1704
1704
1705 else:
1705 else:
1706 # regular execution
1706 # regular execution
1707 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1707 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1708
1708
1709 if opts.has_key('i'):
1709 if opts.has_key('i'):
1710 self.shell.user_ns['__name__'] = __name__save
1710 self.shell.user_ns['__name__'] = __name__save
1711 else:
1711 else:
1712 # The shell MUST hold a reference to prog_ns so after %run
1712 # The shell MUST hold a reference to prog_ns so after %run
1713 # exits, the python deletion mechanism doesn't zero it out
1713 # exits, the python deletion mechanism doesn't zero it out
1714 # (leaving dangling references).
1714 # (leaving dangling references).
1715 self.shell.cache_main_mod(prog_ns,filename)
1715 self.shell.cache_main_mod(prog_ns,filename)
1716 # update IPython interactive namespace
1716 # update IPython interactive namespace
1717
1717
1718 # Some forms of read errors on the file may mean the
1718 # Some forms of read errors on the file may mean the
1719 # __name__ key was never set; using pop we don't have to
1719 # __name__ key was never set; using pop we don't have to
1720 # worry about a possible KeyError.
1720 # worry about a possible KeyError.
1721 prog_ns.pop('__name__', None)
1721 prog_ns.pop('__name__', None)
1722
1722
1723 self.shell.user_ns.update(prog_ns)
1723 self.shell.user_ns.update(prog_ns)
1724 finally:
1724 finally:
1725 # It's a bit of a mystery why, but __builtins__ can change from
1725 # It's a bit of a mystery why, but __builtins__ can change from
1726 # being a module to becoming a dict missing some key data after
1726 # being a module to becoming a dict missing some key data after
1727 # %run. As best I can see, this is NOT something IPython is doing
1727 # %run. As best I can see, this is NOT something IPython is doing
1728 # at all, and similar problems have been reported before:
1728 # at all, and similar problems have been reported before:
1729 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1729 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1730 # Since this seems to be done by the interpreter itself, the best
1730 # Since this seems to be done by the interpreter itself, the best
1731 # we can do is to at least restore __builtins__ for the user on
1731 # we can do is to at least restore __builtins__ for the user on
1732 # exit.
1732 # exit.
1733 self.shell.user_ns['__builtins__'] = builtin_mod
1733 self.shell.user_ns['__builtins__'] = builtin_mod
1734
1734
1735 # Ensure key global structures are restored
1735 # Ensure key global structures are restored
1736 sys.argv = save_argv
1736 sys.argv = save_argv
1737 if restore_main:
1737 if restore_main:
1738 sys.modules['__main__'] = restore_main
1738 sys.modules['__main__'] = restore_main
1739 else:
1739 else:
1740 # Remove from sys.modules the reference to main_mod we'd
1740 # Remove from sys.modules the reference to main_mod we'd
1741 # added. Otherwise it will trap references to objects
1741 # added. Otherwise it will trap references to objects
1742 # contained therein.
1742 # contained therein.
1743 del sys.modules[main_mod_name]
1743 del sys.modules[main_mod_name]
1744
1744
1745 return stats
1745 return stats
1746
1746
1747 @skip_doctest
1747 @skip_doctest
1748 def magic_timeit(self, parameter_s =''):
1748 def magic_timeit(self, parameter_s =''):
1749 """Time execution of a Python statement or expression
1749 """Time execution of a Python statement or expression
1750
1750
1751 Usage:\\
1751 Usage:\\
1752 %timeit [-n<N> -r<R> [-t|-c]] statement
1752 %timeit [-n<N> -r<R> [-t|-c]] statement
1753
1753
1754 Time execution of a Python statement or expression using the timeit
1754 Time execution of a Python statement or expression using the timeit
1755 module.
1755 module.
1756
1756
1757 Options:
1757 Options:
1758 -n<N>: execute the given statement <N> times in a loop. If this value
1758 -n<N>: execute the given statement <N> times in a loop. If this value
1759 is not given, a fitting value is chosen.
1759 is not given, a fitting value is chosen.
1760
1760
1761 -r<R>: repeat the loop iteration <R> times and take the best result.
1761 -r<R>: repeat the loop iteration <R> times and take the best result.
1762 Default: 3
1762 Default: 3
1763
1763
1764 -t: use time.time to measure the time, which is the default on Unix.
1764 -t: use time.time to measure the time, which is the default on Unix.
1765 This function measures wall time.
1765 This function measures wall time.
1766
1766
1767 -c: use time.clock to measure the time, which is the default on
1767 -c: use time.clock to measure the time, which is the default on
1768 Windows and measures wall time. On Unix, resource.getrusage is used
1768 Windows and measures wall time. On Unix, resource.getrusage is used
1769 instead and returns the CPU user time.
1769 instead and returns the CPU user time.
1770
1770
1771 -p<P>: use a precision of <P> digits to display the timing result.
1771 -p<P>: use a precision of <P> digits to display the timing result.
1772 Default: 3
1772 Default: 3
1773
1773
1774
1774
1775 Examples:
1775 Examples:
1776
1776
1777 In [1]: %timeit pass
1777 In [1]: %timeit pass
1778 10000000 loops, best of 3: 53.3 ns per loop
1778 10000000 loops, best of 3: 53.3 ns per loop
1779
1779
1780 In [2]: u = None
1780 In [2]: u = None
1781
1781
1782 In [3]: %timeit u is None
1782 In [3]: %timeit u is None
1783 10000000 loops, best of 3: 184 ns per loop
1783 10000000 loops, best of 3: 184 ns per loop
1784
1784
1785 In [4]: %timeit -r 4 u == None
1785 In [4]: %timeit -r 4 u == None
1786 1000000 loops, best of 4: 242 ns per loop
1786 1000000 loops, best of 4: 242 ns per loop
1787
1787
1788 In [5]: import time
1788 In [5]: import time
1789
1789
1790 In [6]: %timeit -n1 time.sleep(2)
1790 In [6]: %timeit -n1 time.sleep(2)
1791 1 loops, best of 3: 2 s per loop
1791 1 loops, best of 3: 2 s per loop
1792
1792
1793
1793
1794 The times reported by %timeit will be slightly higher than those
1794 The times reported by %timeit will be slightly higher than those
1795 reported by the timeit.py script when variables are accessed. This is
1795 reported by the timeit.py script when variables are accessed. This is
1796 due to the fact that %timeit executes the statement in the namespace
1796 due to the fact that %timeit executes the statement in the namespace
1797 of the shell, compared with timeit.py, which uses a single setup
1797 of the shell, compared with timeit.py, which uses a single setup
1798 statement to import function or create variables. Generally, the bias
1798 statement to import function or create variables. Generally, the bias
1799 does not matter as long as results from timeit.py are not mixed with
1799 does not matter as long as results from timeit.py are not mixed with
1800 those from %timeit."""
1800 those from %timeit."""
1801
1801
1802 import timeit
1802 import timeit
1803 import math
1803 import math
1804
1804
1805 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1805 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1806 # certain terminals. Until we figure out a robust way of
1806 # certain terminals. Until we figure out a robust way of
1807 # auto-detecting if the terminal can deal with it, use plain 'us' for
1807 # auto-detecting if the terminal can deal with it, use plain 'us' for
1808 # microseconds. I am really NOT happy about disabling the proper
1808 # microseconds. I am really NOT happy about disabling the proper
1809 # 'micro' prefix, but crashing is worse... If anyone knows what the
1809 # 'micro' prefix, but crashing is worse... If anyone knows what the
1810 # right solution for this is, I'm all ears...
1810 # right solution for this is, I'm all ears...
1811 #
1811 #
1812 # Note: using
1812 # Note: using
1813 #
1813 #
1814 # s = u'\xb5'
1814 # s = u'\xb5'
1815 # s.encode(sys.getdefaultencoding())
1815 # s.encode(sys.getdefaultencoding())
1816 #
1816 #
1817 # is not sufficient, as I've seen terminals where that fails but
1817 # is not sufficient, as I've seen terminals where that fails but
1818 # print s
1818 # print s
1819 #
1819 #
1820 # succeeds
1820 # succeeds
1821 #
1821 #
1822 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1822 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1823
1823
1824 #units = [u"s", u"ms",u'\xb5',"ns"]
1824 #units = [u"s", u"ms",u'\xb5',"ns"]
1825 units = [u"s", u"ms",u'us',"ns"]
1825 units = [u"s", u"ms",u'us',"ns"]
1826
1826
1827 scaling = [1, 1e3, 1e6, 1e9]
1827 scaling = [1, 1e3, 1e6, 1e9]
1828
1828
1829 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1829 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1830 posix=False)
1830 posix=False)
1831 if stmt == "":
1831 if stmt == "":
1832 return
1832 return
1833 timefunc = timeit.default_timer
1833 timefunc = timeit.default_timer
1834 number = int(getattr(opts, "n", 0))
1834 number = int(getattr(opts, "n", 0))
1835 repeat = int(getattr(opts, "r", timeit.default_repeat))
1835 repeat = int(getattr(opts, "r", timeit.default_repeat))
1836 precision = int(getattr(opts, "p", 3))
1836 precision = int(getattr(opts, "p", 3))
1837 if hasattr(opts, "t"):
1837 if hasattr(opts, "t"):
1838 timefunc = time.time
1838 timefunc = time.time
1839 if hasattr(opts, "c"):
1839 if hasattr(opts, "c"):
1840 timefunc = clock
1840 timefunc = clock
1841
1841
1842 timer = timeit.Timer(timer=timefunc)
1842 timer = timeit.Timer(timer=timefunc)
1843 # this code has tight coupling to the inner workings of timeit.Timer,
1843 # this code has tight coupling to the inner workings of timeit.Timer,
1844 # but is there a better way to achieve that the code stmt has access
1844 # but is there a better way to achieve that the code stmt has access
1845 # to the shell namespace?
1845 # to the shell namespace?
1846
1846
1847 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1847 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1848 'setup': "pass"}
1848 'setup': "pass"}
1849 # Track compilation time so it can be reported if too long
1849 # Track compilation time so it can be reported if too long
1850 # Minimum time above which compilation time will be reported
1850 # Minimum time above which compilation time will be reported
1851 tc_min = 0.1
1851 tc_min = 0.1
1852
1852
1853 t0 = clock()
1853 t0 = clock()
1854 code = compile(src, "<magic-timeit>", "exec")
1854 code = compile(src, "<magic-timeit>", "exec")
1855 tc = clock()-t0
1855 tc = clock()-t0
1856
1856
1857 ns = {}
1857 ns = {}
1858 exec code in self.shell.user_ns, ns
1858 exec code in self.shell.user_ns, ns
1859 timer.inner = ns["inner"]
1859 timer.inner = ns["inner"]
1860
1860
1861 if number == 0:
1861 if number == 0:
1862 # determine number so that 0.2 <= total time < 2.0
1862 # determine number so that 0.2 <= total time < 2.0
1863 number = 1
1863 number = 1
1864 for i in range(1, 10):
1864 for i in range(1, 10):
1865 if timer.timeit(number) >= 0.2:
1865 if timer.timeit(number) >= 0.2:
1866 break
1866 break
1867 number *= 10
1867 number *= 10
1868
1868
1869 best = min(timer.repeat(repeat, number)) / number
1869 best = min(timer.repeat(repeat, number)) / number
1870
1870
1871 if best > 0.0 and best < 1000.0:
1871 if best > 0.0 and best < 1000.0:
1872 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1872 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1873 elif best >= 1000.0:
1873 elif best >= 1000.0:
1874 order = 0
1874 order = 0
1875 else:
1875 else:
1876 order = 3
1876 order = 3
1877 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1877 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1878 precision,
1878 precision,
1879 best * scaling[order],
1879 best * scaling[order],
1880 units[order])
1880 units[order])
1881 if tc > tc_min:
1881 if tc > tc_min:
1882 print "Compiler time: %.2f s" % tc
1882 print "Compiler time: %.2f s" % tc
1883
1883
1884 @skip_doctest
1884 @skip_doctest
1885 @needs_local_scope
1885 @needs_local_scope
1886 def magic_time(self,parameter_s = ''):
1886 def magic_time(self,parameter_s = ''):
1887 """Time execution of a Python statement or expression.
1887 """Time execution of a Python statement or expression.
1888
1888
1889 The CPU and wall clock times are printed, and the value of the
1889 The CPU and wall clock times are printed, and the value of the
1890 expression (if any) is returned. Note that under Win32, system time
1890 expression (if any) is returned. Note that under Win32, system time
1891 is always reported as 0, since it can not be measured.
1891 is always reported as 0, since it can not be measured.
1892
1892
1893 This function provides very basic timing functionality. In Python
1893 This function provides very basic timing functionality. In Python
1894 2.3, the timeit module offers more control and sophistication, so this
1894 2.3, the timeit module offers more control and sophistication, so this
1895 could be rewritten to use it (patches welcome).
1895 could be rewritten to use it (patches welcome).
1896
1896
1897 Some examples:
1897 Some examples:
1898
1898
1899 In [1]: time 2**128
1899 In [1]: time 2**128
1900 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1900 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1901 Wall time: 0.00
1901 Wall time: 0.00
1902 Out[1]: 340282366920938463463374607431768211456L
1902 Out[1]: 340282366920938463463374607431768211456L
1903
1903
1904 In [2]: n = 1000000
1904 In [2]: n = 1000000
1905
1905
1906 In [3]: time sum(range(n))
1906 In [3]: time sum(range(n))
1907 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1907 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1908 Wall time: 1.37
1908 Wall time: 1.37
1909 Out[3]: 499999500000L
1909 Out[3]: 499999500000L
1910
1910
1911 In [4]: time print 'hello world'
1911 In [4]: time print 'hello world'
1912 hello world
1912 hello world
1913 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1913 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1914 Wall time: 0.00
1914 Wall time: 0.00
1915
1915
1916 Note that the time needed by Python to compile the given expression
1916 Note that the time needed by Python to compile the given expression
1917 will be reported if it is more than 0.1s. In this example, the
1917 will be reported if it is more than 0.1s. In this example, the
1918 actual exponentiation is done by Python at compilation time, so while
1918 actual exponentiation is done by Python at compilation time, so while
1919 the expression can take a noticeable amount of time to compute, that
1919 the expression can take a noticeable amount of time to compute, that
1920 time is purely due to the compilation:
1920 time is purely due to the compilation:
1921
1921
1922 In [5]: time 3**9999;
1922 In [5]: time 3**9999;
1923 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1923 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1924 Wall time: 0.00 s
1924 Wall time: 0.00 s
1925
1925
1926 In [6]: time 3**999999;
1926 In [6]: time 3**999999;
1927 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1927 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1928 Wall time: 0.00 s
1928 Wall time: 0.00 s
1929 Compiler : 0.78 s
1929 Compiler : 0.78 s
1930 """
1930 """
1931
1931
1932 # fail immediately if the given expression can't be compiled
1932 # fail immediately if the given expression can't be compiled
1933
1933
1934 expr = self.shell.prefilter(parameter_s,False)
1934 expr = self.shell.prefilter(parameter_s,False)
1935
1935
1936 # Minimum time above which compilation time will be reported
1936 # Minimum time above which compilation time will be reported
1937 tc_min = 0.1
1937 tc_min = 0.1
1938
1938
1939 try:
1939 try:
1940 mode = 'eval'
1940 mode = 'eval'
1941 t0 = clock()
1941 t0 = clock()
1942 code = compile(expr,'<timed eval>',mode)
1942 code = compile(expr,'<timed eval>',mode)
1943 tc = clock()-t0
1943 tc = clock()-t0
1944 except SyntaxError:
1944 except SyntaxError:
1945 mode = 'exec'
1945 mode = 'exec'
1946 t0 = clock()
1946 t0 = clock()
1947 code = compile(expr,'<timed exec>',mode)
1947 code = compile(expr,'<timed exec>',mode)
1948 tc = clock()-t0
1948 tc = clock()-t0
1949 # skew measurement as little as possible
1949 # skew measurement as little as possible
1950 glob = self.shell.user_ns
1950 glob = self.shell.user_ns
1951 locs = self._magic_locals
1951 locs = self._magic_locals
1952 clk = clock2
1952 clk = clock2
1953 wtime = time.time
1953 wtime = time.time
1954 # time execution
1954 # time execution
1955 wall_st = wtime()
1955 wall_st = wtime()
1956 if mode=='eval':
1956 if mode=='eval':
1957 st = clk()
1957 st = clk()
1958 out = eval(code, glob, locs)
1958 out = eval(code, glob, locs)
1959 end = clk()
1959 end = clk()
1960 else:
1960 else:
1961 st = clk()
1961 st = clk()
1962 exec code in glob, locs
1962 exec code in glob, locs
1963 end = clk()
1963 end = clk()
1964 out = None
1964 out = None
1965 wall_end = wtime()
1965 wall_end = wtime()
1966 # Compute actual times and report
1966 # Compute actual times and report
1967 wall_time = wall_end-wall_st
1967 wall_time = wall_end-wall_st
1968 cpu_user = end[0]-st[0]
1968 cpu_user = end[0]-st[0]
1969 cpu_sys = end[1]-st[1]
1969 cpu_sys = end[1]-st[1]
1970 cpu_tot = cpu_user+cpu_sys
1970 cpu_tot = cpu_user+cpu_sys
1971 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1971 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1972 (cpu_user,cpu_sys,cpu_tot)
1972 (cpu_user,cpu_sys,cpu_tot)
1973 print "Wall time: %.2f s" % wall_time
1973 print "Wall time: %.2f s" % wall_time
1974 if tc > tc_min:
1974 if tc > tc_min:
1975 print "Compiler : %.2f s" % tc
1975 print "Compiler : %.2f s" % tc
1976 return out
1976 return out
1977
1977
1978 @skip_doctest
1978 @skip_doctest
1979 def magic_macro(self,parameter_s = ''):
1979 def magic_macro(self,parameter_s = ''):
1980 """Define a macro for future re-execution. It accepts ranges of history,
1980 """Define a macro for future re-execution. It accepts ranges of history,
1981 filenames or string objects.
1981 filenames or string objects.
1982
1982
1983 Usage:\\
1983 Usage:\\
1984 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1984 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1985
1985
1986 Options:
1986 Options:
1987
1987
1988 -r: use 'raw' input. By default, the 'processed' history is used,
1988 -r: use 'raw' input. By default, the 'processed' history is used,
1989 so that magics are loaded in their transformed version to valid
1989 so that magics are loaded in their transformed version to valid
1990 Python. If this option is given, the raw input as typed as the
1990 Python. If this option is given, the raw input as typed as the
1991 command line is used instead.
1991 command line is used instead.
1992
1992
1993 This will define a global variable called `name` which is a string
1993 This will define a global variable called `name` which is a string
1994 made of joining the slices and lines you specify (n1,n2,... numbers
1994 made of joining the slices and lines you specify (n1,n2,... numbers
1995 above) from your input history into a single string. This variable
1995 above) from your input history into a single string. This variable
1996 acts like an automatic function which re-executes those lines as if
1996 acts like an automatic function which re-executes those lines as if
1997 you had typed them. You just type 'name' at the prompt and the code
1997 you had typed them. You just type 'name' at the prompt and the code
1998 executes.
1998 executes.
1999
1999
2000 The syntax for indicating input ranges is described in %history.
2000 The syntax for indicating input ranges is described in %history.
2001
2001
2002 Note: as a 'hidden' feature, you can also use traditional python slice
2002 Note: as a 'hidden' feature, you can also use traditional python slice
2003 notation, where N:M means numbers N through M-1.
2003 notation, where N:M means numbers N through M-1.
2004
2004
2005 For example, if your history contains (%hist prints it):
2005 For example, if your history contains (%hist prints it):
2006
2006
2007 44: x=1
2007 44: x=1
2008 45: y=3
2008 45: y=3
2009 46: z=x+y
2009 46: z=x+y
2010 47: print x
2010 47: print x
2011 48: a=5
2011 48: a=5
2012 49: print 'x',x,'y',y
2012 49: print 'x',x,'y',y
2013
2013
2014 you can create a macro with lines 44 through 47 (included) and line 49
2014 you can create a macro with lines 44 through 47 (included) and line 49
2015 called my_macro with:
2015 called my_macro with:
2016
2016
2017 In [55]: %macro my_macro 44-47 49
2017 In [55]: %macro my_macro 44-47 49
2018
2018
2019 Now, typing `my_macro` (without quotes) will re-execute all this code
2019 Now, typing `my_macro` (without quotes) will re-execute all this code
2020 in one pass.
2020 in one pass.
2021
2021
2022 You don't need to give the line-numbers in order, and any given line
2022 You don't need to give the line-numbers in order, and any given line
2023 number can appear multiple times. You can assemble macros with any
2023 number can appear multiple times. You can assemble macros with any
2024 lines from your input history in any order.
2024 lines from your input history in any order.
2025
2025
2026 The macro is a simple object which holds its value in an attribute,
2026 The macro is a simple object which holds its value in an attribute,
2027 but IPython's display system checks for macros and executes them as
2027 but IPython's display system checks for macros and executes them as
2028 code instead of printing them when you type their name.
2028 code instead of printing them when you type their name.
2029
2029
2030 You can view a macro's contents by explicitly printing it with:
2030 You can view a macro's contents by explicitly printing it with:
2031
2031
2032 'print macro_name'.
2032 'print macro_name'.
2033
2033
2034 """
2034 """
2035 opts,args = self.parse_options(parameter_s,'r',mode='list')
2035 opts,args = self.parse_options(parameter_s,'r',mode='list')
2036 if not args: # List existing macros
2036 if not args: # List existing macros
2037 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
2037 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
2038 isinstance(v, Macro))
2038 isinstance(v, Macro))
2039 if len(args) == 1:
2039 if len(args) == 1:
2040 raise UsageError(
2040 raise UsageError(
2041 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2041 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2042 name, codefrom = args[0], " ".join(args[1:])
2042 name, codefrom = args[0], " ".join(args[1:])
2043
2043
2044 #print 'rng',ranges # dbg
2044 #print 'rng',ranges # dbg
2045 try:
2045 try:
2046 lines = self.shell.find_user_code(codefrom, 'r' in opts)
2046 lines = self.shell.find_user_code(codefrom, 'r' in opts)
2047 except (ValueError, TypeError) as e:
2047 except (ValueError, TypeError) as e:
2048 print e.args[0]
2048 print e.args[0]
2049 return
2049 return
2050 macro = Macro(lines)
2050 macro = Macro(lines)
2051 self.shell.define_macro(name, macro)
2051 self.shell.define_macro(name, macro)
2052 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2052 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2053 print '=== Macro contents: ==='
2053 print '=== Macro contents: ==='
2054 print macro,
2054 print macro,
2055
2055
2056 def magic_save(self,parameter_s = ''):
2056 def magic_save(self,parameter_s = ''):
2057 """Save a set of lines or a macro to a given filename.
2057 """Save a set of lines or a macro to a given filename.
2058
2058
2059 Usage:\\
2059 Usage:\\
2060 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2060 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2061
2061
2062 Options:
2062 Options:
2063
2063
2064 -r: use 'raw' input. By default, the 'processed' history is used,
2064 -r: use 'raw' input. By default, the 'processed' history is used,
2065 so that magics are loaded in their transformed version to valid
2065 so that magics are loaded in their transformed version to valid
2066 Python. If this option is given, the raw input as typed as the
2066 Python. If this option is given, the raw input as typed as the
2067 command line is used instead.
2067 command line is used instead.
2068
2068
2069 This function uses the same syntax as %history for input ranges,
2069 This function uses the same syntax as %history for input ranges,
2070 then saves the lines to the filename you specify.
2070 then saves the lines to the filename you specify.
2071
2071
2072 It adds a '.py' extension to the file if you don't do so yourself, and
2072 It adds a '.py' extension to the file if you don't do so yourself, and
2073 it asks for confirmation before overwriting existing files."""
2073 it asks for confirmation before overwriting existing files."""
2074
2074
2075 opts,args = self.parse_options(parameter_s,'r',mode='list')
2075 opts,args = self.parse_options(parameter_s,'r',mode='list')
2076 fname, codefrom = unquote_filename(args[0]), " ".join(args[1:])
2076 fname, codefrom = unquote_filename(args[0]), " ".join(args[1:])
2077 if not fname.endswith('.py'):
2077 if not fname.endswith('.py'):
2078 fname += '.py'
2078 fname += '.py'
2079 if os.path.isfile(fname):
2079 if os.path.isfile(fname):
2080 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2080 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2081 if ans.lower() not in ['y','yes']:
2081 if ans.lower() not in ['y','yes']:
2082 print 'Operation cancelled.'
2082 print 'Operation cancelled.'
2083 return
2083 return
2084 try:
2084 try:
2085 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
2085 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
2086 except (TypeError, ValueError) as e:
2086 except (TypeError, ValueError) as e:
2087 print e.args[0]
2087 print e.args[0]
2088 return
2088 return
2089 with py3compat.open(fname,'w', encoding="utf-8") as f:
2089 with py3compat.open(fname,'w', encoding="utf-8") as f:
2090 f.write(u"# coding: utf-8\n")
2090 f.write(u"# coding: utf-8\n")
2091 f.write(py3compat.cast_unicode(cmds))
2091 f.write(py3compat.cast_unicode(cmds))
2092 print 'The following commands were written to file `%s`:' % fname
2092 print 'The following commands were written to file `%s`:' % fname
2093 print cmds
2093 print cmds
2094
2094
2095 def magic_pastebin(self, parameter_s = ''):
2095 def magic_pastebin(self, parameter_s = ''):
2096 """Upload code to the 'Lodge it' paste bin, returning the URL."""
2096 """Upload code to the 'Lodge it' paste bin, returning the URL."""
2097 try:
2097 try:
2098 code = self.shell.find_user_code(parameter_s)
2098 code = self.shell.find_user_code(parameter_s)
2099 except (ValueError, TypeError) as e:
2099 except (ValueError, TypeError) as e:
2100 print e.args[0]
2100 print e.args[0]
2101 return
2101 return
2102 pbserver = ServerProxy('http://paste.pocoo.org/xmlrpc/')
2102 pbserver = ServerProxy('http://paste.pocoo.org/xmlrpc/')
2103 id = pbserver.pastes.newPaste("python", code)
2103 id = pbserver.pastes.newPaste("python", code)
2104 return "http://paste.pocoo.org/show/" + id
2104 return "http://paste.pocoo.org/show/" + id
2105
2105
2106 def magic_loadpy(self, arg_s):
2106 def magic_loadpy(self, arg_s):
2107 """Load a .py python script into the GUI console.
2107 """Load a .py python script into the GUI console.
2108
2108
2109 This magic command can either take a local filename or a url::
2109 This magic command can either take a local filename or a url::
2110
2110
2111 %loadpy myscript.py
2111 %loadpy myscript.py
2112 %loadpy http://www.example.com/myscript.py
2112 %loadpy http://www.example.com/myscript.py
2113 """
2113 """
2114 arg_s = unquote_filename(arg_s)
2114 arg_s = unquote_filename(arg_s)
2115 if not arg_s.endswith('.py'):
2115 if not arg_s.endswith('.py'):
2116 raise ValueError('%%load only works with .py files: %s' % arg_s)
2116 raise ValueError('%%load only works with .py files: %s' % arg_s)
2117 if arg_s.startswith('http'):
2117 if arg_s.startswith('http'):
2118 import urllib2
2118 import urllib2
2119 response = urllib2.urlopen(arg_s)
2119 response = urllib2.urlopen(arg_s)
2120 content = response.read()
2120 content = response.read()
2121 else:
2121 else:
2122 with open(arg_s) as f:
2122 with open(arg_s) as f:
2123 content = f.read()
2123 content = f.read()
2124 self.set_next_input(content)
2124 self.set_next_input(content)
2125
2125
2126 def _find_edit_target(self, args, opts, last_call):
2126 def _find_edit_target(self, args, opts, last_call):
2127 """Utility method used by magic_edit to find what to edit."""
2127 """Utility method used by magic_edit to find what to edit."""
2128
2128
2129 def make_filename(arg):
2129 def make_filename(arg):
2130 "Make a filename from the given args"
2130 "Make a filename from the given args"
2131 arg = unquote_filename(arg)
2131 arg = unquote_filename(arg)
2132 try:
2132 try:
2133 filename = get_py_filename(arg)
2133 filename = get_py_filename(arg)
2134 except IOError:
2134 except IOError:
2135 # If it ends with .py but doesn't already exist, assume we want
2135 # If it ends with .py but doesn't already exist, assume we want
2136 # a new file.
2136 # a new file.
2137 if arg.endswith('.py'):
2137 if arg.endswith('.py'):
2138 filename = arg
2138 filename = arg
2139 else:
2139 else:
2140 filename = None
2140 filename = None
2141 return filename
2141 return filename
2142
2142
2143 # Set a few locals from the options for convenience:
2143 # Set a few locals from the options for convenience:
2144 opts_prev = 'p' in opts
2144 opts_prev = 'p' in opts
2145 opts_raw = 'r' in opts
2145 opts_raw = 'r' in opts
2146
2146
2147 # custom exceptions
2147 # custom exceptions
2148 class DataIsObject(Exception): pass
2148 class DataIsObject(Exception): pass
2149
2149
2150 # Default line number value
2150 # Default line number value
2151 lineno = opts.get('n',None)
2151 lineno = opts.get('n',None)
2152
2152
2153 if opts_prev:
2153 if opts_prev:
2154 args = '_%s' % last_call[0]
2154 args = '_%s' % last_call[0]
2155 if not self.shell.user_ns.has_key(args):
2155 if not self.shell.user_ns.has_key(args):
2156 args = last_call[1]
2156 args = last_call[1]
2157
2157
2158 # use last_call to remember the state of the previous call, but don't
2158 # use last_call to remember the state of the previous call, but don't
2159 # let it be clobbered by successive '-p' calls.
2159 # let it be clobbered by successive '-p' calls.
2160 try:
2160 try:
2161 last_call[0] = self.shell.displayhook.prompt_count
2161 last_call[0] = self.shell.displayhook.prompt_count
2162 if not opts_prev:
2162 if not opts_prev:
2163 last_call[1] = parameter_s
2163 last_call[1] = parameter_s
2164 except:
2164 except:
2165 pass
2165 pass
2166
2166
2167 # by default this is done with temp files, except when the given
2167 # by default this is done with temp files, except when the given
2168 # arg is a filename
2168 # arg is a filename
2169 use_temp = True
2169 use_temp = True
2170
2170
2171 data = ''
2171 data = ''
2172
2172
2173 # First, see if the arguments should be a filename.
2173 # First, see if the arguments should be a filename.
2174 filename = make_filename(args)
2174 filename = make_filename(args)
2175 if filename:
2175 if filename:
2176 use_temp = False
2176 use_temp = False
2177 elif args:
2177 elif args:
2178 # Mode where user specifies ranges of lines, like in %macro.
2178 # Mode where user specifies ranges of lines, like in %macro.
2179 data = self.extract_input_lines(args, opts_raw)
2179 data = self.extract_input_lines(args, opts_raw)
2180 if not data:
2180 if not data:
2181 try:
2181 try:
2182 # Load the parameter given as a variable. If not a string,
2182 # Load the parameter given as a variable. If not a string,
2183 # process it as an object instead (below)
2183 # process it as an object instead (below)
2184
2184
2185 #print '*** args',args,'type',type(args) # dbg
2185 #print '*** args',args,'type',type(args) # dbg
2186 data = eval(args, self.shell.user_ns)
2186 data = eval(args, self.shell.user_ns)
2187 if not isinstance(data, basestring):
2187 if not isinstance(data, basestring):
2188 raise DataIsObject
2188 raise DataIsObject
2189
2189
2190 except (NameError,SyntaxError):
2190 except (NameError,SyntaxError):
2191 # given argument is not a variable, try as a filename
2191 # given argument is not a variable, try as a filename
2192 filename = make_filename(args)
2192 filename = make_filename(args)
2193 if filename is None:
2193 if filename is None:
2194 warn("Argument given (%s) can't be found as a variable "
2194 warn("Argument given (%s) can't be found as a variable "
2195 "or as a filename." % args)
2195 "or as a filename." % args)
2196 return
2196 return
2197 use_temp = False
2197 use_temp = False
2198
2198
2199 except DataIsObject:
2199 except DataIsObject:
2200 # macros have a special edit function
2200 # macros have a special edit function
2201 if isinstance(data, Macro):
2201 if isinstance(data, Macro):
2202 raise MacroToEdit(data)
2202 raise MacroToEdit(data)
2203
2203
2204 # For objects, try to edit the file where they are defined
2204 # For objects, try to edit the file where they are defined
2205 try:
2205 try:
2206 filename = inspect.getabsfile(data)
2206 filename = inspect.getabsfile(data)
2207 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2207 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2208 # class created by %edit? Try to find source
2208 # class created by %edit? Try to find source
2209 # by looking for method definitions instead, the
2209 # by looking for method definitions instead, the
2210 # __module__ in those classes is FakeModule.
2210 # __module__ in those classes is FakeModule.
2211 attrs = [getattr(data, aname) for aname in dir(data)]
2211 attrs = [getattr(data, aname) for aname in dir(data)]
2212 for attr in attrs:
2212 for attr in attrs:
2213 if not inspect.ismethod(attr):
2213 if not inspect.ismethod(attr):
2214 continue
2214 continue
2215 filename = inspect.getabsfile(attr)
2215 filename = inspect.getabsfile(attr)
2216 if filename and 'fakemodule' not in filename.lower():
2216 if filename and 'fakemodule' not in filename.lower():
2217 # change the attribute to be the edit target instead
2217 # change the attribute to be the edit target instead
2218 data = attr
2218 data = attr
2219 break
2219 break
2220
2220
2221 datafile = 1
2221 datafile = 1
2222 except TypeError:
2222 except TypeError:
2223 filename = make_filename(args)
2223 filename = make_filename(args)
2224 datafile = 1
2224 datafile = 1
2225 warn('Could not find file where `%s` is defined.\n'
2225 warn('Could not find file where `%s` is defined.\n'
2226 'Opening a file named `%s`' % (args,filename))
2226 'Opening a file named `%s`' % (args,filename))
2227 # Now, make sure we can actually read the source (if it was in
2227 # Now, make sure we can actually read the source (if it was in
2228 # a temp file it's gone by now).
2228 # a temp file it's gone by now).
2229 if datafile:
2229 if datafile:
2230 try:
2230 try:
2231 if lineno is None:
2231 if lineno is None:
2232 lineno = inspect.getsourcelines(data)[1]
2232 lineno = inspect.getsourcelines(data)[1]
2233 except IOError:
2233 except IOError:
2234 filename = make_filename(args)
2234 filename = make_filename(args)
2235 if filename is None:
2235 if filename is None:
2236 warn('The file `%s` where `%s` was defined cannot '
2236 warn('The file `%s` where `%s` was defined cannot '
2237 'be read.' % (filename,data))
2237 'be read.' % (filename,data))
2238 return
2238 return
2239 use_temp = False
2239 use_temp = False
2240
2240
2241 if use_temp:
2241 if use_temp:
2242 filename = self.shell.mktempfile(data)
2242 filename = self.shell.mktempfile(data)
2243 print 'IPython will make a temporary file named:',filename
2243 print 'IPython will make a temporary file named:',filename
2244
2244
2245 return filename, lineno, use_temp
2245 return filename, lineno, use_temp
2246
2246
2247 def _edit_macro(self,mname,macro):
2247 def _edit_macro(self,mname,macro):
2248 """open an editor with the macro data in a file"""
2248 """open an editor with the macro data in a file"""
2249 filename = self.shell.mktempfile(macro.value)
2249 filename = self.shell.mktempfile(macro.value)
2250 self.shell.hooks.editor(filename)
2250 self.shell.hooks.editor(filename)
2251
2251
2252 # and make a new macro object, to replace the old one
2252 # and make a new macro object, to replace the old one
2253 mfile = open(filename)
2253 mfile = open(filename)
2254 mvalue = mfile.read()
2254 mvalue = mfile.read()
2255 mfile.close()
2255 mfile.close()
2256 self.shell.user_ns[mname] = Macro(mvalue)
2256 self.shell.user_ns[mname] = Macro(mvalue)
2257
2257
2258 def magic_ed(self,parameter_s=''):
2258 def magic_ed(self,parameter_s=''):
2259 """Alias to %edit."""
2259 """Alias to %edit."""
2260 return self.magic_edit(parameter_s)
2260 return self.magic_edit(parameter_s)
2261
2261
2262 @skip_doctest
2262 @skip_doctest
2263 def magic_edit(self,parameter_s='',last_call=['','']):
2263 def magic_edit(self,parameter_s='',last_call=['','']):
2264 """Bring up an editor and execute the resulting code.
2264 """Bring up an editor and execute the resulting code.
2265
2265
2266 Usage:
2266 Usage:
2267 %edit [options] [args]
2267 %edit [options] [args]
2268
2268
2269 %edit runs IPython's editor hook. The default version of this hook is
2269 %edit runs IPython's editor hook. The default version of this hook is
2270 set to call the editor specified by your $EDITOR environment variable.
2270 set to call the editor specified by your $EDITOR environment variable.
2271 If this isn't found, it will default to vi under Linux/Unix and to
2271 If this isn't found, it will default to vi under Linux/Unix and to
2272 notepad under Windows. See the end of this docstring for how to change
2272 notepad under Windows. See the end of this docstring for how to change
2273 the editor hook.
2273 the editor hook.
2274
2274
2275 You can also set the value of this editor via the
2275 You can also set the value of this editor via the
2276 ``TerminalInteractiveShell.editor`` option in your configuration file.
2276 ``TerminalInteractiveShell.editor`` option in your configuration file.
2277 This is useful if you wish to use a different editor from your typical
2277 This is useful if you wish to use a different editor from your typical
2278 default with IPython (and for Windows users who typically don't set
2278 default with IPython (and for Windows users who typically don't set
2279 environment variables).
2279 environment variables).
2280
2280
2281 This command allows you to conveniently edit multi-line code right in
2281 This command allows you to conveniently edit multi-line code right in
2282 your IPython session.
2282 your IPython session.
2283
2283
2284 If called without arguments, %edit opens up an empty editor with a
2284 If called without arguments, %edit opens up an empty editor with a
2285 temporary file and will execute the contents of this file when you
2285 temporary file and will execute the contents of this file when you
2286 close it (don't forget to save it!).
2286 close it (don't forget to save it!).
2287
2287
2288
2288
2289 Options:
2289 Options:
2290
2290
2291 -n <number>: open the editor at a specified line number. By default,
2291 -n <number>: open the editor at a specified line number. By default,
2292 the IPython editor hook uses the unix syntax 'editor +N filename', but
2292 the IPython editor hook uses the unix syntax 'editor +N filename', but
2293 you can configure this by providing your own modified hook if your
2293 you can configure this by providing your own modified hook if your
2294 favorite editor supports line-number specifications with a different
2294 favorite editor supports line-number specifications with a different
2295 syntax.
2295 syntax.
2296
2296
2297 -p: this will call the editor with the same data as the previous time
2297 -p: this will call the editor with the same data as the previous time
2298 it was used, regardless of how long ago (in your current session) it
2298 it was used, regardless of how long ago (in your current session) it
2299 was.
2299 was.
2300
2300
2301 -r: use 'raw' input. This option only applies to input taken from the
2301 -r: use 'raw' input. This option only applies to input taken from the
2302 user's history. By default, the 'processed' history is used, so that
2302 user's history. By default, the 'processed' history is used, so that
2303 magics are loaded in their transformed version to valid Python. If
2303 magics are loaded in their transformed version to valid Python. If
2304 this option is given, the raw input as typed as the command line is
2304 this option is given, the raw input as typed as the command line is
2305 used instead. When you exit the editor, it will be executed by
2305 used instead. When you exit the editor, it will be executed by
2306 IPython's own processor.
2306 IPython's own processor.
2307
2307
2308 -x: do not execute the edited code immediately upon exit. This is
2308 -x: do not execute the edited code immediately upon exit. This is
2309 mainly useful if you are editing programs which need to be called with
2309 mainly useful if you are editing programs which need to be called with
2310 command line arguments, which you can then do using %run.
2310 command line arguments, which you can then do using %run.
2311
2311
2312
2312
2313 Arguments:
2313 Arguments:
2314
2314
2315 If arguments are given, the following possibilites exist:
2315 If arguments are given, the following possibilites exist:
2316
2316
2317 - If the argument is a filename, IPython will load that into the
2317 - If the argument is a filename, IPython will load that into the
2318 editor. It will execute its contents with execfile() when you exit,
2318 editor. It will execute its contents with execfile() when you exit,
2319 loading any code in the file into your interactive namespace.
2319 loading any code in the file into your interactive namespace.
2320
2320
2321 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
2321 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
2322 The syntax is the same as in the %history magic.
2322 The syntax is the same as in the %history magic.
2323
2323
2324 - If the argument is a string variable, its contents are loaded
2324 - If the argument is a string variable, its contents are loaded
2325 into the editor. You can thus edit any string which contains
2325 into the editor. You can thus edit any string which contains
2326 python code (including the result of previous edits).
2326 python code (including the result of previous edits).
2327
2327
2328 - If the argument is the name of an object (other than a string),
2328 - If the argument is the name of an object (other than a string),
2329 IPython will try to locate the file where it was defined and open the
2329 IPython will try to locate the file where it was defined and open the
2330 editor at the point where it is defined. You can use `%edit function`
2330 editor at the point where it is defined. You can use `%edit function`
2331 to load an editor exactly at the point where 'function' is defined,
2331 to load an editor exactly at the point where 'function' is defined,
2332 edit it and have the file be executed automatically.
2332 edit it and have the file be executed automatically.
2333
2333
2334 - If the object is a macro (see %macro for details), this opens up your
2334 - If the object is a macro (see %macro for details), this opens up your
2335 specified editor with a temporary file containing the macro's data.
2335 specified editor with a temporary file containing the macro's data.
2336 Upon exit, the macro is reloaded with the contents of the file.
2336 Upon exit, the macro is reloaded with the contents of the file.
2337
2337
2338 Note: opening at an exact line is only supported under Unix, and some
2338 Note: opening at an exact line is only supported under Unix, and some
2339 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2339 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2340 '+NUMBER' parameter necessary for this feature. Good editors like
2340 '+NUMBER' parameter necessary for this feature. Good editors like
2341 (X)Emacs, vi, jed, pico and joe all do.
2341 (X)Emacs, vi, jed, pico and joe all do.
2342
2342
2343 After executing your code, %edit will return as output the code you
2343 After executing your code, %edit will return as output the code you
2344 typed in the editor (except when it was an existing file). This way
2344 typed in the editor (except when it was an existing file). This way
2345 you can reload the code in further invocations of %edit as a variable,
2345 you can reload the code in further invocations of %edit as a variable,
2346 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2346 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2347 the output.
2347 the output.
2348
2348
2349 Note that %edit is also available through the alias %ed.
2349 Note that %edit is also available through the alias %ed.
2350
2350
2351 This is an example of creating a simple function inside the editor and
2351 This is an example of creating a simple function inside the editor and
2352 then modifying it. First, start up the editor:
2352 then modifying it. First, start up the editor:
2353
2353
2354 In [1]: ed
2354 In [1]: ed
2355 Editing... done. Executing edited code...
2355 Editing... done. Executing edited code...
2356 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2356 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2357
2357
2358 We can then call the function foo():
2358 We can then call the function foo():
2359
2359
2360 In [2]: foo()
2360 In [2]: foo()
2361 foo() was defined in an editing session
2361 foo() was defined in an editing session
2362
2362
2363 Now we edit foo. IPython automatically loads the editor with the
2363 Now we edit foo. IPython automatically loads the editor with the
2364 (temporary) file where foo() was previously defined:
2364 (temporary) file where foo() was previously defined:
2365
2365
2366 In [3]: ed foo
2366 In [3]: ed foo
2367 Editing... done. Executing edited code...
2367 Editing... done. Executing edited code...
2368
2368
2369 And if we call foo() again we get the modified version:
2369 And if we call foo() again we get the modified version:
2370
2370
2371 In [4]: foo()
2371 In [4]: foo()
2372 foo() has now been changed!
2372 foo() has now been changed!
2373
2373
2374 Here is an example of how to edit a code snippet successive
2374 Here is an example of how to edit a code snippet successive
2375 times. First we call the editor:
2375 times. First we call the editor:
2376
2376
2377 In [5]: ed
2377 In [5]: ed
2378 Editing... done. Executing edited code...
2378 Editing... done. Executing edited code...
2379 hello
2379 hello
2380 Out[5]: "print 'hello'n"
2380 Out[5]: "print 'hello'n"
2381
2381
2382 Now we call it again with the previous output (stored in _):
2382 Now we call it again with the previous output (stored in _):
2383
2383
2384 In [6]: ed _
2384 In [6]: ed _
2385 Editing... done. Executing edited code...
2385 Editing... done. Executing edited code...
2386 hello world
2386 hello world
2387 Out[6]: "print 'hello world'n"
2387 Out[6]: "print 'hello world'n"
2388
2388
2389 Now we call it with the output #8 (stored in _8, also as Out[8]):
2389 Now we call it with the output #8 (stored in _8, also as Out[8]):
2390
2390
2391 In [7]: ed _8
2391 In [7]: ed _8
2392 Editing... done. Executing edited code...
2392 Editing... done. Executing edited code...
2393 hello again
2393 hello again
2394 Out[7]: "print 'hello again'n"
2394 Out[7]: "print 'hello again'n"
2395
2395
2396
2396
2397 Changing the default editor hook:
2397 Changing the default editor hook:
2398
2398
2399 If you wish to write your own editor hook, you can put it in a
2399 If you wish to write your own editor hook, you can put it in a
2400 configuration file which you load at startup time. The default hook
2400 configuration file which you load at startup time. The default hook
2401 is defined in the IPython.core.hooks module, and you can use that as a
2401 is defined in the IPython.core.hooks module, and you can use that as a
2402 starting example for further modifications. That file also has
2402 starting example for further modifications. That file also has
2403 general instructions on how to set a new hook for use once you've
2403 general instructions on how to set a new hook for use once you've
2404 defined it."""
2404 defined it."""
2405 opts,args = self.parse_options(parameter_s,'prxn:')
2405 opts,args = self.parse_options(parameter_s,'prxn:')
2406
2406
2407 try:
2407 try:
2408 filename, lineno, is_temp = self._find_edit_target(args, opts, last_call)
2408 filename, lineno, is_temp = self._find_edit_target(args, opts, last_call)
2409 except MacroToEdit as e:
2409 except MacroToEdit as e:
2410 self._edit_macro(args, e.args[0])
2410 self._edit_macro(args, e.args[0])
2411 return
2411 return
2412
2412
2413 # do actual editing here
2413 # do actual editing here
2414 print 'Editing...',
2414 print 'Editing...',
2415 sys.stdout.flush()
2415 sys.stdout.flush()
2416 try:
2416 try:
2417 # Quote filenames that may have spaces in them
2417 # Quote filenames that may have spaces in them
2418 if ' ' in filename:
2418 if ' ' in filename:
2419 filename = "'%s'" % filename
2419 filename = "'%s'" % filename
2420 self.shell.hooks.editor(filename,lineno)
2420 self.shell.hooks.editor(filename,lineno)
2421 except TryNext:
2421 except TryNext:
2422 warn('Could not open editor')
2422 warn('Could not open editor')
2423 return
2423 return
2424
2424
2425 # XXX TODO: should this be generalized for all string vars?
2425 # XXX TODO: should this be generalized for all string vars?
2426 # For now, this is special-cased to blocks created by cpaste
2426 # For now, this is special-cased to blocks created by cpaste
2427 if args.strip() == 'pasted_block':
2427 if args.strip() == 'pasted_block':
2428 self.shell.user_ns['pasted_block'] = file_read(filename)
2428 self.shell.user_ns['pasted_block'] = file_read(filename)
2429
2429
2430 if 'x' in opts: # -x prevents actual execution
2430 if 'x' in opts: # -x prevents actual execution
2431 print
2431 print
2432 else:
2432 else:
2433 print 'done. Executing edited code...'
2433 print 'done. Executing edited code...'
2434 if 'r' in opts: # Untranslated IPython code
2434 if 'r' in opts: # Untranslated IPython code
2435 self.shell.run_cell(file_read(filename),
2435 self.shell.run_cell(file_read(filename),
2436 store_history=False)
2436 store_history=False)
2437 else:
2437 else:
2438 self.shell.safe_execfile(filename,self.shell.user_ns,
2438 self.shell.safe_execfile(filename,self.shell.user_ns,
2439 self.shell.user_ns)
2439 self.shell.user_ns)
2440
2440
2441 if is_temp:
2441 if is_temp:
2442 try:
2442 try:
2443 return open(filename).read()
2443 return open(filename).read()
2444 except IOError,msg:
2444 except IOError,msg:
2445 if msg.filename == filename:
2445 if msg.filename == filename:
2446 warn('File not found. Did you forget to save?')
2446 warn('File not found. Did you forget to save?')
2447 return
2447 return
2448 else:
2448 else:
2449 self.shell.showtraceback()
2449 self.shell.showtraceback()
2450
2450
2451 def magic_xmode(self,parameter_s = ''):
2451 def magic_xmode(self,parameter_s = ''):
2452 """Switch modes for the exception handlers.
2452 """Switch modes for the exception handlers.
2453
2453
2454 Valid modes: Plain, Context and Verbose.
2454 Valid modes: Plain, Context and Verbose.
2455
2455
2456 If called without arguments, acts as a toggle."""
2456 If called without arguments, acts as a toggle."""
2457
2457
2458 def xmode_switch_err(name):
2458 def xmode_switch_err(name):
2459 warn('Error changing %s exception modes.\n%s' %
2459 warn('Error changing %s exception modes.\n%s' %
2460 (name,sys.exc_info()[1]))
2460 (name,sys.exc_info()[1]))
2461
2461
2462 shell = self.shell
2462 shell = self.shell
2463 new_mode = parameter_s.strip().capitalize()
2463 new_mode = parameter_s.strip().capitalize()
2464 try:
2464 try:
2465 shell.InteractiveTB.set_mode(mode=new_mode)
2465 shell.InteractiveTB.set_mode(mode=new_mode)
2466 print 'Exception reporting mode:',shell.InteractiveTB.mode
2466 print 'Exception reporting mode:',shell.InteractiveTB.mode
2467 except:
2467 except:
2468 xmode_switch_err('user')
2468 xmode_switch_err('user')
2469
2469
2470 def magic_colors(self,parameter_s = ''):
2470 def magic_colors(self,parameter_s = ''):
2471 """Switch color scheme for prompts, info system and exception handlers.
2471 """Switch color scheme for prompts, info system and exception handlers.
2472
2472
2473 Currently implemented schemes: NoColor, Linux, LightBG.
2473 Currently implemented schemes: NoColor, Linux, LightBG.
2474
2474
2475 Color scheme names are not case-sensitive.
2475 Color scheme names are not case-sensitive.
2476
2476
2477 Examples
2477 Examples
2478 --------
2478 --------
2479 To get a plain black and white terminal::
2479 To get a plain black and white terminal::
2480
2480
2481 %colors nocolor
2481 %colors nocolor
2482 """
2482 """
2483
2483
2484 def color_switch_err(name):
2484 def color_switch_err(name):
2485 warn('Error changing %s color schemes.\n%s' %
2485 warn('Error changing %s color schemes.\n%s' %
2486 (name,sys.exc_info()[1]))
2486 (name,sys.exc_info()[1]))
2487
2487
2488
2488
2489 new_scheme = parameter_s.strip()
2489 new_scheme = parameter_s.strip()
2490 if not new_scheme:
2490 if not new_scheme:
2491 raise UsageError(
2491 raise UsageError(
2492 "%colors: you must specify a color scheme. See '%colors?'")
2492 "%colors: you must specify a color scheme. See '%colors?'")
2493 return
2493 return
2494 # local shortcut
2494 # local shortcut
2495 shell = self.shell
2495 shell = self.shell
2496
2496
2497 import IPython.utils.rlineimpl as readline
2497 import IPython.utils.rlineimpl as readline
2498
2498
2499 if not readline.have_readline and sys.platform == "win32":
2499 if not readline.have_readline and sys.platform == "win32":
2500 msg = """\
2500 msg = """\
2501 Proper color support under MS Windows requires the pyreadline library.
2501 Proper color support under MS Windows requires the pyreadline library.
2502 You can find it at:
2502 You can find it at:
2503 http://ipython.scipy.org/moin/PyReadline/Intro
2503 http://ipython.scipy.org/moin/PyReadline/Intro
2504 Gary's readline needs the ctypes module, from:
2504 Gary's readline needs the ctypes module, from:
2505 http://starship.python.net/crew/theller/ctypes
2505 http://starship.python.net/crew/theller/ctypes
2506 (Note that ctypes is already part of Python versions 2.5 and newer).
2506 (Note that ctypes is already part of Python versions 2.5 and newer).
2507
2507
2508 Defaulting color scheme to 'NoColor'"""
2508 Defaulting color scheme to 'NoColor'"""
2509 new_scheme = 'NoColor'
2509 new_scheme = 'NoColor'
2510 warn(msg)
2510 warn(msg)
2511
2511
2512 # readline option is 0
2512 # readline option is 0
2513 if not shell.has_readline:
2513 if not shell.has_readline:
2514 new_scheme = 'NoColor'
2514 new_scheme = 'NoColor'
2515
2515
2516 # Set prompt colors
2516 # Set prompt colors
2517 try:
2517 try:
2518 shell.displayhook.set_colors(new_scheme)
2518 shell.displayhook.set_colors(new_scheme)
2519 except:
2519 except:
2520 color_switch_err('prompt')
2520 color_switch_err('prompt')
2521 else:
2521 else:
2522 shell.colors = \
2522 shell.colors = \
2523 shell.displayhook.color_table.active_scheme_name
2523 shell.displayhook.color_table.active_scheme_name
2524 # Set exception colors
2524 # Set exception colors
2525 try:
2525 try:
2526 shell.InteractiveTB.set_colors(scheme = new_scheme)
2526 shell.InteractiveTB.set_colors(scheme = new_scheme)
2527 shell.SyntaxTB.set_colors(scheme = new_scheme)
2527 shell.SyntaxTB.set_colors(scheme = new_scheme)
2528 except:
2528 except:
2529 color_switch_err('exception')
2529 color_switch_err('exception')
2530
2530
2531 # Set info (for 'object?') colors
2531 # Set info (for 'object?') colors
2532 if shell.color_info:
2532 if shell.color_info:
2533 try:
2533 try:
2534 shell.inspector.set_active_scheme(new_scheme)
2534 shell.inspector.set_active_scheme(new_scheme)
2535 except:
2535 except:
2536 color_switch_err('object inspector')
2536 color_switch_err('object inspector')
2537 else:
2537 else:
2538 shell.inspector.set_active_scheme('NoColor')
2538 shell.inspector.set_active_scheme('NoColor')
2539
2539
2540 def magic_pprint(self, parameter_s=''):
2540 def magic_pprint(self, parameter_s=''):
2541 """Toggle pretty printing on/off."""
2541 """Toggle pretty printing on/off."""
2542 ptformatter = self.shell.display_formatter.formatters['text/plain']
2542 ptformatter = self.shell.display_formatter.formatters['text/plain']
2543 ptformatter.pprint = bool(1 - ptformatter.pprint)
2543 ptformatter.pprint = bool(1 - ptformatter.pprint)
2544 print 'Pretty printing has been turned', \
2544 print 'Pretty printing has been turned', \
2545 ['OFF','ON'][ptformatter.pprint]
2545 ['OFF','ON'][ptformatter.pprint]
2546
2546
2547 #......................................................................
2547 #......................................................................
2548 # Functions to implement unix shell-type things
2548 # Functions to implement unix shell-type things
2549
2549
2550 @skip_doctest
2550 @skip_doctest
2551 def magic_alias(self, parameter_s = ''):
2551 def magic_alias(self, parameter_s = ''):
2552 """Define an alias for a system command.
2552 """Define an alias for a system command.
2553
2553
2554 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2554 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2555
2555
2556 Then, typing 'alias_name params' will execute the system command 'cmd
2556 Then, typing 'alias_name params' will execute the system command 'cmd
2557 params' (from your underlying operating system).
2557 params' (from your underlying operating system).
2558
2558
2559 Aliases have lower precedence than magic functions and Python normal
2559 Aliases have lower precedence than magic functions and Python normal
2560 variables, so if 'foo' is both a Python variable and an alias, the
2560 variables, so if 'foo' is both a Python variable and an alias, the
2561 alias can not be executed until 'del foo' removes the Python variable.
2561 alias can not be executed until 'del foo' removes the Python variable.
2562
2562
2563 You can use the %l specifier in an alias definition to represent the
2563 You can use the %l specifier in an alias definition to represent the
2564 whole line when the alias is called. For example:
2564 whole line when the alias is called. For example:
2565
2565
2566 In [2]: alias bracket echo "Input in brackets: <%l>"
2566 In [2]: alias bracket echo "Input in brackets: <%l>"
2567 In [3]: bracket hello world
2567 In [3]: bracket hello world
2568 Input in brackets: <hello world>
2568 Input in brackets: <hello world>
2569
2569
2570 You can also define aliases with parameters using %s specifiers (one
2570 You can also define aliases with parameters using %s specifiers (one
2571 per parameter):
2571 per parameter):
2572
2572
2573 In [1]: alias parts echo first %s second %s
2573 In [1]: alias parts echo first %s second %s
2574 In [2]: %parts A B
2574 In [2]: %parts A B
2575 first A second B
2575 first A second B
2576 In [3]: %parts A
2576 In [3]: %parts A
2577 Incorrect number of arguments: 2 expected.
2577 Incorrect number of arguments: 2 expected.
2578 parts is an alias to: 'echo first %s second %s'
2578 parts is an alias to: 'echo first %s second %s'
2579
2579
2580 Note that %l and %s are mutually exclusive. You can only use one or
2580 Note that %l and %s are mutually exclusive. You can only use one or
2581 the other in your aliases.
2581 the other in your aliases.
2582
2582
2583 Aliases expand Python variables just like system calls using ! or !!
2583 Aliases expand Python variables just like system calls using ! or !!
2584 do: all expressions prefixed with '$' get expanded. For details of
2584 do: all expressions prefixed with '$' get expanded. For details of
2585 the semantic rules, see PEP-215:
2585 the semantic rules, see PEP-215:
2586 http://www.python.org/peps/pep-0215.html. This is the library used by
2586 http://www.python.org/peps/pep-0215.html. This is the library used by
2587 IPython for variable expansion. If you want to access a true shell
2587 IPython for variable expansion. If you want to access a true shell
2588 variable, an extra $ is necessary to prevent its expansion by IPython:
2588 variable, an extra $ is necessary to prevent its expansion by IPython:
2589
2589
2590 In [6]: alias show echo
2590 In [6]: alias show echo
2591 In [7]: PATH='A Python string'
2591 In [7]: PATH='A Python string'
2592 In [8]: show $PATH
2592 In [8]: show $PATH
2593 A Python string
2593 A Python string
2594 In [9]: show $$PATH
2594 In [9]: show $$PATH
2595 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2595 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2596
2596
2597 You can use the alias facility to acess all of $PATH. See the %rehash
2597 You can use the alias facility to acess all of $PATH. See the %rehash
2598 and %rehashx functions, which automatically create aliases for the
2598 and %rehashx functions, which automatically create aliases for the
2599 contents of your $PATH.
2599 contents of your $PATH.
2600
2600
2601 If called with no parameters, %alias prints the current alias table."""
2601 If called with no parameters, %alias prints the current alias table."""
2602
2602
2603 par = parameter_s.strip()
2603 par = parameter_s.strip()
2604 if not par:
2604 if not par:
2605 stored = self.db.get('stored_aliases', {} )
2605 stored = self.db.get('stored_aliases', {} )
2606 aliases = sorted(self.shell.alias_manager.aliases)
2606 aliases = sorted(self.shell.alias_manager.aliases)
2607 # for k, v in stored:
2607 # for k, v in stored:
2608 # atab.append(k, v[0])
2608 # atab.append(k, v[0])
2609
2609
2610 print "Total number of aliases:", len(aliases)
2610 print "Total number of aliases:", len(aliases)
2611 sys.stdout.flush()
2611 sys.stdout.flush()
2612 return aliases
2612 return aliases
2613
2613
2614 # Now try to define a new one
2614 # Now try to define a new one
2615 try:
2615 try:
2616 alias,cmd = par.split(None, 1)
2616 alias,cmd = par.split(None, 1)
2617 except:
2617 except:
2618 print oinspect.getdoc(self.magic_alias)
2618 print oinspect.getdoc(self.magic_alias)
2619 else:
2619 else:
2620 self.shell.alias_manager.soft_define_alias(alias, cmd)
2620 self.shell.alias_manager.soft_define_alias(alias, cmd)
2621 # end magic_alias
2621 # end magic_alias
2622
2622
2623 def magic_unalias(self, parameter_s = ''):
2623 def magic_unalias(self, parameter_s = ''):
2624 """Remove an alias"""
2624 """Remove an alias"""
2625
2625
2626 aname = parameter_s.strip()
2626 aname = parameter_s.strip()
2627 self.shell.alias_manager.undefine_alias(aname)
2627 self.shell.alias_manager.undefine_alias(aname)
2628 stored = self.db.get('stored_aliases', {} )
2628 stored = self.db.get('stored_aliases', {} )
2629 if aname in stored:
2629 if aname in stored:
2630 print "Removing %stored alias",aname
2630 print "Removing %stored alias",aname
2631 del stored[aname]
2631 del stored[aname]
2632 self.db['stored_aliases'] = stored
2632 self.db['stored_aliases'] = stored
2633
2633
2634 def magic_rehashx(self, parameter_s = ''):
2634 def magic_rehashx(self, parameter_s = ''):
2635 """Update the alias table with all executable files in $PATH.
2635 """Update the alias table with all executable files in $PATH.
2636
2636
2637 This version explicitly checks that every entry in $PATH is a file
2637 This version explicitly checks that every entry in $PATH is a file
2638 with execute access (os.X_OK), so it is much slower than %rehash.
2638 with execute access (os.X_OK), so it is much slower than %rehash.
2639
2639
2640 Under Windows, it checks executability as a match agains a
2640 Under Windows, it checks executability as a match agains a
2641 '|'-separated string of extensions, stored in the IPython config
2641 '|'-separated string of extensions, stored in the IPython config
2642 variable win_exec_ext. This defaults to 'exe|com|bat'.
2642 variable win_exec_ext. This defaults to 'exe|com|bat'.
2643
2643
2644 This function also resets the root module cache of module completer,
2644 This function also resets the root module cache of module completer,
2645 used on slow filesystems.
2645 used on slow filesystems.
2646 """
2646 """
2647 from IPython.core.alias import InvalidAliasError
2647 from IPython.core.alias import InvalidAliasError
2648
2648
2649 # for the benefit of module completer in ipy_completers.py
2649 # for the benefit of module completer in ipy_completers.py
2650 del self.db['rootmodules']
2650 del self.db['rootmodules']
2651
2651
2652 path = [os.path.abspath(os.path.expanduser(p)) for p in
2652 path = [os.path.abspath(os.path.expanduser(p)) for p in
2653 os.environ.get('PATH','').split(os.pathsep)]
2653 os.environ.get('PATH','').split(os.pathsep)]
2654 path = filter(os.path.isdir,path)
2654 path = filter(os.path.isdir,path)
2655
2655
2656 syscmdlist = []
2656 syscmdlist = []
2657 # Now define isexec in a cross platform manner.
2657 # Now define isexec in a cross platform manner.
2658 if os.name == 'posix':
2658 if os.name == 'posix':
2659 isexec = lambda fname:os.path.isfile(fname) and \
2659 isexec = lambda fname:os.path.isfile(fname) and \
2660 os.access(fname,os.X_OK)
2660 os.access(fname,os.X_OK)
2661 else:
2661 else:
2662 try:
2662 try:
2663 winext = os.environ['pathext'].replace(';','|').replace('.','')
2663 winext = os.environ['pathext'].replace(';','|').replace('.','')
2664 except KeyError:
2664 except KeyError:
2665 winext = 'exe|com|bat|py'
2665 winext = 'exe|com|bat|py'
2666 if 'py' not in winext:
2666 if 'py' not in winext:
2667 winext += '|py'
2667 winext += '|py'
2668 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2668 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2669 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2669 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2670 savedir = os.getcwdu()
2670 savedir = os.getcwdu()
2671
2671
2672 # Now walk the paths looking for executables to alias.
2672 # Now walk the paths looking for executables to alias.
2673 try:
2673 try:
2674 # write the whole loop for posix/Windows so we don't have an if in
2674 # write the whole loop for posix/Windows so we don't have an if in
2675 # the innermost part
2675 # the innermost part
2676 if os.name == 'posix':
2676 if os.name == 'posix':
2677 for pdir in path:
2677 for pdir in path:
2678 os.chdir(pdir)
2678 os.chdir(pdir)
2679 for ff in os.listdir(pdir):
2679 for ff in os.listdir(pdir):
2680 if isexec(ff):
2680 if isexec(ff):
2681 try:
2681 try:
2682 # Removes dots from the name since ipython
2682 # Removes dots from the name since ipython
2683 # will assume names with dots to be python.
2683 # will assume names with dots to be python.
2684 self.shell.alias_manager.define_alias(
2684 self.shell.alias_manager.define_alias(
2685 ff.replace('.',''), ff)
2685 ff.replace('.',''), ff)
2686 except InvalidAliasError:
2686 except InvalidAliasError:
2687 pass
2687 pass
2688 else:
2688 else:
2689 syscmdlist.append(ff)
2689 syscmdlist.append(ff)
2690 else:
2690 else:
2691 no_alias = self.shell.alias_manager.no_alias
2691 no_alias = self.shell.alias_manager.no_alias
2692 for pdir in path:
2692 for pdir in path:
2693 os.chdir(pdir)
2693 os.chdir(pdir)
2694 for ff in os.listdir(pdir):
2694 for ff in os.listdir(pdir):
2695 base, ext = os.path.splitext(ff)
2695 base, ext = os.path.splitext(ff)
2696 if isexec(ff) and base.lower() not in no_alias:
2696 if isexec(ff) and base.lower() not in no_alias:
2697 if ext.lower() == '.exe':
2697 if ext.lower() == '.exe':
2698 ff = base
2698 ff = base
2699 try:
2699 try:
2700 # Removes dots from the name since ipython
2700 # Removes dots from the name since ipython
2701 # will assume names with dots to be python.
2701 # will assume names with dots to be python.
2702 self.shell.alias_manager.define_alias(
2702 self.shell.alias_manager.define_alias(
2703 base.lower().replace('.',''), ff)
2703 base.lower().replace('.',''), ff)
2704 except InvalidAliasError:
2704 except InvalidAliasError:
2705 pass
2705 pass
2706 syscmdlist.append(ff)
2706 syscmdlist.append(ff)
2707 db = self.db
2707 db = self.db
2708 db['syscmdlist'] = syscmdlist
2708 db['syscmdlist'] = syscmdlist
2709 finally:
2709 finally:
2710 os.chdir(savedir)
2710 os.chdir(savedir)
2711
2711
2712 @skip_doctest
2712 @skip_doctest
2713 def magic_pwd(self, parameter_s = ''):
2713 def magic_pwd(self, parameter_s = ''):
2714 """Return the current working directory path.
2714 """Return the current working directory path.
2715
2715
2716 Examples
2716 Examples
2717 --------
2717 --------
2718 ::
2718 ::
2719
2719
2720 In [9]: pwd
2720 In [9]: pwd
2721 Out[9]: '/home/tsuser/sprint/ipython'
2721 Out[9]: '/home/tsuser/sprint/ipython'
2722 """
2722 """
2723 return os.getcwdu()
2723 return os.getcwdu()
2724
2724
2725 @skip_doctest
2725 @skip_doctest
2726 def magic_cd(self, parameter_s=''):
2726 def magic_cd(self, parameter_s=''):
2727 """Change the current working directory.
2727 """Change the current working directory.
2728
2728
2729 This command automatically maintains an internal list of directories
2729 This command automatically maintains an internal list of directories
2730 you visit during your IPython session, in the variable _dh. The
2730 you visit during your IPython session, in the variable _dh. The
2731 command %dhist shows this history nicely formatted. You can also
2731 command %dhist shows this history nicely formatted. You can also
2732 do 'cd -<tab>' to see directory history conveniently.
2732 do 'cd -<tab>' to see directory history conveniently.
2733
2733
2734 Usage:
2734 Usage:
2735
2735
2736 cd 'dir': changes to directory 'dir'.
2736 cd 'dir': changes to directory 'dir'.
2737
2737
2738 cd -: changes to the last visited directory.
2738 cd -: changes to the last visited directory.
2739
2739
2740 cd -<n>: changes to the n-th directory in the directory history.
2740 cd -<n>: changes to the n-th directory in the directory history.
2741
2741
2742 cd --foo: change to directory that matches 'foo' in history
2742 cd --foo: change to directory that matches 'foo' in history
2743
2743
2744 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2744 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2745 (note: cd <bookmark_name> is enough if there is no
2745 (note: cd <bookmark_name> is enough if there is no
2746 directory <bookmark_name>, but a bookmark with the name exists.)
2746 directory <bookmark_name>, but a bookmark with the name exists.)
2747 'cd -b <tab>' allows you to tab-complete bookmark names.
2747 'cd -b <tab>' allows you to tab-complete bookmark names.
2748
2748
2749 Options:
2749 Options:
2750
2750
2751 -q: quiet. Do not print the working directory after the cd command is
2751 -q: quiet. Do not print the working directory after the cd command is
2752 executed. By default IPython's cd command does print this directory,
2752 executed. By default IPython's cd command does print this directory,
2753 since the default prompts do not display path information.
2753 since the default prompts do not display path information.
2754
2754
2755 Note that !cd doesn't work for this purpose because the shell where
2755 Note that !cd doesn't work for this purpose because the shell where
2756 !command runs is immediately discarded after executing 'command'.
2756 !command runs is immediately discarded after executing 'command'.
2757
2757
2758 Examples
2758 Examples
2759 --------
2759 --------
2760 ::
2760 ::
2761
2761
2762 In [10]: cd parent/child
2762 In [10]: cd parent/child
2763 /home/tsuser/parent/child
2763 /home/tsuser/parent/child
2764 """
2764 """
2765
2765
2766 parameter_s = parameter_s.strip()
2766 parameter_s = parameter_s.strip()
2767 #bkms = self.shell.persist.get("bookmarks",{})
2767 #bkms = self.shell.persist.get("bookmarks",{})
2768
2768
2769 oldcwd = os.getcwdu()
2769 oldcwd = os.getcwdu()
2770 numcd = re.match(r'(-)(\d+)$',parameter_s)
2770 numcd = re.match(r'(-)(\d+)$',parameter_s)
2771 # jump in directory history by number
2771 # jump in directory history by number
2772 if numcd:
2772 if numcd:
2773 nn = int(numcd.group(2))
2773 nn = int(numcd.group(2))
2774 try:
2774 try:
2775 ps = self.shell.user_ns['_dh'][nn]
2775 ps = self.shell.user_ns['_dh'][nn]
2776 except IndexError:
2776 except IndexError:
2777 print 'The requested directory does not exist in history.'
2777 print 'The requested directory does not exist in history.'
2778 return
2778 return
2779 else:
2779 else:
2780 opts = {}
2780 opts = {}
2781 elif parameter_s.startswith('--'):
2781 elif parameter_s.startswith('--'):
2782 ps = None
2782 ps = None
2783 fallback = None
2783 fallback = None
2784 pat = parameter_s[2:]
2784 pat = parameter_s[2:]
2785 dh = self.shell.user_ns['_dh']
2785 dh = self.shell.user_ns['_dh']
2786 # first search only by basename (last component)
2786 # first search only by basename (last component)
2787 for ent in reversed(dh):
2787 for ent in reversed(dh):
2788 if pat in os.path.basename(ent) and os.path.isdir(ent):
2788 if pat in os.path.basename(ent) and os.path.isdir(ent):
2789 ps = ent
2789 ps = ent
2790 break
2790 break
2791
2791
2792 if fallback is None and pat in ent and os.path.isdir(ent):
2792 if fallback is None and pat in ent and os.path.isdir(ent):
2793 fallback = ent
2793 fallback = ent
2794
2794
2795 # if we have no last part match, pick the first full path match
2795 # if we have no last part match, pick the first full path match
2796 if ps is None:
2796 if ps is None:
2797 ps = fallback
2797 ps = fallback
2798
2798
2799 if ps is None:
2799 if ps is None:
2800 print "No matching entry in directory history"
2800 print "No matching entry in directory history"
2801 return
2801 return
2802 else:
2802 else:
2803 opts = {}
2803 opts = {}
2804
2804
2805
2805
2806 else:
2806 else:
2807 #turn all non-space-escaping backslashes to slashes,
2807 #turn all non-space-escaping backslashes to slashes,
2808 # for c:\windows\directory\names\
2808 # for c:\windows\directory\names\
2809 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2809 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2810 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2810 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2811 # jump to previous
2811 # jump to previous
2812 if ps == '-':
2812 if ps == '-':
2813 try:
2813 try:
2814 ps = self.shell.user_ns['_dh'][-2]
2814 ps = self.shell.user_ns['_dh'][-2]
2815 except IndexError:
2815 except IndexError:
2816 raise UsageError('%cd -: No previous directory to change to.')
2816 raise UsageError('%cd -: No previous directory to change to.')
2817 # jump to bookmark if needed
2817 # jump to bookmark if needed
2818 else:
2818 else:
2819 if not os.path.isdir(ps) or opts.has_key('b'):
2819 if not os.path.isdir(ps) or opts.has_key('b'):
2820 bkms = self.db.get('bookmarks', {})
2820 bkms = self.db.get('bookmarks', {})
2821
2821
2822 if bkms.has_key(ps):
2822 if bkms.has_key(ps):
2823 target = bkms[ps]
2823 target = bkms[ps]
2824 print '(bookmark:%s) -> %s' % (ps,target)
2824 print '(bookmark:%s) -> %s' % (ps,target)
2825 ps = target
2825 ps = target
2826 else:
2826 else:
2827 if opts.has_key('b'):
2827 if opts.has_key('b'):
2828 raise UsageError("Bookmark '%s' not found. "
2828 raise UsageError("Bookmark '%s' not found. "
2829 "Use '%%bookmark -l' to see your bookmarks." % ps)
2829 "Use '%%bookmark -l' to see your bookmarks." % ps)
2830
2830
2831 # strip extra quotes on Windows, because os.chdir doesn't like them
2831 # strip extra quotes on Windows, because os.chdir doesn't like them
2832 ps = unquote_filename(ps)
2832 ps = unquote_filename(ps)
2833 # at this point ps should point to the target dir
2833 # at this point ps should point to the target dir
2834 if ps:
2834 if ps:
2835 try:
2835 try:
2836 os.chdir(os.path.expanduser(ps))
2836 os.chdir(os.path.expanduser(ps))
2837 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2837 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2838 set_term_title('IPython: ' + abbrev_cwd())
2838 set_term_title('IPython: ' + abbrev_cwd())
2839 except OSError:
2839 except OSError:
2840 print sys.exc_info()[1]
2840 print sys.exc_info()[1]
2841 else:
2841 else:
2842 cwd = os.getcwdu()
2842 cwd = os.getcwdu()
2843 dhist = self.shell.user_ns['_dh']
2843 dhist = self.shell.user_ns['_dh']
2844 if oldcwd != cwd:
2844 if oldcwd != cwd:
2845 dhist.append(cwd)
2845 dhist.append(cwd)
2846 self.db['dhist'] = compress_dhist(dhist)[-100:]
2846 self.db['dhist'] = compress_dhist(dhist)[-100:]
2847
2847
2848 else:
2848 else:
2849 os.chdir(self.shell.home_dir)
2849 os.chdir(self.shell.home_dir)
2850 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2850 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2851 set_term_title('IPython: ' + '~')
2851 set_term_title('IPython: ' + '~')
2852 cwd = os.getcwdu()
2852 cwd = os.getcwdu()
2853 dhist = self.shell.user_ns['_dh']
2853 dhist = self.shell.user_ns['_dh']
2854
2854
2855 if oldcwd != cwd:
2855 if oldcwd != cwd:
2856 dhist.append(cwd)
2856 dhist.append(cwd)
2857 self.db['dhist'] = compress_dhist(dhist)[-100:]
2857 self.db['dhist'] = compress_dhist(dhist)[-100:]
2858 if not 'q' in opts and self.shell.user_ns['_dh']:
2858 if not 'q' in opts and self.shell.user_ns['_dh']:
2859 print self.shell.user_ns['_dh'][-1]
2859 print self.shell.user_ns['_dh'][-1]
2860
2860
2861
2861
2862 def magic_env(self, parameter_s=''):
2862 def magic_env(self, parameter_s=''):
2863 """List environment variables."""
2863 """List environment variables."""
2864
2864
2865 return os.environ.data
2865 return os.environ.data
2866
2866
2867 def magic_pushd(self, parameter_s=''):
2867 def magic_pushd(self, parameter_s=''):
2868 """Place the current dir on stack and change directory.
2868 """Place the current dir on stack and change directory.
2869
2869
2870 Usage:\\
2870 Usage:\\
2871 %pushd ['dirname']
2871 %pushd ['dirname']
2872 """
2872 """
2873
2873
2874 dir_s = self.shell.dir_stack
2874 dir_s = self.shell.dir_stack
2875 tgt = os.path.expanduser(unquote_filename(parameter_s))
2875 tgt = os.path.expanduser(unquote_filename(parameter_s))
2876 cwd = os.getcwdu().replace(self.home_dir,'~')
2876 cwd = os.getcwdu().replace(self.home_dir,'~')
2877 if tgt:
2877 if tgt:
2878 self.magic_cd(parameter_s)
2878 self.magic_cd(parameter_s)
2879 dir_s.insert(0,cwd)
2879 dir_s.insert(0,cwd)
2880 return self.magic_dirs()
2880 return self.magic_dirs()
2881
2881
2882 def magic_popd(self, parameter_s=''):
2882 def magic_popd(self, parameter_s=''):
2883 """Change to directory popped off the top of the stack.
2883 """Change to directory popped off the top of the stack.
2884 """
2884 """
2885 if not self.shell.dir_stack:
2885 if not self.shell.dir_stack:
2886 raise UsageError("%popd on empty stack")
2886 raise UsageError("%popd on empty stack")
2887 top = self.shell.dir_stack.pop(0)
2887 top = self.shell.dir_stack.pop(0)
2888 self.magic_cd(top)
2888 self.magic_cd(top)
2889 print "popd ->",top
2889 print "popd ->",top
2890
2890
2891 def magic_dirs(self, parameter_s=''):
2891 def magic_dirs(self, parameter_s=''):
2892 """Return the current directory stack."""
2892 """Return the current directory stack."""
2893
2893
2894 return self.shell.dir_stack
2894 return self.shell.dir_stack
2895
2895
2896 def magic_dhist(self, parameter_s=''):
2896 def magic_dhist(self, parameter_s=''):
2897 """Print your history of visited directories.
2897 """Print your history of visited directories.
2898
2898
2899 %dhist -> print full history\\
2899 %dhist -> print full history\\
2900 %dhist n -> print last n entries only\\
2900 %dhist n -> print last n entries only\\
2901 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2901 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2902
2902
2903 This history is automatically maintained by the %cd command, and
2903 This history is automatically maintained by the %cd command, and
2904 always available as the global list variable _dh. You can use %cd -<n>
2904 always available as the global list variable _dh. You can use %cd -<n>
2905 to go to directory number <n>.
2905 to go to directory number <n>.
2906
2906
2907 Note that most of time, you should view directory history by entering
2907 Note that most of time, you should view directory history by entering
2908 cd -<TAB>.
2908 cd -<TAB>.
2909
2909
2910 """
2910 """
2911
2911
2912 dh = self.shell.user_ns['_dh']
2912 dh = self.shell.user_ns['_dh']
2913 if parameter_s:
2913 if parameter_s:
2914 try:
2914 try:
2915 args = map(int,parameter_s.split())
2915 args = map(int,parameter_s.split())
2916 except:
2916 except:
2917 self.arg_err(Magic.magic_dhist)
2917 self.arg_err(Magic.magic_dhist)
2918 return
2918 return
2919 if len(args) == 1:
2919 if len(args) == 1:
2920 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2920 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2921 elif len(args) == 2:
2921 elif len(args) == 2:
2922 ini,fin = args
2922 ini,fin = args
2923 else:
2923 else:
2924 self.arg_err(Magic.magic_dhist)
2924 self.arg_err(Magic.magic_dhist)
2925 return
2925 return
2926 else:
2926 else:
2927 ini,fin = 0,len(dh)
2927 ini,fin = 0,len(dh)
2928 nlprint(dh,
2928 nlprint(dh,
2929 header = 'Directory history (kept in _dh)',
2929 header = 'Directory history (kept in _dh)',
2930 start=ini,stop=fin)
2930 start=ini,stop=fin)
2931
2931
2932 @skip_doctest
2932 @skip_doctest
2933 def magic_sc(self, parameter_s=''):
2933 def magic_sc(self, parameter_s=''):
2934 """Shell capture - execute a shell command and capture its output.
2934 """Shell capture - execute a shell command and capture its output.
2935
2935
2936 DEPRECATED. Suboptimal, retained for backwards compatibility.
2936 DEPRECATED. Suboptimal, retained for backwards compatibility.
2937
2937
2938 You should use the form 'var = !command' instead. Example:
2938 You should use the form 'var = !command' instead. Example:
2939
2939
2940 "%sc -l myfiles = ls ~" should now be written as
2940 "%sc -l myfiles = ls ~" should now be written as
2941
2941
2942 "myfiles = !ls ~"
2942 "myfiles = !ls ~"
2943
2943
2944 myfiles.s, myfiles.l and myfiles.n still apply as documented
2944 myfiles.s, myfiles.l and myfiles.n still apply as documented
2945 below.
2945 below.
2946
2946
2947 --
2947 --
2948 %sc [options] varname=command
2948 %sc [options] varname=command
2949
2949
2950 IPython will run the given command using commands.getoutput(), and
2950 IPython will run the given command using commands.getoutput(), and
2951 will then update the user's interactive namespace with a variable
2951 will then update the user's interactive namespace with a variable
2952 called varname, containing the value of the call. Your command can
2952 called varname, containing the value of the call. Your command can
2953 contain shell wildcards, pipes, etc.
2953 contain shell wildcards, pipes, etc.
2954
2954
2955 The '=' sign in the syntax is mandatory, and the variable name you
2955 The '=' sign in the syntax is mandatory, and the variable name you
2956 supply must follow Python's standard conventions for valid names.
2956 supply must follow Python's standard conventions for valid names.
2957
2957
2958 (A special format without variable name exists for internal use)
2958 (A special format without variable name exists for internal use)
2959
2959
2960 Options:
2960 Options:
2961
2961
2962 -l: list output. Split the output on newlines into a list before
2962 -l: list output. Split the output on newlines into a list before
2963 assigning it to the given variable. By default the output is stored
2963 assigning it to the given variable. By default the output is stored
2964 as a single string.
2964 as a single string.
2965
2965
2966 -v: verbose. Print the contents of the variable.
2966 -v: verbose. Print the contents of the variable.
2967
2967
2968 In most cases you should not need to split as a list, because the
2968 In most cases you should not need to split as a list, because the
2969 returned value is a special type of string which can automatically
2969 returned value is a special type of string which can automatically
2970 provide its contents either as a list (split on newlines) or as a
2970 provide its contents either as a list (split on newlines) or as a
2971 space-separated string. These are convenient, respectively, either
2971 space-separated string. These are convenient, respectively, either
2972 for sequential processing or to be passed to a shell command.
2972 for sequential processing or to be passed to a shell command.
2973
2973
2974 For example:
2974 For example:
2975
2975
2976 # all-random
2976 # all-random
2977
2977
2978 # Capture into variable a
2978 # Capture into variable a
2979 In [1]: sc a=ls *py
2979 In [1]: sc a=ls *py
2980
2980
2981 # a is a string with embedded newlines
2981 # a is a string with embedded newlines
2982 In [2]: a
2982 In [2]: a
2983 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2983 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2984
2984
2985 # which can be seen as a list:
2985 # which can be seen as a list:
2986 In [3]: a.l
2986 In [3]: a.l
2987 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2987 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2988
2988
2989 # or as a whitespace-separated string:
2989 # or as a whitespace-separated string:
2990 In [4]: a.s
2990 In [4]: a.s
2991 Out[4]: 'setup.py win32_manual_post_install.py'
2991 Out[4]: 'setup.py win32_manual_post_install.py'
2992
2992
2993 # a.s is useful to pass as a single command line:
2993 # a.s is useful to pass as a single command line:
2994 In [5]: !wc -l $a.s
2994 In [5]: !wc -l $a.s
2995 146 setup.py
2995 146 setup.py
2996 130 win32_manual_post_install.py
2996 130 win32_manual_post_install.py
2997 276 total
2997 276 total
2998
2998
2999 # while the list form is useful to loop over:
2999 # while the list form is useful to loop over:
3000 In [6]: for f in a.l:
3000 In [6]: for f in a.l:
3001 ...: !wc -l $f
3001 ...: !wc -l $f
3002 ...:
3002 ...:
3003 146 setup.py
3003 146 setup.py
3004 130 win32_manual_post_install.py
3004 130 win32_manual_post_install.py
3005
3005
3006 Similiarly, the lists returned by the -l option are also special, in
3006 Similiarly, the lists returned by the -l option are also special, in
3007 the sense that you can equally invoke the .s attribute on them to
3007 the sense that you can equally invoke the .s attribute on them to
3008 automatically get a whitespace-separated string from their contents:
3008 automatically get a whitespace-separated string from their contents:
3009
3009
3010 In [7]: sc -l b=ls *py
3010 In [7]: sc -l b=ls *py
3011
3011
3012 In [8]: b
3012 In [8]: b
3013 Out[8]: ['setup.py', 'win32_manual_post_install.py']
3013 Out[8]: ['setup.py', 'win32_manual_post_install.py']
3014
3014
3015 In [9]: b.s
3015 In [9]: b.s
3016 Out[9]: 'setup.py win32_manual_post_install.py'
3016 Out[9]: 'setup.py win32_manual_post_install.py'
3017
3017
3018 In summary, both the lists and strings used for ouptut capture have
3018 In summary, both the lists and strings used for ouptut capture have
3019 the following special attributes:
3019 the following special attributes:
3020
3020
3021 .l (or .list) : value as list.
3021 .l (or .list) : value as list.
3022 .n (or .nlstr): value as newline-separated string.
3022 .n (or .nlstr): value as newline-separated string.
3023 .s (or .spstr): value as space-separated string.
3023 .s (or .spstr): value as space-separated string.
3024 """
3024 """
3025
3025
3026 opts,args = self.parse_options(parameter_s,'lv')
3026 opts,args = self.parse_options(parameter_s,'lv')
3027 # Try to get a variable name and command to run
3027 # Try to get a variable name and command to run
3028 try:
3028 try:
3029 # the variable name must be obtained from the parse_options
3029 # the variable name must be obtained from the parse_options
3030 # output, which uses shlex.split to strip options out.
3030 # output, which uses shlex.split to strip options out.
3031 var,_ = args.split('=',1)
3031 var,_ = args.split('=',1)
3032 var = var.strip()
3032 var = var.strip()
3033 # But the the command has to be extracted from the original input
3033 # But the the command has to be extracted from the original input
3034 # parameter_s, not on what parse_options returns, to avoid the
3034 # parameter_s, not on what parse_options returns, to avoid the
3035 # quote stripping which shlex.split performs on it.
3035 # quote stripping which shlex.split performs on it.
3036 _,cmd = parameter_s.split('=',1)
3036 _,cmd = parameter_s.split('=',1)
3037 except ValueError:
3037 except ValueError:
3038 var,cmd = '',''
3038 var,cmd = '',''
3039 # If all looks ok, proceed
3039 # If all looks ok, proceed
3040 split = 'l' in opts
3040 split = 'l' in opts
3041 out = self.shell.getoutput(cmd, split=split)
3041 out = self.shell.getoutput(cmd, split=split)
3042 if opts.has_key('v'):
3042 if opts.has_key('v'):
3043 print '%s ==\n%s' % (var,pformat(out))
3043 print '%s ==\n%s' % (var,pformat(out))
3044 if var:
3044 if var:
3045 self.shell.user_ns.update({var:out})
3045 self.shell.user_ns.update({var:out})
3046 else:
3046 else:
3047 return out
3047 return out
3048
3048
3049 def magic_sx(self, parameter_s=''):
3049 def magic_sx(self, parameter_s=''):
3050 """Shell execute - run a shell command and capture its output.
3050 """Shell execute - run a shell command and capture its output.
3051
3051
3052 %sx command
3052 %sx command
3053
3053
3054 IPython will run the given command using commands.getoutput(), and
3054 IPython will run the given command using commands.getoutput(), and
3055 return the result formatted as a list (split on '\\n'). Since the
3055 return the result formatted as a list (split on '\\n'). Since the
3056 output is _returned_, it will be stored in ipython's regular output
3056 output is _returned_, it will be stored in ipython's regular output
3057 cache Out[N] and in the '_N' automatic variables.
3057 cache Out[N] and in the '_N' automatic variables.
3058
3058
3059 Notes:
3059 Notes:
3060
3060
3061 1) If an input line begins with '!!', then %sx is automatically
3061 1) If an input line begins with '!!', then %sx is automatically
3062 invoked. That is, while:
3062 invoked. That is, while:
3063 !ls
3063 !ls
3064 causes ipython to simply issue system('ls'), typing
3064 causes ipython to simply issue system('ls'), typing
3065 !!ls
3065 !!ls
3066 is a shorthand equivalent to:
3066 is a shorthand equivalent to:
3067 %sx ls
3067 %sx ls
3068
3068
3069 2) %sx differs from %sc in that %sx automatically splits into a list,
3069 2) %sx differs from %sc in that %sx automatically splits into a list,
3070 like '%sc -l'. The reason for this is to make it as easy as possible
3070 like '%sc -l'. The reason for this is to make it as easy as possible
3071 to process line-oriented shell output via further python commands.
3071 to process line-oriented shell output via further python commands.
3072 %sc is meant to provide much finer control, but requires more
3072 %sc is meant to provide much finer control, but requires more
3073 typing.
3073 typing.
3074
3074
3075 3) Just like %sc -l, this is a list with special attributes:
3075 3) Just like %sc -l, this is a list with special attributes:
3076
3076
3077 .l (or .list) : value as list.
3077 .l (or .list) : value as list.
3078 .n (or .nlstr): value as newline-separated string.
3078 .n (or .nlstr): value as newline-separated string.
3079 .s (or .spstr): value as whitespace-separated string.
3079 .s (or .spstr): value as whitespace-separated string.
3080
3080
3081 This is very useful when trying to use such lists as arguments to
3081 This is very useful when trying to use such lists as arguments to
3082 system commands."""
3082 system commands."""
3083
3083
3084 if parameter_s:
3084 if parameter_s:
3085 return self.shell.getoutput(parameter_s)
3085 return self.shell.getoutput(parameter_s)
3086
3086
3087
3087
3088 def magic_bookmark(self, parameter_s=''):
3088 def magic_bookmark(self, parameter_s=''):
3089 """Manage IPython's bookmark system.
3089 """Manage IPython's bookmark system.
3090
3090
3091 %bookmark <name> - set bookmark to current dir
3091 %bookmark <name> - set bookmark to current dir
3092 %bookmark <name> <dir> - set bookmark to <dir>
3092 %bookmark <name> <dir> - set bookmark to <dir>
3093 %bookmark -l - list all bookmarks
3093 %bookmark -l - list all bookmarks
3094 %bookmark -d <name> - remove bookmark
3094 %bookmark -d <name> - remove bookmark
3095 %bookmark -r - remove all bookmarks
3095 %bookmark -r - remove all bookmarks
3096
3096
3097 You can later on access a bookmarked folder with:
3097 You can later on access a bookmarked folder with:
3098 %cd -b <name>
3098 %cd -b <name>
3099 or simply '%cd <name>' if there is no directory called <name> AND
3099 or simply '%cd <name>' if there is no directory called <name> AND
3100 there is such a bookmark defined.
3100 there is such a bookmark defined.
3101
3101
3102 Your bookmarks persist through IPython sessions, but they are
3102 Your bookmarks persist through IPython sessions, but they are
3103 associated with each profile."""
3103 associated with each profile."""
3104
3104
3105 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3105 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3106 if len(args) > 2:
3106 if len(args) > 2:
3107 raise UsageError("%bookmark: too many arguments")
3107 raise UsageError("%bookmark: too many arguments")
3108
3108
3109 bkms = self.db.get('bookmarks',{})
3109 bkms = self.db.get('bookmarks',{})
3110
3110
3111 if opts.has_key('d'):
3111 if opts.has_key('d'):
3112 try:
3112 try:
3113 todel = args[0]
3113 todel = args[0]
3114 except IndexError:
3114 except IndexError:
3115 raise UsageError(
3115 raise UsageError(
3116 "%bookmark -d: must provide a bookmark to delete")
3116 "%bookmark -d: must provide a bookmark to delete")
3117 else:
3117 else:
3118 try:
3118 try:
3119 del bkms[todel]
3119 del bkms[todel]
3120 except KeyError:
3120 except KeyError:
3121 raise UsageError(
3121 raise UsageError(
3122 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3122 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3123
3123
3124 elif opts.has_key('r'):
3124 elif opts.has_key('r'):
3125 bkms = {}
3125 bkms = {}
3126 elif opts.has_key('l'):
3126 elif opts.has_key('l'):
3127 bks = bkms.keys()
3127 bks = bkms.keys()
3128 bks.sort()
3128 bks.sort()
3129 if bks:
3129 if bks:
3130 size = max(map(len,bks))
3130 size = max(map(len,bks))
3131 else:
3131 else:
3132 size = 0
3132 size = 0
3133 fmt = '%-'+str(size)+'s -> %s'
3133 fmt = '%-'+str(size)+'s -> %s'
3134 print 'Current bookmarks:'
3134 print 'Current bookmarks:'
3135 for bk in bks:
3135 for bk in bks:
3136 print fmt % (bk,bkms[bk])
3136 print fmt % (bk,bkms[bk])
3137 else:
3137 else:
3138 if not args:
3138 if not args:
3139 raise UsageError("%bookmark: You must specify the bookmark name")
3139 raise UsageError("%bookmark: You must specify the bookmark name")
3140 elif len(args)==1:
3140 elif len(args)==1:
3141 bkms[args[0]] = os.getcwdu()
3141 bkms[args[0]] = os.getcwdu()
3142 elif len(args)==2:
3142 elif len(args)==2:
3143 bkms[args[0]] = args[1]
3143 bkms[args[0]] = args[1]
3144 self.db['bookmarks'] = bkms
3144 self.db['bookmarks'] = bkms
3145
3145
3146 def magic_pycat(self, parameter_s=''):
3146 def magic_pycat(self, parameter_s=''):
3147 """Show a syntax-highlighted file through a pager.
3147 """Show a syntax-highlighted file through a pager.
3148
3148
3149 This magic is similar to the cat utility, but it will assume the file
3149 This magic is similar to the cat utility, but it will assume the file
3150 to be Python source and will show it with syntax highlighting. """
3150 to be Python source and will show it with syntax highlighting. """
3151
3151
3152 try:
3152 try:
3153 filename = get_py_filename(parameter_s)
3153 filename = get_py_filename(parameter_s)
3154 cont = file_read(filename)
3154 cont = file_read(filename)
3155 except IOError:
3155 except IOError:
3156 try:
3156 try:
3157 cont = eval(parameter_s,self.user_ns)
3157 cont = eval(parameter_s,self.user_ns)
3158 except NameError:
3158 except NameError:
3159 cont = None
3159 cont = None
3160 if cont is None:
3160 if cont is None:
3161 print "Error: no such file or variable"
3161 print "Error: no such file or variable"
3162 return
3162 return
3163
3163
3164 page.page(self.shell.pycolorize(cont))
3164 page.page(self.shell.pycolorize(cont))
3165
3165
3166 def _rerun_pasted(self):
3166 def _rerun_pasted(self):
3167 """ Rerun a previously pasted command.
3167 """ Rerun a previously pasted command.
3168 """
3168 """
3169 b = self.user_ns.get('pasted_block', None)
3169 b = self.user_ns.get('pasted_block', None)
3170 if b is None:
3170 if b is None:
3171 raise UsageError('No previous pasted block available')
3171 raise UsageError('No previous pasted block available')
3172 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3172 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3173 exec b in self.user_ns
3173 exec b in self.user_ns
3174
3174
3175 def _get_pasted_lines(self, sentinel):
3175 def _get_pasted_lines(self, sentinel):
3176 """ Yield pasted lines until the user enters the given sentinel value.
3176 """ Yield pasted lines until the user enters the given sentinel value.
3177 """
3177 """
3178 from IPython.core import interactiveshell
3178 from IPython.core import interactiveshell
3179 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3179 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3180 while True:
3180 while True:
3181 l = self.shell.raw_input_original(':')
3181 l = self.shell.raw_input_original(':')
3182 if l == sentinel:
3182 if l == sentinel:
3183 return
3183 return
3184 else:
3184 else:
3185 yield l
3185 yield l
3186
3186
3187 def _strip_pasted_lines_for_code(self, raw_lines):
3187 def _strip_pasted_lines_for_code(self, raw_lines):
3188 """ Strip non-code parts of a sequence of lines to return a block of
3188 """ Strip non-code parts of a sequence of lines to return a block of
3189 code.
3189 code.
3190 """
3190 """
3191 # Regular expressions that declare text we strip from the input:
3191 # Regular expressions that declare text we strip from the input:
3192 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3192 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3193 r'^\s*(\s?>)+', # Python input prompt
3193 r'^\s*(\s?>)+', # Python input prompt
3194 r'^\s*\.{3,}', # Continuation prompts
3194 r'^\s*\.{3,}', # Continuation prompts
3195 r'^\++',
3195 r'^\++',
3196 ]
3196 ]
3197
3197
3198 strip_from_start = map(re.compile,strip_re)
3198 strip_from_start = map(re.compile,strip_re)
3199
3199
3200 lines = []
3200 lines = []
3201 for l in raw_lines:
3201 for l in raw_lines:
3202 for pat in strip_from_start:
3202 for pat in strip_from_start:
3203 l = pat.sub('',l)
3203 l = pat.sub('',l)
3204 lines.append(l)
3204 lines.append(l)
3205
3205
3206 block = "\n".join(lines) + '\n'
3206 block = "\n".join(lines) + '\n'
3207 #print "block:\n",block
3207 #print "block:\n",block
3208 return block
3208 return block
3209
3209
3210 def _execute_block(self, block, par):
3210 def _execute_block(self, block, par):
3211 """ Execute a block, or store it in a variable, per the user's request.
3211 """ Execute a block, or store it in a variable, per the user's request.
3212 """
3212 """
3213 if not par:
3213 if not par:
3214 b = textwrap.dedent(block)
3214 b = textwrap.dedent(block)
3215 self.user_ns['pasted_block'] = b
3215 self.user_ns['pasted_block'] = b
3216 exec b in self.user_ns
3216 exec b in self.user_ns
3217 else:
3217 else:
3218 self.user_ns[par] = SList(block.splitlines())
3218 self.user_ns[par] = SList(block.splitlines())
3219 print "Block assigned to '%s'" % par
3219 print "Block assigned to '%s'" % par
3220
3220
3221 def magic_quickref(self,arg):
3221 def magic_quickref(self,arg):
3222 """ Show a quick reference sheet """
3222 """ Show a quick reference sheet """
3223 import IPython.core.usage
3223 import IPython.core.usage
3224 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3224 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3225
3225
3226 page.page(qr)
3226 page.page(qr)
3227
3227
3228 def magic_doctest_mode(self,parameter_s=''):
3228 def magic_doctest_mode(self,parameter_s=''):
3229 """Toggle doctest mode on and off.
3229 """Toggle doctest mode on and off.
3230
3230
3231 This mode is intended to make IPython behave as much as possible like a
3231 This mode is intended to make IPython behave as much as possible like a
3232 plain Python shell, from the perspective of how its prompts, exceptions
3232 plain Python shell, from the perspective of how its prompts, exceptions
3233 and output look. This makes it easy to copy and paste parts of a
3233 and output look. This makes it easy to copy and paste parts of a
3234 session into doctests. It does so by:
3234 session into doctests. It does so by:
3235
3235
3236 - Changing the prompts to the classic ``>>>`` ones.
3236 - Changing the prompts to the classic ``>>>`` ones.
3237 - Changing the exception reporting mode to 'Plain'.
3237 - Changing the exception reporting mode to 'Plain'.
3238 - Disabling pretty-printing of output.
3238 - Disabling pretty-printing of output.
3239
3239
3240 Note that IPython also supports the pasting of code snippets that have
3240 Note that IPython also supports the pasting of code snippets that have
3241 leading '>>>' and '...' prompts in them. This means that you can paste
3241 leading '>>>' and '...' prompts in them. This means that you can paste
3242 doctests from files or docstrings (even if they have leading
3242 doctests from files or docstrings (even if they have leading
3243 whitespace), and the code will execute correctly. You can then use
3243 whitespace), and the code will execute correctly. You can then use
3244 '%history -t' to see the translated history; this will give you the
3244 '%history -t' to see the translated history; this will give you the
3245 input after removal of all the leading prompts and whitespace, which
3245 input after removal of all the leading prompts and whitespace, which
3246 can be pasted back into an editor.
3246 can be pasted back into an editor.
3247
3247
3248 With these features, you can switch into this mode easily whenever you
3248 With these features, you can switch into this mode easily whenever you
3249 need to do testing and changes to doctests, without having to leave
3249 need to do testing and changes to doctests, without having to leave
3250 your existing IPython session.
3250 your existing IPython session.
3251 """
3251 """
3252
3252
3253 from IPython.utils.ipstruct import Struct
3253 from IPython.utils.ipstruct import Struct
3254
3254
3255 # Shorthands
3255 # Shorthands
3256 shell = self.shell
3256 shell = self.shell
3257 oc = shell.displayhook
3257 oc = shell.displayhook
3258 meta = shell.meta
3258 meta = shell.meta
3259 disp_formatter = self.shell.display_formatter
3259 disp_formatter = self.shell.display_formatter
3260 ptformatter = disp_formatter.formatters['text/plain']
3260 ptformatter = disp_formatter.formatters['text/plain']
3261 # dstore is a data store kept in the instance metadata bag to track any
3261 # dstore is a data store kept in the instance metadata bag to track any
3262 # changes we make, so we can undo them later.
3262 # changes we make, so we can undo them later.
3263 dstore = meta.setdefault('doctest_mode',Struct())
3263 dstore = meta.setdefault('doctest_mode',Struct())
3264 save_dstore = dstore.setdefault
3264 save_dstore = dstore.setdefault
3265
3265
3266 # save a few values we'll need to recover later
3266 # save a few values we'll need to recover later
3267 mode = save_dstore('mode',False)
3267 mode = save_dstore('mode',False)
3268 save_dstore('rc_pprint',ptformatter.pprint)
3268 save_dstore('rc_pprint',ptformatter.pprint)
3269 save_dstore('xmode',shell.InteractiveTB.mode)
3269 save_dstore('xmode',shell.InteractiveTB.mode)
3270 save_dstore('rc_separate_out',shell.separate_out)
3270 save_dstore('rc_separate_out',shell.separate_out)
3271 save_dstore('rc_separate_out2',shell.separate_out2)
3271 save_dstore('rc_separate_out2',shell.separate_out2)
3272 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3272 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3273 save_dstore('rc_separate_in',shell.separate_in)
3273 save_dstore('rc_separate_in',shell.separate_in)
3274 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3274 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3275
3275
3276 if mode == False:
3276 if mode == False:
3277 # turn on
3277 # turn on
3278 oc.prompt1.p_template = '>>> '
3278 oc.prompt1.p_template = '>>> '
3279 oc.prompt2.p_template = '... '
3279 oc.prompt2.p_template = '... '
3280 oc.prompt_out.p_template = ''
3280 oc.prompt_out.p_template = ''
3281
3281
3282 # Prompt separators like plain python
3282 # Prompt separators like plain python
3283 oc.input_sep = oc.prompt1.sep = ''
3283 oc.input_sep = oc.prompt1.sep = ''
3284 oc.output_sep = ''
3284 oc.output_sep = ''
3285 oc.output_sep2 = ''
3285 oc.output_sep2 = ''
3286
3286
3287 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3287 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3288 oc.prompt_out.pad_left = False
3288 oc.prompt_out.pad_left = False
3289
3289
3290 ptformatter.pprint = False
3290 ptformatter.pprint = False
3291 disp_formatter.plain_text_only = True
3291 disp_formatter.plain_text_only = True
3292
3292
3293 shell.magic_xmode('Plain')
3293 shell.magic_xmode('Plain')
3294 else:
3294 else:
3295 # turn off
3295 # turn off
3296 oc.prompt1.p_template = shell.prompt_in1
3296 oc.prompt1.p_template = shell.prompt_in1
3297 oc.prompt2.p_template = shell.prompt_in2
3297 oc.prompt2.p_template = shell.prompt_in2
3298 oc.prompt_out.p_template = shell.prompt_out
3298 oc.prompt_out.p_template = shell.prompt_out
3299
3299
3300 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3300 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3301
3301
3302 oc.output_sep = dstore.rc_separate_out
3302 oc.output_sep = dstore.rc_separate_out
3303 oc.output_sep2 = dstore.rc_separate_out2
3303 oc.output_sep2 = dstore.rc_separate_out2
3304
3304
3305 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3305 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3306 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3306 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3307
3307
3308 ptformatter.pprint = dstore.rc_pprint
3308 ptformatter.pprint = dstore.rc_pprint
3309 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3309 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3310
3310
3311 shell.magic_xmode(dstore.xmode)
3311 shell.magic_xmode(dstore.xmode)
3312
3312
3313 # Store new mode and inform
3313 # Store new mode and inform
3314 dstore.mode = bool(1-int(mode))
3314 dstore.mode = bool(1-int(mode))
3315 mode_label = ['OFF','ON'][dstore.mode]
3315 mode_label = ['OFF','ON'][dstore.mode]
3316 print 'Doctest mode is:', mode_label
3316 print 'Doctest mode is:', mode_label
3317
3317
3318 def magic_gui(self, parameter_s=''):
3318 def magic_gui(self, parameter_s=''):
3319 """Enable or disable IPython GUI event loop integration.
3319 """Enable or disable IPython GUI event loop integration.
3320
3320
3321 %gui [GUINAME]
3321 %gui [GUINAME]
3322
3322
3323 This magic replaces IPython's threaded shells that were activated
3323 This magic replaces IPython's threaded shells that were activated
3324 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3324 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3325 can now be enabled, disabled and changed at runtime and keyboard
3325 can now be enabled, disabled and changed at runtime and keyboard
3326 interrupts should work without any problems. The following toolkits
3326 interrupts should work without any problems. The following toolkits
3327 are supported: wxPython, PyQt4, PyGTK, and Tk::
3327 are supported: wxPython, PyQt4, PyGTK, and Tk::
3328
3328
3329 %gui wx # enable wxPython event loop integration
3329 %gui wx # enable wxPython event loop integration
3330 %gui qt4|qt # enable PyQt4 event loop integration
3330 %gui qt4|qt # enable PyQt4 event loop integration
3331 %gui gtk # enable PyGTK event loop integration
3331 %gui gtk # enable PyGTK event loop integration
3332 %gui tk # enable Tk event loop integration
3332 %gui tk # enable Tk event loop integration
3333 %gui # disable all event loop integration
3333 %gui # disable all event loop integration
3334
3334
3335 WARNING: after any of these has been called you can simply create
3335 WARNING: after any of these has been called you can simply create
3336 an application object, but DO NOT start the event loop yourself, as
3336 an application object, but DO NOT start the event loop yourself, as
3337 we have already handled that.
3337 we have already handled that.
3338 """
3338 """
3339 from IPython.lib.inputhook import enable_gui
3339 from IPython.lib.inputhook import enable_gui
3340 opts, arg = self.parse_options(parameter_s, '')
3340 opts, arg = self.parse_options(parameter_s, '')
3341 if arg=='': arg = None
3341 if arg=='': arg = None
3342 return enable_gui(arg)
3342 return enable_gui(arg)
3343
3343
3344 def magic_load_ext(self, module_str):
3344 def magic_load_ext(self, module_str):
3345 """Load an IPython extension by its module name."""
3345 """Load an IPython extension by its module name."""
3346 return self.extension_manager.load_extension(module_str)
3346 return self.extension_manager.load_extension(module_str)
3347
3347
3348 def magic_unload_ext(self, module_str):
3348 def magic_unload_ext(self, module_str):
3349 """Unload an IPython extension by its module name."""
3349 """Unload an IPython extension by its module name."""
3350 self.extension_manager.unload_extension(module_str)
3350 self.extension_manager.unload_extension(module_str)
3351
3351
3352 def magic_reload_ext(self, module_str):
3352 def magic_reload_ext(self, module_str):
3353 """Reload an IPython extension by its module name."""
3353 """Reload an IPython extension by its module name."""
3354 self.extension_manager.reload_extension(module_str)
3354 self.extension_manager.reload_extension(module_str)
3355
3355
3356 @skip_doctest
3356 @skip_doctest
3357 def magic_install_profiles(self, s):
3357 def magic_install_profiles(self, s):
3358 """Install the default IPython profiles into the .ipython dir.
3358 """Install the default IPython profiles into the .ipython dir.
3359
3359
3360 If the default profiles have already been installed, they will not
3360 If the default profiles have already been installed, they will not
3361 be overwritten. You can force overwriting them by using the ``-o``
3361 be overwritten. You can force overwriting them by using the ``-o``
3362 option::
3362 option::
3363
3363
3364 In [1]: %install_profiles -o
3364 In [1]: %install_profiles -o
3365 """
3365 """
3366 if '-o' in s:
3366 if '-o' in s:
3367 overwrite = True
3367 overwrite = True
3368 else:
3368 else:
3369 overwrite = False
3369 overwrite = False
3370 from IPython.config import profile
3370 from IPython.config import profile
3371 profile_dir = os.path.dirname(profile.__file__)
3371 profile_dir = os.path.dirname(profile.__file__)
3372 ipython_dir = self.ipython_dir
3372 ipython_dir = self.ipython_dir
3373 print "Installing profiles to: %s [overwrite=%s]"%(ipython_dir,overwrite)
3373 print "Installing profiles to: %s [overwrite=%s]"%(ipython_dir,overwrite)
3374 for src in os.listdir(profile_dir):
3374 for src in os.listdir(profile_dir):
3375 if src.startswith('profile_'):
3375 if src.startswith('profile_'):
3376 name = src.replace('profile_', '')
3376 name = src.replace('profile_', '')
3377 print " %s"%name
3377 print " %s"%name
3378 pd = ProfileDir.create_profile_dir_by_name(ipython_dir, name)
3378 pd = ProfileDir.create_profile_dir_by_name(ipython_dir, name)
3379 pd.copy_config_file('ipython_config.py', path=src,
3379 pd.copy_config_file('ipython_config.py', path=src,
3380 overwrite=overwrite)
3380 overwrite=overwrite)
3381
3381
3382 @skip_doctest
3382 @skip_doctest
3383 def magic_install_default_config(self, s):
3383 def magic_install_default_config(self, s):
3384 """Install IPython's default config file into the .ipython dir.
3384 """Install IPython's default config file into the .ipython dir.
3385
3385
3386 If the default config file (:file:`ipython_config.py`) is already
3386 If the default config file (:file:`ipython_config.py`) is already
3387 installed, it will not be overwritten. You can force overwriting
3387 installed, it will not be overwritten. You can force overwriting
3388 by using the ``-o`` option::
3388 by using the ``-o`` option::
3389
3389
3390 In [1]: %install_default_config
3390 In [1]: %install_default_config
3391 """
3391 """
3392 if '-o' in s:
3392 if '-o' in s:
3393 overwrite = True
3393 overwrite = True
3394 else:
3394 else:
3395 overwrite = False
3395 overwrite = False
3396 pd = self.shell.profile_dir
3396 pd = self.shell.profile_dir
3397 print "Installing default config file in: %s" % pd.location
3397 print "Installing default config file in: %s" % pd.location
3398 pd.copy_config_file('ipython_config.py', overwrite=overwrite)
3398 pd.copy_config_file('ipython_config.py', overwrite=overwrite)
3399
3399
3400 # Pylab support: simple wrappers that activate pylab, load gui input
3400 # Pylab support: simple wrappers that activate pylab, load gui input
3401 # handling and modify slightly %run
3401 # handling and modify slightly %run
3402
3402
3403 @skip_doctest
3403 @skip_doctest
3404 def _pylab_magic_run(self, parameter_s=''):
3404 def _pylab_magic_run(self, parameter_s=''):
3405 Magic.magic_run(self, parameter_s,
3405 Magic.magic_run(self, parameter_s,
3406 runner=mpl_runner(self.shell.safe_execfile))
3406 runner=mpl_runner(self.shell.safe_execfile))
3407
3407
3408 _pylab_magic_run.__doc__ = magic_run.__doc__
3408 _pylab_magic_run.__doc__ = magic_run.__doc__
3409
3409
3410 @skip_doctest
3410 @skip_doctest
3411 def magic_pylab(self, s):
3411 def magic_pylab(self, s):
3412 """Load numpy and matplotlib to work interactively.
3412 """Load numpy and matplotlib to work interactively.
3413
3413
3414 %pylab [GUINAME]
3414 %pylab [GUINAME]
3415
3415
3416 This function lets you activate pylab (matplotlib, numpy and
3416 This function lets you activate pylab (matplotlib, numpy and
3417 interactive support) at any point during an IPython session.
3417 interactive support) at any point during an IPython session.
3418
3418
3419 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3419 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3420 pylab and mlab, as well as all names from numpy and pylab.
3420 pylab and mlab, as well as all names from numpy and pylab.
3421
3421
3422 Parameters
3422 Parameters
3423 ----------
3423 ----------
3424 guiname : optional
3424 guiname : optional
3425 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk', 'osx' or
3425 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk', 'osx' or
3426 'tk'). If given, the corresponding Matplotlib backend is used,
3426 'tk'). If given, the corresponding Matplotlib backend is used,
3427 otherwise matplotlib's default (which you can override in your
3427 otherwise matplotlib's default (which you can override in your
3428 matplotlib config file) is used.
3428 matplotlib config file) is used.
3429
3429
3430 Examples
3430 Examples
3431 --------
3431 --------
3432 In this case, where the MPL default is TkAgg:
3432 In this case, where the MPL default is TkAgg:
3433 In [2]: %pylab
3433 In [2]: %pylab
3434
3434
3435 Welcome to pylab, a matplotlib-based Python environment.
3435 Welcome to pylab, a matplotlib-based Python environment.
3436 Backend in use: TkAgg
3436 Backend in use: TkAgg
3437 For more information, type 'help(pylab)'.
3437 For more information, type 'help(pylab)'.
3438
3438
3439 But you can explicitly request a different backend:
3439 But you can explicitly request a different backend:
3440 In [3]: %pylab qt
3440 In [3]: %pylab qt
3441
3441
3442 Welcome to pylab, a matplotlib-based Python environment.
3442 Welcome to pylab, a matplotlib-based Python environment.
3443 Backend in use: Qt4Agg
3443 Backend in use: Qt4Agg
3444 For more information, type 'help(pylab)'.
3444 For more information, type 'help(pylab)'.
3445 """
3445 """
3446
3446
3447 if Application.initialized():
3447 if Application.initialized():
3448 app = Application.instance()
3448 app = Application.instance()
3449 try:
3449 try:
3450 import_all_status = app.pylab_import_all
3450 import_all_status = app.pylab_import_all
3451 except AttributeError:
3451 except AttributeError:
3452 import_all_status = True
3452 import_all_status = True
3453 else:
3453 else:
3454 import_all_status = True
3454 import_all_status = True
3455
3455
3456 self.shell.enable_pylab(s,import_all=import_all_status)
3456 self.shell.enable_pylab(s,import_all=import_all_status)
3457
3457
3458 def magic_tb(self, s):
3458 def magic_tb(self, s):
3459 """Print the last traceback with the currently active exception mode.
3459 """Print the last traceback with the currently active exception mode.
3460
3460
3461 See %xmode for changing exception reporting modes."""
3461 See %xmode for changing exception reporting modes."""
3462 self.shell.showtraceback()
3462 self.shell.showtraceback()
3463
3463
3464 @skip_doctest
3464 @skip_doctest
3465 def magic_precision(self, s=''):
3465 def magic_precision(self, s=''):
3466 """Set floating point precision for pretty printing.
3466 """Set floating point precision for pretty printing.
3467
3467
3468 Can set either integer precision or a format string.
3468 Can set either integer precision or a format string.
3469
3469
3470 If numpy has been imported and precision is an int,
3470 If numpy has been imported and precision is an int,
3471 numpy display precision will also be set, via ``numpy.set_printoptions``.
3471 numpy display precision will also be set, via ``numpy.set_printoptions``.
3472
3472
3473 If no argument is given, defaults will be restored.
3473 If no argument is given, defaults will be restored.
3474
3474
3475 Examples
3475 Examples
3476 --------
3476 --------
3477 ::
3477 ::
3478
3478
3479 In [1]: from math import pi
3479 In [1]: from math import pi
3480
3480
3481 In [2]: %precision 3
3481 In [2]: %precision 3
3482 Out[2]: u'%.3f'
3482 Out[2]: u'%.3f'
3483
3483
3484 In [3]: pi
3484 In [3]: pi
3485 Out[3]: 3.142
3485 Out[3]: 3.142
3486
3486
3487 In [4]: %precision %i
3487 In [4]: %precision %i
3488 Out[4]: u'%i'
3488 Out[4]: u'%i'
3489
3489
3490 In [5]: pi
3490 In [5]: pi
3491 Out[5]: 3
3491 Out[5]: 3
3492
3492
3493 In [6]: %precision %e
3493 In [6]: %precision %e
3494 Out[6]: u'%e'
3494 Out[6]: u'%e'
3495
3495
3496 In [7]: pi**10
3496 In [7]: pi**10
3497 Out[7]: 9.364805e+04
3497 Out[7]: 9.364805e+04
3498
3498
3499 In [8]: %precision
3499 In [8]: %precision
3500 Out[8]: u'%r'
3500 Out[8]: u'%r'
3501
3501
3502 In [9]: pi**10
3502 In [9]: pi**10
3503 Out[9]: 93648.047476082982
3503 Out[9]: 93648.047476082982
3504
3504
3505 """
3505 """
3506
3506
3507 ptformatter = self.shell.display_formatter.formatters['text/plain']
3507 ptformatter = self.shell.display_formatter.formatters['text/plain']
3508 ptformatter.float_precision = s
3508 ptformatter.float_precision = s
3509 return ptformatter.float_format
3509 return ptformatter.float_format
3510
3510
3511
3511
3512 @magic_arguments.magic_arguments()
3512 @magic_arguments.magic_arguments()
3513 @magic_arguments.argument(
3513 @magic_arguments.argument(
3514 '-e', '--export', action='store_true', default=False,
3514 '-e', '--export', action='store_true', default=False,
3515 help='Export IPython history as a notebook. The filename argument '
3515 help='Export IPython history as a notebook. The filename argument '
3516 'is used to specify the notebook name and format. For example '
3516 'is used to specify the notebook name and format. For example '
3517 'a filename of notebook.ipynb will result in a notebook name '
3517 'a filename of notebook.ipynb will result in a notebook name '
3518 'of "notebook" and a format of "xml". Likewise using a ".json" '
3518 'of "notebook" and a format of "xml". Likewise using a ".json" '
3519 'or ".py" file extension will write the notebook in the json '
3519 'or ".py" file extension will write the notebook in the json '
3520 'or py formats.'
3520 'or py formats.'
3521 )
3521 )
3522 @magic_arguments.argument(
3522 @magic_arguments.argument(
3523 '-f', '--format',
3523 '-f', '--format',
3524 help='Convert an existing IPython notebook to a new format. This option '
3524 help='Convert an existing IPython notebook to a new format. This option '
3525 'specifies the new format and can have the values: xml, json, py. '
3525 'specifies the new format and can have the values: xml, json, py. '
3526 'The target filename is choosen automatically based on the new '
3526 'The target filename is choosen automatically based on the new '
3527 'format. The filename argument gives the name of the source file.'
3527 'format. The filename argument gives the name of the source file.'
3528 )
3528 )
3529 @magic_arguments.argument(
3529 @magic_arguments.argument(
3530 'filename', type=unicode,
3530 'filename', type=unicode,
3531 help='Notebook name or filename'
3531 help='Notebook name or filename'
3532 )
3532 )
3533 def magic_notebook(self, s):
3533 def magic_notebook(self, s):
3534 """Export and convert IPython notebooks.
3534 """Export and convert IPython notebooks.
3535
3535
3536 This function can export the current IPython history to a notebook file
3536 This function can export the current IPython history to a notebook file
3537 or can convert an existing notebook file into a different format. For
3537 or can convert an existing notebook file into a different format. For
3538 example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
3538 example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
3539 To export the history to "foo.py" do "%notebook -e foo.py". To convert
3539 To export the history to "foo.py" do "%notebook -e foo.py". To convert
3540 "foo.ipynb" to "foo.json" do "%notebook -f json foo.ipynb". Possible
3540 "foo.ipynb" to "foo.json" do "%notebook -f json foo.ipynb". Possible
3541 formats include (json/ipynb, py).
3541 formats include (json/ipynb, py).
3542 """
3542 """
3543 args = magic_arguments.parse_argstring(self.magic_notebook, s)
3543 args = magic_arguments.parse_argstring(self.magic_notebook, s)
3544
3544
3545 from IPython.nbformat import current
3545 from IPython.nbformat import current
3546 args.filename = unquote_filename(args.filename)
3546 args.filename = unquote_filename(args.filename)
3547 if args.export:
3547 if args.export:
3548 fname, name, format = current.parse_filename(args.filename)
3548 fname, name, format = current.parse_filename(args.filename)
3549 cells = []
3549 cells = []
3550 hist = list(self.history_manager.get_range())
3550 hist = list(self.history_manager.get_range())
3551 for session, prompt_number, input in hist[:-1]:
3551 for session, prompt_number, input in hist[:-1]:
3552 cells.append(current.new_code_cell(prompt_number=prompt_number, input=input))
3552 cells.append(current.new_code_cell(prompt_number=prompt_number, input=input))
3553 worksheet = current.new_worksheet(cells=cells)
3553 worksheet = current.new_worksheet(cells=cells)
3554 nb = current.new_notebook(name=name,worksheets=[worksheet])
3554 nb = current.new_notebook(name=name,worksheets=[worksheet])
3555 with open(fname, 'w') as f:
3555 with open(fname, 'w') as f:
3556 current.write(nb, f, format);
3556 current.write(nb, f, format);
3557 elif args.format is not None:
3557 elif args.format is not None:
3558 old_fname, old_name, old_format = current.parse_filename(args.filename)
3558 old_fname, old_name, old_format = current.parse_filename(args.filename)
3559 new_format = args.format
3559 new_format = args.format
3560 if new_format == u'xml':
3560 if new_format == u'xml':
3561 raise ValueError('Notebooks cannot be written as xml.')
3561 raise ValueError('Notebooks cannot be written as xml.')
3562 elif new_format == u'ipynb' or new_format == u'json':
3562 elif new_format == u'ipynb' or new_format == u'json':
3563 new_fname = old_name + u'.ipynb'
3563 new_fname = old_name + u'.ipynb'
3564 new_format = u'json'
3564 new_format = u'json'
3565 elif new_format == u'py':
3565 elif new_format == u'py':
3566 new_fname = old_name + u'.py'
3566 new_fname = old_name + u'.py'
3567 else:
3567 else:
3568 raise ValueError('Invalid notebook format: %s' % new_format)
3568 raise ValueError('Invalid notebook format: %s' % new_format)
3569 with open(old_fname, 'r') as f:
3569 with open(old_fname, 'r') as f:
3570 s = f.read()
3570 s = f.read()
3571 try:
3571 try:
3572 nb = current.reads(s, old_format)
3572 nb = current.reads(s, old_format)
3573 except:
3573 except:
3574 nb = current.reads(s, u'xml')
3574 nb = current.reads(s, u'xml')
3575 with open(new_fname, 'w') as f:
3575 with open(new_fname, 'w') as f:
3576 current.write(nb, f, new_format)
3576 current.write(nb, f, new_format)
3577
3577
3578
3578
3579 # end Magic
3579 # end Magic
@@ -1,124 +1,124 b''
1 """Tests for the key interactiveshell module.
1 """Tests for the key interactiveshell module.
2
2
3 Historically the main classes in interactiveshell have been under-tested. This
3 Historically the main classes in interactiveshell have been under-tested. This
4 module should grow as many single-method tests as possible to trap many of the
4 module should grow as many single-method tests as possible to trap many of the
5 recurring bugs we seem to encounter with high-level interaction.
5 recurring bugs we seem to encounter with high-level interaction.
6
6
7 Authors
7 Authors
8 -------
8 -------
9 * Fernando Perez
9 * Fernando Perez
10 """
10 """
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Copyright (C) 2011 The IPython Development Team
12 # Copyright (C) 2011 The IPython Development Team
13 #
13 #
14 # Distributed under the terms of the BSD License. The full license is in
14 # Distributed under the terms of the BSD License. The full license is in
15 # the file COPYING, distributed as part of this software.
15 # the file COPYING, distributed as part of this software.
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Imports
19 # Imports
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # stdlib
21 # stdlib
22 import unittest
22 import unittest
23 from cStringIO import StringIO
23 from StringIO import StringIO
24
24
25 from IPython.testing import decorators as dec
25 from IPython.testing import decorators as dec
26 from IPython.utils import io
26 from IPython.utils import io
27
27
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29 # Tests
29 # Tests
30 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
31
31
32 class InteractiveShellTestCase(unittest.TestCase):
32 class InteractiveShellTestCase(unittest.TestCase):
33 def test_naked_string_cells(self):
33 def test_naked_string_cells(self):
34 """Test that cells with only naked strings are fully executed"""
34 """Test that cells with only naked strings are fully executed"""
35 ip = get_ipython()
35 ip = get_ipython()
36 # First, single-line inputs
36 # First, single-line inputs
37 ip.run_cell('"a"\n')
37 ip.run_cell('"a"\n')
38 self.assertEquals(ip.user_ns['_'], 'a')
38 self.assertEquals(ip.user_ns['_'], 'a')
39 # And also multi-line cells
39 # And also multi-line cells
40 ip.run_cell('"""a\nb"""\n')
40 ip.run_cell('"""a\nb"""\n')
41 self.assertEquals(ip.user_ns['_'], 'a\nb')
41 self.assertEquals(ip.user_ns['_'], 'a\nb')
42
42
43 def test_run_empty_cell(self):
43 def test_run_empty_cell(self):
44 """Just make sure we don't get a horrible error with a blank
44 """Just make sure we don't get a horrible error with a blank
45 cell of input. Yes, I did overlook that."""
45 cell of input. Yes, I did overlook that."""
46 ip = get_ipython()
46 ip = get_ipython()
47 old_xc = ip.execution_count
47 old_xc = ip.execution_count
48 ip.run_cell('')
48 ip.run_cell('')
49 self.assertEquals(ip.execution_count, old_xc)
49 self.assertEquals(ip.execution_count, old_xc)
50
50
51 def test_run_cell_multiline(self):
51 def test_run_cell_multiline(self):
52 """Multi-block, multi-line cells must execute correctly.
52 """Multi-block, multi-line cells must execute correctly.
53 """
53 """
54 ip = get_ipython()
54 ip = get_ipython()
55 src = '\n'.join(["x=1",
55 src = '\n'.join(["x=1",
56 "y=2",
56 "y=2",
57 "if 1:",
57 "if 1:",
58 " x += 1",
58 " x += 1",
59 " y += 1",])
59 " y += 1",])
60 ip.run_cell(src)
60 ip.run_cell(src)
61 self.assertEquals(ip.user_ns['x'], 2)
61 self.assertEquals(ip.user_ns['x'], 2)
62 self.assertEquals(ip.user_ns['y'], 3)
62 self.assertEquals(ip.user_ns['y'], 3)
63
63
64 def test_multiline_string_cells(self):
64 def test_multiline_string_cells(self):
65 "Code sprinkled with multiline strings should execute (GH-306)"
65 "Code sprinkled with multiline strings should execute (GH-306)"
66 ip = get_ipython()
66 ip = get_ipython()
67 ip.run_cell('tmp=0')
67 ip.run_cell('tmp=0')
68 self.assertEquals(ip.user_ns['tmp'], 0)
68 self.assertEquals(ip.user_ns['tmp'], 0)
69 ip.run_cell('tmp=1;"""a\nb"""\n')
69 ip.run_cell('tmp=1;"""a\nb"""\n')
70 self.assertEquals(ip.user_ns['tmp'], 1)
70 self.assertEquals(ip.user_ns['tmp'], 1)
71
71
72 def test_dont_cache_with_semicolon(self):
72 def test_dont_cache_with_semicolon(self):
73 "Ending a line with semicolon should not cache the returned object (GH-307)"
73 "Ending a line with semicolon should not cache the returned object (GH-307)"
74 ip = get_ipython()
74 ip = get_ipython()
75 oldlen = len(ip.user_ns['Out'])
75 oldlen = len(ip.user_ns['Out'])
76 a = ip.run_cell('1;')
76 a = ip.run_cell('1;')
77 newlen = len(ip.user_ns['Out'])
77 newlen = len(ip.user_ns['Out'])
78 self.assertEquals(oldlen, newlen)
78 self.assertEquals(oldlen, newlen)
79 #also test the default caching behavior
79 #also test the default caching behavior
80 ip.run_cell('1')
80 ip.run_cell('1')
81 newlen = len(ip.user_ns['Out'])
81 newlen = len(ip.user_ns['Out'])
82 self.assertEquals(oldlen+1, newlen)
82 self.assertEquals(oldlen+1, newlen)
83
83
84 def test_In_variable(self):
84 def test_In_variable(self):
85 "Verify that In variable grows with user input (GH-284)"
85 "Verify that In variable grows with user input (GH-284)"
86 ip = get_ipython()
86 ip = get_ipython()
87 oldlen = len(ip.user_ns['In'])
87 oldlen = len(ip.user_ns['In'])
88 ip.run_cell('1;')
88 ip.run_cell('1;')
89 newlen = len(ip.user_ns['In'])
89 newlen = len(ip.user_ns['In'])
90 self.assertEquals(oldlen+1, newlen)
90 self.assertEquals(oldlen+1, newlen)
91 self.assertEquals(ip.user_ns['In'][-1],'1;')
91 self.assertEquals(ip.user_ns['In'][-1],'1;')
92
92
93 def test_magic_names_in_string(self):
93 def test_magic_names_in_string(self):
94 ip = get_ipython()
94 ip = get_ipython()
95 ip.run_cell('a = """\n%exit\n"""')
95 ip.run_cell('a = """\n%exit\n"""')
96 self.assertEquals(ip.user_ns['a'], '\n%exit\n')
96 self.assertEquals(ip.user_ns['a'], '\n%exit\n')
97
97
98 def test_alias_crash(self):
98 def test_alias_crash(self):
99 """Errors in prefilter can't crash IPython"""
99 """Errors in prefilter can't crash IPython"""
100 ip = get_ipython()
100 ip = get_ipython()
101 ip.run_cell('%alias parts echo first %s second %s')
101 ip.run_cell('%alias parts echo first %s second %s')
102 # capture stderr:
102 # capture stderr:
103 save_err = io.stderr
103 save_err = io.stderr
104 io.stderr = StringIO()
104 io.stderr = StringIO()
105 ip.run_cell('parts 1')
105 ip.run_cell('parts 1')
106 err = io.stderr.getvalue()
106 err = io.stderr.getvalue()
107 io.stderr = save_err
107 io.stderr = save_err
108 self.assertEquals(err.split(':')[0], 'ERROR')
108 self.assertEquals(err.split(':')[0], 'ERROR')
109
109
110 def test_trailing_newline(self):
110 def test_trailing_newline(self):
111 """test that running !(command) does not raise a SyntaxError"""
111 """test that running !(command) does not raise a SyntaxError"""
112 ip = get_ipython()
112 ip = get_ipython()
113 ip.run_cell('!(true)\n', False)
113 ip.run_cell('!(true)\n', False)
114 ip.run_cell('!(true)\n\n\n', False)
114 ip.run_cell('!(true)\n\n\n', False)
115
115
116 def test_gh_597(self):
116 def test_gh_597(self):
117 """Pretty-printing lists of objects with non-ascii reprs may cause
117 """Pretty-printing lists of objects with non-ascii reprs may cause
118 problems."""
118 problems."""
119 class Spam(object):
119 class Spam(object):
120 def __repr__(self):
120 def __repr__(self):
121 return "\xe9"*50
121 return "\xe9"*50
122 import IPython.core.formatters
122 import IPython.core.formatters
123 f = IPython.core.formatters.PlainTextFormatter()
123 f = IPython.core.formatters.PlainTextFormatter()
124 f([Spam(),Spam()])
124 f([Spam(),Spam()])
@@ -1,462 +1,462 b''
1 """Tests for various magic functions.
1 """Tests for various magic functions.
2
2
3 Needs to be run by nose (to make ipython session available).
3 Needs to be run by nose (to make ipython session available).
4 """
4 """
5 from __future__ import absolute_import
5 from __future__ import absolute_import
6
6
7 #-----------------------------------------------------------------------------
7 #-----------------------------------------------------------------------------
8 # Imports
8 # Imports
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 import os
11 import os
12 import sys
12 import sys
13 import tempfile
13 import tempfile
14 import types
14 import types
15 from cStringIO import StringIO
15 from StringIO import StringIO
16
16
17 import nose.tools as nt
17 import nose.tools as nt
18
18
19 from IPython.utils.path import get_long_path_name
19 from IPython.utils.path import get_long_path_name
20 from IPython.testing import decorators as dec
20 from IPython.testing import decorators as dec
21 from IPython.testing import tools as tt
21 from IPython.testing import tools as tt
22
22
23 #-----------------------------------------------------------------------------
23 #-----------------------------------------------------------------------------
24 # Test functions begin
24 # Test functions begin
25 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
26 def test_rehashx():
26 def test_rehashx():
27 # clear up everything
27 # clear up everything
28 _ip = get_ipython()
28 _ip = get_ipython()
29 _ip.alias_manager.alias_table.clear()
29 _ip.alias_manager.alias_table.clear()
30 del _ip.db['syscmdlist']
30 del _ip.db['syscmdlist']
31
31
32 _ip.magic('rehashx')
32 _ip.magic('rehashx')
33 # Practically ALL ipython development systems will have more than 10 aliases
33 # Practically ALL ipython development systems will have more than 10 aliases
34
34
35 yield (nt.assert_true, len(_ip.alias_manager.alias_table) > 10)
35 yield (nt.assert_true, len(_ip.alias_manager.alias_table) > 10)
36 for key, val in _ip.alias_manager.alias_table.iteritems():
36 for key, val in _ip.alias_manager.alias_table.iteritems():
37 # we must strip dots from alias names
37 # we must strip dots from alias names
38 nt.assert_true('.' not in key)
38 nt.assert_true('.' not in key)
39
39
40 # rehashx must fill up syscmdlist
40 # rehashx must fill up syscmdlist
41 scoms = _ip.db['syscmdlist']
41 scoms = _ip.db['syscmdlist']
42 yield (nt.assert_true, len(scoms) > 10)
42 yield (nt.assert_true, len(scoms) > 10)
43
43
44
44
45 def test_magic_parse_options():
45 def test_magic_parse_options():
46 """Test that we don't mangle paths when parsing magic options."""
46 """Test that we don't mangle paths when parsing magic options."""
47 ip = get_ipython()
47 ip = get_ipython()
48 path = 'c:\\x'
48 path = 'c:\\x'
49 opts = ip.parse_options('-f %s' % path,'f:')[0]
49 opts = ip.parse_options('-f %s' % path,'f:')[0]
50 # argv splitting is os-dependent
50 # argv splitting is os-dependent
51 if os.name == 'posix':
51 if os.name == 'posix':
52 expected = 'c:x'
52 expected = 'c:x'
53 else:
53 else:
54 expected = path
54 expected = path
55 nt.assert_equals(opts['f'], expected)
55 nt.assert_equals(opts['f'], expected)
56
56
57
57
58 def doctest_hist_f():
58 def doctest_hist_f():
59 """Test %hist -f with temporary filename.
59 """Test %hist -f with temporary filename.
60
60
61 In [9]: import tempfile
61 In [9]: import tempfile
62
62
63 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
63 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
64
64
65 In [11]: %hist -nl -f $tfile 3
65 In [11]: %hist -nl -f $tfile 3
66
66
67 In [13]: import os; os.unlink(tfile)
67 In [13]: import os; os.unlink(tfile)
68 """
68 """
69
69
70
70
71 def doctest_hist_r():
71 def doctest_hist_r():
72 """Test %hist -r
72 """Test %hist -r
73
73
74 XXX - This test is not recording the output correctly. For some reason, in
74 XXX - This test is not recording the output correctly. For some reason, in
75 testing mode the raw history isn't getting populated. No idea why.
75 testing mode the raw history isn't getting populated. No idea why.
76 Disabling the output checking for now, though at least we do run it.
76 Disabling the output checking for now, though at least we do run it.
77
77
78 In [1]: 'hist' in _ip.lsmagic()
78 In [1]: 'hist' in _ip.lsmagic()
79 Out[1]: True
79 Out[1]: True
80
80
81 In [2]: x=1
81 In [2]: x=1
82
82
83 In [3]: %hist -rl 2
83 In [3]: %hist -rl 2
84 x=1 # random
84 x=1 # random
85 %hist -r 2
85 %hist -r 2
86 """
86 """
87
87
88 def doctest_hist_op():
88 def doctest_hist_op():
89 """Test %hist -op
89 """Test %hist -op
90
90
91 In [1]: class b:
91 In [1]: class b:
92 ...: pass
92 ...: pass
93 ...:
93 ...:
94
94
95 In [2]: class s(b):
95 In [2]: class s(b):
96 ...: def __str__(self):
96 ...: def __str__(self):
97 ...: return 's'
97 ...: return 's'
98 ...:
98 ...:
99
99
100 In [3]:
100 In [3]:
101
101
102 In [4]: class r(b):
102 In [4]: class r(b):
103 ...: def __repr__(self):
103 ...: def __repr__(self):
104 ...: return 'r'
104 ...: return 'r'
105 ...:
105 ...:
106
106
107 In [5]: class sr(s,r): pass
107 In [5]: class sr(s,r): pass
108 ...:
108 ...:
109
109
110 In [6]:
110 In [6]:
111
111
112 In [7]: bb=b()
112 In [7]: bb=b()
113
113
114 In [8]: ss=s()
114 In [8]: ss=s()
115
115
116 In [9]: rr=r()
116 In [9]: rr=r()
117
117
118 In [10]: ssrr=sr()
118 In [10]: ssrr=sr()
119
119
120 In [11]: bb
120 In [11]: bb
121 Out[11]: <...b instance at ...>
121 Out[11]: <...b instance at ...>
122
122
123 In [12]: ss
123 In [12]: ss
124 Out[12]: <...s instance at ...>
124 Out[12]: <...s instance at ...>
125
125
126 In [13]:
126 In [13]:
127
127
128 In [14]: %hist -op
128 In [14]: %hist -op
129 >>> class b:
129 >>> class b:
130 ... pass
130 ... pass
131 ...
131 ...
132 >>> class s(b):
132 >>> class s(b):
133 ... def __str__(self):
133 ... def __str__(self):
134 ... return 's'
134 ... return 's'
135 ...
135 ...
136 >>>
136 >>>
137 >>> class r(b):
137 >>> class r(b):
138 ... def __repr__(self):
138 ... def __repr__(self):
139 ... return 'r'
139 ... return 'r'
140 ...
140 ...
141 >>> class sr(s,r): pass
141 >>> class sr(s,r): pass
142 >>>
142 >>>
143 >>> bb=b()
143 >>> bb=b()
144 >>> ss=s()
144 >>> ss=s()
145 >>> rr=r()
145 >>> rr=r()
146 >>> ssrr=sr()
146 >>> ssrr=sr()
147 >>> bb
147 >>> bb
148 <...b instance at ...>
148 <...b instance at ...>
149 >>> ss
149 >>> ss
150 <...s instance at ...>
150 <...s instance at ...>
151 >>>
151 >>>
152 """
152 """
153
153
154 def test_macro():
154 def test_macro():
155 ip = get_ipython()
155 ip = get_ipython()
156 ip.history_manager.reset() # Clear any existing history.
156 ip.history_manager.reset() # Clear any existing history.
157 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
157 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
158 for i, cmd in enumerate(cmds, start=1):
158 for i, cmd in enumerate(cmds, start=1):
159 ip.history_manager.store_inputs(i, cmd)
159 ip.history_manager.store_inputs(i, cmd)
160 ip.magic("macro test 1-3")
160 ip.magic("macro test 1-3")
161 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
161 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
162
162
163 # List macros.
163 # List macros.
164 assert "test" in ip.magic("macro")
164 assert "test" in ip.magic("macro")
165
165
166 def test_macro_run():
166 def test_macro_run():
167 """Test that we can run a multi-line macro successfully."""
167 """Test that we can run a multi-line macro successfully."""
168 ip = get_ipython()
168 ip = get_ipython()
169 ip.history_manager.reset()
169 ip.history_manager.reset()
170 cmds = ["a=10", "a+=1", "print a", "%macro test 2-3"]
170 cmds = ["a=10", "a+=1", "print a", "%macro test 2-3"]
171 for cmd in cmds:
171 for cmd in cmds:
172 ip.run_cell(cmd)
172 ip.run_cell(cmd)
173 nt.assert_equal(ip.user_ns["test"].value, "a+=1\nprint a\n")
173 nt.assert_equal(ip.user_ns["test"].value, "a+=1\nprint a\n")
174 original_stdout = sys.stdout
174 original_stdout = sys.stdout
175 new_stdout = StringIO()
175 new_stdout = StringIO()
176 sys.stdout = new_stdout
176 sys.stdout = new_stdout
177 try:
177 try:
178 ip.run_cell("test")
178 ip.run_cell("test")
179 nt.assert_true("12" in new_stdout.getvalue())
179 nt.assert_true("12" in new_stdout.getvalue())
180 ip.run_cell("test")
180 ip.run_cell("test")
181 nt.assert_true("13" in new_stdout.getvalue())
181 nt.assert_true("13" in new_stdout.getvalue())
182 finally:
182 finally:
183 sys.stdout = original_stdout
183 sys.stdout = original_stdout
184 new_stdout.close()
184 new_stdout.close()
185
185
186
186
187 # XXX failing for now, until we get clearcmd out of quarantine. But we should
187 # XXX failing for now, until we get clearcmd out of quarantine. But we should
188 # fix this and revert the skip to happen only if numpy is not around.
188 # fix this and revert the skip to happen only if numpy is not around.
189 #@dec.skipif_not_numpy
189 #@dec.skipif_not_numpy
190 @dec.skip_known_failure
190 @dec.skip_known_failure
191 def test_numpy_clear_array_undec():
191 def test_numpy_clear_array_undec():
192 from IPython.extensions import clearcmd
192 from IPython.extensions import clearcmd
193
193
194 _ip.ex('import numpy as np')
194 _ip.ex('import numpy as np')
195 _ip.ex('a = np.empty(2)')
195 _ip.ex('a = np.empty(2)')
196 yield (nt.assert_true, 'a' in _ip.user_ns)
196 yield (nt.assert_true, 'a' in _ip.user_ns)
197 _ip.magic('clear array')
197 _ip.magic('clear array')
198 yield (nt.assert_false, 'a' in _ip.user_ns)
198 yield (nt.assert_false, 'a' in _ip.user_ns)
199
199
200
200
201 # Multiple tests for clipboard pasting
201 # Multiple tests for clipboard pasting
202 @dec.parametric
202 @dec.parametric
203 def test_paste():
203 def test_paste():
204 _ip = get_ipython()
204 _ip = get_ipython()
205 def paste(txt, flags='-q'):
205 def paste(txt, flags='-q'):
206 """Paste input text, by default in quiet mode"""
206 """Paste input text, by default in quiet mode"""
207 hooks.clipboard_get = lambda : txt
207 hooks.clipboard_get = lambda : txt
208 _ip.magic('paste '+flags)
208 _ip.magic('paste '+flags)
209
209
210 # Inject fake clipboard hook but save original so we can restore it later
210 # Inject fake clipboard hook but save original so we can restore it later
211 hooks = _ip.hooks
211 hooks = _ip.hooks
212 user_ns = _ip.user_ns
212 user_ns = _ip.user_ns
213 original_clip = hooks.clipboard_get
213 original_clip = hooks.clipboard_get
214
214
215 try:
215 try:
216 # This try/except with an emtpy except clause is here only because
216 # This try/except with an emtpy except clause is here only because
217 # try/yield/finally is invalid syntax in Python 2.4. This will be
217 # try/yield/finally is invalid syntax in Python 2.4. This will be
218 # removed when we drop 2.4-compatibility, and the emtpy except below
218 # removed when we drop 2.4-compatibility, and the emtpy except below
219 # will be changed to a finally.
219 # will be changed to a finally.
220
220
221 # Run tests with fake clipboard function
221 # Run tests with fake clipboard function
222 user_ns.pop('x', None)
222 user_ns.pop('x', None)
223 paste('x=1')
223 paste('x=1')
224 yield nt.assert_equal(user_ns['x'], 1)
224 yield nt.assert_equal(user_ns['x'], 1)
225
225
226 user_ns.pop('x', None)
226 user_ns.pop('x', None)
227 paste('>>> x=2')
227 paste('>>> x=2')
228 yield nt.assert_equal(user_ns['x'], 2)
228 yield nt.assert_equal(user_ns['x'], 2)
229
229
230 paste("""
230 paste("""
231 >>> x = [1,2,3]
231 >>> x = [1,2,3]
232 >>> y = []
232 >>> y = []
233 >>> for i in x:
233 >>> for i in x:
234 ... y.append(i**2)
234 ... y.append(i**2)
235 ...
235 ...
236 """)
236 """)
237 yield nt.assert_equal(user_ns['x'], [1,2,3])
237 yield nt.assert_equal(user_ns['x'], [1,2,3])
238 yield nt.assert_equal(user_ns['y'], [1,4,9])
238 yield nt.assert_equal(user_ns['y'], [1,4,9])
239
239
240 # Now, test that paste -r works
240 # Now, test that paste -r works
241 user_ns.pop('x', None)
241 user_ns.pop('x', None)
242 yield nt.assert_false('x' in user_ns)
242 yield nt.assert_false('x' in user_ns)
243 _ip.magic('paste -r')
243 _ip.magic('paste -r')
244 yield nt.assert_equal(user_ns['x'], [1,2,3])
244 yield nt.assert_equal(user_ns['x'], [1,2,3])
245
245
246 # Also test paste echoing, by temporarily faking the writer
246 # Also test paste echoing, by temporarily faking the writer
247 w = StringIO()
247 w = StringIO()
248 writer = _ip.write
248 writer = _ip.write
249 _ip.write = w.write
249 _ip.write = w.write
250 code = """
250 code = """
251 a = 100
251 a = 100
252 b = 200"""
252 b = 200"""
253 try:
253 try:
254 paste(code,'')
254 paste(code,'')
255 out = w.getvalue()
255 out = w.getvalue()
256 finally:
256 finally:
257 _ip.write = writer
257 _ip.write = writer
258 yield nt.assert_equal(user_ns['a'], 100)
258 yield nt.assert_equal(user_ns['a'], 100)
259 yield nt.assert_equal(user_ns['b'], 200)
259 yield nt.assert_equal(user_ns['b'], 200)
260 yield nt.assert_equal(out, code+"\n## -- End pasted text --\n")
260 yield nt.assert_equal(out, code+"\n## -- End pasted text --\n")
261
261
262 finally:
262 finally:
263 # This should be in a finally clause, instead of the bare except above.
263 # This should be in a finally clause, instead of the bare except above.
264 # Restore original hook
264 # Restore original hook
265 hooks.clipboard_get = original_clip
265 hooks.clipboard_get = original_clip
266
266
267
267
268 def test_time():
268 def test_time():
269 _ip.magic('time None')
269 _ip.magic('time None')
270
270
271
271
272 def doctest_time():
272 def doctest_time():
273 """
273 """
274 In [10]: %time None
274 In [10]: %time None
275 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
275 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
276 Wall time: 0.00 s
276 Wall time: 0.00 s
277
277
278 In [11]: def f(kmjy):
278 In [11]: def f(kmjy):
279 ....: %time print 2*kmjy
279 ....: %time print 2*kmjy
280
280
281 In [12]: f(3)
281 In [12]: f(3)
282 6
282 6
283 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
283 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
284 Wall time: 0.00 s
284 Wall time: 0.00 s
285 """
285 """
286
286
287
287
288 def test_doctest_mode():
288 def test_doctest_mode():
289 "Toggle doctest_mode twice, it should be a no-op and run without error"
289 "Toggle doctest_mode twice, it should be a no-op and run without error"
290 _ip.magic('doctest_mode')
290 _ip.magic('doctest_mode')
291 _ip.magic('doctest_mode')
291 _ip.magic('doctest_mode')
292
292
293
293
294 def test_parse_options():
294 def test_parse_options():
295 """Tests for basic options parsing in magics."""
295 """Tests for basic options parsing in magics."""
296 # These are only the most minimal of tests, more should be added later. At
296 # These are only the most minimal of tests, more should be added later. At
297 # the very least we check that basic text/unicode calls work OK.
297 # the very least we check that basic text/unicode calls work OK.
298 nt.assert_equal(_ip.parse_options('foo', '')[1], 'foo')
298 nt.assert_equal(_ip.parse_options('foo', '')[1], 'foo')
299 nt.assert_equal(_ip.parse_options(u'foo', '')[1], u'foo')
299 nt.assert_equal(_ip.parse_options(u'foo', '')[1], u'foo')
300
300
301
301
302 def test_dirops():
302 def test_dirops():
303 """Test various directory handling operations."""
303 """Test various directory handling operations."""
304 # curpath = lambda :os.path.splitdrive(os.getcwdu())[1].replace('\\','/')
304 # curpath = lambda :os.path.splitdrive(os.getcwdu())[1].replace('\\','/')
305 curpath = os.getcwdu
305 curpath = os.getcwdu
306 startdir = os.getcwdu()
306 startdir = os.getcwdu()
307 ipdir = _ip.ipython_dir
307 ipdir = _ip.ipython_dir
308 try:
308 try:
309 _ip.magic('cd "%s"' % ipdir)
309 _ip.magic('cd "%s"' % ipdir)
310 nt.assert_equal(curpath(), ipdir)
310 nt.assert_equal(curpath(), ipdir)
311 _ip.magic('cd -')
311 _ip.magic('cd -')
312 nt.assert_equal(curpath(), startdir)
312 nt.assert_equal(curpath(), startdir)
313 _ip.magic('pushd "%s"' % ipdir)
313 _ip.magic('pushd "%s"' % ipdir)
314 nt.assert_equal(curpath(), ipdir)
314 nt.assert_equal(curpath(), ipdir)
315 _ip.magic('popd')
315 _ip.magic('popd')
316 nt.assert_equal(curpath(), startdir)
316 nt.assert_equal(curpath(), startdir)
317 finally:
317 finally:
318 os.chdir(startdir)
318 os.chdir(startdir)
319
319
320
320
321 def check_cpaste(code, should_fail=False):
321 def check_cpaste(code, should_fail=False):
322 """Execute code via 'cpaste' and ensure it was executed, unless
322 """Execute code via 'cpaste' and ensure it was executed, unless
323 should_fail is set.
323 should_fail is set.
324 """
324 """
325 _ip.user_ns['code_ran'] = False
325 _ip.user_ns['code_ran'] = False
326
326
327 src = StringIO()
327 src = StringIO()
328 src.write('\n')
328 src.write('\n')
329 src.write(code)
329 src.write(code)
330 src.write('\n--\n')
330 src.write('\n--\n')
331 src.seek(0)
331 src.seek(0)
332
332
333 stdin_save = sys.stdin
333 stdin_save = sys.stdin
334 sys.stdin = src
334 sys.stdin = src
335
335
336 try:
336 try:
337 _ip.magic('cpaste')
337 _ip.magic('cpaste')
338 except:
338 except:
339 if not should_fail:
339 if not should_fail:
340 raise AssertionError("Failure not expected : '%s'" %
340 raise AssertionError("Failure not expected : '%s'" %
341 code)
341 code)
342 else:
342 else:
343 assert _ip.user_ns['code_ran']
343 assert _ip.user_ns['code_ran']
344 if should_fail:
344 if should_fail:
345 raise AssertionError("Failure expected : '%s'" % code)
345 raise AssertionError("Failure expected : '%s'" % code)
346 finally:
346 finally:
347 sys.stdin = stdin_save
347 sys.stdin = stdin_save
348
348
349
349
350 def test_cpaste():
350 def test_cpaste():
351 """Test cpaste magic"""
351 """Test cpaste magic"""
352
352
353 def run():
353 def run():
354 """Marker function: sets a flag when executed.
354 """Marker function: sets a flag when executed.
355 """
355 """
356 _ip.user_ns['code_ran'] = True
356 _ip.user_ns['code_ran'] = True
357 return 'run' # return string so '+ run()' doesn't result in success
357 return 'run' # return string so '+ run()' doesn't result in success
358
358
359 tests = {'pass': ["> > > run()",
359 tests = {'pass': ["> > > run()",
360 ">>> > run()",
360 ">>> > run()",
361 "+++ run()",
361 "+++ run()",
362 "++ run()",
362 "++ run()",
363 " >>> run()"],
363 " >>> run()"],
364
364
365 'fail': ["+ + run()",
365 'fail': ["+ + run()",
366 " ++ run()"]}
366 " ++ run()"]}
367
367
368 _ip.user_ns['run'] = run
368 _ip.user_ns['run'] = run
369
369
370 for code in tests['pass']:
370 for code in tests['pass']:
371 check_cpaste(code)
371 check_cpaste(code)
372
372
373 for code in tests['fail']:
373 for code in tests['fail']:
374 check_cpaste(code, should_fail=True)
374 check_cpaste(code, should_fail=True)
375
375
376 def test_xmode():
376 def test_xmode():
377 # Calling xmode three times should be a no-op
377 # Calling xmode three times should be a no-op
378 xmode = _ip.InteractiveTB.mode
378 xmode = _ip.InteractiveTB.mode
379 for i in range(3):
379 for i in range(3):
380 _ip.magic("xmode")
380 _ip.magic("xmode")
381 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
381 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
382
382
383 def test_reset_hard():
383 def test_reset_hard():
384 monitor = []
384 monitor = []
385 class A(object):
385 class A(object):
386 def __del__(self):
386 def __del__(self):
387 monitor.append(1)
387 monitor.append(1)
388 def __repr__(self):
388 def __repr__(self):
389 return "<A instance>"
389 return "<A instance>"
390
390
391 _ip.user_ns["a"] = A()
391 _ip.user_ns["a"] = A()
392 _ip.run_cell("a")
392 _ip.run_cell("a")
393
393
394 nt.assert_equal(monitor, [])
394 nt.assert_equal(monitor, [])
395 _ip.magic_reset("-f")
395 _ip.magic_reset("-f")
396 nt.assert_equal(monitor, [1])
396 nt.assert_equal(monitor, [1])
397
397
398 class TestXdel(tt.TempFileMixin):
398 class TestXdel(tt.TempFileMixin):
399 def test_xdel(self):
399 def test_xdel(self):
400 """Test that references from %run are cleared by xdel."""
400 """Test that references from %run are cleared by xdel."""
401 src = ("class A(object):\n"
401 src = ("class A(object):\n"
402 " monitor = []\n"
402 " monitor = []\n"
403 " def __del__(self):\n"
403 " def __del__(self):\n"
404 " self.monitor.append(1)\n"
404 " self.monitor.append(1)\n"
405 "a = A()\n")
405 "a = A()\n")
406 self.mktmp(src)
406 self.mktmp(src)
407 # %run creates some hidden references...
407 # %run creates some hidden references...
408 _ip.magic("run %s" % self.fname)
408 _ip.magic("run %s" % self.fname)
409 # ... as does the displayhook.
409 # ... as does the displayhook.
410 _ip.run_cell("a")
410 _ip.run_cell("a")
411
411
412 monitor = _ip.user_ns["A"].monitor
412 monitor = _ip.user_ns["A"].monitor
413 nt.assert_equal(monitor, [])
413 nt.assert_equal(monitor, [])
414
414
415 _ip.magic("xdel a")
415 _ip.magic("xdel a")
416
416
417 # Check that a's __del__ method has been called.
417 # Check that a's __del__ method has been called.
418 nt.assert_equal(monitor, [1])
418 nt.assert_equal(monitor, [1])
419
419
420 def doctest_who():
420 def doctest_who():
421 """doctest for %who
421 """doctest for %who
422
422
423 In [1]: %reset -f
423 In [1]: %reset -f
424
424
425 In [2]: alpha = 123
425 In [2]: alpha = 123
426
426
427 In [3]: beta = 'beta'
427 In [3]: beta = 'beta'
428
428
429 In [4]: %who int
429 In [4]: %who int
430 alpha
430 alpha
431
431
432 In [5]: %who str
432 In [5]: %who str
433 beta
433 beta
434
434
435 In [6]: %whos
435 In [6]: %whos
436 Variable Type Data/Info
436 Variable Type Data/Info
437 ----------------------------
437 ----------------------------
438 alpha int 123
438 alpha int 123
439 beta str beta
439 beta str beta
440
440
441 In [7]: %who_ls
441 In [7]: %who_ls
442 Out[7]: ['alpha', 'beta']
442 Out[7]: ['alpha', 'beta']
443 """
443 """
444
444
445 def doctest_precision():
445 def doctest_precision():
446 """doctest for %precision
446 """doctest for %precision
447
447
448 In [1]: f = get_ipython().shell.display_formatter.formatters['text/plain']
448 In [1]: f = get_ipython().shell.display_formatter.formatters['text/plain']
449
449
450 In [2]: %precision 5
450 In [2]: %precision 5
451 Out[2]: u'%.5f'
451 Out[2]: u'%.5f'
452
452
453 In [3]: f.float_format
453 In [3]: f.float_format
454 Out[3]: u'%.5f'
454 Out[3]: u'%.5f'
455
455
456 In [4]: %precision %e
456 In [4]: %precision %e
457 Out[4]: u'%e'
457 Out[4]: u'%e'
458
458
459 In [5]: f(3.1415927)
459 In [5]: f(3.1415927)
460 Out[5]: u'3.141593e+00'
460 Out[5]: u'3.141593e+00'
461 """
461 """
462
462
@@ -1,170 +1,170 b''
1 """Test suite for the irunner module.
1 """Test suite for the irunner module.
2
2
3 Not the most elegant or fine-grained, but it does cover at least the bulk
3 Not the most elegant or fine-grained, but it does cover at least the bulk
4 functionality."""
4 functionality."""
5
5
6 # Global to make tests extra verbose and help debugging
6 # Global to make tests extra verbose and help debugging
7 VERBOSE = True
7 VERBOSE = True
8
8
9 # stdlib imports
9 # stdlib imports
10 import cStringIO as StringIO
10 import StringIO
11 import sys
11 import sys
12 import unittest
12 import unittest
13
13
14 # IPython imports
14 # IPython imports
15 from IPython.lib import irunner
15 from IPython.lib import irunner
16
16
17 # Testing code begins
17 # Testing code begins
18 class RunnerTestCase(unittest.TestCase):
18 class RunnerTestCase(unittest.TestCase):
19
19
20 def setUp(self):
20 def setUp(self):
21 self.out = StringIO.StringIO()
21 self.out = StringIO.StringIO()
22 #self.out = sys.stdout
22 #self.out = sys.stdout
23
23
24 def _test_runner(self,runner,source,output):
24 def _test_runner(self,runner,source,output):
25 """Test that a given runner's input/output match."""
25 """Test that a given runner's input/output match."""
26
26
27 runner.run_source(source)
27 runner.run_source(source)
28 out = self.out.getvalue()
28 out = self.out.getvalue()
29 #out = ''
29 #out = ''
30 # this output contains nasty \r\n lineends, and the initial ipython
30 # this output contains nasty \r\n lineends, and the initial ipython
31 # banner. clean it up for comparison, removing lines of whitespace
31 # banner. clean it up for comparison, removing lines of whitespace
32 output_l = [l for l in output.splitlines() if l and not l.isspace()]
32 output_l = [l for l in output.splitlines() if l and not l.isspace()]
33 out_l = [l for l in out.splitlines() if l and not l.isspace()]
33 out_l = [l for l in out.splitlines() if l and not l.isspace()]
34 mismatch = 0
34 mismatch = 0
35 if len(output_l) != len(out_l):
35 if len(output_l) != len(out_l):
36 message = ("Mismatch in number of lines\n\n"
36 message = ("Mismatch in number of lines\n\n"
37 "Expected:\n"
37 "Expected:\n"
38 "~~~~~~~~~\n"
38 "~~~~~~~~~\n"
39 "%s\n\n"
39 "%s\n\n"
40 "Got:\n"
40 "Got:\n"
41 "~~~~~~~~~\n"
41 "~~~~~~~~~\n"
42 "%s"
42 "%s"
43 ) % ("\n".join(output_l), "\n".join(out_l))
43 ) % ("\n".join(output_l), "\n".join(out_l))
44 self.fail(message)
44 self.fail(message)
45 for n in range(len(output_l)):
45 for n in range(len(output_l)):
46 # Do a line-by-line comparison
46 # Do a line-by-line comparison
47 ol1 = output_l[n].strip()
47 ol1 = output_l[n].strip()
48 ol2 = out_l[n].strip()
48 ol2 = out_l[n].strip()
49 if ol1 != ol2:
49 if ol1 != ol2:
50 mismatch += 1
50 mismatch += 1
51 if VERBOSE:
51 if VERBOSE:
52 print '<<< line %s does not match:' % n
52 print '<<< line %s does not match:' % n
53 print repr(ol1)
53 print repr(ol1)
54 print repr(ol2)
54 print repr(ol2)
55 print '>>>'
55 print '>>>'
56 self.assert_(mismatch==0,'Number of mismatched lines: %s' %
56 self.assert_(mismatch==0,'Number of mismatched lines: %s' %
57 mismatch)
57 mismatch)
58
58
59 def testIPython(self):
59 def testIPython(self):
60 """Test the IPython runner."""
60 """Test the IPython runner."""
61 source = """
61 source = """
62 print 'hello, this is python'
62 print 'hello, this is python'
63 # some more code
63 # some more code
64 x=1;y=2
64 x=1;y=2
65 x+y**2
65 x+y**2
66
66
67 # An example of autocall functionality
67 # An example of autocall functionality
68 from math import *
68 from math import *
69 autocall 1
69 autocall 1
70 cos pi
70 cos pi
71 autocall 0
71 autocall 0
72 cos pi
72 cos pi
73 cos(pi)
73 cos(pi)
74
74
75 for i in range(5):
75 for i in range(5):
76 print i,
76 print i,
77
77
78 print "that's all folks!"
78 print "that's all folks!"
79
79
80 exit
80 exit
81 """
81 """
82 output = """\
82 output = """\
83 In [1]: print 'hello, this is python'
83 In [1]: print 'hello, this is python'
84 hello, this is python
84 hello, this is python
85
85
86
86
87 # some more code
87 # some more code
88 In [2]: x=1;y=2
88 In [2]: x=1;y=2
89
89
90 In [3]: x+y**2
90 In [3]: x+y**2
91 Out[3]: 5
91 Out[3]: 5
92
92
93
93
94 # An example of autocall functionality
94 # An example of autocall functionality
95 In [4]: from math import *
95 In [4]: from math import *
96
96
97 In [5]: autocall 1
97 In [5]: autocall 1
98 Automatic calling is: Smart
98 Automatic calling is: Smart
99
99
100 In [6]: cos pi
100 In [6]: cos pi
101 ------> cos(pi)
101 ------> cos(pi)
102 Out[6]: -1.0
102 Out[6]: -1.0
103
103
104 In [7]: autocall 0
104 In [7]: autocall 0
105 Automatic calling is: OFF
105 Automatic calling is: OFF
106
106
107 In [8]: cos pi
107 In [8]: cos pi
108 File "<ipython-input-8-6bd7313dd9a9>", line 1
108 File "<ipython-input-8-6bd7313dd9a9>", line 1
109 cos pi
109 cos pi
110 ^
110 ^
111 SyntaxError: invalid syntax
111 SyntaxError: invalid syntax
112
112
113
113
114 In [9]: cos(pi)
114 In [9]: cos(pi)
115 Out[9]: -1.0
115 Out[9]: -1.0
116
116
117
117
118 In [10]: for i in range(5):
118 In [10]: for i in range(5):
119 ....: print i,
119 ....: print i,
120 ....:
120 ....:
121 0 1 2 3 4
121 0 1 2 3 4
122
122
123 In [11]: print "that's all folks!"
123 In [11]: print "that's all folks!"
124 that's all folks!
124 that's all folks!
125
125
126
126
127 In [12]: exit
127 In [12]: exit
128 """
128 """
129 runner = irunner.IPythonRunner(out=self.out)
129 runner = irunner.IPythonRunner(out=self.out)
130 self._test_runner(runner,source,output)
130 self._test_runner(runner,source,output)
131
131
132 def testPython(self):
132 def testPython(self):
133 """Test the Python runner."""
133 """Test the Python runner."""
134 runner = irunner.PythonRunner(out=self.out)
134 runner = irunner.PythonRunner(out=self.out)
135 source = """
135 source = """
136 print 'hello, this is python'
136 print 'hello, this is python'
137
137
138 # some more code
138 # some more code
139 x=1;y=2
139 x=1;y=2
140 x+y**2
140 x+y**2
141
141
142 from math import *
142 from math import *
143 cos(pi)
143 cos(pi)
144
144
145 for i in range(5):
145 for i in range(5):
146 print i,
146 print i,
147
147
148 print "that's all folks!"
148 print "that's all folks!"
149 """
149 """
150 output = """\
150 output = """\
151 >>> print 'hello, this is python'
151 >>> print 'hello, this is python'
152 hello, this is python
152 hello, this is python
153
153
154 # some more code
154 # some more code
155 >>> x=1;y=2
155 >>> x=1;y=2
156 >>> x+y**2
156 >>> x+y**2
157 5
157 5
158
158
159 >>> from math import *
159 >>> from math import *
160 >>> cos(pi)
160 >>> cos(pi)
161 -1.0
161 -1.0
162
162
163 >>> for i in range(5):
163 >>> for i in range(5):
164 ... print i,
164 ... print i,
165 ...
165 ...
166 0 1 2 3 4
166 0 1 2 3 4
167 >>> print "that's all folks!"
167 >>> print "that's all folks!"
168 that's all folks!
168 that's all folks!
169 """
169 """
170 self._test_runner(runner,source,output)
170 self._test_runner(runner,source,output)
@@ -1,108 +1,108 b''
1 """Test suite for pylab_import_all magic
1 """Test suite for pylab_import_all magic
2 Modified from the irunner module but using regex.
2 Modified from the irunner module but using regex.
3 """
3 """
4
4
5 # Global to make tests extra verbose and help debugging
5 # Global to make tests extra verbose and help debugging
6 VERBOSE = True
6 VERBOSE = True
7
7
8 # stdlib imports
8 # stdlib imports
9 import cStringIO as StringIO
9 import StringIO
10 import sys
10 import sys
11 import unittest
11 import unittest
12 import re
12 import re
13
13
14 # IPython imports
14 # IPython imports
15 from IPython.lib import irunner
15 from IPython.lib import irunner
16 from IPython.testing import decorators
16 from IPython.testing import decorators
17
17
18 # Testing code begins
18 # Testing code begins
19 class RunnerTestCase(unittest.TestCase):
19 class RunnerTestCase(unittest.TestCase):
20
20
21 def setUp(self):
21 def setUp(self):
22 self.out = StringIO.StringIO()
22 self.out = StringIO.StringIO()
23 #self.out = sys.stdout
23 #self.out = sys.stdout
24
24
25 def _test_runner(self,runner,source,output):
25 def _test_runner(self,runner,source,output):
26 """Test that a given runner's input/output match."""
26 """Test that a given runner's input/output match."""
27
27
28 runner.run_source(source)
28 runner.run_source(source)
29 out = self.out.getvalue()
29 out = self.out.getvalue()
30 #out = ''
30 #out = ''
31 # this output contains nasty \r\n lineends, and the initial ipython
31 # this output contains nasty \r\n lineends, and the initial ipython
32 # banner. clean it up for comparison, removing lines of whitespace
32 # banner. clean it up for comparison, removing lines of whitespace
33 output_l = [l for l in output.splitlines() if l and not l.isspace()]
33 output_l = [l for l in output.splitlines() if l and not l.isspace()]
34 out_l = [l for l in out.splitlines() if l and not l.isspace()]
34 out_l = [l for l in out.splitlines() if l and not l.isspace()]
35 mismatch = 0
35 mismatch = 0
36 if len(output_l) != len(out_l):
36 if len(output_l) != len(out_l):
37 message = ("Mismatch in number of lines\n\n"
37 message = ("Mismatch in number of lines\n\n"
38 "Expected:\n"
38 "Expected:\n"
39 "~~~~~~~~~\n"
39 "~~~~~~~~~\n"
40 "%s\n\n"
40 "%s\n\n"
41 "Got:\n"
41 "Got:\n"
42 "~~~~~~~~~\n"
42 "~~~~~~~~~\n"
43 "%s"
43 "%s"
44 ) % ("\n".join(output_l), "\n".join(out_l))
44 ) % ("\n".join(output_l), "\n".join(out_l))
45 self.fail(message)
45 self.fail(message)
46 for n in range(len(output_l)):
46 for n in range(len(output_l)):
47 # Do a line-by-line comparison
47 # Do a line-by-line comparison
48 ol1 = output_l[n].strip()
48 ol1 = output_l[n].strip()
49 ol2 = out_l[n].strip()
49 ol2 = out_l[n].strip()
50 if not re.match(ol1,ol2):
50 if not re.match(ol1,ol2):
51 mismatch += 1
51 mismatch += 1
52 if VERBOSE:
52 if VERBOSE:
53 print '<<< line %s does not match:' % n
53 print '<<< line %s does not match:' % n
54 print repr(ol1)
54 print repr(ol1)
55 print repr(ol2)
55 print repr(ol2)
56 print '>>>'
56 print '>>>'
57 self.assert_(mismatch==0,'Number of mismatched lines: %s' %
57 self.assert_(mismatch==0,'Number of mismatched lines: %s' %
58 mismatch)
58 mismatch)
59
59
60 @decorators.skipif_not_matplotlib
60 @decorators.skipif_not_matplotlib
61 def test_pylab_import_all_enabled(self):
61 def test_pylab_import_all_enabled(self):
62 "Verify that plot is available when pylab_import_all = True"
62 "Verify that plot is available when pylab_import_all = True"
63 source = """
63 source = """
64 from IPython.config.application import Application
64 from IPython.config.application import Application
65 app = Application.instance()
65 app = Application.instance()
66 app.pylab_import_all = True
66 app.pylab_import_all = True
67 pylab
67 pylab
68 ip=get_ipython()
68 ip=get_ipython()
69 'plot' in ip.user_ns
69 'plot' in ip.user_ns
70 """
70 """
71 output = """
71 output = """
72 In \[1\]: from IPython\.config\.application import Application
72 In \[1\]: from IPython\.config\.application import Application
73 In \[2\]: app = Application\.instance\(\)
73 In \[2\]: app = Application\.instance\(\)
74 In \[3\]: app\.pylab_import_all = True
74 In \[3\]: app\.pylab_import_all = True
75 In \[4\]: pylab
75 In \[4\]: pylab
76 ^Welcome to pylab, a matplotlib-based Python environment
76 ^Welcome to pylab, a matplotlib-based Python environment
77 For more information, type 'help\(pylab\)'\.
77 For more information, type 'help\(pylab\)'\.
78 In \[5\]: ip=get_ipython\(\)
78 In \[5\]: ip=get_ipython\(\)
79 In \[6\]: \'plot\' in ip\.user_ns
79 In \[6\]: \'plot\' in ip\.user_ns
80 Out\[6\]: True
80 Out\[6\]: True
81 """
81 """
82 runner = irunner.IPythonRunner(out=self.out)
82 runner = irunner.IPythonRunner(out=self.out)
83 self._test_runner(runner,source,output)
83 self._test_runner(runner,source,output)
84
84
85 @decorators.skipif_not_matplotlib
85 @decorators.skipif_not_matplotlib
86 def test_pylab_import_all_disabled(self):
86 def test_pylab_import_all_disabled(self):
87 "Verify that plot is not available when pylab_import_all = False"
87 "Verify that plot is not available when pylab_import_all = False"
88 source = """
88 source = """
89 from IPython.config.application import Application
89 from IPython.config.application import Application
90 app = Application.instance()
90 app = Application.instance()
91 app.pylab_import_all = False
91 app.pylab_import_all = False
92 pylab
92 pylab
93 ip=get_ipython()
93 ip=get_ipython()
94 'plot' in ip.user_ns
94 'plot' in ip.user_ns
95 """
95 """
96 output = """
96 output = """
97 In \[1\]: from IPython\.config\.application import Application
97 In \[1\]: from IPython\.config\.application import Application
98 In \[2\]: app = Application\.instance\(\)
98 In \[2\]: app = Application\.instance\(\)
99 In \[3\]: app\.pylab_import_all = False
99 In \[3\]: app\.pylab_import_all = False
100 In \[4\]: pylab
100 In \[4\]: pylab
101 ^Welcome to pylab, a matplotlib-based Python environment
101 ^Welcome to pylab, a matplotlib-based Python environment
102 For more information, type 'help\(pylab\)'\.
102 For more information, type 'help\(pylab\)'\.
103 In \[5\]: ip=get_ipython\(\)
103 In \[5\]: ip=get_ipython\(\)
104 In \[6\]: \'plot\' in ip\.user_ns
104 In \[6\]: \'plot\' in ip\.user_ns
105 Out\[6\]: False
105 Out\[6\]: False
106 """
106 """
107 runner = irunner.IPythonRunner(out=self.out)
107 runner = irunner.IPythonRunner(out=self.out)
108 self._test_runner(runner,source,output)
108 self._test_runner(runner,source,output)
@@ -1,311 +1,311 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 Class and program to colorize python source code for ANSI terminals.
3 Class and program to colorize python source code for ANSI terminals.
4
4
5 Based on an HTML code highlighter by Jurgen Hermann found at:
5 Based on an HTML code highlighter by Jurgen Hermann found at:
6 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52298
6 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52298
7
7
8 Modifications by Fernando Perez (fperez@colorado.edu).
8 Modifications by Fernando Perez (fperez@colorado.edu).
9
9
10 Information on the original HTML highlighter follows:
10 Information on the original HTML highlighter follows:
11
11
12 MoinMoin - Python Source Parser
12 MoinMoin - Python Source Parser
13
13
14 Title: Colorize Python source using the built-in tokenizer
14 Title: Colorize Python source using the built-in tokenizer
15
15
16 Submitter: Jurgen Hermann
16 Submitter: Jurgen Hermann
17 Last Updated:2001/04/06
17 Last Updated:2001/04/06
18
18
19 Version no:1.2
19 Version no:1.2
20
20
21 Description:
21 Description:
22
22
23 This code is part of MoinMoin (http://moin.sourceforge.net/) and converts
23 This code is part of MoinMoin (http://moin.sourceforge.net/) and converts
24 Python source code to HTML markup, rendering comments, keywords,
24 Python source code to HTML markup, rendering comments, keywords,
25 operators, numeric and string literals in different colors.
25 operators, numeric and string literals in different colors.
26
26
27 It shows how to use the built-in keyword, token and tokenize modules to
27 It shows how to use the built-in keyword, token and tokenize modules to
28 scan Python source code and re-emit it with no changes to its original
28 scan Python source code and re-emit it with no changes to its original
29 formatting (which is the hard part).
29 formatting (which is the hard part).
30 """
30 """
31
31
32 __all__ = ['ANSICodeColors','Parser']
32 __all__ = ['ANSICodeColors','Parser']
33
33
34 _scheme_default = 'Linux'
34 _scheme_default = 'Linux'
35
35
36 # Imports
36 # Imports
37 import cStringIO
37 import StringIO
38 import keyword
38 import keyword
39 import os
39 import os
40 import optparse
40 import optparse
41 import sys
41 import sys
42 import token
42 import token
43 import tokenize
43 import tokenize
44
44
45 try:
45 try:
46 generate_tokens = tokenize.generate_tokens
46 generate_tokens = tokenize.generate_tokens
47 except AttributeError:
47 except AttributeError:
48 # Python 3. Note that we use the undocumented _tokenize because it expects
48 # Python 3. Note that we use the undocumented _tokenize because it expects
49 # strings, not bytes. See also Python issue #9969.
49 # strings, not bytes. See also Python issue #9969.
50 generate_tokens = tokenize._tokenize
50 generate_tokens = tokenize._tokenize
51
51
52 from IPython.utils.coloransi import *
52 from IPython.utils.coloransi import *
53
53
54 #############################################################################
54 #############################################################################
55 ### Python Source Parser (does Hilighting)
55 ### Python Source Parser (does Hilighting)
56 #############################################################################
56 #############################################################################
57
57
58 _KEYWORD = token.NT_OFFSET + 1
58 _KEYWORD = token.NT_OFFSET + 1
59 _TEXT = token.NT_OFFSET + 2
59 _TEXT = token.NT_OFFSET + 2
60
60
61 #****************************************************************************
61 #****************************************************************************
62 # Builtin color schemes
62 # Builtin color schemes
63
63
64 Colors = TermColors # just a shorthand
64 Colors = TermColors # just a shorthand
65
65
66 # Build a few color schemes
66 # Build a few color schemes
67 NoColor = ColorScheme(
67 NoColor = ColorScheme(
68 'NoColor',{
68 'NoColor',{
69 token.NUMBER : Colors.NoColor,
69 token.NUMBER : Colors.NoColor,
70 token.OP : Colors.NoColor,
70 token.OP : Colors.NoColor,
71 token.STRING : Colors.NoColor,
71 token.STRING : Colors.NoColor,
72 tokenize.COMMENT : Colors.NoColor,
72 tokenize.COMMENT : Colors.NoColor,
73 token.NAME : Colors.NoColor,
73 token.NAME : Colors.NoColor,
74 token.ERRORTOKEN : Colors.NoColor,
74 token.ERRORTOKEN : Colors.NoColor,
75
75
76 _KEYWORD : Colors.NoColor,
76 _KEYWORD : Colors.NoColor,
77 _TEXT : Colors.NoColor,
77 _TEXT : Colors.NoColor,
78
78
79 'normal' : Colors.NoColor # color off (usu. Colors.Normal)
79 'normal' : Colors.NoColor # color off (usu. Colors.Normal)
80 } )
80 } )
81
81
82 LinuxColors = ColorScheme(
82 LinuxColors = ColorScheme(
83 'Linux',{
83 'Linux',{
84 token.NUMBER : Colors.LightCyan,
84 token.NUMBER : Colors.LightCyan,
85 token.OP : Colors.Yellow,
85 token.OP : Colors.Yellow,
86 token.STRING : Colors.LightBlue,
86 token.STRING : Colors.LightBlue,
87 tokenize.COMMENT : Colors.LightRed,
87 tokenize.COMMENT : Colors.LightRed,
88 token.NAME : Colors.Normal,
88 token.NAME : Colors.Normal,
89 token.ERRORTOKEN : Colors.Red,
89 token.ERRORTOKEN : Colors.Red,
90
90
91 _KEYWORD : Colors.LightGreen,
91 _KEYWORD : Colors.LightGreen,
92 _TEXT : Colors.Yellow,
92 _TEXT : Colors.Yellow,
93
93
94 'normal' : Colors.Normal # color off (usu. Colors.Normal)
94 'normal' : Colors.Normal # color off (usu. Colors.Normal)
95 } )
95 } )
96
96
97 LightBGColors = ColorScheme(
97 LightBGColors = ColorScheme(
98 'LightBG',{
98 'LightBG',{
99 token.NUMBER : Colors.Cyan,
99 token.NUMBER : Colors.Cyan,
100 token.OP : Colors.Blue,
100 token.OP : Colors.Blue,
101 token.STRING : Colors.Blue,
101 token.STRING : Colors.Blue,
102 tokenize.COMMENT : Colors.Red,
102 tokenize.COMMENT : Colors.Red,
103 token.NAME : Colors.Normal,
103 token.NAME : Colors.Normal,
104 token.ERRORTOKEN : Colors.Red,
104 token.ERRORTOKEN : Colors.Red,
105
105
106 _KEYWORD : Colors.Green,
106 _KEYWORD : Colors.Green,
107 _TEXT : Colors.Blue,
107 _TEXT : Colors.Blue,
108
108
109 'normal' : Colors.Normal # color off (usu. Colors.Normal)
109 'normal' : Colors.Normal # color off (usu. Colors.Normal)
110 } )
110 } )
111
111
112 # Build table of color schemes (needed by the parser)
112 # Build table of color schemes (needed by the parser)
113 ANSICodeColors = ColorSchemeTable([NoColor,LinuxColors,LightBGColors],
113 ANSICodeColors = ColorSchemeTable([NoColor,LinuxColors,LightBGColors],
114 _scheme_default)
114 _scheme_default)
115
115
116 class Parser:
116 class Parser:
117 """ Format colored Python source.
117 """ Format colored Python source.
118 """
118 """
119
119
120 def __init__(self, color_table=None,out = sys.stdout):
120 def __init__(self, color_table=None,out = sys.stdout):
121 """ Create a parser with a specified color table and output channel.
121 """ Create a parser with a specified color table and output channel.
122
122
123 Call format() to process code.
123 Call format() to process code.
124 """
124 """
125 self.color_table = color_table and color_table or ANSICodeColors
125 self.color_table = color_table and color_table or ANSICodeColors
126 self.out = out
126 self.out = out
127
127
128 def format(self, raw, out = None, scheme = ''):
128 def format(self, raw, out = None, scheme = ''):
129 return self.format2(raw, out, scheme)[0]
129 return self.format2(raw, out, scheme)[0]
130
130
131 def format2(self, raw, out = None, scheme = ''):
131 def format2(self, raw, out = None, scheme = ''):
132 """ Parse and send the colored source.
132 """ Parse and send the colored source.
133
133
134 If out and scheme are not specified, the defaults (given to
134 If out and scheme are not specified, the defaults (given to
135 constructor) are used.
135 constructor) are used.
136
136
137 out should be a file-type object. Optionally, out can be given as the
137 out should be a file-type object. Optionally, out can be given as the
138 string 'str' and the parser will automatically return the output in a
138 string 'str' and the parser will automatically return the output in a
139 string."""
139 string."""
140
140
141 string_output = 0
141 string_output = 0
142 if out == 'str' or self.out == 'str' or \
142 if out == 'str' or self.out == 'str' or \
143 isinstance(self.out,cStringIO.OutputType):
143 isinstance(self.out,StringIO.StringIO):
144 # XXX - I don't really like this state handling logic, but at this
144 # XXX - I don't really like this state handling logic, but at this
145 # point I don't want to make major changes, so adding the
145 # point I don't want to make major changes, so adding the
146 # isinstance() check is the simplest I can do to ensure correct
146 # isinstance() check is the simplest I can do to ensure correct
147 # behavior.
147 # behavior.
148 out_old = self.out
148 out_old = self.out
149 self.out = cStringIO.StringIO()
149 self.out = StringIO.StringIO()
150 string_output = 1
150 string_output = 1
151 elif out is not None:
151 elif out is not None:
152 self.out = out
152 self.out = out
153
153
154 # Fast return of the unmodified input for NoColor scheme
154 # Fast return of the unmodified input for NoColor scheme
155 if scheme == 'NoColor':
155 if scheme == 'NoColor':
156 error = False
156 error = False
157 self.out.write(raw)
157 self.out.write(raw)
158 if string_output:
158 if string_output:
159 return raw,error
159 return raw,error
160 else:
160 else:
161 return None,error
161 return None,error
162
162
163 # local shorthands
163 # local shorthands
164 colors = self.color_table[scheme].colors
164 colors = self.color_table[scheme].colors
165 self.colors = colors # put in object so __call__ sees it
165 self.colors = colors # put in object so __call__ sees it
166
166
167 # Remove trailing whitespace and normalize tabs
167 # Remove trailing whitespace and normalize tabs
168 self.raw = raw.expandtabs().rstrip()
168 self.raw = raw.expandtabs().rstrip()
169
169
170 # store line offsets in self.lines
170 # store line offsets in self.lines
171 self.lines = [0, 0]
171 self.lines = [0, 0]
172 pos = 0
172 pos = 0
173 raw_find = self.raw.find
173 raw_find = self.raw.find
174 lines_append = self.lines.append
174 lines_append = self.lines.append
175 while 1:
175 while 1:
176 pos = raw_find('\n', pos) + 1
176 pos = raw_find('\n', pos) + 1
177 if not pos: break
177 if not pos: break
178 lines_append(pos)
178 lines_append(pos)
179 lines_append(len(self.raw))
179 lines_append(len(self.raw))
180
180
181 # parse the source and write it
181 # parse the source and write it
182 self.pos = 0
182 self.pos = 0
183 text = cStringIO.StringIO(self.raw)
183 text = StringIO.StringIO(self.raw)
184
184
185 error = False
185 error = False
186 try:
186 try:
187 for atoken in generate_tokens(text.readline):
187 for atoken in generate_tokens(text.readline):
188 self(*atoken)
188 self(*atoken)
189 except tokenize.TokenError as ex:
189 except tokenize.TokenError as ex:
190 msg = ex.args[0]
190 msg = ex.args[0]
191 line = ex.args[1][0]
191 line = ex.args[1][0]
192 self.out.write("%s\n\n*** ERROR: %s%s%s\n" %
192 self.out.write("%s\n\n*** ERROR: %s%s%s\n" %
193 (colors[token.ERRORTOKEN],
193 (colors[token.ERRORTOKEN],
194 msg, self.raw[self.lines[line]:],
194 msg, self.raw[self.lines[line]:],
195 colors.normal)
195 colors.normal)
196 )
196 )
197 error = True
197 error = True
198 self.out.write(colors.normal+'\n')
198 self.out.write(colors.normal+'\n')
199 if string_output:
199 if string_output:
200 output = self.out.getvalue()
200 output = self.out.getvalue()
201 self.out = out_old
201 self.out = out_old
202 return (output, error)
202 return (output, error)
203 return (None, error)
203 return (None, error)
204
204
205 def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line):
205 def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line):
206 """ Token handler, with syntax highlighting."""
206 """ Token handler, with syntax highlighting."""
207
207
208 # local shorthands
208 # local shorthands
209 colors = self.colors
209 colors = self.colors
210 owrite = self.out.write
210 owrite = self.out.write
211
211
212 # line separator, so this works across platforms
212 # line separator, so this works across platforms
213 linesep = os.linesep
213 linesep = os.linesep
214
214
215 # calculate new positions
215 # calculate new positions
216 oldpos = self.pos
216 oldpos = self.pos
217 newpos = self.lines[srow] + scol
217 newpos = self.lines[srow] + scol
218 self.pos = newpos + len(toktext)
218 self.pos = newpos + len(toktext)
219
219
220 # handle newlines
220 # handle newlines
221 if toktype in [token.NEWLINE, tokenize.NL]:
221 if toktype in [token.NEWLINE, tokenize.NL]:
222 owrite(linesep)
222 owrite(linesep)
223 return
223 return
224
224
225 # send the original whitespace, if needed
225 # send the original whitespace, if needed
226 if newpos > oldpos:
226 if newpos > oldpos:
227 owrite(self.raw[oldpos:newpos])
227 owrite(self.raw[oldpos:newpos])
228
228
229 # skip indenting tokens
229 # skip indenting tokens
230 if toktype in [token.INDENT, token.DEDENT]:
230 if toktype in [token.INDENT, token.DEDENT]:
231 self.pos = newpos
231 self.pos = newpos
232 return
232 return
233
233
234 # map token type to a color group
234 # map token type to a color group
235 if token.LPAR <= toktype and toktype <= token.OP:
235 if token.LPAR <= toktype and toktype <= token.OP:
236 toktype = token.OP
236 toktype = token.OP
237 elif toktype == token.NAME and keyword.iskeyword(toktext):
237 elif toktype == token.NAME and keyword.iskeyword(toktext):
238 toktype = _KEYWORD
238 toktype = _KEYWORD
239 color = colors.get(toktype, colors[_TEXT])
239 color = colors.get(toktype, colors[_TEXT])
240
240
241 #print '<%s>' % toktext, # dbg
241 #print '<%s>' % toktext, # dbg
242
242
243 # Triple quoted strings must be handled carefully so that backtracking
243 # Triple quoted strings must be handled carefully so that backtracking
244 # in pagers works correctly. We need color terminators on _each_ line.
244 # in pagers works correctly. We need color terminators on _each_ line.
245 if linesep in toktext:
245 if linesep in toktext:
246 toktext = toktext.replace(linesep, '%s%s%s' %
246 toktext = toktext.replace(linesep, '%s%s%s' %
247 (colors.normal,linesep,color))
247 (colors.normal,linesep,color))
248
248
249 # send text
249 # send text
250 owrite('%s%s%s' % (color,toktext,colors.normal))
250 owrite('%s%s%s' % (color,toktext,colors.normal))
251
251
252 def main(argv=None):
252 def main(argv=None):
253 """Run as a command-line script: colorize a python file or stdin using ANSI
253 """Run as a command-line script: colorize a python file or stdin using ANSI
254 color escapes and print to stdout.
254 color escapes and print to stdout.
255
255
256 Inputs:
256 Inputs:
257
257
258 - argv(None): a list of strings like sys.argv[1:] giving the command-line
258 - argv(None): a list of strings like sys.argv[1:] giving the command-line
259 arguments. If None, use sys.argv[1:].
259 arguments. If None, use sys.argv[1:].
260 """
260 """
261
261
262 usage_msg = """%prog [options] [filename]
262 usage_msg = """%prog [options] [filename]
263
263
264 Colorize a python file or stdin using ANSI color escapes and print to stdout.
264 Colorize a python file or stdin using ANSI color escapes and print to stdout.
265 If no filename is given, or if filename is -, read standard input."""
265 If no filename is given, or if filename is -, read standard input."""
266
266
267 parser = optparse.OptionParser(usage=usage_msg)
267 parser = optparse.OptionParser(usage=usage_msg)
268 newopt = parser.add_option
268 newopt = parser.add_option
269 newopt('-s','--scheme',metavar='NAME',dest='scheme_name',action='store',
269 newopt('-s','--scheme',metavar='NAME',dest='scheme_name',action='store',
270 choices=['Linux','LightBG','NoColor'],default=_scheme_default,
270 choices=['Linux','LightBG','NoColor'],default=_scheme_default,
271 help="give the color scheme to use. Currently only 'Linux'\
271 help="give the color scheme to use. Currently only 'Linux'\
272 (default) and 'LightBG' and 'NoColor' are implemented (give without\
272 (default) and 'LightBG' and 'NoColor' are implemented (give without\
273 quotes)")
273 quotes)")
274
274
275 opts,args = parser.parse_args(argv)
275 opts,args = parser.parse_args(argv)
276
276
277 if len(args) > 1:
277 if len(args) > 1:
278 parser.error("you must give at most one filename.")
278 parser.error("you must give at most one filename.")
279
279
280 if len(args) == 0:
280 if len(args) == 0:
281 fname = '-' # no filename given; setup to read from stdin
281 fname = '-' # no filename given; setup to read from stdin
282 else:
282 else:
283 fname = args[0]
283 fname = args[0]
284
284
285 if fname == '-':
285 if fname == '-':
286 stream = sys.stdin
286 stream = sys.stdin
287 else:
287 else:
288 try:
288 try:
289 stream = file(fname)
289 stream = file(fname)
290 except IOError,msg:
290 except IOError,msg:
291 print >> sys.stderr, msg
291 print >> sys.stderr, msg
292 sys.exit(1)
292 sys.exit(1)
293
293
294 parser = Parser()
294 parser = Parser()
295
295
296 # we need nested try blocks because pre-2.5 python doesn't support unified
296 # we need nested try blocks because pre-2.5 python doesn't support unified
297 # try-except-finally
297 # try-except-finally
298 try:
298 try:
299 try:
299 try:
300 # write colorized version to stdout
300 # write colorized version to stdout
301 parser.format(stream.read(),scheme=opts.scheme_name)
301 parser.format(stream.read(),scheme=opts.scheme_name)
302 except IOError,msg:
302 except IOError,msg:
303 # if user reads through a pager and quits, don't print traceback
303 # if user reads through a pager and quits, don't print traceback
304 if msg.args != (32,'Broken pipe'):
304 if msg.args != (32,'Broken pipe'):
305 raise
305 raise
306 finally:
306 finally:
307 if stream is not sys.stdin:
307 if stream is not sys.stdin:
308 stream.close() # in case a non-handled exception happened above
308 stream.close() # in case a non-handled exception happened above
309
309
310 if __name__ == "__main__":
310 if __name__ == "__main__":
311 main()
311 main()
@@ -1,71 +1,71 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Tests for io.py"""
2 """Tests for io.py"""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2008 The IPython Development Team
5 # Copyright (C) 2008 The IPython Development Team
6 #
6 #
7 # Distributed under the terms of the BSD License. The full license is in
7 # Distributed under the terms of the BSD License. The full license is in
8 # the file COPYING, distributed as part of this software.
8 # the file COPYING, distributed as part of this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 import sys
15 import sys
16
16
17 from cStringIO import StringIO
17 from StringIO import StringIO
18 from subprocess import Popen, PIPE
18 from subprocess import Popen, PIPE
19
19
20 import nose.tools as nt
20 import nose.tools as nt
21
21
22 from IPython.testing import decorators as dec
22 from IPython.testing import decorators as dec
23 from IPython.utils.io import Tee
23 from IPython.utils.io import Tee
24
24
25 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
26 # Tests
26 # Tests
27 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
28
28
29
29
30 def test_tee_simple():
30 def test_tee_simple():
31 "Very simple check with stdout only"
31 "Very simple check with stdout only"
32 chan = StringIO()
32 chan = StringIO()
33 text = 'Hello'
33 text = 'Hello'
34 tee = Tee(chan, channel='stdout')
34 tee = Tee(chan, channel='stdout')
35 print >> chan, text,
35 print >> chan, text,
36 nt.assert_equal(chan.getvalue(), text)
36 nt.assert_equal(chan.getvalue(), text)
37
37
38
38
39 class TeeTestCase(dec.ParametricTestCase):
39 class TeeTestCase(dec.ParametricTestCase):
40
40
41 def tchan(self, channel, check='close'):
41 def tchan(self, channel, check='close'):
42 trap = StringIO()
42 trap = StringIO()
43 chan = StringIO()
43 chan = StringIO()
44 text = 'Hello'
44 text = 'Hello'
45
45
46 std_ori = getattr(sys, channel)
46 std_ori = getattr(sys, channel)
47 setattr(sys, channel, trap)
47 setattr(sys, channel, trap)
48
48
49 tee = Tee(chan, channel=channel)
49 tee = Tee(chan, channel=channel)
50 print >> chan, text,
50 print >> chan, text,
51 setattr(sys, channel, std_ori)
51 setattr(sys, channel, std_ori)
52 trap_val = trap.getvalue()
52 trap_val = trap.getvalue()
53 nt.assert_equals(chan.getvalue(), text)
53 nt.assert_equals(chan.getvalue(), text)
54 if check=='close':
54 if check=='close':
55 tee.close()
55 tee.close()
56 else:
56 else:
57 del tee
57 del tee
58
58
59 def test(self):
59 def test(self):
60 for chan in ['stdout', 'stderr']:
60 for chan in ['stdout', 'stderr']:
61 for check in ['close', 'del']:
61 for check in ['close', 'del']:
62 yield self.tchan(chan, check)
62 yield self.tchan(chan, check)
63
63
64 def test_io_init():
64 def test_io_init():
65 """Test that io.stdin/out/err exist at startup"""
65 """Test that io.stdin/out/err exist at startup"""
66 for name in ('stdin', 'stdout', 'stderr'):
66 for name in ('stdin', 'stdout', 'stderr'):
67 p = Popen([sys.executable, '-c', "from IPython.utils import io;print io.%s.__class__"%name],
67 p = Popen([sys.executable, '-c', "from IPython.utils import io;print io.%s.__class__"%name],
68 stdout=PIPE)
68 stdout=PIPE)
69 p.wait()
69 p.wait()
70 classname = p.stdout.read().strip()
70 classname = p.stdout.read().strip()
71 nt.assert_equals(classname, 'IPython.utils.io.IOStream')
71 nt.assert_equals(classname, 'IPython.utils.io.IOStream')
General Comments 0
You need to be logged in to leave comments. Login now