##// END OF EJS Templates
- new doctest_mode magic to toggle doctest pasting/prompts....
fperez -
Show More
@@ -83,6 +83,8 b' __license__ = Release.license'
83
83
84 import re
84 import re
85
85
86 from IPython.iplib import InteractiveShell
87
86 PROMPT_RE = re.compile(r'(^[ \t]*>>> |^[ \t]*\.\.\. )')
88 PROMPT_RE = re.compile(r'(^[ \t]*>>> |^[ \t]*\.\.\. )')
87
89
88 def prefilter_paste(self,line,continuation):
90 def prefilter_paste(self,line,continuation):
@@ -106,13 +108,15 b' def prefilter_paste(self,line,continuation):'
106 return ''
108 return ''
107 else:
109 else:
108 return self._prefilter(line,continuation)
110 return self._prefilter(line,continuation)
109
110 # Rebind this to be the new IPython prefilter:
111 from IPython.iplib import InteractiveShell
112 InteractiveShell.prefilter = prefilter_paste
113
111
114 # Clean up the namespace.
112 def activate_prefilter():
115 del InteractiveShell,prefilter_paste
113 """Rebind the input-pasting filter to be the new IPython prefilter"""
114 InteractiveShell.prefilter = prefilter_paste
115
116 def deactivate_prefilter():
117 """Reset the filter."""
118 InteractiveShell.prefilter = InteractiveShell._prefilter
116
119
117 # Just a heads up at the console
120 # Just a heads up at the console
121 activate_prefilter()
118 print '*** Pasting of code with ">>>" or "..." has been enabled.'
122 print '*** Pasting of code with ">>>" or "..." has been enabled.'
@@ -42,4 +42,7 b' def main():'
42 # Use plain exceptions, to also resemble normal pyhton.
42 # Use plain exceptions, to also resemble normal pyhton.
43 o.xmode = 'plain'
43 o.xmode = 'plain'
44
44
45 # Store the activity flag in the metadata bag from the running shell
46 ip.IP.meta.doctest_mode = True
47
45 main()
48 main()
@@ -12,14 +12,14 b' def main():'
12 ip = IPython.ipapi.get()
12 ip = IPython.ipapi.get()
13
13
14 try:
14 try:
15 ip.ex("import scipy")
16 ip.ex("import numpy")
15 ip.ex("import numpy")
16 ip.ex("import scipy")
17
17
18 ip.ex("from scipy import *")
19 ip.ex("from numpy import *")
18 ip.ex("from numpy import *")
19 ip.ex("from scipy import *")
20 print "SciPy profile successfully loaded."
20 print "SciPy profile successfully loaded."
21 except ImportError:
21 except ImportError:
22 print "Unable to start scipy profile, are scipy and numpy installed?"
22 print "Unable to start scipy profile, are scipy and numpy installed?"
23
23
24
24
25 main() No newline at end of file
25 main()
@@ -1,7 +1,7 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3
3
4 $Id: Magic.py 2595 2007-08-08 09:41:33Z vivainio $"""
4 $Id: Magic.py 2601 2007-08-10 07:01:29Z fperez $"""
5
5
6 #*****************************************************************************
6 #*****************************************************************************
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
@@ -2912,4 +2912,90 b' Defaulting color scheme to \'NoColor\'"""'
2912 suffix = (sys.platform == 'win32' and '.ini' or '')
2912 suffix = (sys.platform == 'win32' and '.ini' or '')
2913 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
2913 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
2914
2914
2915
2916 def magic_doctest_mode(self,parameter_s=''):
2917 """Toggle doctest mode on and off.
2918
2919 This mode allows you to toggle the prompt behavior between normal
2920 IPython prompts and ones that are as similar to the default IPython
2921 interpreter as possible.
2922
2923 It also supports the pasting of code snippets that have leading '>>>'
2924 and '...' prompts in them. This means that you can paste doctests from
2925 files or docstrings (even if they have leading whitespace), and the
2926 code will execute correctly. You can then use '%history -tn' to see
2927 the translated history without line numbers; this will give you the
2928 input after removal of all the leading prompts and whitespace, which
2929 can be pasted back into an editor.
2930
2931 With these features, you can switch into this mode easily whenever you
2932 need to do testing and changes to doctests, without having to leave
2933 your existing IPython session.
2934 """
2935
2936 # XXX - Fix this to have cleaner activate/deactivate calls.
2937 from IPython.Extensions import InterpreterPasteInput as ipaste
2938 from IPython.ipstruct import Struct
2939
2940 # Shorthands
2941 shell = self.shell
2942 oc = shell.outputcache
2943 rc = shell.rc
2944 meta = shell.meta
2945 # dstore is a data store kept in the instance metadata bag to track any
2946 # changes we make, so we can undo them later.
2947 dstore = meta.setdefault('doctest_mode',Struct())
2948 save_dstore = dstore.setdefault
2949
2950 # save a few values we'll need to recover later
2951 mode = save_dstore('mode',False)
2952 save_dstore('rc_pprint',rc.pprint)
2953 save_dstore('xmode',shell.InteractiveTB.mode)
2954 save_dstore('rc_separate_in',rc.separate_in)
2955 save_dstore('rc_separate_out',rc.separate_out)
2956 save_dstore('rc_separate_out2',rc.separate_out2)
2957 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
2958
2959 if mode == False:
2960 # turn on
2961 ipaste.activate_prefilter()
2962
2963 oc.prompt1.p_template = '>>> '
2964 oc.prompt2.p_template = '... '
2965 oc.prompt_out.p_template = ''
2966
2967 oc.prompt1.sep = ''
2968 oc.prompt_out.output_sep = ''
2969 oc.prompt_out.output_sep2 = '\n'
2970
2971 oc.prompt1.pad_left = oc.prompt2.pad_left = \
2972 oc.prompt_out.pad_left = False
2973
2974 shell.magic_xmode('Plain')
2975
2976 rc.pprint = False
2977
2978 else:
2979 # turn off
2980 ipaste.deactivate_prefilter()
2981
2982 oc.prompt1.p_template = rc.prompt_in1
2983 oc.prompt2.p_template = rc.prompt_in2
2984 oc.prompt_out.p_template = rc.prompt_out
2985
2986 oc.prompt1.sep = dstore.rc_separate_in
2987 oc.prompt_out.output_sep = dstore.rc_separate_out
2988 oc.prompt_out.output_sep2 = dstore.rc_separate_out2
2989
2990 oc.prompt1.pad_left = oc.prompt2.pad_left = \
2991 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
2992 shell.magic_xmode(dstore.xmode)
2993
2994 rc.pprint = dstore.rc_pprint
2995
2996 # Store new mode and inform
2997 dstore.mode = bool(1-int(mode))
2998 print 'Doctest mode is:',
2999 print ['OFF','ON'][dstore.mode]
3000
2915 # end Magic
3001 # end Magic
@@ -2,7 +2,7 b''
2 """
2 """
3 Classes for handling input/output prompts.
3 Classes for handling input/output prompts.
4
4
5 $Id: Prompts.py 2397 2007-05-26 10:06:26Z vivainio $"""
5 $Id: Prompts.py 2601 2007-08-10 07:01:29Z fperez $"""
6
6
7 #*****************************************************************************
7 #*****************************************************************************
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
@@ -215,8 +215,19 b' def str_safe(arg):'
215 out = '<ERROR: %s>' % msg
215 out = '<ERROR: %s>' % msg
216 return out
216 return out
217
217
218 class BasePrompt:
218 class BasePrompt(object):
219 """Interactive prompt similar to Mathematica's."""
219 """Interactive prompt similar to Mathematica's."""
220
221 def _get_p_template(self):
222 return self._p_template
223
224 def _set_p_template(self,val):
225 self._p_template = val
226 self.set_p_str()
227
228 p_template = property(_get_p_template,_set_p_template,
229 doc='Template for prompt string creation')
230
220 def __init__(self,cache,sep,prompt,pad_left=False):
231 def __init__(self,cache,sep,prompt,pad_left=False):
221
232
222 # Hack: we access information about the primary prompt through the
233 # Hack: we access information about the primary prompt through the
@@ -232,7 +243,9 b' class BasePrompt:'
232 # Flag to left-pad prompt strings to match the length of the primary
243 # Flag to left-pad prompt strings to match the length of the primary
233 # prompt
244 # prompt
234 self.pad_left = pad_left
245 self.pad_left = pad_left
235 # Set template to create each actual prompt (where numbers change)
246
247 # Set template to create each actual prompt (where numbers change).
248 # Use a property
236 self.p_template = prompt
249 self.p_template = prompt
237 self.set_p_str()
250 self.set_p_str()
238
251
@@ -251,7 +251,8 b' class IPApi:'
251
251
252 Inputs:
252 Inputs:
253
253
254 - vars: string with variable names separated by whitespace
254 - vars: string with variable names separated by whitespace, or a
255 dict with name/value pairs.
255
256
256 - interactive: if True (default), the var will be listed with
257 - interactive: if True (default), the var will be listed with
257 %whos et. al.
258 %whos et. al.
@@ -285,33 +286,53 b' class IPApi:'
285 # if this routine crashes on the next line after:
286 # if this routine crashes on the next line after:
286 ip.to_user_ns('x y')
287 ip.to_user_ns('x y')
287 ...
288 ...
289
290 # To expose *ALL* the local variables from the function, use:
291 ip.to_user_ns(locals())
292
293 ...
288 # return
294 # return
289
295
290 If you need to rename variables, just use ip.user_ns with dict
296
291 and update:
297 If you need to rename variables, the dict input makes it easy. For
292
298 example, this call exposes variables 'foo' as 'x' and 'bar' as 'y'
293 # exposes variables 'foo' as 'x' and 'bar' as 'y' in IPython
299 in IPython user namespace:
294 # user namespace
300
295 ip.user_ns.update(dict(x=foo,y=bar))
301 ip.to_user_ns(dict(x=foo,y=bar))
296 """
302 """
297
303
298 # print 'vars given:',vars # dbg
304 # print 'vars given:',vars # dbg
299 # Get the caller's frame to evaluate the given names in
300 cf = sys._getframe(1)
301
305
302 user_ns = self.user_ns
306 # We need a dict of name/value pairs to do namespace updates.
307 if isinstance(vars,dict):
308 # If a dict was given, no need to change anything.
309 vdict = vars
310 elif isinstance(vars,basestring):
311 # If a string with names was given, get the caller's frame to
312 # evaluate the given names in
313 cf = sys._getframe(1)
314 vdict = {}
315 for name in vars.split():
316 try:
317 vdict[name] = eval(name,cf.f_globals,cf.f_locals)
318 except:
319 print ('could not get var. %s from %s' %
320 (name,cf.f_code.co_name))
321 else:
322 raise ValueError('vars must be a string or a dict')
323
324 # Propagate variables to user namespace
325 self.user_ns.update(vdict)
326
327 # And configure interactive visibility
303 config_ns = self.IP.user_config_ns
328 config_ns = self.IP.user_config_ns
304 for name in vars.split():
329 if interactive:
305 try:
330 for name,val in vdict.iteritems():
306 val = eval(name,cf.f_globals,cf.f_locals)
331 config_ns.pop(name,None)
307 user_ns[name] = val
332 else:
308 if not interactive:
333 for name,val in vdict.iteritems():
309 config_ns[name] = val
334 config_ns[name] = val
310 else:
335
311 config_ns.pop(name,None)
312 except:
313 print ('could not get var. %s from %s' %
314 (name,cf.f_code.co_name))
315
336
316 def expand_alias(self,line):
337 def expand_alias(self,line):
317 """ Expand an alias in the command line
338 """ Expand an alias in the command line
@@ -1,3 +1,14 b''
1 2007-8-9 Fernando Perez <fperez@planck.colorado.edu>
2
3 * IPython/ipapi.py (to_user_ns): update to accept a dict as well as
4 a string with names.
5
6 2007-08-09 Fernando Perez <Fernando.Perez@colorado.edu>
7
8 * IPython/Magic.py (magic_doctest_mode): added new %doctest_mode
9 magic to toggle on/off the doctest pasting support without having
10 to leave a session to switch to a separate profile.
11
1 2007-08-08 Fernando Perez <Fernando.Perez@colorado.edu>
12 2007-08-08 Fernando Perez <Fernando.Perez@colorado.edu>
2
13
3 * IPython/Extensions/ipy_profile_doctest.py (main): fix prompt to
14 * IPython/Extensions/ipy_profile_doctest.py (main): fix prompt to
General Comments 0
You need to be logged in to leave comments. Login now