##// END OF EJS Templates
Merging upstreat changes.
Brian Granger -
r1779:b1c1fe59 merge
parent child Browse files
Show More
@@ -0,0 +1,161 b''
1 """Tests for the decorators we've created for IPython.
2 """
3
4 # Module imports
5 # Std lib
6 import inspect
7 import sys
8
9 # Third party
10 import nose.tools as nt
11
12 # Our own
13 from IPython.testing import decorators as dec
14
15
16 #-----------------------------------------------------------------------------
17 # Utilities
18
19 # Note: copied from OInspect, kept here so the testing stuff doesn't create
20 # circular dependencies and is easier to reuse.
21 def getargspec(obj):
22 """Get the names and default values of a function's arguments.
23
24 A tuple of four things is returned: (args, varargs, varkw, defaults).
25 'args' is a list of the argument names (it may contain nested lists).
26 'varargs' and 'varkw' are the names of the * and ** arguments or None.
27 'defaults' is an n-tuple of the default values of the last n arguments.
28
29 Modified version of inspect.getargspec from the Python Standard
30 Library."""
31
32 if inspect.isfunction(obj):
33 func_obj = obj
34 elif inspect.ismethod(obj):
35 func_obj = obj.im_func
36 else:
37 raise TypeError, 'arg is not a Python function'
38 args, varargs, varkw = inspect.getargs(func_obj.func_code)
39 return args, varargs, varkw, func_obj.func_defaults
40
41 #-----------------------------------------------------------------------------
42 # Testing functions
43
44 @dec.skip
45 def test_deliberately_broken():
46 """A deliberately broken test - we want to skip this one."""
47 1/0
48
49 @dec.skip('foo')
50 def test_deliberately_broken2():
51 """Another deliberately broken test - we want to skip this one."""
52 1/0
53
54
55 # Verify that we can correctly skip the doctest for a function at will, but
56 # that the docstring itself is NOT destroyed by the decorator.
57 @dec.skip_doctest
58 def doctest_bad(x,y=1,**k):
59 """A function whose doctest we need to skip.
60
61 >>> 1+1
62 3
63 """
64 print 'x:',x
65 print 'y:',y
66 print 'k:',k
67
68
69 def call_doctest_bad():
70 """Check that we can still call the decorated functions.
71
72 >>> doctest_bad(3,y=4)
73 x: 3
74 y: 4
75 k: {}
76 """
77 pass
78
79
80 def test_skip_dt_decorator():
81 """Doctest-skipping decorator should preserve the docstring.
82 """
83 # Careful: 'check' must be a *verbatim* copy of the doctest_bad docstring!
84 check = """A function whose doctest we need to skip.
85
86 >>> 1+1
87 3
88 """
89 # Fetch the docstring from doctest_bad after decoration.
90 val = doctest_bad.__doc__
91
92 assert check==val,"doctest_bad docstrings don't match"
93
94 # Doctest skipping should work for class methods too
95 class foo(object):
96 """Foo
97
98 Example:
99
100 >>> 1+1
101 2
102 """
103
104 @dec.skip_doctest
105 def __init__(self,x):
106 """Make a foo.
107
108 Example:
109
110 >>> f = foo(3)
111 junk
112 """
113 print 'Making a foo.'
114 self.x = x
115
116 @dec.skip_doctest
117 def bar(self,y):
118 """Example:
119
120 >>> f = foo(3)
121 >>> f.bar(0)
122 boom!
123 >>> 1/0
124 bam!
125 """
126 return 1/y
127
128 def baz(self,y):
129 """Example:
130
131 >>> f = foo(3)
132 Making a foo.
133 >>> f.baz(3)
134 True
135 """
136 return self.x==y
137
138
139
140 def test_skip_dt_decorator2():
141 """Doctest-skipping decorator should preserve function signature.
142 """
143 # Hardcoded correct answer
144 dtargs = (['x', 'y'], None, 'k', (1,))
145 # Introspect out the value
146 dtargsr = getargspec(doctest_bad)
147 assert dtargsr==dtargs, \
148 "Incorrectly reconstructed args for doctest_bad: %s" % (dtargsr,)
149
150
151 @dec.skip_linux
152 def test_linux():
153 nt.assert_not_equals(sys.platform,'linux2',"This test can't run under linux")
154
155 @dec.skip_win32
156 def test_win32():
157 nt.assert_not_equals(sys.platform,'win32',"This test can't run under windows")
158
159 @dec.skip_osx
160 def test_osx():
161 nt.assert_not_equals(sys.platform,'darwin',"This test can't run under osx")
@@ -0,0 +1,21 b''
1 """ Tests for various magic functions
2
3 Needs to be run by nose (to make ipython session available)
4
5 """
6 def test_rehashx():
7 # clear up everything
8 _ip.IP.alias_table.clear()
9 del _ip.db['syscmdlist']
10
11 _ip.magic('rehashx')
12 # Practically ALL ipython development systems will have more than 10 aliases
13
14 assert len(_ip.IP.alias_table) > 10
15 for key, val in _ip.IP.alias_table.items():
16 # we must strip dots from alias names
17 assert '.' not in key
18
19 # rehashx must fill up syscmdlist
20 scoms = _ip.db['syscmdlist']
21 assert len(scoms) > 10
@@ -0,0 +1,20 b''
1 #!/usr/bin/env python
2 """Call the compile script to check that all code we ship compiles correctly.
3 """
4
5 import os
6 import sys
7
8
9 vstr = '.'.join(map(str,sys.version_info[:2]))
10
11 stat = os.system('python %s/lib/python%s/compileall.py .' % (sys.prefix,vstr))
12
13 print
14 if stat:
15 print '*** THERE WAS AN ERROR! ***'
16 print 'See messages above for the actual file that produced it.'
17 else:
18 print 'OK'
19
20 sys.exit(stat)
@@ -1,394 +1,400 b''
1
1
2 """ Implementations for various useful completers
2 """ Implementations for various useful completers
3
3
4 See Extensions/ipy_stock_completers.py on examples of how to enable a completer,
4 See Extensions/ipy_stock_completers.py on examples of how to enable a completer,
5 but the basic idea is to do:
5 but the basic idea is to do:
6
6
7 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
7 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
8
8
9 """
9 """
10 import IPython.ipapi
10 import IPython.ipapi
11 import glob,os,shlex,sys
11 import glob,os,shlex,sys
12 import inspect
12 import inspect
13 from time import time
13 from time import time
14 from zipimport import zipimporter
14 from zipimport import zipimporter
15 ip = IPython.ipapi.get()
15 ip = IPython.ipapi.get()
16
16
17 try:
17 try:
18 set
18 set
19 except:
19 except:
20 from sets import Set as set
20 from sets import Set as set
21
21
22 TIMEOUT_STORAGE = 3 #Time in seconds after which the rootmodules will be stored
22 TIMEOUT_STORAGE = 3 #Time in seconds after which the rootmodules will be stored
23 TIMEOUT_GIVEUP = 20 #Time in seconds after which we give up
23 TIMEOUT_GIVEUP = 20 #Time in seconds after which we give up
24
24
25 def quick_completer(cmd, completions):
25 def quick_completer(cmd, completions):
26 """ Easily create a trivial completer for a command.
26 """ Easily create a trivial completer for a command.
27
27
28 Takes either a list of completions, or all completions in string
28 Takes either a list of completions, or all completions in string
29 (that will be split on whitespace)
29 (that will be split on whitespace)
30
30
31 Example::
31 Example::
32
32
33 [d:\ipython]|1> import ipy_completers
33 [d:\ipython]|1> import ipy_completers
34 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
34 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
35 [d:\ipython]|3> foo b<TAB>
35 [d:\ipython]|3> foo b<TAB>
36 bar baz
36 bar baz
37 [d:\ipython]|3> foo ba
37 [d:\ipython]|3> foo ba
38 """
38 """
39 if isinstance(completions, basestring):
39 if isinstance(completions, basestring):
40
40
41 completions = completions.split()
41 completions = completions.split()
42 def do_complete(self,event):
42 def do_complete(self,event):
43 return completions
43 return completions
44
44
45 ip.set_hook('complete_command',do_complete, str_key = cmd)
45 ip.set_hook('complete_command',do_complete, str_key = cmd)
46
46
47 def getRootModules():
47 def getRootModules():
48 """
48 """
49 Returns a list containing the names of all the modules available in the
49 Returns a list containing the names of all the modules available in the
50 folders of the pythonpath.
50 folders of the pythonpath.
51 """
51 """
52 modules = []
52 modules = []
53 if ip.db.has_key('rootmodules'):
53 if ip.db.has_key('rootmodules'):
54 return ip.db['rootmodules']
54 return ip.db['rootmodules']
55 t = time()
55 t = time()
56 store = False
56 store = False
57 for path in sys.path:
57 for path in sys.path:
58 modules += moduleList(path)
58 modules += moduleList(path)
59 if time() - t >= TIMEOUT_STORAGE and not store:
59 if time() - t >= TIMEOUT_STORAGE and not store:
60 store = True
60 store = True
61 print "\nCaching the list of root modules, please wait!"
61 print "\nCaching the list of root modules, please wait!"
62 print "(This will only be done once - type '%rehashx' to " + \
62 print "(This will only be done once - type '%rehashx' to " + \
63 "reset cache!)"
63 "reset cache!)"
64 print
64 print
65 if time() - t > TIMEOUT_GIVEUP:
65 if time() - t > TIMEOUT_GIVEUP:
66 print "This is taking too long, we give up."
66 print "This is taking too long, we give up."
67 print
67 print
68 ip.db['rootmodules'] = []
68 ip.db['rootmodules'] = []
69 return []
69 return []
70
70
71 modules += sys.builtin_module_names
71 modules += sys.builtin_module_names
72
72
73 modules = list(set(modules))
73 modules = list(set(modules))
74 if '__init__' in modules:
74 if '__init__' in modules:
75 modules.remove('__init__')
75 modules.remove('__init__')
76 modules = list(set(modules))
76 modules = list(set(modules))
77 if store:
77 if store:
78 ip.db['rootmodules'] = modules
78 ip.db['rootmodules'] = modules
79 return modules
79 return modules
80
80
81 def moduleList(path):
81 def moduleList(path):
82 """
82 """
83 Return the list containing the names of the modules available in the given
83 Return the list containing the names of the modules available in the given
84 folder.
84 folder.
85 """
85 """
86
86
87 if os.path.isdir(path):
87 if os.path.isdir(path):
88 folder_list = os.listdir(path)
88 folder_list = os.listdir(path)
89 elif path.endswith('.egg'):
89 elif path.endswith('.egg'):
90 try:
90 try:
91 folder_list = [f for f in zipimporter(path)._files]
91 folder_list = [f for f in zipimporter(path)._files]
92 except:
92 except:
93 folder_list = []
93 folder_list = []
94 else:
94 else:
95 folder_list = []
95 folder_list = []
96 #folder_list = glob.glob(os.path.join(path,'*'))
96 #folder_list = glob.glob(os.path.join(path,'*'))
97 folder_list = [p for p in folder_list \
97 folder_list = [p for p in folder_list \
98 if os.path.exists(os.path.join(path, p,'__init__.py'))\
98 if os.path.exists(os.path.join(path, p,'__init__.py'))\
99 or p[-3:] in ('.py','.so')\
99 or p[-3:] in ('.py','.so')\
100 or p[-4:] in ('.pyc','.pyo','.pyd')]
100 or p[-4:] in ('.pyc','.pyo','.pyd')]
101
101
102 folder_list = [os.path.basename(p).split('.')[0] for p in folder_list]
102 folder_list = [os.path.basename(p).split('.')[0] for p in folder_list]
103 return folder_list
103 return folder_list
104
104
105 def moduleCompletion(line):
105 def moduleCompletion(line):
106 """
106 """
107 Returns a list containing the completion possibilities for an import line.
107 Returns a list containing the completion possibilities for an import line.
108 The line looks like this :
108 The line looks like this :
109 'import xml.d'
109 'import xml.d'
110 'from xml.dom import'
110 'from xml.dom import'
111 """
111 """
112 def tryImport(mod, only_modules=False):
112 def tryImport(mod, only_modules=False):
113 def isImportable(module, attr):
113 def isImportable(module, attr):
114 if only_modules:
114 if only_modules:
115 return inspect.ismodule(getattr(module, attr))
115 return inspect.ismodule(getattr(module, attr))
116 else:
116 else:
117 return not(attr[:2] == '__' and attr[-2:] == '__')
117 return not(attr[:2] == '__' and attr[-2:] == '__')
118 try:
118 try:
119 m = __import__(mod)
119 m = __import__(mod)
120 except:
120 except:
121 return []
121 return []
122 mods = mod.split('.')
122 mods = mod.split('.')
123 for module in mods[1:]:
123 for module in mods[1:]:
124 m = getattr(m,module)
124 m = getattr(m,module)
125 if (not hasattr(m, '__file__')) or (not only_modules) or\
125 if (not hasattr(m, '__file__')) or (not only_modules) or\
126 (hasattr(m, '__file__') and '__init__' in m.__file__):
126 (hasattr(m, '__file__') and '__init__' in m.__file__):
127 completion_list = [attr for attr in dir(m) if isImportable(m, attr)]
127 completion_list = [attr for attr in dir(m) if isImportable(m, attr)]
128 completion_list.extend(getattr(m,'__all__',[]))
128 completion_list.extend(getattr(m,'__all__',[]))
129 if hasattr(m, '__file__') and '__init__' in m.__file__:
129 if hasattr(m, '__file__') and '__init__' in m.__file__:
130 completion_list.extend(moduleList(os.path.dirname(m.__file__)))
130 completion_list.extend(moduleList(os.path.dirname(m.__file__)))
131 completion_list = list(set(completion_list))
131 completion_list = list(set(completion_list))
132 if '__init__' in completion_list:
132 if '__init__' in completion_list:
133 completion_list.remove('__init__')
133 completion_list.remove('__init__')
134 return completion_list
134 return completion_list
135
135
136 words = line.split(' ')
136 words = line.split(' ')
137 if len(words) == 3 and words[0] == 'from':
137 if len(words) == 3 and words[0] == 'from':
138 return ['import ']
138 return ['import ']
139 if len(words) < 3 and (words[0] in ['import','from']) :
139 if len(words) < 3 and (words[0] in ['import','from']) :
140 if len(words) == 1:
140 if len(words) == 1:
141 return getRootModules()
141 return getRootModules()
142 mod = words[1].split('.')
142 mod = words[1].split('.')
143 if len(mod) < 2:
143 if len(mod) < 2:
144 return getRootModules()
144 return getRootModules()
145 completion_list = tryImport('.'.join(mod[:-1]), True)
145 completion_list = tryImport('.'.join(mod[:-1]), True)
146 completion_list = ['.'.join(mod[:-1] + [el]) for el in completion_list]
146 completion_list = ['.'.join(mod[:-1] + [el]) for el in completion_list]
147 return completion_list
147 return completion_list
148 if len(words) >= 3 and words[0] == 'from':
148 if len(words) >= 3 and words[0] == 'from':
149 mod = words[1]
149 mod = words[1]
150 return tryImport(mod)
150 return tryImport(mod)
151
151
152 def vcs_completer(commands, event):
152 def vcs_completer(commands, event):
153 """ utility to make writing typical version control app completers easier
153 """ utility to make writing typical version control app completers easier
154
154
155 VCS command line apps typically have the format:
155 VCS command line apps typically have the format:
156
156
157 [sudo ]PROGNAME [help] [command] file file...
157 [sudo ]PROGNAME [help] [command] file file...
158
158
159 """
159 """
160
160
161
161
162 cmd_param = event.line.split()
162 cmd_param = event.line.split()
163 if event.line.endswith(' '):
163 if event.line.endswith(' '):
164 cmd_param.append('')
164 cmd_param.append('')
165
165
166 if cmd_param[0] == 'sudo':
166 if cmd_param[0] == 'sudo':
167 cmd_param = cmd_param[1:]
167 cmd_param = cmd_param[1:]
168
168
169 if len(cmd_param) == 2 or 'help' in cmd_param:
169 if len(cmd_param) == 2 or 'help' in cmd_param:
170 return commands.split()
170 return commands.split()
171
171
172 return ip.IP.Completer.file_matches(event.symbol)
172 return ip.IP.Completer.file_matches(event.symbol)
173
173
174
174
175 pkg_cache = None
175 pkg_cache = None
176
176
177 def module_completer(self,event):
177 def module_completer(self,event):
178 """ Give completions after user has typed 'import ...' or 'from ...'"""
178 """ Give completions after user has typed 'import ...' or 'from ...'"""
179
179
180 # This works in all versions of python. While 2.5 has
180 # This works in all versions of python. While 2.5 has
181 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
181 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
182 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
182 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
183 # of possibly problematic side effects.
183 # of possibly problematic side effects.
184 # This search the folders in the sys.path for available modules.
184 # This search the folders in the sys.path for available modules.
185
185
186 return moduleCompletion(event.line)
186 return moduleCompletion(event.line)
187
187
188
188
189 svn_commands = """\
189 svn_commands = """\
190 add blame praise annotate ann cat checkout co cleanup commit ci copy
190 add blame praise annotate ann cat checkout co cleanup commit ci copy
191 cp delete del remove rm diff di export help ? h import info list ls
191 cp delete del remove rm diff di export help ? h import info list ls
192 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
192 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
193 pe propget pget pg proplist plist pl propset pset ps resolved revert
193 pe propget pget pg proplist plist pl propset pset ps resolved revert
194 status stat st switch sw unlock update
194 status stat st switch sw unlock update
195 """
195 """
196
196
197 def svn_completer(self,event):
197 def svn_completer(self,event):
198 return vcs_completer(svn_commands, event)
198 return vcs_completer(svn_commands, event)
199
199
200
200
201 hg_commands = """
201 hg_commands = """
202 add addremove annotate archive backout branch branches bundle cat
202 add addremove annotate archive backout branch branches bundle cat
203 clone commit copy diff export grep heads help identify import incoming
203 clone commit copy diff export grep heads help identify import incoming
204 init locate log manifest merge outgoing parents paths pull push
204 init locate log manifest merge outgoing parents paths pull push
205 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
205 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
206 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
206 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
207 qselect qseries qtop qunapplied recover remove rename revert rollback
207 qselect qseries qtop qunapplied recover remove rename revert rollback
208 root serve showconfig status strip tag tags tip unbundle update verify
208 root serve showconfig status strip tag tags tip unbundle update verify
209 version
209 version
210 """
210 """
211
211
212 def hg_completer(self,event):
212 def hg_completer(self,event):
213 """ Completer for mercurial commands """
213 """ Completer for mercurial commands """
214
214
215 return vcs_completer(hg_commands, event)
215 return vcs_completer(hg_commands, event)
216
216
217
217
218
218
219 __bzr_commands = None
219 __bzr_commands = None
220
220
221 def bzr_commands():
221 def bzr_commands():
222 global __bzr_commands
222 global __bzr_commands
223 if __bzr_commands is not None:
223 if __bzr_commands is not None:
224 return __bzr_commands
224 return __bzr_commands
225 out = os.popen('bzr help commands')
225 out = os.popen('bzr help commands')
226 __bzr_commands = [l.split()[0] for l in out]
226 __bzr_commands = [l.split()[0] for l in out]
227 return __bzr_commands
227 return __bzr_commands
228
228
229 def bzr_completer(self,event):
229 def bzr_completer(self,event):
230 """ Completer for bazaar commands """
230 """ Completer for bazaar commands """
231 cmd_param = event.line.split()
231 cmd_param = event.line.split()
232 if event.line.endswith(' '):
232 if event.line.endswith(' '):
233 cmd_param.append('')
233 cmd_param.append('')
234
234
235 if len(cmd_param) > 2:
235 if len(cmd_param) > 2:
236 cmd = cmd_param[1]
236 cmd = cmd_param[1]
237 param = cmd_param[-1]
237 param = cmd_param[-1]
238 output_file = (param == '--output=')
238 output_file = (param == '--output=')
239 if cmd == 'help':
239 if cmd == 'help':
240 return bzr_commands()
240 return bzr_commands()
241 elif cmd in ['bundle-revisions','conflicts',
241 elif cmd in ['bundle-revisions','conflicts',
242 'deleted','nick','register-branch',
242 'deleted','nick','register-branch',
243 'serve','unbind','upgrade','version',
243 'serve','unbind','upgrade','version',
244 'whoami'] and not output_file:
244 'whoami'] and not output_file:
245 return []
245 return []
246 else:
246 else:
247 # the rest are probably file names
247 # the rest are probably file names
248 return ip.IP.Completer.file_matches(event.symbol)
248 return ip.IP.Completer.file_matches(event.symbol)
249
249
250 return bzr_commands()
250 return bzr_commands()
251
251
252
252
253 def shlex_split(x):
253 def shlex_split(x):
254 """Helper function to split lines into segments."""
254 """Helper function to split lines into segments."""
255 #shlex.split raise exception if syntax error in sh syntax
255 #shlex.split raise exception if syntax error in sh syntax
256 #for example if no closing " is found. This function keeps dropping
256 #for example if no closing " is found. This function keeps dropping
257 #the last character of the line until shlex.split does not raise
257 #the last character of the line until shlex.split does not raise
258 #exception. Adds end of the line to the result of shlex.split
258 #exception. Adds end of the line to the result of shlex.split
259 #example: %run "c:/python -> ['%run','"c:/python']
259 #example: %run "c:/python -> ['%run','"c:/python']
260 endofline=[]
260 endofline=[]
261 while x!="":
261 while x!="":
262 try:
262 try:
263 comps=shlex.split(x)
263 comps=shlex.split(x)
264 if len(endofline)>=1:
264 if len(endofline)>=1:
265 comps.append("".join(endofline))
265 comps.append("".join(endofline))
266 return comps
266 return comps
267 except ValueError:
267 except ValueError:
268 endofline=[x[-1:]]+endofline
268 endofline=[x[-1:]]+endofline
269 x=x[:-1]
269 x=x[:-1]
270 return ["".join(endofline)]
270 return ["".join(endofline)]
271
271
272 def runlistpy(self, event):
272 def runlistpy(self, event):
273 comps = shlex_split(event.line)
273 comps = shlex_split(event.line)
274 relpath = (len(comps) > 1 and comps[-1] or '').strip("'\"")
274 relpath = (len(comps) > 1 and comps[-1] or '').strip("'\"")
275
275
276 #print "\nev=",event # dbg
276 #print "\nev=",event # dbg
277 #print "rp=",relpath # dbg
277 #print "rp=",relpath # dbg
278 #print 'comps=',comps # dbg
278 #print 'comps=',comps # dbg
279
279
280 lglob = glob.glob
280 lglob = glob.glob
281 isdir = os.path.isdir
281 isdir = os.path.isdir
282 if relpath.startswith('~'):
282 if relpath.startswith('~'):
283 relpath = os.path.expanduser(relpath)
283 relpath = os.path.expanduser(relpath)
284 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
284 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
285 if isdir(f)]
285 if isdir(f)]
286
286
287 # Find if the user has already typed the first filename, after which we
287 # Find if the user has already typed the first filename, after which we
288 # should complete on all files, since after the first one other files may
288 # should complete on all files, since after the first one other files may
289 # be arguments to the input script.
289 # be arguments to the input script.
290 #filter(
290 #filter(
291 if filter(lambda f: f.endswith('.py') or f.endswith('.ipy') or
291 if filter(lambda f: f.endswith('.py') or f.endswith('.ipy') or
292 f.endswith('.pyw'),comps):
292 f.endswith('.pyw'),comps):
293 pys = [f.replace('\\','/') for f in lglob('*')]
293 pys = [f.replace('\\','/') for f in lglob('*')]
294 else:
294 else:
295 pys = [f.replace('\\','/')
295 pys = [f.replace('\\','/')
296 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
296 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
297 lglob(relpath + '*.pyw')]
297 lglob(relpath + '*.pyw')]
298 return dirs + pys
298 return dirs + pys
299
299
300
300
301 greedy_cd_completer = False
301 greedy_cd_completer = False
302
302
303 def cd_completer(self, event):
303 def cd_completer(self, event):
304 relpath = event.symbol
304 relpath = event.symbol
305 #print event # dbg
305 #print event # dbg
306 if '-b' in event.line:
306 if '-b' in event.line:
307 # return only bookmark completions
307 # return only bookmark completions
308 bkms = self.db.get('bookmarks',{})
308 bkms = self.db.get('bookmarks',{})
309 return bkms.keys()
309 return bkms.keys()
310
310
311
311
312 if event.symbol == '-':
312 if event.symbol == '-':
313 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
313 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
314 # jump in directory history by number
314 # jump in directory history by number
315 fmt = '-%0' + width_dh +'d [%s]'
315 fmt = '-%0' + width_dh +'d [%s]'
316 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
316 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
317 if len(ents) > 1:
317 if len(ents) > 1:
318 return ents
318 return ents
319 return []
319 return []
320
320
321 if event.symbol.startswith('--'):
321 if event.symbol.startswith('--'):
322 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
322 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
323
323
324 if relpath.startswith('~'):
324 if relpath.startswith('~'):
325 relpath = os.path.expanduser(relpath).replace('\\','/')
325 relpath = os.path.expanduser(relpath).replace('\\','/')
326 found = []
326 found = []
327 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
327 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
328 if os.path.isdir(f)]:
328 if os.path.isdir(f)]:
329 if ' ' in d:
329 if ' ' in d:
330 # we don't want to deal with any of that, complex code
330 # we don't want to deal with any of that, complex code
331 # for this is elsewhere
331 # for this is elsewhere
332 raise IPython.ipapi.TryNext
332 raise IPython.ipapi.TryNext
333 found.append( d )
333 found.append( d )
334
334
335 if not found:
335 if not found:
336 if os.path.isdir(relpath):
336 if os.path.isdir(relpath):
337 return [relpath]
337 return [relpath]
338 # if no completions so far, try bookmarks
339 bks = self.db.get('bookmarks',{}).keys()
340 bkmatches = [s for s in bks if s.startswith(event.symbol)]
341 if bkmatches:
342 return bkmatches
343
338 raise IPython.ipapi.TryNext
344 raise IPython.ipapi.TryNext
339
345
340
346
341 def single_dir_expand(matches):
347 def single_dir_expand(matches):
342 "Recursively expand match lists containing a single dir."
348 "Recursively expand match lists containing a single dir."
343
349
344 if len(matches) == 1 and os.path.isdir(matches[0]):
350 if len(matches) == 1 and os.path.isdir(matches[0]):
345 # Takes care of links to directories also. Use '/'
351 # Takes care of links to directories also. Use '/'
346 # explicitly, even under Windows, so that name completions
352 # explicitly, even under Windows, so that name completions
347 # don't end up escaped.
353 # don't end up escaped.
348 d = matches[0]
354 d = matches[0]
349 if d[-1] in ['/','\\']:
355 if d[-1] in ['/','\\']:
350 d = d[:-1]
356 d = d[:-1]
351
357
352 subdirs = [p for p in os.listdir(d) if os.path.isdir( d + '/' + p) and not p.startswith('.')]
358 subdirs = [p for p in os.listdir(d) if os.path.isdir( d + '/' + p) and not p.startswith('.')]
353 if subdirs:
359 if subdirs:
354 matches = [ (d + '/' + p) for p in subdirs ]
360 matches = [ (d + '/' + p) for p in subdirs ]
355 return single_dir_expand(matches)
361 return single_dir_expand(matches)
356 else:
362 else:
357 return matches
363 return matches
358 else:
364 else:
359 return matches
365 return matches
360
366
361 if greedy_cd_completer:
367 if greedy_cd_completer:
362 return single_dir_expand(found)
368 return single_dir_expand(found)
363 else:
369 else:
364 return found
370 return found
365
371
366 def apt_get_packages(prefix):
372 def apt_get_packages(prefix):
367 out = os.popen('apt-cache pkgnames')
373 out = os.popen('apt-cache pkgnames')
368 for p in out:
374 for p in out:
369 if p.startswith(prefix):
375 if p.startswith(prefix):
370 yield p.rstrip()
376 yield p.rstrip()
371
377
372
378
373 apt_commands = """\
379 apt_commands = """\
374 update upgrade install remove purge source build-dep dist-upgrade
380 update upgrade install remove purge source build-dep dist-upgrade
375 dselect-upgrade clean autoclean check"""
381 dselect-upgrade clean autoclean check"""
376
382
377 def apt_completer(self, event):
383 def apt_completer(self, event):
378 """ Completer for apt-get (uses apt-cache internally)
384 """ Completer for apt-get (uses apt-cache internally)
379
385
380 """
386 """
381
387
382
388
383 cmd_param = event.line.split()
389 cmd_param = event.line.split()
384 if event.line.endswith(' '):
390 if event.line.endswith(' '):
385 cmd_param.append('')
391 cmd_param.append('')
386
392
387 if cmd_param[0] == 'sudo':
393 if cmd_param[0] == 'sudo':
388 cmd_param = cmd_param[1:]
394 cmd_param = cmd_param[1:]
389
395
390 if len(cmd_param) == 2 or 'help' in cmd_param:
396 if len(cmd_param) == 2 or 'help' in cmd_param:
391 return apt_commands.split()
397 return apt_commands.split()
392
398
393 return list(apt_get_packages(event.symbol))
399 return list(apt_get_packages(event.symbol))
394
400
@@ -1,258 +1,270 b''
1 """Shell mode for IPython.
1 """Shell mode for IPython.
2
2
3 Start ipython in shell mode by invoking "ipython -p sh"
3 Start ipython in shell mode by invoking "ipython -p sh"
4
4
5 (the old version, "ipython -p pysh" still works but this is the more "modern"
5 (the old version, "ipython -p pysh" still works but this is the more "modern"
6 shell mode and is recommended for users who don't care about pysh-mode
6 shell mode and is recommended for users who don't care about pysh-mode
7 compatibility)
7 compatibility)
8 """
8 """
9
9
10 from IPython import ipapi
10 from IPython import ipapi
11 import os,textwrap
11 import os,textwrap
12
12
13 # The import below effectively obsoletes your old-style ipythonrc[.ini],
13 # The import below effectively obsoletes your old-style ipythonrc[.ini],
14 # so consider yourself warned!
14 # so consider yourself warned!
15
15
16 import ipy_defaults
16 import ipy_defaults
17
17
18 def main():
18 def main():
19 ip = ipapi.get()
19 ip = ipapi.get()
20 o = ip.options
20 o = ip.options
21 # autocall to "full" mode (smart mode is default, I like full mode)
21 # autocall to "full" mode (smart mode is default, I like full mode)
22
22
23 o.autocall = 2
23 o.autocall = 2
24
24
25 # Jason Orendorff's path class is handy to have in user namespace
25 # Jason Orendorff's path class is handy to have in user namespace
26 # if you are doing shell-like stuff
26 # if you are doing shell-like stuff
27 try:
27 try:
28 ip.ex("from IPython.external.path import path" )
28 ip.ex("from IPython.external.path import path" )
29 except ImportError:
29 except ImportError:
30 pass
30 pass
31
31
32 # beefed up %env is handy in shell mode
32 # beefed up %env is handy in shell mode
33 import envpersist
33 import envpersist
34
34
35 # To see where mycmd resides (in path/aliases), do %which mycmd
35 # To see where mycmd resides (in path/aliases), do %which mycmd
36 import ipy_which
36 import ipy_which
37
37
38 # tab completers for hg, svn, ...
38 # tab completers for hg, svn, ...
39 import ipy_app_completers
39 import ipy_app_completers
40
40
41 # To make executables foo and bar in mybin usable without PATH change, do:
41 # To make executables foo and bar in mybin usable without PATH change, do:
42 # %rehashdir c:/mybin
42 # %rehashdir c:/mybin
43 # %store foo
43 # %store foo
44 # %store bar
44 # %store bar
45 import ipy_rehashdir
45 import ipy_rehashdir
46
46
47 # does not work without subprocess module!
47 # does not work without subprocess module!
48 #import ipy_signals
48 #import ipy_signals
49
49
50 ip.ex('import os')
50 ip.ex('import os')
51 ip.ex("def up(): os.chdir('..')")
51 ip.ex("def up(): os.chdir('..')")
52 ip.user_ns['LA'] = LastArgFinder()
52 ip.user_ns['LA'] = LastArgFinder()
53 # Nice prompt
54
53
55 o.prompt_in1= r'\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Green|\#> '
54 # You can assign to _prompt_title variable
55 # to provide some extra information for prompt
56 # (e.g. the current mode, host/username...)
57
58 ip.user_ns['_prompt_title'] = ''
59
60 # Nice prompt
61 o.prompt_in1= r'\C_Green${_prompt_title}\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Green|\#> '
56 o.prompt_in2= r'\C_Green|\C_LightGreen\D\C_Green> '
62 o.prompt_in2= r'\C_Green|\C_LightGreen\D\C_Green> '
57 o.prompt_out= '<\#> '
63 o.prompt_out= '<\#> '
58
64
59 from IPython import Release
65 from IPython import Release
60
66
61 import sys
67 import sys
62 # Non-chatty banner
68 # Non-chatty banner
63 o.banner = "IPython %s [on Py %s]\n" % (Release.version,sys.version.split(None,1)[0])
69 o.banner = "IPython %s [on Py %s]\n" % (Release.version,sys.version.split(None,1)[0])
64
70
65
71
66 ip.IP.default_option('cd','-q')
72 ip.IP.default_option('cd','-q')
67 ip.IP.default_option('macro', '-r')
73 ip.IP.default_option('macro', '-r')
68 # If you only rarely want to execute the things you %edit...
74 # If you only rarely want to execute the things you %edit...
69 #ip.IP.default_option('edit','-x')
75 #ip.IP.default_option('edit','-x')
70
76
71
77
72 o.prompts_pad_left="1"
78 o.prompts_pad_left="1"
73 # Remove all blank lines in between prompts, like a normal shell.
79 # Remove all blank lines in between prompts, like a normal shell.
74 o.separate_in="0"
80 o.separate_in="0"
75 o.separate_out="0"
81 o.separate_out="0"
76 o.separate_out2="0"
82 o.separate_out2="0"
77
83
78 # now alias all syscommands
84 # now alias all syscommands
79
85
80 db = ip.db
86 db = ip.db
81
87
82 syscmds = db.get("syscmdlist",[] )
88 syscmds = db.get("syscmdlist",[] )
83 if not syscmds:
89 if not syscmds:
84 print textwrap.dedent("""
90 print textwrap.dedent("""
85 System command list not initialized, probably the first run...
91 System command list not initialized, probably the first run...
86 running %rehashx to refresh the command list. Run %rehashx
92 running %rehashx to refresh the command list. Run %rehashx
87 again to refresh command list (after installing new software etc.)
93 again to refresh command list (after installing new software etc.)
88 """)
94 """)
89 ip.magic('rehashx')
95 ip.magic('rehashx')
90 syscmds = db.get("syscmdlist")
96 syscmds = db.get("syscmdlist")
91
97
92 # lowcase aliases on win32 only
98 # lowcase aliases on win32 only
93 if os.name == 'posix':
99 if os.name == 'posix':
94 mapper = lambda s:s
100 mapper = lambda s:s
95 else:
101 else:
96 def mapper(s): return s.lower()
102 def mapper(s): return s.lower()
97
103
98 for cmd in syscmds:
104 for cmd in syscmds:
99 # print "sys",cmd #dbg
105 # print "sys",cmd #dbg
100 noext, ext = os.path.splitext(cmd)
106 noext, ext = os.path.splitext(cmd)
101 key = mapper(noext)
107 if ext.lower() == '.exe':
108 cmd = noext
109
110 key = mapper(cmd)
102 if key not in ip.IP.alias_table:
111 if key not in ip.IP.alias_table:
103 ip.defalias(key, cmd)
112 # Dots will be removed from alias names, since ipython
113 # assumes names with dots to be python code
114
115 ip.defalias(key.replace('.',''), cmd)
104
116
105 # mglob combines 'find', recursion, exclusion... '%mglob?' to learn more
117 # mglob combines 'find', recursion, exclusion... '%mglob?' to learn more
106 ip.load("IPython.external.mglob")
118 ip.load("IPython.external.mglob")
107
119
108 # win32 is crippled w/o cygwin, try to help it a little bit
120 # win32 is crippled w/o cygwin, try to help it a little bit
109 if sys.platform == 'win32':
121 if sys.platform == 'win32':
110 if 'cygwin' in os.environ['PATH'].lower():
122 if 'cygwin' in os.environ['PATH'].lower():
111 # use the colors of cygwin ls (recommended)
123 # use the colors of cygwin ls (recommended)
112 ip.defalias('d', 'ls -F --color=auto')
124 ip.defalias('d', 'ls -F --color=auto')
113 else:
125 else:
114 # get icp, imv, imkdir, igrep, irm,...
126 # get icp, imv, imkdir, igrep, irm,...
115 ip.load('ipy_fsops')
127 ip.load('ipy_fsops')
116
128
117 # and the next best thing to real 'ls -F'
129 # and the next best thing to real 'ls -F'
118 ip.defalias('d','dir /w /og /on')
130 ip.defalias('d','dir /w /og /on')
119
131
120 ip.set_hook('input_prefilter', dotslash_prefilter_f)
132 ip.set_hook('input_prefilter', dotslash_prefilter_f)
121 extend_shell_behavior(ip)
133 extend_shell_behavior(ip)
122
134
123 class LastArgFinder:
135 class LastArgFinder:
124 """ Allow $LA to work as "last argument of previous command", like $! in bash
136 """ Allow $LA to work as "last argument of previous command", like $! in bash
125
137
126 To call this in normal IPython code, do LA()
138 To call this in normal IPython code, do LA()
127 """
139 """
128 def __call__(self, hist_idx = None):
140 def __call__(self, hist_idx = None):
129 ip = ipapi.get()
141 ip = ipapi.get()
130 if hist_idx is None:
142 if hist_idx is None:
131 return str(self)
143 return str(self)
132 return ip.IP.input_hist_raw[hist_idx].strip().split()[-1]
144 return ip.IP.input_hist_raw[hist_idx].strip().split()[-1]
133 def __str__(self):
145 def __str__(self):
134 ip = ipapi.get()
146 ip = ipapi.get()
135 for cmd in reversed(ip.IP.input_hist_raw):
147 for cmd in reversed(ip.IP.input_hist_raw):
136 parts = cmd.strip().split()
148 parts = cmd.strip().split()
137 if len(parts) < 2 or parts[-1] in ['$LA', 'LA()']:
149 if len(parts) < 2 or parts[-1] in ['$LA', 'LA()']:
138 continue
150 continue
139 return parts[-1]
151 return parts[-1]
140 return ""
152 return ""
141
153
142 def dotslash_prefilter_f(self,line):
154 def dotslash_prefilter_f(self,line):
143 """ ./foo now runs foo as system command
155 """ ./foo now runs foo as system command
144
156
145 Removes the need for doing !./foo
157 Removes the need for doing !./foo
146 """
158 """
147 import IPython.genutils
159 import IPython.genutils
148 if line.startswith("./"):
160 if line.startswith("./"):
149 return "_ip.system(" + IPython.genutils.make_quoted_expr(line)+")"
161 return "_ip.system(" + IPython.genutils.make_quoted_expr(line)+")"
150 raise ipapi.TryNext
162 raise ipapi.TryNext
151
163
152 # XXX You do not need to understand the next function!
164 # XXX You do not need to understand the next function!
153 # This should probably be moved out of profile
165 # This should probably be moved out of profile
154
166
155 def extend_shell_behavior(ip):
167 def extend_shell_behavior(ip):
156
168
157 # Instead of making signature a global variable tie it to IPSHELL.
169 # Instead of making signature a global variable tie it to IPSHELL.
158 # In future if it is required to distinguish between different
170 # In future if it is required to distinguish between different
159 # shells we can assign a signature per shell basis
171 # shells we can assign a signature per shell basis
160 ip.IP.__sig__ = 0xa005
172 ip.IP.__sig__ = 0xa005
161 # mark the IPSHELL with this signature
173 # mark the IPSHELL with this signature
162 ip.IP.user_ns['__builtins__'].__dict__['__sig__'] = ip.IP.__sig__
174 ip.IP.user_ns['__builtins__'].__dict__['__sig__'] = ip.IP.__sig__
163
175
164 from IPython.Itpl import ItplNS
176 from IPython.Itpl import ItplNS
165 from IPython.genutils import shell
177 from IPython.genutils import shell
166 # utility to expand user variables via Itpl
178 # utility to expand user variables via Itpl
167 # xxx do something sensible with depth?
179 # xxx do something sensible with depth?
168 ip.IP.var_expand = lambda cmd, lvars=None, depth=2: \
180 ip.IP.var_expand = lambda cmd, lvars=None, depth=2: \
169 str(ItplNS(cmd, ip.IP.user_ns, get_locals()))
181 str(ItplNS(cmd, ip.IP.user_ns, get_locals()))
170
182
171 def get_locals():
183 def get_locals():
172 """ Substituting a variable through Itpl deep inside the IPSHELL stack
184 """ Substituting a variable through Itpl deep inside the IPSHELL stack
173 requires the knowledge of all the variables in scope upto the last
185 requires the knowledge of all the variables in scope upto the last
174 IPSHELL frame. This routine simply merges all the local variables
186 IPSHELL frame. This routine simply merges all the local variables
175 on the IPSHELL stack without worrying about their scope rules
187 on the IPSHELL stack without worrying about their scope rules
176 """
188 """
177 import sys
189 import sys
178 # note lambda expression constitues a function call
190 # note lambda expression constitues a function call
179 # hence fno should be incremented by one
191 # hence fno should be incremented by one
180 getsig = lambda fno: sys._getframe(fno+1).f_globals \
192 getsig = lambda fno: sys._getframe(fno+1).f_globals \
181 ['__builtins__'].__dict__['__sig__']
193 ['__builtins__'].__dict__['__sig__']
182 getlvars = lambda fno: sys._getframe(fno+1).f_locals
194 getlvars = lambda fno: sys._getframe(fno+1).f_locals
183 # trackback until we enter the IPSHELL
195 # trackback until we enter the IPSHELL
184 frame_no = 1
196 frame_no = 1
185 sig = ip.IP.__sig__
197 sig = ip.IP.__sig__
186 fsig = ~sig
198 fsig = ~sig
187 while fsig != sig :
199 while fsig != sig :
188 try:
200 try:
189 fsig = getsig(frame_no)
201 fsig = getsig(frame_no)
190 except (AttributeError, KeyError):
202 except (AttributeError, KeyError):
191 frame_no += 1
203 frame_no += 1
192 except ValueError:
204 except ValueError:
193 # stack is depleted
205 # stack is depleted
194 # call did not originate from IPSHELL
206 # call did not originate from IPSHELL
195 return {}
207 return {}
196 first_frame = frame_no
208 first_frame = frame_no
197 # walk further back until we exit from IPSHELL or deplete stack
209 # walk further back until we exit from IPSHELL or deplete stack
198 try:
210 try:
199 while(sig == getsig(frame_no+1)):
211 while(sig == getsig(frame_no+1)):
200 frame_no += 1
212 frame_no += 1
201 except (AttributeError, KeyError, ValueError):
213 except (AttributeError, KeyError, ValueError):
202 pass
214 pass
203 # merge the locals from top down hence overriding
215 # merge the locals from top down hence overriding
204 # any re-definitions of variables, functions etc.
216 # any re-definitions of variables, functions etc.
205 lvars = {}
217 lvars = {}
206 for fno in range(frame_no, first_frame-1, -1):
218 for fno in range(frame_no, first_frame-1, -1):
207 lvars.update(getlvars(fno))
219 lvars.update(getlvars(fno))
208 #print '\n'*5, first_frame, frame_no, '\n', lvars, '\n'*5 #dbg
220 #print '\n'*5, first_frame, frame_no, '\n', lvars, '\n'*5 #dbg
209 return lvars
221 return lvars
210
222
211 def _runlines(lines):
223 def _runlines(lines):
212 """Run a string of one or more lines of source.
224 """Run a string of one or more lines of source.
213
225
214 This method is capable of running a string containing multiple source
226 This method is capable of running a string containing multiple source
215 lines, as if they had been entered at the IPython prompt. Since it
227 lines, as if they had been entered at the IPython prompt. Since it
216 exposes IPython's processing machinery, the given strings can contain
228 exposes IPython's processing machinery, the given strings can contain
217 magic calls (%magic), special shell access (!cmd), etc."""
229 magic calls (%magic), special shell access (!cmd), etc."""
218
230
219 # We must start with a clean buffer, in case this is run from an
231 # We must start with a clean buffer, in case this is run from an
220 # interactive IPython session (via a magic, for example).
232 # interactive IPython session (via a magic, for example).
221 ip.IP.resetbuffer()
233 ip.IP.resetbuffer()
222 lines = lines.split('\n')
234 lines = lines.split('\n')
223 more = 0
235 more = 0
224 command = ''
236 command = ''
225 for line in lines:
237 for line in lines:
226 # skip blank lines so we don't mess up the prompt counter, but do
238 # skip blank lines so we don't mess up the prompt counter, but do
227 # NOT skip even a blank line if we are in a code block (more is
239 # NOT skip even a blank line if we are in a code block (more is
228 # true)
240 # true)
229 # if command is not empty trim the line
241 # if command is not empty trim the line
230 if command != '' :
242 if command != '' :
231 line = line.strip()
243 line = line.strip()
232 # add the broken line to the command
244 # add the broken line to the command
233 if line and line[-1] == '\\' :
245 if line and line[-1] == '\\' :
234 command += line[0:-1] + ' '
246 command += line[0:-1] + ' '
235 more = True
247 more = True
236 continue
248 continue
237 else :
249 else :
238 # add the last (current) line to the command
250 # add the last (current) line to the command
239 command += line
251 command += line
240 if command or more:
252 if command or more:
241 # push to raw history, so hist line numbers stay in sync
253 # push to raw history, so hist line numbers stay in sync
242 ip.IP.input_hist_raw.append("# " + command + "\n")
254 ip.IP.input_hist_raw.append("# " + command + "\n")
243
255
244 more = ip.IP.push(ip.IP.prefilter(command,more))
256 more = ip.IP.push(ip.IP.prefilter(command,more))
245 command = ''
257 command = ''
246 # IPython's runsource returns None if there was an error
258 # IPython's runsource returns None if there was an error
247 # compiling the code. This allows us to stop processing right
259 # compiling the code. This allows us to stop processing right
248 # away, so the user gets the error message at the right place.
260 # away, so the user gets the error message at the right place.
249 if more is None:
261 if more is None:
250 break
262 break
251 # final newline in case the input didn't have it, so that the code
263 # final newline in case the input didn't have it, so that the code
252 # actually does get executed
264 # actually does get executed
253 if more:
265 if more:
254 ip.IP.push('\n')
266 ip.IP.push('\n')
255
267
256 ip.IP.runlines = _runlines
268 ip.IP.runlines = _runlines
257
269
258 main()
270 main()
@@ -1,3377 +1,3397 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 2996 2008-01-30 06:31:39Z fperez $"""
4 $Id: Magic.py 2996 2008-01-30 06:31:39Z 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
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
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 # Modules and globals
15 # Modules and globals
16
16
17 from IPython import Release
17 from IPython import Release
18 __author__ = '%s <%s>\n%s <%s>' % \
18 __author__ = '%s <%s>\n%s <%s>' % \
19 ( Release.authors['Janko'] + Release.authors['Fernando'] )
19 ( Release.authors['Janko'] + Release.authors['Fernando'] )
20 __license__ = Release.license
20 __license__ = Release.license
21
21
22 # Python standard modules
22 # Python standard modules
23 import __builtin__
23 import __builtin__
24 import bdb
24 import bdb
25 import inspect
25 import inspect
26 import os
26 import os
27 import pdb
27 import pdb
28 import pydoc
28 import pydoc
29 import sys
29 import sys
30 import re
30 import re
31 import tempfile
31 import tempfile
32 import time
32 import time
33 import cPickle as pickle
33 import cPickle as pickle
34 import textwrap
34 import textwrap
35 from cStringIO import StringIO
35 from cStringIO import StringIO
36 from getopt import getopt,GetoptError
36 from getopt import getopt,GetoptError
37 from pprint import pprint, pformat
37 from pprint import pprint, pformat
38 from sets import Set
38 from sets import Set
39
39
40 # cProfile was added in Python2.5
40 # cProfile was added in Python2.5
41 try:
41 try:
42 import cProfile as profile
42 import cProfile as profile
43 import pstats
43 import pstats
44 except ImportError:
44 except ImportError:
45 # profile isn't bundled by default in Debian for license reasons
45 # profile isn't bundled by default in Debian for license reasons
46 try:
46 try:
47 import profile,pstats
47 import profile,pstats
48 except ImportError:
48 except ImportError:
49 profile = pstats = None
49 profile = pstats = None
50
50
51 # Homebrewed
51 # Homebrewed
52 import IPython
52 import IPython
53 from IPython import Debugger, OInspect, wildcard
53 from IPython import Debugger, OInspect, wildcard
54 from IPython.FakeModule import FakeModule
54 from IPython.FakeModule import FakeModule
55 from IPython.Itpl import Itpl, itpl, printpl,itplns
55 from IPython.Itpl import Itpl, itpl, printpl,itplns
56 from IPython.PyColorize import Parser
56 from IPython.PyColorize import Parser
57 from IPython.ipstruct import Struct
57 from IPython.ipstruct import Struct
58 from IPython.macro import Macro
58 from IPython.macro import Macro
59 from IPython.genutils import *
59 from IPython.genutils import *
60 from IPython import platutils
60 from IPython import platutils
61 import IPython.generics
61 import IPython.generics
62 import IPython.ipapi
62 import IPython.ipapi
63 from IPython.ipapi import UsageError
63 from IPython.ipapi import UsageError
64 from IPython.testing import decorators as testdec
64 from IPython.testing import decorators as testdec
65
65
66 #***************************************************************************
66 #***************************************************************************
67 # Utility functions
67 # Utility functions
68 def on_off(tag):
68 def on_off(tag):
69 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
69 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
70 return ['OFF','ON'][tag]
70 return ['OFF','ON'][tag]
71
71
72 class Bunch: pass
72 class Bunch: pass
73
73
74 def compress_dhist(dh):
74 def compress_dhist(dh):
75 head, tail = dh[:-10], dh[-10:]
75 head, tail = dh[:-10], dh[-10:]
76
76
77 newhead = []
77 newhead = []
78 done = Set()
78 done = Set()
79 for h in head:
79 for h in head:
80 if h in done:
80 if h in done:
81 continue
81 continue
82 newhead.append(h)
82 newhead.append(h)
83 done.add(h)
83 done.add(h)
84
84
85 return newhead + tail
85 return newhead + tail
86
86
87
87
88 #***************************************************************************
88 #***************************************************************************
89 # Main class implementing Magic functionality
89 # Main class implementing Magic functionality
90 class Magic:
90 class Magic:
91 """Magic functions for InteractiveShell.
91 """Magic functions for InteractiveShell.
92
92
93 Shell functions which can be reached as %function_name. All magic
93 Shell functions which can be reached as %function_name. All magic
94 functions should accept a string, which they can parse for their own
94 functions should accept a string, which they can parse for their own
95 needs. This can make some functions easier to type, eg `%cd ../`
95 needs. This can make some functions easier to type, eg `%cd ../`
96 vs. `%cd("../")`
96 vs. `%cd("../")`
97
97
98 ALL definitions MUST begin with the prefix magic_. The user won't need it
98 ALL definitions MUST begin with the prefix magic_. The user won't need it
99 at the command line, but it is is needed in the definition. """
99 at the command line, but it is is needed in the definition. """
100
100
101 # class globals
101 # class globals
102 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
102 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
103 'Automagic is ON, % prefix NOT needed for magic functions.']
103 'Automagic is ON, % prefix NOT needed for magic functions.']
104
104
105 #......................................................................
105 #......................................................................
106 # some utility functions
106 # some utility functions
107
107
108 def __init__(self,shell):
108 def __init__(self,shell):
109
109
110 self.options_table = {}
110 self.options_table = {}
111 if profile is None:
111 if profile is None:
112 self.magic_prun = self.profile_missing_notice
112 self.magic_prun = self.profile_missing_notice
113 self.shell = shell
113 self.shell = shell
114
114
115 # namespace for holding state we may need
115 # namespace for holding state we may need
116 self._magic_state = Bunch()
116 self._magic_state = Bunch()
117
117
118 def profile_missing_notice(self, *args, **kwargs):
118 def profile_missing_notice(self, *args, **kwargs):
119 error("""\
119 error("""\
120 The profile module could not be found. It has been removed from the standard
120 The profile module could not be found. It has been removed from the standard
121 python packages because of its non-free license. To use profiling, install the
121 python packages because of its non-free license. To use profiling, install the
122 python-profiler package from non-free.""")
122 python-profiler package from non-free.""")
123
123
124 def default_option(self,fn,optstr):
124 def default_option(self,fn,optstr):
125 """Make an entry in the options_table for fn, with value optstr"""
125 """Make an entry in the options_table for fn, with value optstr"""
126
126
127 if fn not in self.lsmagic():
127 if fn not in self.lsmagic():
128 error("%s is not a magic function" % fn)
128 error("%s is not a magic function" % fn)
129 self.options_table[fn] = optstr
129 self.options_table[fn] = optstr
130
130
131 def lsmagic(self):
131 def lsmagic(self):
132 """Return a list of currently available magic functions.
132 """Return a list of currently available magic functions.
133
133
134 Gives a list of the bare names after mangling (['ls','cd', ...], not
134 Gives a list of the bare names after mangling (['ls','cd', ...], not
135 ['magic_ls','magic_cd',...]"""
135 ['magic_ls','magic_cd',...]"""
136
136
137 # FIXME. This needs a cleanup, in the way the magics list is built.
137 # FIXME. This needs a cleanup, in the way the magics list is built.
138
138
139 # magics in class definition
139 # magics in class definition
140 class_magic = lambda fn: fn.startswith('magic_') and \
140 class_magic = lambda fn: fn.startswith('magic_') and \
141 callable(Magic.__dict__[fn])
141 callable(Magic.__dict__[fn])
142 # in instance namespace (run-time user additions)
142 # in instance namespace (run-time user additions)
143 inst_magic = lambda fn: fn.startswith('magic_') and \
143 inst_magic = lambda fn: fn.startswith('magic_') and \
144 callable(self.__dict__[fn])
144 callable(self.__dict__[fn])
145 # and bound magics by user (so they can access self):
145 # and bound magics by user (so they can access self):
146 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
146 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
147 callable(self.__class__.__dict__[fn])
147 callable(self.__class__.__dict__[fn])
148 magics = filter(class_magic,Magic.__dict__.keys()) + \
148 magics = filter(class_magic,Magic.__dict__.keys()) + \
149 filter(inst_magic,self.__dict__.keys()) + \
149 filter(inst_magic,self.__dict__.keys()) + \
150 filter(inst_bound_magic,self.__class__.__dict__.keys())
150 filter(inst_bound_magic,self.__class__.__dict__.keys())
151 out = []
151 out = []
152 for fn in Set(magics):
152 for fn in Set(magics):
153 out.append(fn.replace('magic_','',1))
153 out.append(fn.replace('magic_','',1))
154 out.sort()
154 out.sort()
155 return out
155 return out
156
156
157 def extract_input_slices(self,slices,raw=False):
157 def extract_input_slices(self,slices,raw=False):
158 """Return as a string a set of input history slices.
158 """Return as a string a set of input history slices.
159
159
160 Inputs:
160 Inputs:
161
161
162 - slices: the set of slices is given as a list of strings (like
162 - slices: the set of slices is given as a list of strings (like
163 ['1','4:8','9'], since this function is for use by magic functions
163 ['1','4:8','9'], since this function is for use by magic functions
164 which get their arguments as strings.
164 which get their arguments as strings.
165
165
166 Optional inputs:
166 Optional inputs:
167
167
168 - raw(False): by default, the processed input is used. If this is
168 - raw(False): by default, the processed input is used. If this is
169 true, the raw input history is used instead.
169 true, the raw input history is used instead.
170
170
171 Note that slices can be called with two notations:
171 Note that slices can be called with two notations:
172
172
173 N:M -> standard python form, means including items N...(M-1).
173 N:M -> standard python form, means including items N...(M-1).
174
174
175 N-M -> include items N..M (closed endpoint)."""
175 N-M -> include items N..M (closed endpoint)."""
176
176
177 if raw:
177 if raw:
178 hist = self.shell.input_hist_raw
178 hist = self.shell.input_hist_raw
179 else:
179 else:
180 hist = self.shell.input_hist
180 hist = self.shell.input_hist
181
181
182 cmds = []
182 cmds = []
183 for chunk in slices:
183 for chunk in slices:
184 if ':' in chunk:
184 if ':' in chunk:
185 ini,fin = map(int,chunk.split(':'))
185 ini,fin = map(int,chunk.split(':'))
186 elif '-' in chunk:
186 elif '-' in chunk:
187 ini,fin = map(int,chunk.split('-'))
187 ini,fin = map(int,chunk.split('-'))
188 fin += 1
188 fin += 1
189 else:
189 else:
190 ini = int(chunk)
190 ini = int(chunk)
191 fin = ini+1
191 fin = ini+1
192 cmds.append(hist[ini:fin])
192 cmds.append(hist[ini:fin])
193 return cmds
193 return cmds
194
194
195 def _ofind(self, oname, namespaces=None):
195 def _ofind(self, oname, namespaces=None):
196 """Find an object in the available namespaces.
196 """Find an object in the available namespaces.
197
197
198 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
198 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
199
199
200 Has special code to detect magic functions.
200 Has special code to detect magic functions.
201 """
201 """
202
202
203 oname = oname.strip()
203 oname = oname.strip()
204
204
205 alias_ns = None
205 alias_ns = None
206 if namespaces is None:
206 if namespaces is None:
207 # Namespaces to search in:
207 # Namespaces to search in:
208 # Put them in a list. The order is important so that we
208 # Put them in a list. The order is important so that we
209 # find things in the same order that Python finds them.
209 # find things in the same order that Python finds them.
210 namespaces = [ ('Interactive', self.shell.user_ns),
210 namespaces = [ ('Interactive', self.shell.user_ns),
211 ('IPython internal', self.shell.internal_ns),
211 ('IPython internal', self.shell.internal_ns),
212 ('Python builtin', __builtin__.__dict__),
212 ('Python builtin', __builtin__.__dict__),
213 ('Alias', self.shell.alias_table),
213 ('Alias', self.shell.alias_table),
214 ]
214 ]
215 alias_ns = self.shell.alias_table
215 alias_ns = self.shell.alias_table
216
216
217 # initialize results to 'null'
217 # initialize results to 'null'
218 found = 0; obj = None; ospace = None; ds = None;
218 found = 0; obj = None; ospace = None; ds = None;
219 ismagic = 0; isalias = 0; parent = None
219 ismagic = 0; isalias = 0; parent = None
220
220
221 # Look for the given name by splitting it in parts. If the head is
221 # Look for the given name by splitting it in parts. If the head is
222 # found, then we look for all the remaining parts as members, and only
222 # found, then we look for all the remaining parts as members, and only
223 # declare success if we can find them all.
223 # declare success if we can find them all.
224 oname_parts = oname.split('.')
224 oname_parts = oname.split('.')
225 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
225 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
226 for nsname,ns in namespaces:
226 for nsname,ns in namespaces:
227 try:
227 try:
228 obj = ns[oname_head]
228 obj = ns[oname_head]
229 except KeyError:
229 except KeyError:
230 continue
230 continue
231 else:
231 else:
232 #print 'oname_rest:', oname_rest # dbg
232 #print 'oname_rest:', oname_rest # dbg
233 for part in oname_rest:
233 for part in oname_rest:
234 try:
234 try:
235 parent = obj
235 parent = obj
236 obj = getattr(obj,part)
236 obj = getattr(obj,part)
237 except:
237 except:
238 # Blanket except b/c some badly implemented objects
238 # Blanket except b/c some badly implemented objects
239 # allow __getattr__ to raise exceptions other than
239 # allow __getattr__ to raise exceptions other than
240 # AttributeError, which then crashes IPython.
240 # AttributeError, which then crashes IPython.
241 break
241 break
242 else:
242 else:
243 # If we finish the for loop (no break), we got all members
243 # If we finish the for loop (no break), we got all members
244 found = 1
244 found = 1
245 ospace = nsname
245 ospace = nsname
246 if ns == alias_ns:
246 if ns == alias_ns:
247 isalias = 1
247 isalias = 1
248 break # namespace loop
248 break # namespace loop
249
249
250 # Try to see if it's magic
250 # Try to see if it's magic
251 if not found:
251 if not found:
252 if oname.startswith(self.shell.ESC_MAGIC):
252 if oname.startswith(self.shell.ESC_MAGIC):
253 oname = oname[1:]
253 oname = oname[1:]
254 obj = getattr(self,'magic_'+oname,None)
254 obj = getattr(self,'magic_'+oname,None)
255 if obj is not None:
255 if obj is not None:
256 found = 1
256 found = 1
257 ospace = 'IPython internal'
257 ospace = 'IPython internal'
258 ismagic = 1
258 ismagic = 1
259
259
260 # Last try: special-case some literals like '', [], {}, etc:
260 # Last try: special-case some literals like '', [], {}, etc:
261 if not found and oname_head in ["''",'""','[]','{}','()']:
261 if not found and oname_head in ["''",'""','[]','{}','()']:
262 obj = eval(oname_head)
262 obj = eval(oname_head)
263 found = 1
263 found = 1
264 ospace = 'Interactive'
264 ospace = 'Interactive'
265
265
266 return {'found':found, 'obj':obj, 'namespace':ospace,
266 return {'found':found, 'obj':obj, 'namespace':ospace,
267 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
267 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
268
268
269 def arg_err(self,func):
269 def arg_err(self,func):
270 """Print docstring if incorrect arguments were passed"""
270 """Print docstring if incorrect arguments were passed"""
271 print 'Error in arguments:'
271 print 'Error in arguments:'
272 print OInspect.getdoc(func)
272 print OInspect.getdoc(func)
273
273
274 def format_latex(self,strng):
274 def format_latex(self,strng):
275 """Format a string for latex inclusion."""
275 """Format a string for latex inclusion."""
276
276
277 # Characters that need to be escaped for latex:
277 # Characters that need to be escaped for latex:
278 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
278 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
279 # Magic command names as headers:
279 # Magic command names as headers:
280 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
280 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
281 re.MULTILINE)
281 re.MULTILINE)
282 # Magic commands
282 # Magic commands
283 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
283 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
284 re.MULTILINE)
284 re.MULTILINE)
285 # Paragraph continue
285 # Paragraph continue
286 par_re = re.compile(r'\\$',re.MULTILINE)
286 par_re = re.compile(r'\\$',re.MULTILINE)
287
287
288 # The "\n" symbol
288 # The "\n" symbol
289 newline_re = re.compile(r'\\n')
289 newline_re = re.compile(r'\\n')
290
290
291 # Now build the string for output:
291 # Now build the string for output:
292 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
292 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
293 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
293 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
294 strng)
294 strng)
295 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
295 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
296 strng = par_re.sub(r'\\\\',strng)
296 strng = par_re.sub(r'\\\\',strng)
297 strng = escape_re.sub(r'\\\1',strng)
297 strng = escape_re.sub(r'\\\1',strng)
298 strng = newline_re.sub(r'\\textbackslash{}n',strng)
298 strng = newline_re.sub(r'\\textbackslash{}n',strng)
299 return strng
299 return strng
300
300
301 def format_screen(self,strng):
301 def format_screen(self,strng):
302 """Format a string for screen printing.
302 """Format a string for screen printing.
303
303
304 This removes some latex-type format codes."""
304 This removes some latex-type format codes."""
305 # Paragraph continue
305 # Paragraph continue
306 par_re = re.compile(r'\\$',re.MULTILINE)
306 par_re = re.compile(r'\\$',re.MULTILINE)
307 strng = par_re.sub('',strng)
307 strng = par_re.sub('',strng)
308 return strng
308 return strng
309
309
310 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
310 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
311 """Parse options passed to an argument string.
311 """Parse options passed to an argument string.
312
312
313 The interface is similar to that of getopt(), but it returns back a
313 The interface is similar to that of getopt(), but it returns back a
314 Struct with the options as keys and the stripped argument string still
314 Struct with the options as keys and the stripped argument string still
315 as a string.
315 as a string.
316
316
317 arg_str is quoted as a true sys.argv vector by using shlex.split.
317 arg_str is quoted as a true sys.argv vector by using shlex.split.
318 This allows us to easily expand variables, glob files, quote
318 This allows us to easily expand variables, glob files, quote
319 arguments, etc.
319 arguments, etc.
320
320
321 Options:
321 Options:
322 -mode: default 'string'. If given as 'list', the argument string is
322 -mode: default 'string'. If given as 'list', the argument string is
323 returned as a list (split on whitespace) instead of a string.
323 returned as a list (split on whitespace) instead of a string.
324
324
325 -list_all: put all option values in lists. Normally only options
325 -list_all: put all option values in lists. Normally only options
326 appearing more than once are put in a list.
326 appearing more than once are put in a list.
327
327
328 -posix (True): whether to split the input line in POSIX mode or not,
328 -posix (True): whether to split the input line in POSIX mode or not,
329 as per the conventions outlined in the shlex module from the
329 as per the conventions outlined in the shlex module from the
330 standard library."""
330 standard library."""
331
331
332 # inject default options at the beginning of the input line
332 # inject default options at the beginning of the input line
333 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
333 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
334 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
334 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
335
335
336 mode = kw.get('mode','string')
336 mode = kw.get('mode','string')
337 if mode not in ['string','list']:
337 if mode not in ['string','list']:
338 raise ValueError,'incorrect mode given: %s' % mode
338 raise ValueError,'incorrect mode given: %s' % mode
339 # Get options
339 # Get options
340 list_all = kw.get('list_all',0)
340 list_all = kw.get('list_all',0)
341 posix = kw.get('posix',True)
341 posix = kw.get('posix',True)
342
342
343 # Check if we have more than one argument to warrant extra processing:
343 # Check if we have more than one argument to warrant extra processing:
344 odict = {} # Dictionary with options
344 odict = {} # Dictionary with options
345 args = arg_str.split()
345 args = arg_str.split()
346 if len(args) >= 1:
346 if len(args) >= 1:
347 # If the list of inputs only has 0 or 1 thing in it, there's no
347 # If the list of inputs only has 0 or 1 thing in it, there's no
348 # need to look for options
348 # need to look for options
349 argv = arg_split(arg_str,posix)
349 argv = arg_split(arg_str,posix)
350 # Do regular option processing
350 # Do regular option processing
351 try:
351 try:
352 opts,args = getopt(argv,opt_str,*long_opts)
352 opts,args = getopt(argv,opt_str,*long_opts)
353 except GetoptError,e:
353 except GetoptError,e:
354 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
354 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
355 " ".join(long_opts)))
355 " ".join(long_opts)))
356 for o,a in opts:
356 for o,a in opts:
357 if o.startswith('--'):
357 if o.startswith('--'):
358 o = o[2:]
358 o = o[2:]
359 else:
359 else:
360 o = o[1:]
360 o = o[1:]
361 try:
361 try:
362 odict[o].append(a)
362 odict[o].append(a)
363 except AttributeError:
363 except AttributeError:
364 odict[o] = [odict[o],a]
364 odict[o] = [odict[o],a]
365 except KeyError:
365 except KeyError:
366 if list_all:
366 if list_all:
367 odict[o] = [a]
367 odict[o] = [a]
368 else:
368 else:
369 odict[o] = a
369 odict[o] = a
370
370
371 # Prepare opts,args for return
371 # Prepare opts,args for return
372 opts = Struct(odict)
372 opts = Struct(odict)
373 if mode == 'string':
373 if mode == 'string':
374 args = ' '.join(args)
374 args = ' '.join(args)
375
375
376 return opts,args
376 return opts,args
377
377
378 #......................................................................
378 #......................................................................
379 # And now the actual magic functions
379 # And now the actual magic functions
380
380
381 # Functions for IPython shell work (vars,funcs, config, etc)
381 # Functions for IPython shell work (vars,funcs, config, etc)
382 def magic_lsmagic(self, parameter_s = ''):
382 def magic_lsmagic(self, parameter_s = ''):
383 """List currently available magic functions."""
383 """List currently available magic functions."""
384 mesc = self.shell.ESC_MAGIC
384 mesc = self.shell.ESC_MAGIC
385 print 'Available magic functions:\n'+mesc+\
385 print 'Available magic functions:\n'+mesc+\
386 (' '+mesc).join(self.lsmagic())
386 (' '+mesc).join(self.lsmagic())
387 print '\n' + Magic.auto_status[self.shell.rc.automagic]
387 print '\n' + Magic.auto_status[self.shell.rc.automagic]
388 return None
388 return None
389
389
390 def magic_magic(self, parameter_s = ''):
390 def magic_magic(self, parameter_s = ''):
391 """Print information about the magic function system.
391 """Print information about the magic function system.
392
392
393 Supported formats: -latex, -brief, -rest
393 Supported formats: -latex, -brief, -rest
394 """
394 """
395
395
396 mode = ''
396 mode = ''
397 try:
397 try:
398 if parameter_s.split()[0] == '-latex':
398 if parameter_s.split()[0] == '-latex':
399 mode = 'latex'
399 mode = 'latex'
400 if parameter_s.split()[0] == '-brief':
400 if parameter_s.split()[0] == '-brief':
401 mode = 'brief'
401 mode = 'brief'
402 if parameter_s.split()[0] == '-rest':
402 if parameter_s.split()[0] == '-rest':
403 mode = 'rest'
403 mode = 'rest'
404 rest_docs = []
404 rest_docs = []
405 except:
405 except:
406 pass
406 pass
407
407
408 magic_docs = []
408 magic_docs = []
409 for fname in self.lsmagic():
409 for fname in self.lsmagic():
410 mname = 'magic_' + fname
410 mname = 'magic_' + fname
411 for space in (Magic,self,self.__class__):
411 for space in (Magic,self,self.__class__):
412 try:
412 try:
413 fn = space.__dict__[mname]
413 fn = space.__dict__[mname]
414 except KeyError:
414 except KeyError:
415 pass
415 pass
416 else:
416 else:
417 break
417 break
418 if mode == 'brief':
418 if mode == 'brief':
419 # only first line
419 # only first line
420 if fn.__doc__:
420 if fn.__doc__:
421 fndoc = fn.__doc__.split('\n',1)[0]
421 fndoc = fn.__doc__.split('\n',1)[0]
422 else:
422 else:
423 fndoc = 'No documentation'
423 fndoc = 'No documentation'
424 else:
424 else:
425 fndoc = fn.__doc__.rstrip()
425 fndoc = fn.__doc__.rstrip()
426
426
427 if mode == 'rest':
427 if mode == 'rest':
428 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(self.shell.ESC_MAGIC,
428 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(self.shell.ESC_MAGIC,
429 fname,fndoc))
429 fname,fndoc))
430
430
431 else:
431 else:
432 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
432 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
433 fname,fndoc))
433 fname,fndoc))
434
434
435 magic_docs = ''.join(magic_docs)
435 magic_docs = ''.join(magic_docs)
436
436
437 if mode == 'rest':
437 if mode == 'rest':
438 return "".join(rest_docs)
438 return "".join(rest_docs)
439
439
440 if mode == 'latex':
440 if mode == 'latex':
441 print self.format_latex(magic_docs)
441 print self.format_latex(magic_docs)
442 return
442 return
443 else:
443 else:
444 magic_docs = self.format_screen(magic_docs)
444 magic_docs = self.format_screen(magic_docs)
445 if mode == 'brief':
445 if mode == 'brief':
446 return magic_docs
446 return magic_docs
447
447
448 outmsg = """
448 outmsg = """
449 IPython's 'magic' functions
449 IPython's 'magic' functions
450 ===========================
450 ===========================
451
451
452 The magic function system provides a series of functions which allow you to
452 The magic function system provides a series of functions which allow you to
453 control the behavior of IPython itself, plus a lot of system-type
453 control the behavior of IPython itself, plus a lot of system-type
454 features. All these functions are prefixed with a % character, but parameters
454 features. All these functions are prefixed with a % character, but parameters
455 are given without parentheses or quotes.
455 are given without parentheses or quotes.
456
456
457 NOTE: If you have 'automagic' enabled (via the command line option or with the
457 NOTE: If you have 'automagic' enabled (via the command line option or with the
458 %automagic function), you don't need to type in the % explicitly. By default,
458 %automagic function), you don't need to type in the % explicitly. By default,
459 IPython ships with automagic on, so you should only rarely need the % escape.
459 IPython ships with automagic on, so you should only rarely need the % escape.
460
460
461 Example: typing '%cd mydir' (without the quotes) changes you working directory
461 Example: typing '%cd mydir' (without the quotes) changes you working directory
462 to 'mydir', if it exists.
462 to 'mydir', if it exists.
463
463
464 You can define your own magic functions to extend the system. See the supplied
464 You can define your own magic functions to extend the system. See the supplied
465 ipythonrc and example-magic.py files for details (in your ipython
465 ipythonrc and example-magic.py files for details (in your ipython
466 configuration directory, typically $HOME/.ipython/).
466 configuration directory, typically $HOME/.ipython/).
467
467
468 You can also define your own aliased names for magic functions. In your
468 You can also define your own aliased names for magic functions. In your
469 ipythonrc file, placing a line like:
469 ipythonrc file, placing a line like:
470
470
471 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
471 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
472
472
473 will define %pf as a new name for %profile.
473 will define %pf as a new name for %profile.
474
474
475 You can also call magics in code using the ipmagic() function, which IPython
475 You can also call magics in code using the ipmagic() function, which IPython
476 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
476 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
477
477
478 For a list of the available magic functions, use %lsmagic. For a description
478 For a list of the available magic functions, use %lsmagic. For a description
479 of any of them, type %magic_name?, e.g. '%cd?'.
479 of any of them, type %magic_name?, e.g. '%cd?'.
480
480
481 Currently the magic system has the following functions:\n"""
481 Currently the magic system has the following functions:\n"""
482
482
483 mesc = self.shell.ESC_MAGIC
483 mesc = self.shell.ESC_MAGIC
484 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
484 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
485 "\n\n%s%s\n\n%s" % (outmsg,
485 "\n\n%s%s\n\n%s" % (outmsg,
486 magic_docs,mesc,mesc,
486 magic_docs,mesc,mesc,
487 (' '+mesc).join(self.lsmagic()),
487 (' '+mesc).join(self.lsmagic()),
488 Magic.auto_status[self.shell.rc.automagic] ) )
488 Magic.auto_status[self.shell.rc.automagic] ) )
489
489
490 page(outmsg,screen_lines=self.shell.rc.screen_length)
490 page(outmsg,screen_lines=self.shell.rc.screen_length)
491
491
492
492
493 def magic_autoindent(self, parameter_s = ''):
493 def magic_autoindent(self, parameter_s = ''):
494 """Toggle autoindent on/off (if available)."""
494 """Toggle autoindent on/off (if available)."""
495
495
496 self.shell.set_autoindent()
496 self.shell.set_autoindent()
497 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
497 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
498
498
499
499
500 def magic_automagic(self, parameter_s = ''):
500 def magic_automagic(self, parameter_s = ''):
501 """Make magic functions callable without having to type the initial %.
501 """Make magic functions callable without having to type the initial %.
502
502
503 Without argumentsl toggles on/off (when off, you must call it as
503 Without argumentsl toggles on/off (when off, you must call it as
504 %automagic, of course). With arguments it sets the value, and you can
504 %automagic, of course). With arguments it sets the value, and you can
505 use any of (case insensitive):
505 use any of (case insensitive):
506
506
507 - on,1,True: to activate
507 - on,1,True: to activate
508
508
509 - off,0,False: to deactivate.
509 - off,0,False: to deactivate.
510
510
511 Note that magic functions have lowest priority, so if there's a
511 Note that magic functions have lowest priority, so if there's a
512 variable whose name collides with that of a magic fn, automagic won't
512 variable whose name collides with that of a magic fn, automagic won't
513 work for that function (you get the variable instead). However, if you
513 work for that function (you get the variable instead). However, if you
514 delete the variable (del var), the previously shadowed magic function
514 delete the variable (del var), the previously shadowed magic function
515 becomes visible to automagic again."""
515 becomes visible to automagic again."""
516
516
517 rc = self.shell.rc
517 rc = self.shell.rc
518 arg = parameter_s.lower()
518 arg = parameter_s.lower()
519 if parameter_s in ('on','1','true'):
519 if parameter_s in ('on','1','true'):
520 rc.automagic = True
520 rc.automagic = True
521 elif parameter_s in ('off','0','false'):
521 elif parameter_s in ('off','0','false'):
522 rc.automagic = False
522 rc.automagic = False
523 else:
523 else:
524 rc.automagic = not rc.automagic
524 rc.automagic = not rc.automagic
525 print '\n' + Magic.auto_status[rc.automagic]
525 print '\n' + Magic.auto_status[rc.automagic]
526
526
527 @testdec.skip_doctest
527 @testdec.skip_doctest
528 def magic_autocall(self, parameter_s = ''):
528 def magic_autocall(self, parameter_s = ''):
529 """Make functions callable without having to type parentheses.
529 """Make functions callable without having to type parentheses.
530
530
531 Usage:
531 Usage:
532
532
533 %autocall [mode]
533 %autocall [mode]
534
534
535 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
535 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
536 value is toggled on and off (remembering the previous state).
536 value is toggled on and off (remembering the previous state).
537
537
538 In more detail, these values mean:
538 In more detail, these values mean:
539
539
540 0 -> fully disabled
540 0 -> fully disabled
541
541
542 1 -> active, but do not apply if there are no arguments on the line.
542 1 -> active, but do not apply if there are no arguments on the line.
543
543
544 In this mode, you get:
544 In this mode, you get:
545
545
546 In [1]: callable
546 In [1]: callable
547 Out[1]: <built-in function callable>
547 Out[1]: <built-in function callable>
548
548
549 In [2]: callable 'hello'
549 In [2]: callable 'hello'
550 ------> callable('hello')
550 ------> callable('hello')
551 Out[2]: False
551 Out[2]: False
552
552
553 2 -> Active always. Even if no arguments are present, the callable
553 2 -> Active always. Even if no arguments are present, the callable
554 object is called:
554 object is called:
555
555
556 In [2]: float
556 In [2]: float
557 ------> float()
557 ------> float()
558 Out[2]: 0.0
558 Out[2]: 0.0
559
559
560 Note that even with autocall off, you can still use '/' at the start of
560 Note that even with autocall off, you can still use '/' at the start of
561 a line to treat the first argument on the command line as a function
561 a line to treat the first argument on the command line as a function
562 and add parentheses to it:
562 and add parentheses to it:
563
563
564 In [8]: /str 43
564 In [8]: /str 43
565 ------> str(43)
565 ------> str(43)
566 Out[8]: '43'
566 Out[8]: '43'
567
567
568 # all-random (note for auto-testing)
568 # all-random (note for auto-testing)
569 """
569 """
570
570
571 rc = self.shell.rc
571 rc = self.shell.rc
572
572
573 if parameter_s:
573 if parameter_s:
574 arg = int(parameter_s)
574 arg = int(parameter_s)
575 else:
575 else:
576 arg = 'toggle'
576 arg = 'toggle'
577
577
578 if not arg in (0,1,2,'toggle'):
578 if not arg in (0,1,2,'toggle'):
579 error('Valid modes: (0->Off, 1->Smart, 2->Full')
579 error('Valid modes: (0->Off, 1->Smart, 2->Full')
580 return
580 return
581
581
582 if arg in (0,1,2):
582 if arg in (0,1,2):
583 rc.autocall = arg
583 rc.autocall = arg
584 else: # toggle
584 else: # toggle
585 if rc.autocall:
585 if rc.autocall:
586 self._magic_state.autocall_save = rc.autocall
586 self._magic_state.autocall_save = rc.autocall
587 rc.autocall = 0
587 rc.autocall = 0
588 else:
588 else:
589 try:
589 try:
590 rc.autocall = self._magic_state.autocall_save
590 rc.autocall = self._magic_state.autocall_save
591 except AttributeError:
591 except AttributeError:
592 rc.autocall = self._magic_state.autocall_save = 1
592 rc.autocall = self._magic_state.autocall_save = 1
593
593
594 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
594 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
595
595
596 def magic_system_verbose(self, parameter_s = ''):
596 def magic_system_verbose(self, parameter_s = ''):
597 """Set verbose printing of system calls.
597 """Set verbose printing of system calls.
598
598
599 If called without an argument, act as a toggle"""
599 If called without an argument, act as a toggle"""
600
600
601 if parameter_s:
601 if parameter_s:
602 val = bool(eval(parameter_s))
602 val = bool(eval(parameter_s))
603 else:
603 else:
604 val = None
604 val = None
605
605
606 self.shell.rc_set_toggle('system_verbose',val)
606 self.shell.rc_set_toggle('system_verbose',val)
607 print "System verbose printing is:",\
607 print "System verbose printing is:",\
608 ['OFF','ON'][self.shell.rc.system_verbose]
608 ['OFF','ON'][self.shell.rc.system_verbose]
609
609
610
610
611 def magic_page(self, parameter_s=''):
611 def magic_page(self, parameter_s=''):
612 """Pretty print the object and display it through a pager.
612 """Pretty print the object and display it through a pager.
613
613
614 %page [options] OBJECT
614 %page [options] OBJECT
615
615
616 If no object is given, use _ (last output).
616 If no object is given, use _ (last output).
617
617
618 Options:
618 Options:
619
619
620 -r: page str(object), don't pretty-print it."""
620 -r: page str(object), don't pretty-print it."""
621
621
622 # After a function contributed by Olivier Aubert, slightly modified.
622 # After a function contributed by Olivier Aubert, slightly modified.
623
623
624 # Process options/args
624 # Process options/args
625 opts,args = self.parse_options(parameter_s,'r')
625 opts,args = self.parse_options(parameter_s,'r')
626 raw = 'r' in opts
626 raw = 'r' in opts
627
627
628 oname = args and args or '_'
628 oname = args and args or '_'
629 info = self._ofind(oname)
629 info = self._ofind(oname)
630 if info['found']:
630 if info['found']:
631 txt = (raw and str or pformat)( info['obj'] )
631 txt = (raw and str or pformat)( info['obj'] )
632 page(txt)
632 page(txt)
633 else:
633 else:
634 print 'Object `%s` not found' % oname
634 print 'Object `%s` not found' % oname
635
635
636 def magic_profile(self, parameter_s=''):
636 def magic_profile(self, parameter_s=''):
637 """Print your currently active IPyhton profile."""
637 """Print your currently active IPyhton profile."""
638 if self.shell.rc.profile:
638 if self.shell.rc.profile:
639 printpl('Current IPython profile: $self.shell.rc.profile.')
639 printpl('Current IPython profile: $self.shell.rc.profile.')
640 else:
640 else:
641 print 'No profile active.'
641 print 'No profile active.'
642
642
643 def magic_pinfo(self, parameter_s='', namespaces=None):
643 def magic_pinfo(self, parameter_s='', namespaces=None):
644 """Provide detailed information about an object.
644 """Provide detailed information about an object.
645
645
646 '%pinfo object' is just a synonym for object? or ?object."""
646 '%pinfo object' is just a synonym for object? or ?object."""
647
647
648 #print 'pinfo par: <%s>' % parameter_s # dbg
648 #print 'pinfo par: <%s>' % parameter_s # dbg
649
649
650
650
651 # detail_level: 0 -> obj? , 1 -> obj??
651 # detail_level: 0 -> obj? , 1 -> obj??
652 detail_level = 0
652 detail_level = 0
653 # We need to detect if we got called as 'pinfo pinfo foo', which can
653 # We need to detect if we got called as 'pinfo pinfo foo', which can
654 # happen if the user types 'pinfo foo?' at the cmd line.
654 # happen if the user types 'pinfo foo?' at the cmd line.
655 pinfo,qmark1,oname,qmark2 = \
655 pinfo,qmark1,oname,qmark2 = \
656 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
656 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
657 if pinfo or qmark1 or qmark2:
657 if pinfo or qmark1 or qmark2:
658 detail_level = 1
658 detail_level = 1
659 if "*" in oname:
659 if "*" in oname:
660 self.magic_psearch(oname)
660 self.magic_psearch(oname)
661 else:
661 else:
662 self._inspect('pinfo', oname, detail_level=detail_level,
662 self._inspect('pinfo', oname, detail_level=detail_level,
663 namespaces=namespaces)
663 namespaces=namespaces)
664
664
665 def magic_pdef(self, parameter_s='', namespaces=None):
665 def magic_pdef(self, parameter_s='', namespaces=None):
666 """Print the definition header for any callable object.
666 """Print the definition header for any callable object.
667
667
668 If the object is a class, print the constructor information."""
668 If the object is a class, print the constructor information."""
669 self._inspect('pdef',parameter_s, namespaces)
669 self._inspect('pdef',parameter_s, namespaces)
670
670
671 def magic_pdoc(self, parameter_s='', namespaces=None):
671 def magic_pdoc(self, parameter_s='', namespaces=None):
672 """Print the docstring for an object.
672 """Print the docstring for an object.
673
673
674 If the given object is a class, it will print both the class and the
674 If the given object is a class, it will print both the class and the
675 constructor docstrings."""
675 constructor docstrings."""
676 self._inspect('pdoc',parameter_s, namespaces)
676 self._inspect('pdoc',parameter_s, namespaces)
677
677
678 def magic_psource(self, parameter_s='', namespaces=None):
678 def magic_psource(self, parameter_s='', namespaces=None):
679 """Print (or run through pager) the source code for an object."""
679 """Print (or run through pager) the source code for an object."""
680 self._inspect('psource',parameter_s, namespaces)
680 self._inspect('psource',parameter_s, namespaces)
681
681
682 def magic_pfile(self, parameter_s=''):
682 def magic_pfile(self, parameter_s=''):
683 """Print (or run through pager) the file where an object is defined.
683 """Print (or run through pager) the file where an object is defined.
684
684
685 The file opens at the line where the object definition begins. IPython
685 The file opens at the line where the object definition begins. IPython
686 will honor the environment variable PAGER if set, and otherwise will
686 will honor the environment variable PAGER if set, and otherwise will
687 do its best to print the file in a convenient form.
687 do its best to print the file in a convenient form.
688
688
689 If the given argument is not an object currently defined, IPython will
689 If the given argument is not an object currently defined, IPython will
690 try to interpret it as a filename (automatically adding a .py extension
690 try to interpret it as a filename (automatically adding a .py extension
691 if needed). You can thus use %pfile as a syntax highlighting code
691 if needed). You can thus use %pfile as a syntax highlighting code
692 viewer."""
692 viewer."""
693
693
694 # first interpret argument as an object name
694 # first interpret argument as an object name
695 out = self._inspect('pfile',parameter_s)
695 out = self._inspect('pfile',parameter_s)
696 # if not, try the input as a filename
696 # if not, try the input as a filename
697 if out == 'not found':
697 if out == 'not found':
698 try:
698 try:
699 filename = get_py_filename(parameter_s)
699 filename = get_py_filename(parameter_s)
700 except IOError,msg:
700 except IOError,msg:
701 print msg
701 print msg
702 return
702 return
703 page(self.shell.inspector.format(file(filename).read()))
703 page(self.shell.inspector.format(file(filename).read()))
704
704
705 def _inspect(self,meth,oname,namespaces=None,**kw):
705 def _inspect(self,meth,oname,namespaces=None,**kw):
706 """Generic interface to the inspector system.
706 """Generic interface to the inspector system.
707
707
708 This function is meant to be called by pdef, pdoc & friends."""
708 This function is meant to be called by pdef, pdoc & friends."""
709
709
710 #oname = oname.strip()
710 #oname = oname.strip()
711 #print '1- oname: <%r>' % oname # dbg
711 #print '1- oname: <%r>' % oname # dbg
712 try:
712 try:
713 oname = oname.strip().encode('ascii')
713 oname = oname.strip().encode('ascii')
714 #print '2- oname: <%r>' % oname # dbg
714 #print '2- oname: <%r>' % oname # dbg
715 except UnicodeEncodeError:
715 except UnicodeEncodeError:
716 print 'Python identifiers can only contain ascii characters.'
716 print 'Python identifiers can only contain ascii characters.'
717 return 'not found'
717 return 'not found'
718
718
719 info = Struct(self._ofind(oname, namespaces))
719 info = Struct(self._ofind(oname, namespaces))
720
720
721 if info.found:
721 if info.found:
722 try:
722 try:
723 IPython.generics.inspect_object(info.obj)
723 IPython.generics.inspect_object(info.obj)
724 return
724 return
725 except IPython.ipapi.TryNext:
725 except IPython.ipapi.TryNext:
726 pass
726 pass
727 # Get the docstring of the class property if it exists.
727 # Get the docstring of the class property if it exists.
728 path = oname.split('.')
728 path = oname.split('.')
729 root = '.'.join(path[:-1])
729 root = '.'.join(path[:-1])
730 if info.parent is not None:
730 if info.parent is not None:
731 try:
731 try:
732 target = getattr(info.parent, '__class__')
732 target = getattr(info.parent, '__class__')
733 # The object belongs to a class instance.
733 # The object belongs to a class instance.
734 try:
734 try:
735 target = getattr(target, path[-1])
735 target = getattr(target, path[-1])
736 # The class defines the object.
736 # The class defines the object.
737 if isinstance(target, property):
737 if isinstance(target, property):
738 oname = root + '.__class__.' + path[-1]
738 oname = root + '.__class__.' + path[-1]
739 info = Struct(self._ofind(oname))
739 info = Struct(self._ofind(oname))
740 except AttributeError: pass
740 except AttributeError: pass
741 except AttributeError: pass
741 except AttributeError: pass
742
742
743 pmethod = getattr(self.shell.inspector,meth)
743 pmethod = getattr(self.shell.inspector,meth)
744 formatter = info.ismagic and self.format_screen or None
744 formatter = info.ismagic and self.format_screen or None
745 if meth == 'pdoc':
745 if meth == 'pdoc':
746 pmethod(info.obj,oname,formatter)
746 pmethod(info.obj,oname,formatter)
747 elif meth == 'pinfo':
747 elif meth == 'pinfo':
748 pmethod(info.obj,oname,formatter,info,**kw)
748 pmethod(info.obj,oname,formatter,info,**kw)
749 else:
749 else:
750 pmethod(info.obj,oname)
750 pmethod(info.obj,oname)
751 else:
751 else:
752 print 'Object `%s` not found.' % oname
752 print 'Object `%s` not found.' % oname
753 return 'not found' # so callers can take other action
753 return 'not found' # so callers can take other action
754
754
755 def magic_psearch(self, parameter_s=''):
755 def magic_psearch(self, parameter_s=''):
756 """Search for object in namespaces by wildcard.
756 """Search for object in namespaces by wildcard.
757
757
758 %psearch [options] PATTERN [OBJECT TYPE]
758 %psearch [options] PATTERN [OBJECT TYPE]
759
759
760 Note: ? can be used as a synonym for %psearch, at the beginning or at
760 Note: ? can be used as a synonym for %psearch, at the beginning or at
761 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
761 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
762 rest of the command line must be unchanged (options come first), so
762 rest of the command line must be unchanged (options come first), so
763 for example the following forms are equivalent
763 for example the following forms are equivalent
764
764
765 %psearch -i a* function
765 %psearch -i a* function
766 -i a* function?
766 -i a* function?
767 ?-i a* function
767 ?-i a* function
768
768
769 Arguments:
769 Arguments:
770
770
771 PATTERN
771 PATTERN
772
772
773 where PATTERN is a string containing * as a wildcard similar to its
773 where PATTERN is a string containing * as a wildcard similar to its
774 use in a shell. The pattern is matched in all namespaces on the
774 use in a shell. The pattern is matched in all namespaces on the
775 search path. By default objects starting with a single _ are not
775 search path. By default objects starting with a single _ are not
776 matched, many IPython generated objects have a single
776 matched, many IPython generated objects have a single
777 underscore. The default is case insensitive matching. Matching is
777 underscore. The default is case insensitive matching. Matching is
778 also done on the attributes of objects and not only on the objects
778 also done on the attributes of objects and not only on the objects
779 in a module.
779 in a module.
780
780
781 [OBJECT TYPE]
781 [OBJECT TYPE]
782
782
783 Is the name of a python type from the types module. The name is
783 Is the name of a python type from the types module. The name is
784 given in lowercase without the ending type, ex. StringType is
784 given in lowercase without the ending type, ex. StringType is
785 written string. By adding a type here only objects matching the
785 written string. By adding a type here only objects matching the
786 given type are matched. Using all here makes the pattern match all
786 given type are matched. Using all here makes the pattern match all
787 types (this is the default).
787 types (this is the default).
788
788
789 Options:
789 Options:
790
790
791 -a: makes the pattern match even objects whose names start with a
791 -a: makes the pattern match even objects whose names start with a
792 single underscore. These names are normally ommitted from the
792 single underscore. These names are normally ommitted from the
793 search.
793 search.
794
794
795 -i/-c: make the pattern case insensitive/sensitive. If neither of
795 -i/-c: make the pattern case insensitive/sensitive. If neither of
796 these options is given, the default is read from your ipythonrc
796 these options is given, the default is read from your ipythonrc
797 file. The option name which sets this value is
797 file. The option name which sets this value is
798 'wildcards_case_sensitive'. If this option is not specified in your
798 'wildcards_case_sensitive'. If this option is not specified in your
799 ipythonrc file, IPython's internal default is to do a case sensitive
799 ipythonrc file, IPython's internal default is to do a case sensitive
800 search.
800 search.
801
801
802 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
802 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
803 specifiy can be searched in any of the following namespaces:
803 specifiy can be searched in any of the following namespaces:
804 'builtin', 'user', 'user_global','internal', 'alias', where
804 'builtin', 'user', 'user_global','internal', 'alias', where
805 'builtin' and 'user' are the search defaults. Note that you should
805 'builtin' and 'user' are the search defaults. Note that you should
806 not use quotes when specifying namespaces.
806 not use quotes when specifying namespaces.
807
807
808 'Builtin' contains the python module builtin, 'user' contains all
808 'Builtin' contains the python module builtin, 'user' contains all
809 user data, 'alias' only contain the shell aliases and no python
809 user data, 'alias' only contain the shell aliases and no python
810 objects, 'internal' contains objects used by IPython. The
810 objects, 'internal' contains objects used by IPython. The
811 'user_global' namespace is only used by embedded IPython instances,
811 'user_global' namespace is only used by embedded IPython instances,
812 and it contains module-level globals. You can add namespaces to the
812 and it contains module-level globals. You can add namespaces to the
813 search with -s or exclude them with -e (these options can be given
813 search with -s or exclude them with -e (these options can be given
814 more than once).
814 more than once).
815
815
816 Examples:
816 Examples:
817
817
818 %psearch a* -> objects beginning with an a
818 %psearch a* -> objects beginning with an a
819 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
819 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
820 %psearch a* function -> all functions beginning with an a
820 %psearch a* function -> all functions beginning with an a
821 %psearch re.e* -> objects beginning with an e in module re
821 %psearch re.e* -> objects beginning with an e in module re
822 %psearch r*.e* -> objects that start with e in modules starting in r
822 %psearch r*.e* -> objects that start with e in modules starting in r
823 %psearch r*.* string -> all strings in modules beginning with r
823 %psearch r*.* string -> all strings in modules beginning with r
824
824
825 Case sensitve search:
825 Case sensitve search:
826
826
827 %psearch -c a* list all object beginning with lower case a
827 %psearch -c a* list all object beginning with lower case a
828
828
829 Show objects beginning with a single _:
829 Show objects beginning with a single _:
830
830
831 %psearch -a _* list objects beginning with a single underscore"""
831 %psearch -a _* list objects beginning with a single underscore"""
832 try:
832 try:
833 parameter_s = parameter_s.encode('ascii')
833 parameter_s = parameter_s.encode('ascii')
834 except UnicodeEncodeError:
834 except UnicodeEncodeError:
835 print 'Python identifiers can only contain ascii characters.'
835 print 'Python identifiers can only contain ascii characters.'
836 return
836 return
837
837
838 # default namespaces to be searched
838 # default namespaces to be searched
839 def_search = ['user','builtin']
839 def_search = ['user','builtin']
840
840
841 # Process options/args
841 # Process options/args
842 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
842 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
843 opt = opts.get
843 opt = opts.get
844 shell = self.shell
844 shell = self.shell
845 psearch = shell.inspector.psearch
845 psearch = shell.inspector.psearch
846
846
847 # select case options
847 # select case options
848 if opts.has_key('i'):
848 if opts.has_key('i'):
849 ignore_case = True
849 ignore_case = True
850 elif opts.has_key('c'):
850 elif opts.has_key('c'):
851 ignore_case = False
851 ignore_case = False
852 else:
852 else:
853 ignore_case = not shell.rc.wildcards_case_sensitive
853 ignore_case = not shell.rc.wildcards_case_sensitive
854
854
855 # Build list of namespaces to search from user options
855 # Build list of namespaces to search from user options
856 def_search.extend(opt('s',[]))
856 def_search.extend(opt('s',[]))
857 ns_exclude = ns_exclude=opt('e',[])
857 ns_exclude = ns_exclude=opt('e',[])
858 ns_search = [nm for nm in def_search if nm not in ns_exclude]
858 ns_search = [nm for nm in def_search if nm not in ns_exclude]
859
859
860 # Call the actual search
860 # Call the actual search
861 try:
861 try:
862 psearch(args,shell.ns_table,ns_search,
862 psearch(args,shell.ns_table,ns_search,
863 show_all=opt('a'),ignore_case=ignore_case)
863 show_all=opt('a'),ignore_case=ignore_case)
864 except:
864 except:
865 shell.showtraceback()
865 shell.showtraceback()
866
866
867 def magic_who_ls(self, parameter_s=''):
867 def magic_who_ls(self, parameter_s=''):
868 """Return a sorted list of all interactive variables.
868 """Return a sorted list of all interactive variables.
869
869
870 If arguments are given, only variables of types matching these
870 If arguments are given, only variables of types matching these
871 arguments are returned."""
871 arguments are returned."""
872
872
873 user_ns = self.shell.user_ns
873 user_ns = self.shell.user_ns
874 internal_ns = self.shell.internal_ns
874 internal_ns = self.shell.internal_ns
875 user_config_ns = self.shell.user_config_ns
875 user_config_ns = self.shell.user_config_ns
876 out = []
876 out = []
877 typelist = parameter_s.split()
877 typelist = parameter_s.split()
878
878
879 for i in user_ns:
879 for i in user_ns:
880 if not (i.startswith('_') or i.startswith('_i')) \
880 if not (i.startswith('_') or i.startswith('_i')) \
881 and not (i in internal_ns or i in user_config_ns):
881 and not (i in internal_ns or i in user_config_ns):
882 if typelist:
882 if typelist:
883 if type(user_ns[i]).__name__ in typelist:
883 if type(user_ns[i]).__name__ in typelist:
884 out.append(i)
884 out.append(i)
885 else:
885 else:
886 out.append(i)
886 out.append(i)
887 out.sort()
887 out.sort()
888 return out
888 return out
889
889
890 def magic_who(self, parameter_s=''):
890 def magic_who(self, parameter_s=''):
891 """Print all interactive variables, with some minimal formatting.
891 """Print all interactive variables, with some minimal formatting.
892
892
893 If any arguments are given, only variables whose type matches one of
893 If any arguments are given, only variables whose type matches one of
894 these are printed. For example:
894 these are printed. For example:
895
895
896 %who function str
896 %who function str
897
897
898 will only list functions and strings, excluding all other types of
898 will only list functions and strings, excluding all other types of
899 variables. To find the proper type names, simply use type(var) at a
899 variables. To find the proper type names, simply use type(var) at a
900 command line to see how python prints type names. For example:
900 command line to see how python prints type names. For example:
901
901
902 In [1]: type('hello')\\
902 In [1]: type('hello')\\
903 Out[1]: <type 'str'>
903 Out[1]: <type 'str'>
904
904
905 indicates that the type name for strings is 'str'.
905 indicates that the type name for strings is 'str'.
906
906
907 %who always excludes executed names loaded through your configuration
907 %who always excludes executed names loaded through your configuration
908 file and things which are internal to IPython.
908 file and things which are internal to IPython.
909
909
910 This is deliberate, as typically you may load many modules and the
910 This is deliberate, as typically you may load many modules and the
911 purpose of %who is to show you only what you've manually defined."""
911 purpose of %who is to show you only what you've manually defined."""
912
912
913 varlist = self.magic_who_ls(parameter_s)
913 varlist = self.magic_who_ls(parameter_s)
914 if not varlist:
914 if not varlist:
915 if parameter_s:
915 if parameter_s:
916 print 'No variables match your requested type.'
916 print 'No variables match your requested type.'
917 else:
917 else:
918 print 'Interactive namespace is empty.'
918 print 'Interactive namespace is empty.'
919 return
919 return
920
920
921 # if we have variables, move on...
921 # if we have variables, move on...
922 count = 0
922 count = 0
923 for i in varlist:
923 for i in varlist:
924 print i+'\t',
924 print i+'\t',
925 count += 1
925 count += 1
926 if count > 8:
926 if count > 8:
927 count = 0
927 count = 0
928 print
928 print
929 print
929 print
930
930
931 def magic_whos(self, parameter_s=''):
931 def magic_whos(self, parameter_s=''):
932 """Like %who, but gives some extra information about each variable.
932 """Like %who, but gives some extra information about each variable.
933
933
934 The same type filtering of %who can be applied here.
934 The same type filtering of %who can be applied here.
935
935
936 For all variables, the type is printed. Additionally it prints:
936 For all variables, the type is printed. Additionally it prints:
937
937
938 - For {},[],(): their length.
938 - For {},[],(): their length.
939
939
940 - For numpy and Numeric arrays, a summary with shape, number of
940 - For numpy and Numeric arrays, a summary with shape, number of
941 elements, typecode and size in memory.
941 elements, typecode and size in memory.
942
942
943 - Everything else: a string representation, snipping their middle if
943 - Everything else: a string representation, snipping their middle if
944 too long."""
944 too long."""
945
945
946 varnames = self.magic_who_ls(parameter_s)
946 varnames = self.magic_who_ls(parameter_s)
947 if not varnames:
947 if not varnames:
948 if parameter_s:
948 if parameter_s:
949 print 'No variables match your requested type.'
949 print 'No variables match your requested type.'
950 else:
950 else:
951 print 'Interactive namespace is empty.'
951 print 'Interactive namespace is empty.'
952 return
952 return
953
953
954 # if we have variables, move on...
954 # if we have variables, move on...
955
955
956 # for these types, show len() instead of data:
956 # for these types, show len() instead of data:
957 seq_types = [types.DictType,types.ListType,types.TupleType]
957 seq_types = [types.DictType,types.ListType,types.TupleType]
958
958
959 # for numpy/Numeric arrays, display summary info
959 # for numpy/Numeric arrays, display summary info
960 try:
960 try:
961 import numpy
961 import numpy
962 except ImportError:
962 except ImportError:
963 ndarray_type = None
963 ndarray_type = None
964 else:
964 else:
965 ndarray_type = numpy.ndarray.__name__
965 ndarray_type = numpy.ndarray.__name__
966 try:
966 try:
967 import Numeric
967 import Numeric
968 except ImportError:
968 except ImportError:
969 array_type = None
969 array_type = None
970 else:
970 else:
971 array_type = Numeric.ArrayType.__name__
971 array_type = Numeric.ArrayType.__name__
972
972
973 # Find all variable names and types so we can figure out column sizes
973 # Find all variable names and types so we can figure out column sizes
974 def get_vars(i):
974 def get_vars(i):
975 return self.shell.user_ns[i]
975 return self.shell.user_ns[i]
976
976
977 # some types are well known and can be shorter
977 # some types are well known and can be shorter
978 abbrevs = {'IPython.macro.Macro' : 'Macro'}
978 abbrevs = {'IPython.macro.Macro' : 'Macro'}
979 def type_name(v):
979 def type_name(v):
980 tn = type(v).__name__
980 tn = type(v).__name__
981 return abbrevs.get(tn,tn)
981 return abbrevs.get(tn,tn)
982
982
983 varlist = map(get_vars,varnames)
983 varlist = map(get_vars,varnames)
984
984
985 typelist = []
985 typelist = []
986 for vv in varlist:
986 for vv in varlist:
987 tt = type_name(vv)
987 tt = type_name(vv)
988
988
989 if tt=='instance':
989 if tt=='instance':
990 typelist.append( abbrevs.get(str(vv.__class__),
990 typelist.append( abbrevs.get(str(vv.__class__),
991 str(vv.__class__)))
991 str(vv.__class__)))
992 else:
992 else:
993 typelist.append(tt)
993 typelist.append(tt)
994
994
995 # column labels and # of spaces as separator
995 # column labels and # of spaces as separator
996 varlabel = 'Variable'
996 varlabel = 'Variable'
997 typelabel = 'Type'
997 typelabel = 'Type'
998 datalabel = 'Data/Info'
998 datalabel = 'Data/Info'
999 colsep = 3
999 colsep = 3
1000 # variable format strings
1000 # variable format strings
1001 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1001 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1002 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1002 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1003 aformat = "%s: %s elems, type `%s`, %s bytes"
1003 aformat = "%s: %s elems, type `%s`, %s bytes"
1004 # find the size of the columns to format the output nicely
1004 # find the size of the columns to format the output nicely
1005 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1005 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1006 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1006 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1007 # table header
1007 # table header
1008 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1008 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1009 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1009 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1010 # and the table itself
1010 # and the table itself
1011 kb = 1024
1011 kb = 1024
1012 Mb = 1048576 # kb**2
1012 Mb = 1048576 # kb**2
1013 for vname,var,vtype in zip(varnames,varlist,typelist):
1013 for vname,var,vtype in zip(varnames,varlist,typelist):
1014 print itpl(vformat),
1014 print itpl(vformat),
1015 if vtype in seq_types:
1015 if vtype in seq_types:
1016 print len(var)
1016 print len(var)
1017 elif vtype in [array_type,ndarray_type]:
1017 elif vtype in [array_type,ndarray_type]:
1018 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1018 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1019 if vtype==ndarray_type:
1019 if vtype==ndarray_type:
1020 # numpy
1020 # numpy
1021 vsize = var.size
1021 vsize = var.size
1022 vbytes = vsize*var.itemsize
1022 vbytes = vsize*var.itemsize
1023 vdtype = var.dtype
1023 vdtype = var.dtype
1024 else:
1024 else:
1025 # Numeric
1025 # Numeric
1026 vsize = Numeric.size(var)
1026 vsize = Numeric.size(var)
1027 vbytes = vsize*var.itemsize()
1027 vbytes = vsize*var.itemsize()
1028 vdtype = var.typecode()
1028 vdtype = var.typecode()
1029
1029
1030 if vbytes < 100000:
1030 if vbytes < 100000:
1031 print aformat % (vshape,vsize,vdtype,vbytes)
1031 print aformat % (vshape,vsize,vdtype,vbytes)
1032 else:
1032 else:
1033 print aformat % (vshape,vsize,vdtype,vbytes),
1033 print aformat % (vshape,vsize,vdtype,vbytes),
1034 if vbytes < Mb:
1034 if vbytes < Mb:
1035 print '(%s kb)' % (vbytes/kb,)
1035 print '(%s kb)' % (vbytes/kb,)
1036 else:
1036 else:
1037 print '(%s Mb)' % (vbytes/Mb,)
1037 print '(%s Mb)' % (vbytes/Mb,)
1038 else:
1038 else:
1039 try:
1039 try:
1040 vstr = str(var)
1040 vstr = str(var)
1041 except UnicodeEncodeError:
1041 except UnicodeEncodeError:
1042 vstr = unicode(var).encode(sys.getdefaultencoding(),
1042 vstr = unicode(var).encode(sys.getdefaultencoding(),
1043 'backslashreplace')
1043 'backslashreplace')
1044 vstr = vstr.replace('\n','\\n')
1044 vstr = vstr.replace('\n','\\n')
1045 if len(vstr) < 50:
1045 if len(vstr) < 50:
1046 print vstr
1046 print vstr
1047 else:
1047 else:
1048 printpl(vfmt_short)
1048 printpl(vfmt_short)
1049
1049
1050 def magic_reset(self, parameter_s=''):
1050 def magic_reset(self, parameter_s=''):
1051 """Resets the namespace by removing all names defined by the user.
1051 """Resets the namespace by removing all names defined by the user.
1052
1052
1053 Input/Output history are left around in case you need them."""
1053 Input/Output history are left around in case you need them."""
1054
1054
1055 ans = self.shell.ask_yes_no(
1055 ans = self.shell.ask_yes_no(
1056 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1056 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1057 if not ans:
1057 if not ans:
1058 print 'Nothing done.'
1058 print 'Nothing done.'
1059 return
1059 return
1060 user_ns = self.shell.user_ns
1060 user_ns = self.shell.user_ns
1061 for i in self.magic_who_ls():
1061 for i in self.magic_who_ls():
1062 del(user_ns[i])
1062 del(user_ns[i])
1063
1063
1064 # Also flush the private list of module references kept for script
1064 # Also flush the private list of module references kept for script
1065 # execution protection
1065 # execution protection
1066 self.shell._user_main_modules[:] = []
1066 self.shell._user_main_modules[:] = []
1067
1067
1068 def magic_logstart(self,parameter_s=''):
1068 def magic_logstart(self,parameter_s=''):
1069 """Start logging anywhere in a session.
1069 """Start logging anywhere in a session.
1070
1070
1071 %logstart [-o|-r|-t] [log_name [log_mode]]
1071 %logstart [-o|-r|-t] [log_name [log_mode]]
1072
1072
1073 If no name is given, it defaults to a file named 'ipython_log.py' in your
1073 If no name is given, it defaults to a file named 'ipython_log.py' in your
1074 current directory, in 'rotate' mode (see below).
1074 current directory, in 'rotate' mode (see below).
1075
1075
1076 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1076 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1077 history up to that point and then continues logging.
1077 history up to that point and then continues logging.
1078
1078
1079 %logstart takes a second optional parameter: logging mode. This can be one
1079 %logstart takes a second optional parameter: logging mode. This can be one
1080 of (note that the modes are given unquoted):\\
1080 of (note that the modes are given unquoted):\\
1081 append: well, that says it.\\
1081 append: well, that says it.\\
1082 backup: rename (if exists) to name~ and start name.\\
1082 backup: rename (if exists) to name~ and start name.\\
1083 global: single logfile in your home dir, appended to.\\
1083 global: single logfile in your home dir, appended to.\\
1084 over : overwrite existing log.\\
1084 over : overwrite existing log.\\
1085 rotate: create rotating logs name.1~, name.2~, etc.
1085 rotate: create rotating logs name.1~, name.2~, etc.
1086
1086
1087 Options:
1087 Options:
1088
1088
1089 -o: log also IPython's output. In this mode, all commands which
1089 -o: log also IPython's output. In this mode, all commands which
1090 generate an Out[NN] prompt are recorded to the logfile, right after
1090 generate an Out[NN] prompt are recorded to the logfile, right after
1091 their corresponding input line. The output lines are always
1091 their corresponding input line. The output lines are always
1092 prepended with a '#[Out]# ' marker, so that the log remains valid
1092 prepended with a '#[Out]# ' marker, so that the log remains valid
1093 Python code.
1093 Python code.
1094
1094
1095 Since this marker is always the same, filtering only the output from
1095 Since this marker is always the same, filtering only the output from
1096 a log is very easy, using for example a simple awk call:
1096 a log is very easy, using for example a simple awk call:
1097
1097
1098 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1098 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1099
1099
1100 -r: log 'raw' input. Normally, IPython's logs contain the processed
1100 -r: log 'raw' input. Normally, IPython's logs contain the processed
1101 input, so that user lines are logged in their final form, converted
1101 input, so that user lines are logged in their final form, converted
1102 into valid Python. For example, %Exit is logged as
1102 into valid Python. For example, %Exit is logged as
1103 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1103 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1104 exactly as typed, with no transformations applied.
1104 exactly as typed, with no transformations applied.
1105
1105
1106 -t: put timestamps before each input line logged (these are put in
1106 -t: put timestamps before each input line logged (these are put in
1107 comments)."""
1107 comments)."""
1108
1108
1109 opts,par = self.parse_options(parameter_s,'ort')
1109 opts,par = self.parse_options(parameter_s,'ort')
1110 log_output = 'o' in opts
1110 log_output = 'o' in opts
1111 log_raw_input = 'r' in opts
1111 log_raw_input = 'r' in opts
1112 timestamp = 't' in opts
1112 timestamp = 't' in opts
1113
1113
1114 rc = self.shell.rc
1114 rc = self.shell.rc
1115 logger = self.shell.logger
1115 logger = self.shell.logger
1116
1116
1117 # if no args are given, the defaults set in the logger constructor by
1117 # if no args are given, the defaults set in the logger constructor by
1118 # ipytohn remain valid
1118 # ipytohn remain valid
1119 if par:
1119 if par:
1120 try:
1120 try:
1121 logfname,logmode = par.split()
1121 logfname,logmode = par.split()
1122 except:
1122 except:
1123 logfname = par
1123 logfname = par
1124 logmode = 'backup'
1124 logmode = 'backup'
1125 else:
1125 else:
1126 logfname = logger.logfname
1126 logfname = logger.logfname
1127 logmode = logger.logmode
1127 logmode = logger.logmode
1128 # put logfname into rc struct as if it had been called on the command
1128 # put logfname into rc struct as if it had been called on the command
1129 # line, so it ends up saved in the log header Save it in case we need
1129 # line, so it ends up saved in the log header Save it in case we need
1130 # to restore it...
1130 # to restore it...
1131 old_logfile = rc.opts.get('logfile','')
1131 old_logfile = rc.opts.get('logfile','')
1132 if logfname:
1132 if logfname:
1133 logfname = os.path.expanduser(logfname)
1133 logfname = os.path.expanduser(logfname)
1134 rc.opts.logfile = logfname
1134 rc.opts.logfile = logfname
1135 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1135 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1136 try:
1136 try:
1137 started = logger.logstart(logfname,loghead,logmode,
1137 started = logger.logstart(logfname,loghead,logmode,
1138 log_output,timestamp,log_raw_input)
1138 log_output,timestamp,log_raw_input)
1139 except:
1139 except:
1140 rc.opts.logfile = old_logfile
1140 rc.opts.logfile = old_logfile
1141 warn("Couldn't start log: %s" % sys.exc_info()[1])
1141 warn("Couldn't start log: %s" % sys.exc_info()[1])
1142 else:
1142 else:
1143 # log input history up to this point, optionally interleaving
1143 # log input history up to this point, optionally interleaving
1144 # output if requested
1144 # output if requested
1145
1145
1146 if timestamp:
1146 if timestamp:
1147 # disable timestamping for the previous history, since we've
1147 # disable timestamping for the previous history, since we've
1148 # lost those already (no time machine here).
1148 # lost those already (no time machine here).
1149 logger.timestamp = False
1149 logger.timestamp = False
1150
1150
1151 if log_raw_input:
1151 if log_raw_input:
1152 input_hist = self.shell.input_hist_raw
1152 input_hist = self.shell.input_hist_raw
1153 else:
1153 else:
1154 input_hist = self.shell.input_hist
1154 input_hist = self.shell.input_hist
1155
1155
1156 if log_output:
1156 if log_output:
1157 log_write = logger.log_write
1157 log_write = logger.log_write
1158 output_hist = self.shell.output_hist
1158 output_hist = self.shell.output_hist
1159 for n in range(1,len(input_hist)-1):
1159 for n in range(1,len(input_hist)-1):
1160 log_write(input_hist[n].rstrip())
1160 log_write(input_hist[n].rstrip())
1161 if n in output_hist:
1161 if n in output_hist:
1162 log_write(repr(output_hist[n]),'output')
1162 log_write(repr(output_hist[n]),'output')
1163 else:
1163 else:
1164 logger.log_write(input_hist[1:])
1164 logger.log_write(input_hist[1:])
1165 if timestamp:
1165 if timestamp:
1166 # re-enable timestamping
1166 # re-enable timestamping
1167 logger.timestamp = True
1167 logger.timestamp = True
1168
1168
1169 print ('Activating auto-logging. '
1169 print ('Activating auto-logging. '
1170 'Current session state plus future input saved.')
1170 'Current session state plus future input saved.')
1171 logger.logstate()
1171 logger.logstate()
1172
1172
1173 def magic_logstop(self,parameter_s=''):
1173 def magic_logstop(self,parameter_s=''):
1174 """Fully stop logging and close log file.
1174 """Fully stop logging and close log file.
1175
1175
1176 In order to start logging again, a new %logstart call needs to be made,
1176 In order to start logging again, a new %logstart call needs to be made,
1177 possibly (though not necessarily) with a new filename, mode and other
1177 possibly (though not necessarily) with a new filename, mode and other
1178 options."""
1178 options."""
1179 self.logger.logstop()
1179 self.logger.logstop()
1180
1180
1181 def magic_logoff(self,parameter_s=''):
1181 def magic_logoff(self,parameter_s=''):
1182 """Temporarily stop logging.
1182 """Temporarily stop logging.
1183
1183
1184 You must have previously started logging."""
1184 You must have previously started logging."""
1185 self.shell.logger.switch_log(0)
1185 self.shell.logger.switch_log(0)
1186
1186
1187 def magic_logon(self,parameter_s=''):
1187 def magic_logon(self,parameter_s=''):
1188 """Restart logging.
1188 """Restart logging.
1189
1189
1190 This function is for restarting logging which you've temporarily
1190 This function is for restarting logging which you've temporarily
1191 stopped with %logoff. For starting logging for the first time, you
1191 stopped with %logoff. For starting logging for the first time, you
1192 must use the %logstart function, which allows you to specify an
1192 must use the %logstart function, which allows you to specify an
1193 optional log filename."""
1193 optional log filename."""
1194
1194
1195 self.shell.logger.switch_log(1)
1195 self.shell.logger.switch_log(1)
1196
1196
1197 def magic_logstate(self,parameter_s=''):
1197 def magic_logstate(self,parameter_s=''):
1198 """Print the status of the logging system."""
1198 """Print the status of the logging system."""
1199
1199
1200 self.shell.logger.logstate()
1200 self.shell.logger.logstate()
1201
1201
1202 def magic_pdb(self, parameter_s=''):
1202 def magic_pdb(self, parameter_s=''):
1203 """Control the automatic calling of the pdb interactive debugger.
1203 """Control the automatic calling of the pdb interactive debugger.
1204
1204
1205 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1205 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1206 argument it works as a toggle.
1206 argument it works as a toggle.
1207
1207
1208 When an exception is triggered, IPython can optionally call the
1208 When an exception is triggered, IPython can optionally call the
1209 interactive pdb debugger after the traceback printout. %pdb toggles
1209 interactive pdb debugger after the traceback printout. %pdb toggles
1210 this feature on and off.
1210 this feature on and off.
1211
1211
1212 The initial state of this feature is set in your ipythonrc
1212 The initial state of this feature is set in your ipythonrc
1213 configuration file (the variable is called 'pdb').
1213 configuration file (the variable is called 'pdb').
1214
1214
1215 If you want to just activate the debugger AFTER an exception has fired,
1215 If you want to just activate the debugger AFTER an exception has fired,
1216 without having to type '%pdb on' and rerunning your code, you can use
1216 without having to type '%pdb on' and rerunning your code, you can use
1217 the %debug magic."""
1217 the %debug magic."""
1218
1218
1219 par = parameter_s.strip().lower()
1219 par = parameter_s.strip().lower()
1220
1220
1221 if par:
1221 if par:
1222 try:
1222 try:
1223 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1223 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1224 except KeyError:
1224 except KeyError:
1225 print ('Incorrect argument. Use on/1, off/0, '
1225 print ('Incorrect argument. Use on/1, off/0, '
1226 'or nothing for a toggle.')
1226 'or nothing for a toggle.')
1227 return
1227 return
1228 else:
1228 else:
1229 # toggle
1229 # toggle
1230 new_pdb = not self.shell.call_pdb
1230 new_pdb = not self.shell.call_pdb
1231
1231
1232 # set on the shell
1232 # set on the shell
1233 self.shell.call_pdb = new_pdb
1233 self.shell.call_pdb = new_pdb
1234 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1234 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1235
1235
1236 def magic_debug(self, parameter_s=''):
1236 def magic_debug(self, parameter_s=''):
1237 """Activate the interactive debugger in post-mortem mode.
1237 """Activate the interactive debugger in post-mortem mode.
1238
1238
1239 If an exception has just occurred, this lets you inspect its stack
1239 If an exception has just occurred, this lets you inspect its stack
1240 frames interactively. Note that this will always work only on the last
1240 frames interactively. Note that this will always work only on the last
1241 traceback that occurred, so you must call this quickly after an
1241 traceback that occurred, so you must call this quickly after an
1242 exception that you wish to inspect has fired, because if another one
1242 exception that you wish to inspect has fired, because if another one
1243 occurs, it clobbers the previous one.
1243 occurs, it clobbers the previous one.
1244
1244
1245 If you want IPython to automatically do this on every exception, see
1245 If you want IPython to automatically do this on every exception, see
1246 the %pdb magic for more details.
1246 the %pdb magic for more details.
1247 """
1247 """
1248
1248
1249 self.shell.debugger(force=True)
1249 self.shell.debugger(force=True)
1250
1250
1251 @testdec.skip_doctest
1251 @testdec.skip_doctest
1252 def magic_prun(self, parameter_s ='',user_mode=1,
1252 def magic_prun(self, parameter_s ='',user_mode=1,
1253 opts=None,arg_lst=None,prog_ns=None):
1253 opts=None,arg_lst=None,prog_ns=None):
1254
1254
1255 """Run a statement through the python code profiler.
1255 """Run a statement through the python code profiler.
1256
1256
1257 Usage:
1257 Usage:
1258 %prun [options] statement
1258 %prun [options] statement
1259
1259
1260 The given statement (which doesn't require quote marks) is run via the
1260 The given statement (which doesn't require quote marks) is run via the
1261 python profiler in a manner similar to the profile.run() function.
1261 python profiler in a manner similar to the profile.run() function.
1262 Namespaces are internally managed to work correctly; profile.run
1262 Namespaces are internally managed to work correctly; profile.run
1263 cannot be used in IPython because it makes certain assumptions about
1263 cannot be used in IPython because it makes certain assumptions about
1264 namespaces which do not hold under IPython.
1264 namespaces which do not hold under IPython.
1265
1265
1266 Options:
1266 Options:
1267
1267
1268 -l <limit>: you can place restrictions on what or how much of the
1268 -l <limit>: you can place restrictions on what or how much of the
1269 profile gets printed. The limit value can be:
1269 profile gets printed. The limit value can be:
1270
1270
1271 * A string: only information for function names containing this string
1271 * A string: only information for function names containing this string
1272 is printed.
1272 is printed.
1273
1273
1274 * An integer: only these many lines are printed.
1274 * An integer: only these many lines are printed.
1275
1275
1276 * A float (between 0 and 1): this fraction of the report is printed
1276 * A float (between 0 and 1): this fraction of the report is printed
1277 (for example, use a limit of 0.4 to see the topmost 40% only).
1277 (for example, use a limit of 0.4 to see the topmost 40% only).
1278
1278
1279 You can combine several limits with repeated use of the option. For
1279 You can combine several limits with repeated use of the option. For
1280 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1280 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1281 information about class constructors.
1281 information about class constructors.
1282
1282
1283 -r: return the pstats.Stats object generated by the profiling. This
1283 -r: return the pstats.Stats object generated by the profiling. This
1284 object has all the information about the profile in it, and you can
1284 object has all the information about the profile in it, and you can
1285 later use it for further analysis or in other functions.
1285 later use it for further analysis or in other functions.
1286
1286
1287 -s <key>: sort profile by given key. You can provide more than one key
1287 -s <key>: sort profile by given key. You can provide more than one key
1288 by using the option several times: '-s key1 -s key2 -s key3...'. The
1288 by using the option several times: '-s key1 -s key2 -s key3...'. The
1289 default sorting key is 'time'.
1289 default sorting key is 'time'.
1290
1290
1291 The following is copied verbatim from the profile documentation
1291 The following is copied verbatim from the profile documentation
1292 referenced below:
1292 referenced below:
1293
1293
1294 When more than one key is provided, additional keys are used as
1294 When more than one key is provided, additional keys are used as
1295 secondary criteria when the there is equality in all keys selected
1295 secondary criteria when the there is equality in all keys selected
1296 before them.
1296 before them.
1297
1297
1298 Abbreviations can be used for any key names, as long as the
1298 Abbreviations can be used for any key names, as long as the
1299 abbreviation is unambiguous. The following are the keys currently
1299 abbreviation is unambiguous. The following are the keys currently
1300 defined:
1300 defined:
1301
1301
1302 Valid Arg Meaning
1302 Valid Arg Meaning
1303 "calls" call count
1303 "calls" call count
1304 "cumulative" cumulative time
1304 "cumulative" cumulative time
1305 "file" file name
1305 "file" file name
1306 "module" file name
1306 "module" file name
1307 "pcalls" primitive call count
1307 "pcalls" primitive call count
1308 "line" line number
1308 "line" line number
1309 "name" function name
1309 "name" function name
1310 "nfl" name/file/line
1310 "nfl" name/file/line
1311 "stdname" standard name
1311 "stdname" standard name
1312 "time" internal time
1312 "time" internal time
1313
1313
1314 Note that all sorts on statistics are in descending order (placing
1314 Note that all sorts on statistics are in descending order (placing
1315 most time consuming items first), where as name, file, and line number
1315 most time consuming items first), where as name, file, and line number
1316 searches are in ascending order (i.e., alphabetical). The subtle
1316 searches are in ascending order (i.e., alphabetical). The subtle
1317 distinction between "nfl" and "stdname" is that the standard name is a
1317 distinction between "nfl" and "stdname" is that the standard name is a
1318 sort of the name as printed, which means that the embedded line
1318 sort of the name as printed, which means that the embedded line
1319 numbers get compared in an odd way. For example, lines 3, 20, and 40
1319 numbers get compared in an odd way. For example, lines 3, 20, and 40
1320 would (if the file names were the same) appear in the string order
1320 would (if the file names were the same) appear in the string order
1321 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1321 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1322 line numbers. In fact, sort_stats("nfl") is the same as
1322 line numbers. In fact, sort_stats("nfl") is the same as
1323 sort_stats("name", "file", "line").
1323 sort_stats("name", "file", "line").
1324
1324
1325 -T <filename>: save profile results as shown on screen to a text
1325 -T <filename>: save profile results as shown on screen to a text
1326 file. The profile is still shown on screen.
1326 file. The profile is still shown on screen.
1327
1327
1328 -D <filename>: save (via dump_stats) profile statistics to given
1328 -D <filename>: save (via dump_stats) profile statistics to given
1329 filename. This data is in a format understod by the pstats module, and
1329 filename. This data is in a format understod by the pstats module, and
1330 is generated by a call to the dump_stats() method of profile
1330 is generated by a call to the dump_stats() method of profile
1331 objects. The profile is still shown on screen.
1331 objects. The profile is still shown on screen.
1332
1332
1333 If you want to run complete programs under the profiler's control, use
1333 If you want to run complete programs under the profiler's control, use
1334 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1334 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1335 contains profiler specific options as described here.
1335 contains profiler specific options as described here.
1336
1336
1337 You can read the complete documentation for the profile module with::
1337 You can read the complete documentation for the profile module with::
1338
1338
1339 In [1]: import profile; profile.help()
1339 In [1]: import profile; profile.help()
1340 """
1340 """
1341
1341
1342 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1342 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1343 # protect user quote marks
1343 # protect user quote marks
1344 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1344 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1345
1345
1346 if user_mode: # regular user call
1346 if user_mode: # regular user call
1347 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1347 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1348 list_all=1)
1348 list_all=1)
1349 namespace = self.shell.user_ns
1349 namespace = self.shell.user_ns
1350 else: # called to run a program by %run -p
1350 else: # called to run a program by %run -p
1351 try:
1351 try:
1352 filename = get_py_filename(arg_lst[0])
1352 filename = get_py_filename(arg_lst[0])
1353 except IOError,msg:
1353 except IOError,msg:
1354 error(msg)
1354 error(msg)
1355 return
1355 return
1356
1356
1357 arg_str = 'execfile(filename,prog_ns)'
1357 arg_str = 'execfile(filename,prog_ns)'
1358 namespace = locals()
1358 namespace = locals()
1359
1359
1360 opts.merge(opts_def)
1360 opts.merge(opts_def)
1361
1361
1362 prof = profile.Profile()
1362 prof = profile.Profile()
1363 try:
1363 try:
1364 prof = prof.runctx(arg_str,namespace,namespace)
1364 prof = prof.runctx(arg_str,namespace,namespace)
1365 sys_exit = ''
1365 sys_exit = ''
1366 except SystemExit:
1366 except SystemExit:
1367 sys_exit = """*** SystemExit exception caught in code being profiled."""
1367 sys_exit = """*** SystemExit exception caught in code being profiled."""
1368
1368
1369 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1369 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1370
1370
1371 lims = opts.l
1371 lims = opts.l
1372 if lims:
1372 if lims:
1373 lims = [] # rebuild lims with ints/floats/strings
1373 lims = [] # rebuild lims with ints/floats/strings
1374 for lim in opts.l:
1374 for lim in opts.l:
1375 try:
1375 try:
1376 lims.append(int(lim))
1376 lims.append(int(lim))
1377 except ValueError:
1377 except ValueError:
1378 try:
1378 try:
1379 lims.append(float(lim))
1379 lims.append(float(lim))
1380 except ValueError:
1380 except ValueError:
1381 lims.append(lim)
1381 lims.append(lim)
1382
1382
1383 # Trap output.
1383 # Trap output.
1384 stdout_trap = StringIO()
1384 stdout_trap = StringIO()
1385
1385
1386 if hasattr(stats,'stream'):
1386 if hasattr(stats,'stream'):
1387 # In newer versions of python, the stats object has a 'stream'
1387 # In newer versions of python, the stats object has a 'stream'
1388 # attribute to write into.
1388 # attribute to write into.
1389 stats.stream = stdout_trap
1389 stats.stream = stdout_trap
1390 stats.print_stats(*lims)
1390 stats.print_stats(*lims)
1391 else:
1391 else:
1392 # For older versions, we manually redirect stdout during printing
1392 # For older versions, we manually redirect stdout during printing
1393 sys_stdout = sys.stdout
1393 sys_stdout = sys.stdout
1394 try:
1394 try:
1395 sys.stdout = stdout_trap
1395 sys.stdout = stdout_trap
1396 stats.print_stats(*lims)
1396 stats.print_stats(*lims)
1397 finally:
1397 finally:
1398 sys.stdout = sys_stdout
1398 sys.stdout = sys_stdout
1399
1399
1400 output = stdout_trap.getvalue()
1400 output = stdout_trap.getvalue()
1401 output = output.rstrip()
1401 output = output.rstrip()
1402
1402
1403 page(output,screen_lines=self.shell.rc.screen_length)
1403 page(output,screen_lines=self.shell.rc.screen_length)
1404 print sys_exit,
1404 print sys_exit,
1405
1405
1406 dump_file = opts.D[0]
1406 dump_file = opts.D[0]
1407 text_file = opts.T[0]
1407 text_file = opts.T[0]
1408 if dump_file:
1408 if dump_file:
1409 prof.dump_stats(dump_file)
1409 prof.dump_stats(dump_file)
1410 print '\n*** Profile stats marshalled to file',\
1410 print '\n*** Profile stats marshalled to file',\
1411 `dump_file`+'.',sys_exit
1411 `dump_file`+'.',sys_exit
1412 if text_file:
1412 if text_file:
1413 pfile = file(text_file,'w')
1413 pfile = file(text_file,'w')
1414 pfile.write(output)
1414 pfile.write(output)
1415 pfile.close()
1415 pfile.close()
1416 print '\n*** Profile printout saved to text file',\
1416 print '\n*** Profile printout saved to text file',\
1417 `text_file`+'.',sys_exit
1417 `text_file`+'.',sys_exit
1418
1418
1419 if opts.has_key('r'):
1419 if opts.has_key('r'):
1420 return stats
1420 return stats
1421 else:
1421 else:
1422 return None
1422 return None
1423
1423
1424 @testdec.skip_doctest
1424 @testdec.skip_doctest
1425 def magic_run(self, parameter_s ='',runner=None):
1425 def magic_run(self, parameter_s ='',runner=None):
1426 """Run the named file inside IPython as a program.
1426 """Run the named file inside IPython as a program.
1427
1427
1428 Usage:\\
1428 Usage:\\
1429 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1429 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1430
1430
1431 Parameters after the filename are passed as command-line arguments to
1431 Parameters after the filename are passed as command-line arguments to
1432 the program (put in sys.argv). Then, control returns to IPython's
1432 the program (put in sys.argv). Then, control returns to IPython's
1433 prompt.
1433 prompt.
1434
1434
1435 This is similar to running at a system prompt:\\
1435 This is similar to running at a system prompt:\\
1436 $ python file args\\
1436 $ python file args\\
1437 but with the advantage of giving you IPython's tracebacks, and of
1437 but with the advantage of giving you IPython's tracebacks, and of
1438 loading all variables into your interactive namespace for further use
1438 loading all variables into your interactive namespace for further use
1439 (unless -p is used, see below).
1439 (unless -p is used, see below).
1440
1440
1441 The file is executed in a namespace initially consisting only of
1441 The file is executed in a namespace initially consisting only of
1442 __name__=='__main__' and sys.argv constructed as indicated. It thus
1442 __name__=='__main__' and sys.argv constructed as indicated. It thus
1443 sees its environment as if it were being run as a stand-alone program
1443 sees its environment as if it were being run as a stand-alone program
1444 (except for sharing global objects such as previously imported
1444 (except for sharing global objects such as previously imported
1445 modules). But after execution, the IPython interactive namespace gets
1445 modules). But after execution, the IPython interactive namespace gets
1446 updated with all variables defined in the program (except for __name__
1446 updated with all variables defined in the program (except for __name__
1447 and sys.argv). This allows for very convenient loading of code for
1447 and sys.argv). This allows for very convenient loading of code for
1448 interactive work, while giving each program a 'clean sheet' to run in.
1448 interactive work, while giving each program a 'clean sheet' to run in.
1449
1449
1450 Options:
1450 Options:
1451
1451
1452 -n: __name__ is NOT set to '__main__', but to the running file's name
1452 -n: __name__ is NOT set to '__main__', but to the running file's name
1453 without extension (as python does under import). This allows running
1453 without extension (as python does under import). This allows running
1454 scripts and reloading the definitions in them without calling code
1454 scripts and reloading the definitions in them without calling code
1455 protected by an ' if __name__ == "__main__" ' clause.
1455 protected by an ' if __name__ == "__main__" ' clause.
1456
1456
1457 -i: run the file in IPython's namespace instead of an empty one. This
1457 -i: run the file in IPython's namespace instead of an empty one. This
1458 is useful if you are experimenting with code written in a text editor
1458 is useful if you are experimenting with code written in a text editor
1459 which depends on variables defined interactively.
1459 which depends on variables defined interactively.
1460
1460
1461 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1461 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1462 being run. This is particularly useful if IPython is being used to
1462 being run. This is particularly useful if IPython is being used to
1463 run unittests, which always exit with a sys.exit() call. In such
1463 run unittests, which always exit with a sys.exit() call. In such
1464 cases you are interested in the output of the test results, not in
1464 cases you are interested in the output of the test results, not in
1465 seeing a traceback of the unittest module.
1465 seeing a traceback of the unittest module.
1466
1466
1467 -t: print timing information at the end of the run. IPython will give
1467 -t: print timing information at the end of the run. IPython will give
1468 you an estimated CPU time consumption for your script, which under
1468 you an estimated CPU time consumption for your script, which under
1469 Unix uses the resource module to avoid the wraparound problems of
1469 Unix uses the resource module to avoid the wraparound problems of
1470 time.clock(). Under Unix, an estimate of time spent on system tasks
1470 time.clock(). Under Unix, an estimate of time spent on system tasks
1471 is also given (for Windows platforms this is reported as 0.0).
1471 is also given (for Windows platforms this is reported as 0.0).
1472
1472
1473 If -t is given, an additional -N<N> option can be given, where <N>
1473 If -t is given, an additional -N<N> option can be given, where <N>
1474 must be an integer indicating how many times you want the script to
1474 must be an integer indicating how many times you want the script to
1475 run. The final timing report will include total and per run results.
1475 run. The final timing report will include total and per run results.
1476
1476
1477 For example (testing the script uniq_stable.py):
1477 For example (testing the script uniq_stable.py):
1478
1478
1479 In [1]: run -t uniq_stable
1479 In [1]: run -t uniq_stable
1480
1480
1481 IPython CPU timings (estimated):\\
1481 IPython CPU timings (estimated):\\
1482 User : 0.19597 s.\\
1482 User : 0.19597 s.\\
1483 System: 0.0 s.\\
1483 System: 0.0 s.\\
1484
1484
1485 In [2]: run -t -N5 uniq_stable
1485 In [2]: run -t -N5 uniq_stable
1486
1486
1487 IPython CPU timings (estimated):\\
1487 IPython CPU timings (estimated):\\
1488 Total runs performed: 5\\
1488 Total runs performed: 5\\
1489 Times : Total Per run\\
1489 Times : Total Per run\\
1490 User : 0.910862 s, 0.1821724 s.\\
1490 User : 0.910862 s, 0.1821724 s.\\
1491 System: 0.0 s, 0.0 s.
1491 System: 0.0 s, 0.0 s.
1492
1492
1493 -d: run your program under the control of pdb, the Python debugger.
1493 -d: run your program under the control of pdb, the Python debugger.
1494 This allows you to execute your program step by step, watch variables,
1494 This allows you to execute your program step by step, watch variables,
1495 etc. Internally, what IPython does is similar to calling:
1495 etc. Internally, what IPython does is similar to calling:
1496
1496
1497 pdb.run('execfile("YOURFILENAME")')
1497 pdb.run('execfile("YOURFILENAME")')
1498
1498
1499 with a breakpoint set on line 1 of your file. You can change the line
1499 with a breakpoint set on line 1 of your file. You can change the line
1500 number for this automatic breakpoint to be <N> by using the -bN option
1500 number for this automatic breakpoint to be <N> by using the -bN option
1501 (where N must be an integer). For example:
1501 (where N must be an integer). For example:
1502
1502
1503 %run -d -b40 myscript
1503 %run -d -b40 myscript
1504
1504
1505 will set the first breakpoint at line 40 in myscript.py. Note that
1505 will set the first breakpoint at line 40 in myscript.py. Note that
1506 the first breakpoint must be set on a line which actually does
1506 the first breakpoint must be set on a line which actually does
1507 something (not a comment or docstring) for it to stop execution.
1507 something (not a comment or docstring) for it to stop execution.
1508
1508
1509 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1509 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1510 first enter 'c' (without qoutes) to start execution up to the first
1510 first enter 'c' (without qoutes) to start execution up to the first
1511 breakpoint.
1511 breakpoint.
1512
1512
1513 Entering 'help' gives information about the use of the debugger. You
1513 Entering 'help' gives information about the use of the debugger. You
1514 can easily see pdb's full documentation with "import pdb;pdb.help()"
1514 can easily see pdb's full documentation with "import pdb;pdb.help()"
1515 at a prompt.
1515 at a prompt.
1516
1516
1517 -p: run program under the control of the Python profiler module (which
1517 -p: run program under the control of the Python profiler module (which
1518 prints a detailed report of execution times, function calls, etc).
1518 prints a detailed report of execution times, function calls, etc).
1519
1519
1520 You can pass other options after -p which affect the behavior of the
1520 You can pass other options after -p which affect the behavior of the
1521 profiler itself. See the docs for %prun for details.
1521 profiler itself. See the docs for %prun for details.
1522
1522
1523 In this mode, the program's variables do NOT propagate back to the
1523 In this mode, the program's variables do NOT propagate back to the
1524 IPython interactive namespace (because they remain in the namespace
1524 IPython interactive namespace (because they remain in the namespace
1525 where the profiler executes them).
1525 where the profiler executes them).
1526
1526
1527 Internally this triggers a call to %prun, see its documentation for
1527 Internally this triggers a call to %prun, see its documentation for
1528 details on the options available specifically for profiling.
1528 details on the options available specifically for profiling.
1529
1529
1530 There is one special usage for which the text above doesn't apply:
1530 There is one special usage for which the text above doesn't apply:
1531 if the filename ends with .ipy, the file is run as ipython script,
1531 if the filename ends with .ipy, the file is run as ipython script,
1532 just as if the commands were written on IPython prompt.
1532 just as if the commands were written on IPython prompt.
1533 """
1533 """
1534
1534
1535 # get arguments and set sys.argv for program to be run.
1535 # get arguments and set sys.argv for program to be run.
1536 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1536 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1537 mode='list',list_all=1)
1537 mode='list',list_all=1)
1538
1538
1539 try:
1539 try:
1540 filename = get_py_filename(arg_lst[0])
1540 filename = get_py_filename(arg_lst[0])
1541 except IndexError:
1541 except IndexError:
1542 warn('you must provide at least a filename.')
1542 warn('you must provide at least a filename.')
1543 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1543 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1544 return
1544 return
1545 except IOError,msg:
1545 except IOError,msg:
1546 error(msg)
1546 error(msg)
1547 return
1547 return
1548
1548
1549 if filename.lower().endswith('.ipy'):
1549 if filename.lower().endswith('.ipy'):
1550 self.api.runlines(open(filename).read())
1550 self.api.runlines(open(filename).read())
1551 return
1551 return
1552
1552
1553 # Control the response to exit() calls made by the script being run
1553 # Control the response to exit() calls made by the script being run
1554 exit_ignore = opts.has_key('e')
1554 exit_ignore = opts.has_key('e')
1555
1555
1556 # Make sure that the running script gets a proper sys.argv as if it
1556 # Make sure that the running script gets a proper sys.argv as if it
1557 # were run from a system shell.
1557 # were run from a system shell.
1558 save_argv = sys.argv # save it for later restoring
1558 save_argv = sys.argv # save it for later restoring
1559 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1559 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1560
1560
1561 if opts.has_key('i'):
1561 if opts.has_key('i'):
1562 # Run in user's interactive namespace
1562 # Run in user's interactive namespace
1563 prog_ns = self.shell.user_ns
1563 prog_ns = self.shell.user_ns
1564 __name__save = self.shell.user_ns['__name__']
1564 __name__save = self.shell.user_ns['__name__']
1565 prog_ns['__name__'] = '__main__'
1565 prog_ns['__name__'] = '__main__'
1566 main_mod = FakeModule(prog_ns)
1566 main_mod = FakeModule(prog_ns)
1567 else:
1567 else:
1568 # Run in a fresh, empty namespace
1568 # Run in a fresh, empty namespace
1569 if opts.has_key('n'):
1569 if opts.has_key('n'):
1570 name = os.path.splitext(os.path.basename(filename))[0]
1570 name = os.path.splitext(os.path.basename(filename))[0]
1571 else:
1571 else:
1572 name = '__main__'
1572 name = '__main__'
1573 main_mod = FakeModule()
1573 main_mod = FakeModule()
1574 prog_ns = main_mod.__dict__
1574 prog_ns = main_mod.__dict__
1575 prog_ns['__name__'] = name
1575 prog_ns['__name__'] = name
1576 # The shell MUST hold a reference to main_mod so after %run exits,
1576 # The shell MUST hold a reference to main_mod so after %run exits,
1577 # the python deletion mechanism doesn't zero it out (leaving
1577 # the python deletion mechanism doesn't zero it out (leaving
1578 # dangling references)
1578 # dangling references)
1579 self.shell._user_main_modules.append(main_mod)
1579 self.shell._user_main_modules.append(main_mod)
1580
1580
1581 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1581 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1582 # set the __file__ global in the script's namespace
1582 # set the __file__ global in the script's namespace
1583 prog_ns['__file__'] = filename
1583 prog_ns['__file__'] = filename
1584
1584
1585 # pickle fix. See iplib for an explanation. But we need to make sure
1585 # pickle fix. See iplib for an explanation. But we need to make sure
1586 # that, if we overwrite __main__, we replace it at the end
1586 # that, if we overwrite __main__, we replace it at the end
1587 main_mod_name = prog_ns['__name__']
1587 main_mod_name = prog_ns['__name__']
1588
1588
1589 if main_mod_name == '__main__':
1589 if main_mod_name == '__main__':
1590 restore_main = sys.modules['__main__']
1590 restore_main = sys.modules['__main__']
1591 else:
1591 else:
1592 restore_main = False
1592 restore_main = False
1593
1593
1594 # This needs to be undone at the end to prevent holding references to
1594 # This needs to be undone at the end to prevent holding references to
1595 # every single object ever created.
1595 # every single object ever created.
1596 sys.modules[main_mod_name] = main_mod
1596 sys.modules[main_mod_name] = main_mod
1597
1597
1598 stats = None
1598 stats = None
1599 try:
1599 try:
1600 self.shell.savehist()
1600 self.shell.savehist()
1601
1601
1602 if opts.has_key('p'):
1602 if opts.has_key('p'):
1603 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1603 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1604 else:
1604 else:
1605 if opts.has_key('d'):
1605 if opts.has_key('d'):
1606 deb = Debugger.Pdb(self.shell.rc.colors)
1606 deb = Debugger.Pdb(self.shell.rc.colors)
1607 # reset Breakpoint state, which is moronically kept
1607 # reset Breakpoint state, which is moronically kept
1608 # in a class
1608 # in a class
1609 bdb.Breakpoint.next = 1
1609 bdb.Breakpoint.next = 1
1610 bdb.Breakpoint.bplist = {}
1610 bdb.Breakpoint.bplist = {}
1611 bdb.Breakpoint.bpbynumber = [None]
1611 bdb.Breakpoint.bpbynumber = [None]
1612 # Set an initial breakpoint to stop execution
1612 # Set an initial breakpoint to stop execution
1613 maxtries = 10
1613 maxtries = 10
1614 bp = int(opts.get('b',[1])[0])
1614 bp = int(opts.get('b',[1])[0])
1615 checkline = deb.checkline(filename,bp)
1615 checkline = deb.checkline(filename,bp)
1616 if not checkline:
1616 if not checkline:
1617 for bp in range(bp+1,bp+maxtries+1):
1617 for bp in range(bp+1,bp+maxtries+1):
1618 if deb.checkline(filename,bp):
1618 if deb.checkline(filename,bp):
1619 break
1619 break
1620 else:
1620 else:
1621 msg = ("\nI failed to find a valid line to set "
1621 msg = ("\nI failed to find a valid line to set "
1622 "a breakpoint\n"
1622 "a breakpoint\n"
1623 "after trying up to line: %s.\n"
1623 "after trying up to line: %s.\n"
1624 "Please set a valid breakpoint manually "
1624 "Please set a valid breakpoint manually "
1625 "with the -b option." % bp)
1625 "with the -b option." % bp)
1626 error(msg)
1626 error(msg)
1627 return
1627 return
1628 # if we find a good linenumber, set the breakpoint
1628 # if we find a good linenumber, set the breakpoint
1629 deb.do_break('%s:%s' % (filename,bp))
1629 deb.do_break('%s:%s' % (filename,bp))
1630 # Start file run
1630 # Start file run
1631 print "NOTE: Enter 'c' at the",
1631 print "NOTE: Enter 'c' at the",
1632 print "%s prompt to start your script." % deb.prompt
1632 print "%s prompt to start your script." % deb.prompt
1633 try:
1633 try:
1634 deb.run('execfile("%s")' % filename,prog_ns)
1634 deb.run('execfile("%s")' % filename,prog_ns)
1635
1635
1636 except:
1636 except:
1637 etype, value, tb = sys.exc_info()
1637 etype, value, tb = sys.exc_info()
1638 # Skip three frames in the traceback: the %run one,
1638 # Skip three frames in the traceback: the %run one,
1639 # one inside bdb.py, and the command-line typed by the
1639 # one inside bdb.py, and the command-line typed by the
1640 # user (run by exec in pdb itself).
1640 # user (run by exec in pdb itself).
1641 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1641 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1642 else:
1642 else:
1643 if runner is None:
1643 if runner is None:
1644 runner = self.shell.safe_execfile
1644 runner = self.shell.safe_execfile
1645 if opts.has_key('t'):
1645 if opts.has_key('t'):
1646 # timed execution
1646 # timed execution
1647 try:
1647 try:
1648 nruns = int(opts['N'][0])
1648 nruns = int(opts['N'][0])
1649 if nruns < 1:
1649 if nruns < 1:
1650 error('Number of runs must be >=1')
1650 error('Number of runs must be >=1')
1651 return
1651 return
1652 except (KeyError):
1652 except (KeyError):
1653 nruns = 1
1653 nruns = 1
1654 if nruns == 1:
1654 if nruns == 1:
1655 t0 = clock2()
1655 t0 = clock2()
1656 runner(filename,prog_ns,prog_ns,
1656 runner(filename,prog_ns,prog_ns,
1657 exit_ignore=exit_ignore)
1657 exit_ignore=exit_ignore)
1658 t1 = clock2()
1658 t1 = clock2()
1659 t_usr = t1[0]-t0[0]
1659 t_usr = t1[0]-t0[0]
1660 t_sys = t1[1]-t1[1]
1660 t_sys = t1[1]-t1[1]
1661 print "\nIPython CPU timings (estimated):"
1661 print "\nIPython CPU timings (estimated):"
1662 print " User : %10s s." % t_usr
1662 print " User : %10s s." % t_usr
1663 print " System: %10s s." % t_sys
1663 print " System: %10s s." % t_sys
1664 else:
1664 else:
1665 runs = range(nruns)
1665 runs = range(nruns)
1666 t0 = clock2()
1666 t0 = clock2()
1667 for nr in runs:
1667 for nr in runs:
1668 runner(filename,prog_ns,prog_ns,
1668 runner(filename,prog_ns,prog_ns,
1669 exit_ignore=exit_ignore)
1669 exit_ignore=exit_ignore)
1670 t1 = clock2()
1670 t1 = clock2()
1671 t_usr = t1[0]-t0[0]
1671 t_usr = t1[0]-t0[0]
1672 t_sys = t1[1]-t1[1]
1672 t_sys = t1[1]-t1[1]
1673 print "\nIPython CPU timings (estimated):"
1673 print "\nIPython CPU timings (estimated):"
1674 print "Total runs performed:",nruns
1674 print "Total runs performed:",nruns
1675 print " Times : %10s %10s" % ('Total','Per run')
1675 print " Times : %10s %10s" % ('Total','Per run')
1676 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1676 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1677 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1677 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1678
1678
1679 else:
1679 else:
1680 # regular execution
1680 # regular execution
1681 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1681 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1682 if opts.has_key('i'):
1682 if opts.has_key('i'):
1683 self.shell.user_ns['__name__'] = __name__save
1683 self.shell.user_ns['__name__'] = __name__save
1684 else:
1684 else:
1685 # update IPython interactive namespace
1685 # update IPython interactive namespace
1686 del prog_ns['__name__']
1686 del prog_ns['__name__']
1687 self.shell.user_ns.update(prog_ns)
1687 self.shell.user_ns.update(prog_ns)
1688 finally:
1688 finally:
1689 # Ensure key global structures are restored
1689 # Ensure key global structures are restored
1690 sys.argv = save_argv
1690 sys.argv = save_argv
1691 if restore_main:
1691 if restore_main:
1692 sys.modules['__main__'] = restore_main
1692 sys.modules['__main__'] = restore_main
1693 else:
1693 else:
1694 # Remove from sys.modules the reference to main_mod we'd
1694 # Remove from sys.modules the reference to main_mod we'd
1695 # added. Otherwise it will trap references to objects
1695 # added. Otherwise it will trap references to objects
1696 # contained therein.
1696 # contained therein.
1697 del sys.modules[main_mod_name]
1697 del sys.modules[main_mod_name]
1698 self.shell.reloadhist()
1698 self.shell.reloadhist()
1699
1699
1700 return stats
1700 return stats
1701
1701
1702 def magic_runlog(self, parameter_s =''):
1702 def magic_runlog(self, parameter_s =''):
1703 """Run files as logs.
1703 """Run files as logs.
1704
1704
1705 Usage:\\
1705 Usage:\\
1706 %runlog file1 file2 ...
1706 %runlog file1 file2 ...
1707
1707
1708 Run the named files (treating them as log files) in sequence inside
1708 Run the named files (treating them as log files) in sequence inside
1709 the interpreter, and return to the prompt. This is much slower than
1709 the interpreter, and return to the prompt. This is much slower than
1710 %run because each line is executed in a try/except block, but it
1710 %run because each line is executed in a try/except block, but it
1711 allows running files with syntax errors in them.
1711 allows running files with syntax errors in them.
1712
1712
1713 Normally IPython will guess when a file is one of its own logfiles, so
1713 Normally IPython will guess when a file is one of its own logfiles, so
1714 you can typically use %run even for logs. This shorthand allows you to
1714 you can typically use %run even for logs. This shorthand allows you to
1715 force any file to be treated as a log file."""
1715 force any file to be treated as a log file."""
1716
1716
1717 for f in parameter_s.split():
1717 for f in parameter_s.split():
1718 self.shell.safe_execfile(f,self.shell.user_ns,
1718 self.shell.safe_execfile(f,self.shell.user_ns,
1719 self.shell.user_ns,islog=1)
1719 self.shell.user_ns,islog=1)
1720
1720
1721 @testdec.skip_doctest
1721 @testdec.skip_doctest
1722 def magic_timeit(self, parameter_s =''):
1722 def magic_timeit(self, parameter_s =''):
1723 """Time execution of a Python statement or expression
1723 """Time execution of a Python statement or expression
1724
1724
1725 Usage:\\
1725 Usage:\\
1726 %timeit [-n<N> -r<R> [-t|-c]] statement
1726 %timeit [-n<N> -r<R> [-t|-c]] statement
1727
1727
1728 Time execution of a Python statement or expression using the timeit
1728 Time execution of a Python statement or expression using the timeit
1729 module.
1729 module.
1730
1730
1731 Options:
1731 Options:
1732 -n<N>: execute the given statement <N> times in a loop. If this value
1732 -n<N>: execute the given statement <N> times in a loop. If this value
1733 is not given, a fitting value is chosen.
1733 is not given, a fitting value is chosen.
1734
1734
1735 -r<R>: repeat the loop iteration <R> times and take the best result.
1735 -r<R>: repeat the loop iteration <R> times and take the best result.
1736 Default: 3
1736 Default: 3
1737
1737
1738 -t: use time.time to measure the time, which is the default on Unix.
1738 -t: use time.time to measure the time, which is the default on Unix.
1739 This function measures wall time.
1739 This function measures wall time.
1740
1740
1741 -c: use time.clock to measure the time, which is the default on
1741 -c: use time.clock to measure the time, which is the default on
1742 Windows and measures wall time. On Unix, resource.getrusage is used
1742 Windows and measures wall time. On Unix, resource.getrusage is used
1743 instead and returns the CPU user time.
1743 instead and returns the CPU user time.
1744
1744
1745 -p<P>: use a precision of <P> digits to display the timing result.
1745 -p<P>: use a precision of <P> digits to display the timing result.
1746 Default: 3
1746 Default: 3
1747
1747
1748
1748
1749 Examples:
1749 Examples:
1750
1750
1751 In [1]: %timeit pass
1751 In [1]: %timeit pass
1752 10000000 loops, best of 3: 53.3 ns per loop
1752 10000000 loops, best of 3: 53.3 ns per loop
1753
1753
1754 In [2]: u = None
1754 In [2]: u = None
1755
1755
1756 In [3]: %timeit u is None
1756 In [3]: %timeit u is None
1757 10000000 loops, best of 3: 184 ns per loop
1757 10000000 loops, best of 3: 184 ns per loop
1758
1758
1759 In [4]: %timeit -r 4 u == None
1759 In [4]: %timeit -r 4 u == None
1760 1000000 loops, best of 4: 242 ns per loop
1760 1000000 loops, best of 4: 242 ns per loop
1761
1761
1762 In [5]: import time
1762 In [5]: import time
1763
1763
1764 In [6]: %timeit -n1 time.sleep(2)
1764 In [6]: %timeit -n1 time.sleep(2)
1765 1 loops, best of 3: 2 s per loop
1765 1 loops, best of 3: 2 s per loop
1766
1766
1767
1767
1768 The times reported by %timeit will be slightly higher than those
1768 The times reported by %timeit will be slightly higher than those
1769 reported by the timeit.py script when variables are accessed. This is
1769 reported by the timeit.py script when variables are accessed. This is
1770 due to the fact that %timeit executes the statement in the namespace
1770 due to the fact that %timeit executes the statement in the namespace
1771 of the shell, compared with timeit.py, which uses a single setup
1771 of the shell, compared with timeit.py, which uses a single setup
1772 statement to import function or create variables. Generally, the bias
1772 statement to import function or create variables. Generally, the bias
1773 does not matter as long as results from timeit.py are not mixed with
1773 does not matter as long as results from timeit.py are not mixed with
1774 those from %timeit."""
1774 those from %timeit."""
1775
1775
1776 import timeit
1776 import timeit
1777 import math
1777 import math
1778
1778
1779 units = [u"s", u"ms", u"\xb5s", u"ns"]
1779 units = [u"s", u"ms", u"\xb5s", u"ns"]
1780 scaling = [1, 1e3, 1e6, 1e9]
1780 scaling = [1, 1e3, 1e6, 1e9]
1781
1781
1782 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1782 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1783 posix=False)
1783 posix=False)
1784 if stmt == "":
1784 if stmt == "":
1785 return
1785 return
1786 timefunc = timeit.default_timer
1786 timefunc = timeit.default_timer
1787 number = int(getattr(opts, "n", 0))
1787 number = int(getattr(opts, "n", 0))
1788 repeat = int(getattr(opts, "r", timeit.default_repeat))
1788 repeat = int(getattr(opts, "r", timeit.default_repeat))
1789 precision = int(getattr(opts, "p", 3))
1789 precision = int(getattr(opts, "p", 3))
1790 if hasattr(opts, "t"):
1790 if hasattr(opts, "t"):
1791 timefunc = time.time
1791 timefunc = time.time
1792 if hasattr(opts, "c"):
1792 if hasattr(opts, "c"):
1793 timefunc = clock
1793 timefunc = clock
1794
1794
1795 timer = timeit.Timer(timer=timefunc)
1795 timer = timeit.Timer(timer=timefunc)
1796 # this code has tight coupling to the inner workings of timeit.Timer,
1796 # this code has tight coupling to the inner workings of timeit.Timer,
1797 # but is there a better way to achieve that the code stmt has access
1797 # but is there a better way to achieve that the code stmt has access
1798 # to the shell namespace?
1798 # to the shell namespace?
1799
1799
1800 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1800 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1801 'setup': "pass"}
1801 'setup': "pass"}
1802 # Track compilation time so it can be reported if too long
1802 # Track compilation time so it can be reported if too long
1803 # Minimum time above which compilation time will be reported
1803 # Minimum time above which compilation time will be reported
1804 tc_min = 0.1
1804 tc_min = 0.1
1805
1805
1806 t0 = clock()
1806 t0 = clock()
1807 code = compile(src, "<magic-timeit>", "exec")
1807 code = compile(src, "<magic-timeit>", "exec")
1808 tc = clock()-t0
1808 tc = clock()-t0
1809
1809
1810 ns = {}
1810 ns = {}
1811 exec code in self.shell.user_ns, ns
1811 exec code in self.shell.user_ns, ns
1812 timer.inner = ns["inner"]
1812 timer.inner = ns["inner"]
1813
1813
1814 if number == 0:
1814 if number == 0:
1815 # determine number so that 0.2 <= total time < 2.0
1815 # determine number so that 0.2 <= total time < 2.0
1816 number = 1
1816 number = 1
1817 for i in range(1, 10):
1817 for i in range(1, 10):
1818 number *= 10
1818 number *= 10
1819 if timer.timeit(number) >= 0.2:
1819 if timer.timeit(number) >= 0.2:
1820 break
1820 break
1821
1821
1822 best = min(timer.repeat(repeat, number)) / number
1822 best = min(timer.repeat(repeat, number)) / number
1823
1823
1824 if best > 0.0:
1824 if best > 0.0:
1825 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1825 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1826 else:
1826 else:
1827 order = 3
1827 order = 3
1828 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1828 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1829 precision,
1829 precision,
1830 best * scaling[order],
1830 best * scaling[order],
1831 units[order])
1831 units[order])
1832 if tc > tc_min:
1832 if tc > tc_min:
1833 print "Compiler time: %.2f s" % tc
1833 print "Compiler time: %.2f s" % tc
1834
1834
1835 @testdec.skip_doctest
1835 @testdec.skip_doctest
1836 def magic_time(self,parameter_s = ''):
1836 def magic_time(self,parameter_s = ''):
1837 """Time execution of a Python statement or expression.
1837 """Time execution of a Python statement or expression.
1838
1838
1839 The CPU and wall clock times are printed, and the value of the
1839 The CPU and wall clock times are printed, and the value of the
1840 expression (if any) is returned. Note that under Win32, system time
1840 expression (if any) is returned. Note that under Win32, system time
1841 is always reported as 0, since it can not be measured.
1841 is always reported as 0, since it can not be measured.
1842
1842
1843 This function provides very basic timing functionality. In Python
1843 This function provides very basic timing functionality. In Python
1844 2.3, the timeit module offers more control and sophistication, so this
1844 2.3, the timeit module offers more control and sophistication, so this
1845 could be rewritten to use it (patches welcome).
1845 could be rewritten to use it (patches welcome).
1846
1846
1847 Some examples:
1847 Some examples:
1848
1848
1849 In [1]: time 2**128
1849 In [1]: time 2**128
1850 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1850 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1851 Wall time: 0.00
1851 Wall time: 0.00
1852 Out[1]: 340282366920938463463374607431768211456L
1852 Out[1]: 340282366920938463463374607431768211456L
1853
1853
1854 In [2]: n = 1000000
1854 In [2]: n = 1000000
1855
1855
1856 In [3]: time sum(range(n))
1856 In [3]: time sum(range(n))
1857 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1857 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1858 Wall time: 1.37
1858 Wall time: 1.37
1859 Out[3]: 499999500000L
1859 Out[3]: 499999500000L
1860
1860
1861 In [4]: time print 'hello world'
1861 In [4]: time print 'hello world'
1862 hello world
1862 hello world
1863 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1863 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1864 Wall time: 0.00
1864 Wall time: 0.00
1865
1865
1866 Note that the time needed by Python to compile the given expression
1866 Note that the time needed by Python to compile the given expression
1867 will be reported if it is more than 0.1s. In this example, the
1867 will be reported if it is more than 0.1s. In this example, the
1868 actual exponentiation is done by Python at compilation time, so while
1868 actual exponentiation is done by Python at compilation time, so while
1869 the expression can take a noticeable amount of time to compute, that
1869 the expression can take a noticeable amount of time to compute, that
1870 time is purely due to the compilation:
1870 time is purely due to the compilation:
1871
1871
1872 In [5]: time 3**9999;
1872 In [5]: time 3**9999;
1873 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1873 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1874 Wall time: 0.00 s
1874 Wall time: 0.00 s
1875
1875
1876 In [6]: time 3**999999;
1876 In [6]: time 3**999999;
1877 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1877 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1878 Wall time: 0.00 s
1878 Wall time: 0.00 s
1879 Compiler : 0.78 s
1879 Compiler : 0.78 s
1880 """
1880 """
1881
1881
1882 # fail immediately if the given expression can't be compiled
1882 # fail immediately if the given expression can't be compiled
1883
1883
1884 expr = self.shell.prefilter(parameter_s,False)
1884 expr = self.shell.prefilter(parameter_s,False)
1885
1885
1886 # Minimum time above which compilation time will be reported
1886 # Minimum time above which compilation time will be reported
1887 tc_min = 0.1
1887 tc_min = 0.1
1888
1888
1889 try:
1889 try:
1890 mode = 'eval'
1890 mode = 'eval'
1891 t0 = clock()
1891 t0 = clock()
1892 code = compile(expr,'<timed eval>',mode)
1892 code = compile(expr,'<timed eval>',mode)
1893 tc = clock()-t0
1893 tc = clock()-t0
1894 except SyntaxError:
1894 except SyntaxError:
1895 mode = 'exec'
1895 mode = 'exec'
1896 t0 = clock()
1896 t0 = clock()
1897 code = compile(expr,'<timed exec>',mode)
1897 code = compile(expr,'<timed exec>',mode)
1898 tc = clock()-t0
1898 tc = clock()-t0
1899 # skew measurement as little as possible
1899 # skew measurement as little as possible
1900 glob = self.shell.user_ns
1900 glob = self.shell.user_ns
1901 clk = clock2
1901 clk = clock2
1902 wtime = time.time
1902 wtime = time.time
1903 # time execution
1903 # time execution
1904 wall_st = wtime()
1904 wall_st = wtime()
1905 if mode=='eval':
1905 if mode=='eval':
1906 st = clk()
1906 st = clk()
1907 out = eval(code,glob)
1907 out = eval(code,glob)
1908 end = clk()
1908 end = clk()
1909 else:
1909 else:
1910 st = clk()
1910 st = clk()
1911 exec code in glob
1911 exec code in glob
1912 end = clk()
1912 end = clk()
1913 out = None
1913 out = None
1914 wall_end = wtime()
1914 wall_end = wtime()
1915 # Compute actual times and report
1915 # Compute actual times and report
1916 wall_time = wall_end-wall_st
1916 wall_time = wall_end-wall_st
1917 cpu_user = end[0]-st[0]
1917 cpu_user = end[0]-st[0]
1918 cpu_sys = end[1]-st[1]
1918 cpu_sys = end[1]-st[1]
1919 cpu_tot = cpu_user+cpu_sys
1919 cpu_tot = cpu_user+cpu_sys
1920 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1920 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1921 (cpu_user,cpu_sys,cpu_tot)
1921 (cpu_user,cpu_sys,cpu_tot)
1922 print "Wall time: %.2f s" % wall_time
1922 print "Wall time: %.2f s" % wall_time
1923 if tc > tc_min:
1923 if tc > tc_min:
1924 print "Compiler : %.2f s" % tc
1924 print "Compiler : %.2f s" % tc
1925 return out
1925 return out
1926
1926
1927 @testdec.skip_doctest
1927 @testdec.skip_doctest
1928 def magic_macro(self,parameter_s = ''):
1928 def magic_macro(self,parameter_s = ''):
1929 """Define a set of input lines as a macro for future re-execution.
1929 """Define a set of input lines as a macro for future re-execution.
1930
1930
1931 Usage:\\
1931 Usage:\\
1932 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1932 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1933
1933
1934 Options:
1934 Options:
1935
1935
1936 -r: use 'raw' input. By default, the 'processed' history is used,
1936 -r: use 'raw' input. By default, the 'processed' history is used,
1937 so that magics are loaded in their transformed version to valid
1937 so that magics are loaded in their transformed version to valid
1938 Python. If this option is given, the raw input as typed as the
1938 Python. If this option is given, the raw input as typed as the
1939 command line is used instead.
1939 command line is used instead.
1940
1940
1941 This will define a global variable called `name` which is a string
1941 This will define a global variable called `name` which is a string
1942 made of joining the slices and lines you specify (n1,n2,... numbers
1942 made of joining the slices and lines you specify (n1,n2,... numbers
1943 above) from your input history into a single string. This variable
1943 above) from your input history into a single string. This variable
1944 acts like an automatic function which re-executes those lines as if
1944 acts like an automatic function which re-executes those lines as if
1945 you had typed them. You just type 'name' at the prompt and the code
1945 you had typed them. You just type 'name' at the prompt and the code
1946 executes.
1946 executes.
1947
1947
1948 The notation for indicating number ranges is: n1-n2 means 'use line
1948 The notation for indicating number ranges is: n1-n2 means 'use line
1949 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1949 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1950 using the lines numbered 5,6 and 7.
1950 using the lines numbered 5,6 and 7.
1951
1951
1952 Note: as a 'hidden' feature, you can also use traditional python slice
1952 Note: as a 'hidden' feature, you can also use traditional python slice
1953 notation, where N:M means numbers N through M-1.
1953 notation, where N:M means numbers N through M-1.
1954
1954
1955 For example, if your history contains (%hist prints it):
1955 For example, if your history contains (%hist prints it):
1956
1956
1957 44: x=1
1957 44: x=1
1958 45: y=3
1958 45: y=3
1959 46: z=x+y
1959 46: z=x+y
1960 47: print x
1960 47: print x
1961 48: a=5
1961 48: a=5
1962 49: print 'x',x,'y',y
1962 49: print 'x',x,'y',y
1963
1963
1964 you can create a macro with lines 44 through 47 (included) and line 49
1964 you can create a macro with lines 44 through 47 (included) and line 49
1965 called my_macro with:
1965 called my_macro with:
1966
1966
1967 In [55]: %macro my_macro 44-47 49
1967 In [55]: %macro my_macro 44-47 49
1968
1968
1969 Now, typing `my_macro` (without quotes) will re-execute all this code
1969 Now, typing `my_macro` (without quotes) will re-execute all this code
1970 in one pass.
1970 in one pass.
1971
1971
1972 You don't need to give the line-numbers in order, and any given line
1972 You don't need to give the line-numbers in order, and any given line
1973 number can appear multiple times. You can assemble macros with any
1973 number can appear multiple times. You can assemble macros with any
1974 lines from your input history in any order.
1974 lines from your input history in any order.
1975
1975
1976 The macro is a simple object which holds its value in an attribute,
1976 The macro is a simple object which holds its value in an attribute,
1977 but IPython's display system checks for macros and executes them as
1977 but IPython's display system checks for macros and executes them as
1978 code instead of printing them when you type their name.
1978 code instead of printing them when you type their name.
1979
1979
1980 You can view a macro's contents by explicitly printing it with:
1980 You can view a macro's contents by explicitly printing it with:
1981
1981
1982 'print macro_name'.
1982 'print macro_name'.
1983
1983
1984 For one-off cases which DON'T contain magic function calls in them you
1984 For one-off cases which DON'T contain magic function calls in them you
1985 can obtain similar results by explicitly executing slices from your
1985 can obtain similar results by explicitly executing slices from your
1986 input history with:
1986 input history with:
1987
1987
1988 In [60]: exec In[44:48]+In[49]"""
1988 In [60]: exec In[44:48]+In[49]"""
1989
1989
1990 opts,args = self.parse_options(parameter_s,'r',mode='list')
1990 opts,args = self.parse_options(parameter_s,'r',mode='list')
1991 if not args:
1991 if not args:
1992 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
1992 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
1993 macs.sort()
1993 macs.sort()
1994 return macs
1994 return macs
1995 if len(args) == 1:
1995 if len(args) == 1:
1996 raise UsageError(
1996 raise UsageError(
1997 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1997 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1998 name,ranges = args[0], args[1:]
1998 name,ranges = args[0], args[1:]
1999
1999
2000 #print 'rng',ranges # dbg
2000 #print 'rng',ranges # dbg
2001 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2001 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2002 macro = Macro(lines)
2002 macro = Macro(lines)
2003 self.shell.user_ns.update({name:macro})
2003 self.shell.user_ns.update({name:macro})
2004 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2004 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2005 print 'Macro contents:'
2005 print 'Macro contents:'
2006 print macro,
2006 print macro,
2007
2007
2008 def magic_save(self,parameter_s = ''):
2008 def magic_save(self,parameter_s = ''):
2009 """Save a set of lines to a given filename.
2009 """Save a set of lines to a given filename.
2010
2010
2011 Usage:\\
2011 Usage:\\
2012 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2012 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2013
2013
2014 Options:
2014 Options:
2015
2015
2016 -r: use 'raw' input. By default, the 'processed' history is used,
2016 -r: use 'raw' input. By default, the 'processed' history is used,
2017 so that magics are loaded in their transformed version to valid
2017 so that magics are loaded in their transformed version to valid
2018 Python. If this option is given, the raw input as typed as the
2018 Python. If this option is given, the raw input as typed as the
2019 command line is used instead.
2019 command line is used instead.
2020
2020
2021 This function uses the same syntax as %macro for line extraction, but
2021 This function uses the same syntax as %macro for line extraction, but
2022 instead of creating a macro it saves the resulting string to the
2022 instead of creating a macro it saves the resulting string to the
2023 filename you specify.
2023 filename you specify.
2024
2024
2025 It adds a '.py' extension to the file if you don't do so yourself, and
2025 It adds a '.py' extension to the file if you don't do so yourself, and
2026 it asks for confirmation before overwriting existing files."""
2026 it asks for confirmation before overwriting existing files."""
2027
2027
2028 opts,args = self.parse_options(parameter_s,'r',mode='list')
2028 opts,args = self.parse_options(parameter_s,'r',mode='list')
2029 fname,ranges = args[0], args[1:]
2029 fname,ranges = args[0], args[1:]
2030 if not fname.endswith('.py'):
2030 if not fname.endswith('.py'):
2031 fname += '.py'
2031 fname += '.py'
2032 if os.path.isfile(fname):
2032 if os.path.isfile(fname):
2033 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2033 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2034 if ans.lower() not in ['y','yes']:
2034 if ans.lower() not in ['y','yes']:
2035 print 'Operation cancelled.'
2035 print 'Operation cancelled.'
2036 return
2036 return
2037 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2037 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2038 f = file(fname,'w')
2038 f = file(fname,'w')
2039 f.write(cmds)
2039 f.write(cmds)
2040 f.close()
2040 f.close()
2041 print 'The following commands were written to file `%s`:' % fname
2041 print 'The following commands were written to file `%s`:' % fname
2042 print cmds
2042 print cmds
2043
2043
2044 def _edit_macro(self,mname,macro):
2044 def _edit_macro(self,mname,macro):
2045 """open an editor with the macro data in a file"""
2045 """open an editor with the macro data in a file"""
2046 filename = self.shell.mktempfile(macro.value)
2046 filename = self.shell.mktempfile(macro.value)
2047 self.shell.hooks.editor(filename)
2047 self.shell.hooks.editor(filename)
2048
2048
2049 # and make a new macro object, to replace the old one
2049 # and make a new macro object, to replace the old one
2050 mfile = open(filename)
2050 mfile = open(filename)
2051 mvalue = mfile.read()
2051 mvalue = mfile.read()
2052 mfile.close()
2052 mfile.close()
2053 self.shell.user_ns[mname] = Macro(mvalue)
2053 self.shell.user_ns[mname] = Macro(mvalue)
2054
2054
2055 def magic_ed(self,parameter_s=''):
2055 def magic_ed(self,parameter_s=''):
2056 """Alias to %edit."""
2056 """Alias to %edit."""
2057 return self.magic_edit(parameter_s)
2057 return self.magic_edit(parameter_s)
2058
2058
2059 @testdec.skip_doctest
2059 @testdec.skip_doctest
2060 def magic_edit(self,parameter_s='',last_call=['','']):
2060 def magic_edit(self,parameter_s='',last_call=['','']):
2061 """Bring up an editor and execute the resulting code.
2061 """Bring up an editor and execute the resulting code.
2062
2062
2063 Usage:
2063 Usage:
2064 %edit [options] [args]
2064 %edit [options] [args]
2065
2065
2066 %edit runs IPython's editor hook. The default version of this hook is
2066 %edit runs IPython's editor hook. The default version of this hook is
2067 set to call the __IPYTHON__.rc.editor command. This is read from your
2067 set to call the __IPYTHON__.rc.editor command. This is read from your
2068 environment variable $EDITOR. If this isn't found, it will default to
2068 environment variable $EDITOR. If this isn't found, it will default to
2069 vi under Linux/Unix and to notepad under Windows. See the end of this
2069 vi under Linux/Unix and to notepad under Windows. See the end of this
2070 docstring for how to change the editor hook.
2070 docstring for how to change the editor hook.
2071
2071
2072 You can also set the value of this editor via the command line option
2072 You can also set the value of this editor via the command line option
2073 '-editor' or in your ipythonrc file. This is useful if you wish to use
2073 '-editor' or in your ipythonrc file. This is useful if you wish to use
2074 specifically for IPython an editor different from your typical default
2074 specifically for IPython an editor different from your typical default
2075 (and for Windows users who typically don't set environment variables).
2075 (and for Windows users who typically don't set environment variables).
2076
2076
2077 This command allows you to conveniently edit multi-line code right in
2077 This command allows you to conveniently edit multi-line code right in
2078 your IPython session.
2078 your IPython session.
2079
2079
2080 If called without arguments, %edit opens up an empty editor with a
2080 If called without arguments, %edit opens up an empty editor with a
2081 temporary file and will execute the contents of this file when you
2081 temporary file and will execute the contents of this file when you
2082 close it (don't forget to save it!).
2082 close it (don't forget to save it!).
2083
2083
2084
2084
2085 Options:
2085 Options:
2086
2086
2087 -n <number>: open the editor at a specified line number. By default,
2087 -n <number>: open the editor at a specified line number. By default,
2088 the IPython editor hook uses the unix syntax 'editor +N filename', but
2088 the IPython editor hook uses the unix syntax 'editor +N filename', but
2089 you can configure this by providing your own modified hook if your
2089 you can configure this by providing your own modified hook if your
2090 favorite editor supports line-number specifications with a different
2090 favorite editor supports line-number specifications with a different
2091 syntax.
2091 syntax.
2092
2092
2093 -p: this will call the editor with the same data as the previous time
2093 -p: this will call the editor with the same data as the previous time
2094 it was used, regardless of how long ago (in your current session) it
2094 it was used, regardless of how long ago (in your current session) it
2095 was.
2095 was.
2096
2096
2097 -r: use 'raw' input. This option only applies to input taken from the
2097 -r: use 'raw' input. This option only applies to input taken from the
2098 user's history. By default, the 'processed' history is used, so that
2098 user's history. By default, the 'processed' history is used, so that
2099 magics are loaded in their transformed version to valid Python. If
2099 magics are loaded in their transformed version to valid Python. If
2100 this option is given, the raw input as typed as the command line is
2100 this option is given, the raw input as typed as the command line is
2101 used instead. When you exit the editor, it will be executed by
2101 used instead. When you exit the editor, it will be executed by
2102 IPython's own processor.
2102 IPython's own processor.
2103
2103
2104 -x: do not execute the edited code immediately upon exit. This is
2104 -x: do not execute the edited code immediately upon exit. This is
2105 mainly useful if you are editing programs which need to be called with
2105 mainly useful if you are editing programs which need to be called with
2106 command line arguments, which you can then do using %run.
2106 command line arguments, which you can then do using %run.
2107
2107
2108
2108
2109 Arguments:
2109 Arguments:
2110
2110
2111 If arguments are given, the following possibilites exist:
2111 If arguments are given, the following possibilites exist:
2112
2112
2113 - The arguments are numbers or pairs of colon-separated numbers (like
2113 - The arguments are numbers or pairs of colon-separated numbers (like
2114 1 4:8 9). These are interpreted as lines of previous input to be
2114 1 4:8 9). These are interpreted as lines of previous input to be
2115 loaded into the editor. The syntax is the same of the %macro command.
2115 loaded into the editor. The syntax is the same of the %macro command.
2116
2116
2117 - If the argument doesn't start with a number, it is evaluated as a
2117 - If the argument doesn't start with a number, it is evaluated as a
2118 variable and its contents loaded into the editor. You can thus edit
2118 variable and its contents loaded into the editor. You can thus edit
2119 any string which contains python code (including the result of
2119 any string which contains python code (including the result of
2120 previous edits).
2120 previous edits).
2121
2121
2122 - If the argument is the name of an object (other than a string),
2122 - If the argument is the name of an object (other than a string),
2123 IPython will try to locate the file where it was defined and open the
2123 IPython will try to locate the file where it was defined and open the
2124 editor at the point where it is defined. You can use `%edit function`
2124 editor at the point where it is defined. You can use `%edit function`
2125 to load an editor exactly at the point where 'function' is defined,
2125 to load an editor exactly at the point where 'function' is defined,
2126 edit it and have the file be executed automatically.
2126 edit it and have the file be executed automatically.
2127
2127
2128 If the object is a macro (see %macro for details), this opens up your
2128 If the object is a macro (see %macro for details), this opens up your
2129 specified editor with a temporary file containing the macro's data.
2129 specified editor with a temporary file containing the macro's data.
2130 Upon exit, the macro is reloaded with the contents of the file.
2130 Upon exit, the macro is reloaded with the contents of the file.
2131
2131
2132 Note: opening at an exact line is only supported under Unix, and some
2132 Note: opening at an exact line is only supported under Unix, and some
2133 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2133 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2134 '+NUMBER' parameter necessary for this feature. Good editors like
2134 '+NUMBER' parameter necessary for this feature. Good editors like
2135 (X)Emacs, vi, jed, pico and joe all do.
2135 (X)Emacs, vi, jed, pico and joe all do.
2136
2136
2137 - If the argument is not found as a variable, IPython will look for a
2137 - If the argument is not found as a variable, IPython will look for a
2138 file with that name (adding .py if necessary) and load it into the
2138 file with that name (adding .py if necessary) and load it into the
2139 editor. It will execute its contents with execfile() when you exit,
2139 editor. It will execute its contents with execfile() when you exit,
2140 loading any code in the file into your interactive namespace.
2140 loading any code in the file into your interactive namespace.
2141
2141
2142 After executing your code, %edit will return as output the code you
2142 After executing your code, %edit will return as output the code you
2143 typed in the editor (except when it was an existing file). This way
2143 typed in the editor (except when it was an existing file). This way
2144 you can reload the code in further invocations of %edit as a variable,
2144 you can reload the code in further invocations of %edit as a variable,
2145 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2145 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2146 the output.
2146 the output.
2147
2147
2148 Note that %edit is also available through the alias %ed.
2148 Note that %edit is also available through the alias %ed.
2149
2149
2150 This is an example of creating a simple function inside the editor and
2150 This is an example of creating a simple function inside the editor and
2151 then modifying it. First, start up the editor:
2151 then modifying it. First, start up the editor:
2152
2152
2153 In [1]: ed
2153 In [1]: ed
2154 Editing... done. Executing edited code...
2154 Editing... done. Executing edited code...
2155 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2155 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2156
2156
2157 We can then call the function foo():
2157 We can then call the function foo():
2158
2158
2159 In [2]: foo()
2159 In [2]: foo()
2160 foo() was defined in an editing session
2160 foo() was defined in an editing session
2161
2161
2162 Now we edit foo. IPython automatically loads the editor with the
2162 Now we edit foo. IPython automatically loads the editor with the
2163 (temporary) file where foo() was previously defined:
2163 (temporary) file where foo() was previously defined:
2164
2164
2165 In [3]: ed foo
2165 In [3]: ed foo
2166 Editing... done. Executing edited code...
2166 Editing... done. Executing edited code...
2167
2167
2168 And if we call foo() again we get the modified version:
2168 And if we call foo() again we get the modified version:
2169
2169
2170 In [4]: foo()
2170 In [4]: foo()
2171 foo() has now been changed!
2171 foo() has now been changed!
2172
2172
2173 Here is an example of how to edit a code snippet successive
2173 Here is an example of how to edit a code snippet successive
2174 times. First we call the editor:
2174 times. First we call the editor:
2175
2175
2176 In [5]: ed
2176 In [5]: ed
2177 Editing... done. Executing edited code...
2177 Editing... done. Executing edited code...
2178 hello
2178 hello
2179 Out[5]: "print 'hello'n"
2179 Out[5]: "print 'hello'n"
2180
2180
2181 Now we call it again with the previous output (stored in _):
2181 Now we call it again with the previous output (stored in _):
2182
2182
2183 In [6]: ed _
2183 In [6]: ed _
2184 Editing... done. Executing edited code...
2184 Editing... done. Executing edited code...
2185 hello world
2185 hello world
2186 Out[6]: "print 'hello world'n"
2186 Out[6]: "print 'hello world'n"
2187
2187
2188 Now we call it with the output #8 (stored in _8, also as Out[8]):
2188 Now we call it with the output #8 (stored in _8, also as Out[8]):
2189
2189
2190 In [7]: ed _8
2190 In [7]: ed _8
2191 Editing... done. Executing edited code...
2191 Editing... done. Executing edited code...
2192 hello again
2192 hello again
2193 Out[7]: "print 'hello again'n"
2193 Out[7]: "print 'hello again'n"
2194
2194
2195
2195
2196 Changing the default editor hook:
2196 Changing the default editor hook:
2197
2197
2198 If you wish to write your own editor hook, you can put it in a
2198 If you wish to write your own editor hook, you can put it in a
2199 configuration file which you load at startup time. The default hook
2199 configuration file which you load at startup time. The default hook
2200 is defined in the IPython.hooks module, and you can use that as a
2200 is defined in the IPython.hooks module, and you can use that as a
2201 starting example for further modifications. That file also has
2201 starting example for further modifications. That file also has
2202 general instructions on how to set a new hook for use once you've
2202 general instructions on how to set a new hook for use once you've
2203 defined it."""
2203 defined it."""
2204
2204
2205 # FIXME: This function has become a convoluted mess. It needs a
2205 # FIXME: This function has become a convoluted mess. It needs a
2206 # ground-up rewrite with clean, simple logic.
2206 # ground-up rewrite with clean, simple logic.
2207
2207
2208 def make_filename(arg):
2208 def make_filename(arg):
2209 "Make a filename from the given args"
2209 "Make a filename from the given args"
2210 try:
2210 try:
2211 filename = get_py_filename(arg)
2211 filename = get_py_filename(arg)
2212 except IOError:
2212 except IOError:
2213 if args.endswith('.py'):
2213 if args.endswith('.py'):
2214 filename = arg
2214 filename = arg
2215 else:
2215 else:
2216 filename = None
2216 filename = None
2217 return filename
2217 return filename
2218
2218
2219 # custom exceptions
2219 # custom exceptions
2220 class DataIsObject(Exception): pass
2220 class DataIsObject(Exception): pass
2221
2221
2222 opts,args = self.parse_options(parameter_s,'prxn:')
2222 opts,args = self.parse_options(parameter_s,'prxn:')
2223 # Set a few locals from the options for convenience:
2223 # Set a few locals from the options for convenience:
2224 opts_p = opts.has_key('p')
2224 opts_p = opts.has_key('p')
2225 opts_r = opts.has_key('r')
2225 opts_r = opts.has_key('r')
2226
2226
2227 # Default line number value
2227 # Default line number value
2228 lineno = opts.get('n',None)
2228 lineno = opts.get('n',None)
2229
2229
2230 if opts_p:
2230 if opts_p:
2231 args = '_%s' % last_call[0]
2231 args = '_%s' % last_call[0]
2232 if not self.shell.user_ns.has_key(args):
2232 if not self.shell.user_ns.has_key(args):
2233 args = last_call[1]
2233 args = last_call[1]
2234
2234
2235 # use last_call to remember the state of the previous call, but don't
2235 # use last_call to remember the state of the previous call, but don't
2236 # let it be clobbered by successive '-p' calls.
2236 # let it be clobbered by successive '-p' calls.
2237 try:
2237 try:
2238 last_call[0] = self.shell.outputcache.prompt_count
2238 last_call[0] = self.shell.outputcache.prompt_count
2239 if not opts_p:
2239 if not opts_p:
2240 last_call[1] = parameter_s
2240 last_call[1] = parameter_s
2241 except:
2241 except:
2242 pass
2242 pass
2243
2243
2244 # by default this is done with temp files, except when the given
2244 # by default this is done with temp files, except when the given
2245 # arg is a filename
2245 # arg is a filename
2246 use_temp = 1
2246 use_temp = 1
2247
2247
2248 if re.match(r'\d',args):
2248 if re.match(r'\d',args):
2249 # Mode where user specifies ranges of lines, like in %macro.
2249 # Mode where user specifies ranges of lines, like in %macro.
2250 # This means that you can't edit files whose names begin with
2250 # This means that you can't edit files whose names begin with
2251 # numbers this way. Tough.
2251 # numbers this way. Tough.
2252 ranges = args.split()
2252 ranges = args.split()
2253 data = ''.join(self.extract_input_slices(ranges,opts_r))
2253 data = ''.join(self.extract_input_slices(ranges,opts_r))
2254 elif args.endswith('.py'):
2254 elif args.endswith('.py'):
2255 filename = make_filename(args)
2255 filename = make_filename(args)
2256 data = ''
2256 data = ''
2257 use_temp = 0
2257 use_temp = 0
2258 elif args:
2258 elif args:
2259 try:
2259 try:
2260 # Load the parameter given as a variable. If not a string,
2260 # Load the parameter given as a variable. If not a string,
2261 # process it as an object instead (below)
2261 # process it as an object instead (below)
2262
2262
2263 #print '*** args',args,'type',type(args) # dbg
2263 #print '*** args',args,'type',type(args) # dbg
2264 data = eval(args,self.shell.user_ns)
2264 data = eval(args,self.shell.user_ns)
2265 if not type(data) in StringTypes:
2265 if not type(data) in StringTypes:
2266 raise DataIsObject
2266 raise DataIsObject
2267
2267
2268 except (NameError,SyntaxError):
2268 except (NameError,SyntaxError):
2269 # given argument is not a variable, try as a filename
2269 # given argument is not a variable, try as a filename
2270 filename = make_filename(args)
2270 filename = make_filename(args)
2271 if filename is None:
2271 if filename is None:
2272 warn("Argument given (%s) can't be found as a variable "
2272 warn("Argument given (%s) can't be found as a variable "
2273 "or as a filename." % args)
2273 "or as a filename." % args)
2274 return
2274 return
2275
2275
2276 data = ''
2276 data = ''
2277 use_temp = 0
2277 use_temp = 0
2278 except DataIsObject:
2278 except DataIsObject:
2279
2279
2280 # macros have a special edit function
2280 # macros have a special edit function
2281 if isinstance(data,Macro):
2281 if isinstance(data,Macro):
2282 self._edit_macro(args,data)
2282 self._edit_macro(args,data)
2283 return
2283 return
2284
2284
2285 # For objects, try to edit the file where they are defined
2285 # For objects, try to edit the file where they are defined
2286 try:
2286 try:
2287 filename = inspect.getabsfile(data)
2287 filename = inspect.getabsfile(data)
2288 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2288 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2289 # class created by %edit? Try to find source
2289 # class created by %edit? Try to find source
2290 # by looking for method definitions instead, the
2290 # by looking for method definitions instead, the
2291 # __module__ in those classes is FakeModule.
2291 # __module__ in those classes is FakeModule.
2292 attrs = [getattr(data, aname) for aname in dir(data)]
2292 attrs = [getattr(data, aname) for aname in dir(data)]
2293 for attr in attrs:
2293 for attr in attrs:
2294 if not inspect.ismethod(attr):
2294 if not inspect.ismethod(attr):
2295 continue
2295 continue
2296 filename = inspect.getabsfile(attr)
2296 filename = inspect.getabsfile(attr)
2297 if filename and 'fakemodule' not in filename.lower():
2297 if filename and 'fakemodule' not in filename.lower():
2298 # change the attribute to be the edit target instead
2298 # change the attribute to be the edit target instead
2299 data = attr
2299 data = attr
2300 break
2300 break
2301
2301
2302 datafile = 1
2302 datafile = 1
2303 except TypeError:
2303 except TypeError:
2304 filename = make_filename(args)
2304 filename = make_filename(args)
2305 datafile = 1
2305 datafile = 1
2306 warn('Could not find file where `%s` is defined.\n'
2306 warn('Could not find file where `%s` is defined.\n'
2307 'Opening a file named `%s`' % (args,filename))
2307 'Opening a file named `%s`' % (args,filename))
2308 # Now, make sure we can actually read the source (if it was in
2308 # Now, make sure we can actually read the source (if it was in
2309 # a temp file it's gone by now).
2309 # a temp file it's gone by now).
2310 if datafile:
2310 if datafile:
2311 try:
2311 try:
2312 if lineno is None:
2312 if lineno is None:
2313 lineno = inspect.getsourcelines(data)[1]
2313 lineno = inspect.getsourcelines(data)[1]
2314 except IOError:
2314 except IOError:
2315 filename = make_filename(args)
2315 filename = make_filename(args)
2316 if filename is None:
2316 if filename is None:
2317 warn('The file `%s` where `%s` was defined cannot '
2317 warn('The file `%s` where `%s` was defined cannot '
2318 'be read.' % (filename,data))
2318 'be read.' % (filename,data))
2319 return
2319 return
2320 use_temp = 0
2320 use_temp = 0
2321 else:
2321 else:
2322 data = ''
2322 data = ''
2323
2323
2324 if use_temp:
2324 if use_temp:
2325 filename = self.shell.mktempfile(data)
2325 filename = self.shell.mktempfile(data)
2326 print 'IPython will make a temporary file named:',filename
2326 print 'IPython will make a temporary file named:',filename
2327
2327
2328 # do actual editing here
2328 # do actual editing here
2329 print 'Editing...',
2329 print 'Editing...',
2330 sys.stdout.flush()
2330 sys.stdout.flush()
2331 self.shell.hooks.editor(filename,lineno)
2331 self.shell.hooks.editor(filename,lineno)
2332
2333 # XXX TODO: should this be generalized for all string vars?
2334 # For now, this is special-cased to blocks created by cpaste
2335 if args.strip() == 'pasted_block':
2336 self.shell.user_ns['pasted_block'] = file_read(filename)
2337
2332 if opts.has_key('x'): # -x prevents actual execution
2338 if opts.has_key('x'): # -x prevents actual execution
2333 print
2339 print
2334 else:
2340 else:
2335 print 'done. Executing edited code...'
2341 print 'done. Executing edited code...'
2336 if opts_r:
2342 if opts_r:
2337 self.shell.runlines(file_read(filename))
2343 self.shell.runlines(file_read(filename))
2338 else:
2344 else:
2339 self.shell.safe_execfile(filename,self.shell.user_ns,
2345 self.shell.safe_execfile(filename,self.shell.user_ns,
2340 self.shell.user_ns)
2346 self.shell.user_ns)
2347
2348
2341 if use_temp:
2349 if use_temp:
2342 try:
2350 try:
2343 return open(filename).read()
2351 return open(filename).read()
2344 except IOError,msg:
2352 except IOError,msg:
2345 if msg.filename == filename:
2353 if msg.filename == filename:
2346 warn('File not found. Did you forget to save?')
2354 warn('File not found. Did you forget to save?')
2347 return
2355 return
2348 else:
2356 else:
2349 self.shell.showtraceback()
2357 self.shell.showtraceback()
2350
2358
2351 def magic_xmode(self,parameter_s = ''):
2359 def magic_xmode(self,parameter_s = ''):
2352 """Switch modes for the exception handlers.
2360 """Switch modes for the exception handlers.
2353
2361
2354 Valid modes: Plain, Context and Verbose.
2362 Valid modes: Plain, Context and Verbose.
2355
2363
2356 If called without arguments, acts as a toggle."""
2364 If called without arguments, acts as a toggle."""
2357
2365
2358 def xmode_switch_err(name):
2366 def xmode_switch_err(name):
2359 warn('Error changing %s exception modes.\n%s' %
2367 warn('Error changing %s exception modes.\n%s' %
2360 (name,sys.exc_info()[1]))
2368 (name,sys.exc_info()[1]))
2361
2369
2362 shell = self.shell
2370 shell = self.shell
2363 new_mode = parameter_s.strip().capitalize()
2371 new_mode = parameter_s.strip().capitalize()
2364 try:
2372 try:
2365 shell.InteractiveTB.set_mode(mode=new_mode)
2373 shell.InteractiveTB.set_mode(mode=new_mode)
2366 print 'Exception reporting mode:',shell.InteractiveTB.mode
2374 print 'Exception reporting mode:',shell.InteractiveTB.mode
2367 except:
2375 except:
2368 xmode_switch_err('user')
2376 xmode_switch_err('user')
2369
2377
2370 # threaded shells use a special handler in sys.excepthook
2378 # threaded shells use a special handler in sys.excepthook
2371 if shell.isthreaded:
2379 if shell.isthreaded:
2372 try:
2380 try:
2373 shell.sys_excepthook.set_mode(mode=new_mode)
2381 shell.sys_excepthook.set_mode(mode=new_mode)
2374 except:
2382 except:
2375 xmode_switch_err('threaded')
2383 xmode_switch_err('threaded')
2376
2384
2377 def magic_colors(self,parameter_s = ''):
2385 def magic_colors(self,parameter_s = ''):
2378 """Switch color scheme for prompts, info system and exception handlers.
2386 """Switch color scheme for prompts, info system and exception handlers.
2379
2387
2380 Currently implemented schemes: NoColor, Linux, LightBG.
2388 Currently implemented schemes: NoColor, Linux, LightBG.
2381
2389
2382 Color scheme names are not case-sensitive."""
2390 Color scheme names are not case-sensitive."""
2383
2391
2384 def color_switch_err(name):
2392 def color_switch_err(name):
2385 warn('Error changing %s color schemes.\n%s' %
2393 warn('Error changing %s color schemes.\n%s' %
2386 (name,sys.exc_info()[1]))
2394 (name,sys.exc_info()[1]))
2387
2395
2388
2396
2389 new_scheme = parameter_s.strip()
2397 new_scheme = parameter_s.strip()
2390 if not new_scheme:
2398 if not new_scheme:
2391 raise UsageError(
2399 raise UsageError(
2392 "%colors: you must specify a color scheme. See '%colors?'")
2400 "%colors: you must specify a color scheme. See '%colors?'")
2393 return
2401 return
2394 # local shortcut
2402 # local shortcut
2395 shell = self.shell
2403 shell = self.shell
2396
2404
2397 import IPython.rlineimpl as readline
2405 import IPython.rlineimpl as readline
2398
2406
2399 if not readline.have_readline and sys.platform == "win32":
2407 if not readline.have_readline and sys.platform == "win32":
2400 msg = """\
2408 msg = """\
2401 Proper color support under MS Windows requires the pyreadline library.
2409 Proper color support under MS Windows requires the pyreadline library.
2402 You can find it at:
2410 You can find it at:
2403 http://ipython.scipy.org/moin/PyReadline/Intro
2411 http://ipython.scipy.org/moin/PyReadline/Intro
2404 Gary's readline needs the ctypes module, from:
2412 Gary's readline needs the ctypes module, from:
2405 http://starship.python.net/crew/theller/ctypes
2413 http://starship.python.net/crew/theller/ctypes
2406 (Note that ctypes is already part of Python versions 2.5 and newer).
2414 (Note that ctypes is already part of Python versions 2.5 and newer).
2407
2415
2408 Defaulting color scheme to 'NoColor'"""
2416 Defaulting color scheme to 'NoColor'"""
2409 new_scheme = 'NoColor'
2417 new_scheme = 'NoColor'
2410 warn(msg)
2418 warn(msg)
2411
2419
2412 # readline option is 0
2420 # readline option is 0
2413 if not shell.has_readline:
2421 if not shell.has_readline:
2414 new_scheme = 'NoColor'
2422 new_scheme = 'NoColor'
2415
2423
2416 # Set prompt colors
2424 # Set prompt colors
2417 try:
2425 try:
2418 shell.outputcache.set_colors(new_scheme)
2426 shell.outputcache.set_colors(new_scheme)
2419 except:
2427 except:
2420 color_switch_err('prompt')
2428 color_switch_err('prompt')
2421 else:
2429 else:
2422 shell.rc.colors = \
2430 shell.rc.colors = \
2423 shell.outputcache.color_table.active_scheme_name
2431 shell.outputcache.color_table.active_scheme_name
2424 # Set exception colors
2432 # Set exception colors
2425 try:
2433 try:
2426 shell.InteractiveTB.set_colors(scheme = new_scheme)
2434 shell.InteractiveTB.set_colors(scheme = new_scheme)
2427 shell.SyntaxTB.set_colors(scheme = new_scheme)
2435 shell.SyntaxTB.set_colors(scheme = new_scheme)
2428 except:
2436 except:
2429 color_switch_err('exception')
2437 color_switch_err('exception')
2430
2438
2431 # threaded shells use a verbose traceback in sys.excepthook
2439 # threaded shells use a verbose traceback in sys.excepthook
2432 if shell.isthreaded:
2440 if shell.isthreaded:
2433 try:
2441 try:
2434 shell.sys_excepthook.set_colors(scheme=new_scheme)
2442 shell.sys_excepthook.set_colors(scheme=new_scheme)
2435 except:
2443 except:
2436 color_switch_err('system exception handler')
2444 color_switch_err('system exception handler')
2437
2445
2438 # Set info (for 'object?') colors
2446 # Set info (for 'object?') colors
2439 if shell.rc.color_info:
2447 if shell.rc.color_info:
2440 try:
2448 try:
2441 shell.inspector.set_active_scheme(new_scheme)
2449 shell.inspector.set_active_scheme(new_scheme)
2442 except:
2450 except:
2443 color_switch_err('object inspector')
2451 color_switch_err('object inspector')
2444 else:
2452 else:
2445 shell.inspector.set_active_scheme('NoColor')
2453 shell.inspector.set_active_scheme('NoColor')
2446
2454
2447 def magic_color_info(self,parameter_s = ''):
2455 def magic_color_info(self,parameter_s = ''):
2448 """Toggle color_info.
2456 """Toggle color_info.
2449
2457
2450 The color_info configuration parameter controls whether colors are
2458 The color_info configuration parameter controls whether colors are
2451 used for displaying object details (by things like %psource, %pfile or
2459 used for displaying object details (by things like %psource, %pfile or
2452 the '?' system). This function toggles this value with each call.
2460 the '?' system). This function toggles this value with each call.
2453
2461
2454 Note that unless you have a fairly recent pager (less works better
2462 Note that unless you have a fairly recent pager (less works better
2455 than more) in your system, using colored object information displays
2463 than more) in your system, using colored object information displays
2456 will not work properly. Test it and see."""
2464 will not work properly. Test it and see."""
2457
2465
2458 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2466 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2459 self.magic_colors(self.shell.rc.colors)
2467 self.magic_colors(self.shell.rc.colors)
2460 print 'Object introspection functions have now coloring:',
2468 print 'Object introspection functions have now coloring:',
2461 print ['OFF','ON'][self.shell.rc.color_info]
2469 print ['OFF','ON'][self.shell.rc.color_info]
2462
2470
2463 def magic_Pprint(self, parameter_s=''):
2471 def magic_Pprint(self, parameter_s=''):
2464 """Toggle pretty printing on/off."""
2472 """Toggle pretty printing on/off."""
2465
2473
2466 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2474 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2467 print 'Pretty printing has been turned', \
2475 print 'Pretty printing has been turned', \
2468 ['OFF','ON'][self.shell.rc.pprint]
2476 ['OFF','ON'][self.shell.rc.pprint]
2469
2477
2470 def magic_exit(self, parameter_s=''):
2478 def magic_exit(self, parameter_s=''):
2471 """Exit IPython, confirming if configured to do so.
2479 """Exit IPython, confirming if configured to do so.
2472
2480
2473 You can configure whether IPython asks for confirmation upon exit by
2481 You can configure whether IPython asks for confirmation upon exit by
2474 setting the confirm_exit flag in the ipythonrc file."""
2482 setting the confirm_exit flag in the ipythonrc file."""
2475
2483
2476 self.shell.exit()
2484 self.shell.exit()
2477
2485
2478 def magic_quit(self, parameter_s=''):
2486 def magic_quit(self, parameter_s=''):
2479 """Exit IPython, confirming if configured to do so (like %exit)"""
2487 """Exit IPython, confirming if configured to do so (like %exit)"""
2480
2488
2481 self.shell.exit()
2489 self.shell.exit()
2482
2490
2483 def magic_Exit(self, parameter_s=''):
2491 def magic_Exit(self, parameter_s=''):
2484 """Exit IPython without confirmation."""
2492 """Exit IPython without confirmation."""
2485
2493
2486 self.shell.ask_exit()
2494 self.shell.ask_exit()
2487
2495
2488 #......................................................................
2496 #......................................................................
2489 # Functions to implement unix shell-type things
2497 # Functions to implement unix shell-type things
2490
2498
2491 @testdec.skip_doctest
2499 @testdec.skip_doctest
2492 def magic_alias(self, parameter_s = ''):
2500 def magic_alias(self, parameter_s = ''):
2493 """Define an alias for a system command.
2501 """Define an alias for a system command.
2494
2502
2495 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2503 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2496
2504
2497 Then, typing 'alias_name params' will execute the system command 'cmd
2505 Then, typing 'alias_name params' will execute the system command 'cmd
2498 params' (from your underlying operating system).
2506 params' (from your underlying operating system).
2499
2507
2500 Aliases have lower precedence than magic functions and Python normal
2508 Aliases have lower precedence than magic functions and Python normal
2501 variables, so if 'foo' is both a Python variable and an alias, the
2509 variables, so if 'foo' is both a Python variable and an alias, the
2502 alias can not be executed until 'del foo' removes the Python variable.
2510 alias can not be executed until 'del foo' removes the Python variable.
2503
2511
2504 You can use the %l specifier in an alias definition to represent the
2512 You can use the %l specifier in an alias definition to represent the
2505 whole line when the alias is called. For example:
2513 whole line when the alias is called. For example:
2506
2514
2507 In [2]: alias all echo "Input in brackets: <%l>"
2515 In [2]: alias all echo "Input in brackets: <%l>"
2508 In [3]: all hello world
2516 In [3]: all hello world
2509 Input in brackets: <hello world>
2517 Input in brackets: <hello world>
2510
2518
2511 You can also define aliases with parameters using %s specifiers (one
2519 You can also define aliases with parameters using %s specifiers (one
2512 per parameter):
2520 per parameter):
2513
2521
2514 In [1]: alias parts echo first %s second %s
2522 In [1]: alias parts echo first %s second %s
2515 In [2]: %parts A B
2523 In [2]: %parts A B
2516 first A second B
2524 first A second B
2517 In [3]: %parts A
2525 In [3]: %parts A
2518 Incorrect number of arguments: 2 expected.
2526 Incorrect number of arguments: 2 expected.
2519 parts is an alias to: 'echo first %s second %s'
2527 parts is an alias to: 'echo first %s second %s'
2520
2528
2521 Note that %l and %s are mutually exclusive. You can only use one or
2529 Note that %l and %s are mutually exclusive. You can only use one or
2522 the other in your aliases.
2530 the other in your aliases.
2523
2531
2524 Aliases expand Python variables just like system calls using ! or !!
2532 Aliases expand Python variables just like system calls using ! or !!
2525 do: all expressions prefixed with '$' get expanded. For details of
2533 do: all expressions prefixed with '$' get expanded. For details of
2526 the semantic rules, see PEP-215:
2534 the semantic rules, see PEP-215:
2527 http://www.python.org/peps/pep-0215.html. This is the library used by
2535 http://www.python.org/peps/pep-0215.html. This is the library used by
2528 IPython for variable expansion. If you want to access a true shell
2536 IPython for variable expansion. If you want to access a true shell
2529 variable, an extra $ is necessary to prevent its expansion by IPython:
2537 variable, an extra $ is necessary to prevent its expansion by IPython:
2530
2538
2531 In [6]: alias show echo
2539 In [6]: alias show echo
2532 In [7]: PATH='A Python string'
2540 In [7]: PATH='A Python string'
2533 In [8]: show $PATH
2541 In [8]: show $PATH
2534 A Python string
2542 A Python string
2535 In [9]: show $$PATH
2543 In [9]: show $$PATH
2536 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2544 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2537
2545
2538 You can use the alias facility to acess all of $PATH. See the %rehash
2546 You can use the alias facility to acess all of $PATH. See the %rehash
2539 and %rehashx functions, which automatically create aliases for the
2547 and %rehashx functions, which automatically create aliases for the
2540 contents of your $PATH.
2548 contents of your $PATH.
2541
2549
2542 If called with no parameters, %alias prints the current alias table."""
2550 If called with no parameters, %alias prints the current alias table."""
2543
2551
2544 par = parameter_s.strip()
2552 par = parameter_s.strip()
2545 if not par:
2553 if not par:
2546 stored = self.db.get('stored_aliases', {} )
2554 stored = self.db.get('stored_aliases', {} )
2547 atab = self.shell.alias_table
2555 atab = self.shell.alias_table
2548 aliases = atab.keys()
2556 aliases = atab.keys()
2549 aliases.sort()
2557 aliases.sort()
2550 res = []
2558 res = []
2551 showlast = []
2559 showlast = []
2552 for alias in aliases:
2560 for alias in aliases:
2553 special = False
2561 special = False
2554 try:
2562 try:
2555 tgt = atab[alias][1]
2563 tgt = atab[alias][1]
2556 except (TypeError, AttributeError):
2564 except (TypeError, AttributeError):
2557 # unsubscriptable? probably a callable
2565 # unsubscriptable? probably a callable
2558 tgt = atab[alias]
2566 tgt = atab[alias]
2559 special = True
2567 special = True
2560 # 'interesting' aliases
2568 # 'interesting' aliases
2561 if (alias in stored or
2569 if (alias in stored or
2562 special or
2570 special or
2563 alias.lower() != os.path.splitext(tgt)[0].lower() or
2571 alias.lower() != os.path.splitext(tgt)[0].lower() or
2564 ' ' in tgt):
2572 ' ' in tgt):
2565 showlast.append((alias, tgt))
2573 showlast.append((alias, tgt))
2566 else:
2574 else:
2567 res.append((alias, tgt ))
2575 res.append((alias, tgt ))
2568
2576
2569 # show most interesting aliases last
2577 # show most interesting aliases last
2570 res.extend(showlast)
2578 res.extend(showlast)
2571 print "Total number of aliases:",len(aliases)
2579 print "Total number of aliases:",len(aliases)
2572 return res
2580 return res
2573 try:
2581 try:
2574 alias,cmd = par.split(None,1)
2582 alias,cmd = par.split(None,1)
2575 except:
2583 except:
2576 print OInspect.getdoc(self.magic_alias)
2584 print OInspect.getdoc(self.magic_alias)
2577 else:
2585 else:
2578 nargs = cmd.count('%s')
2586 nargs = cmd.count('%s')
2579 if nargs>0 and cmd.find('%l')>=0:
2587 if nargs>0 and cmd.find('%l')>=0:
2580 error('The %s and %l specifiers are mutually exclusive '
2588 error('The %s and %l specifiers are mutually exclusive '
2581 'in alias definitions.')
2589 'in alias definitions.')
2582 else: # all looks OK
2590 else: # all looks OK
2583 self.shell.alias_table[alias] = (nargs,cmd)
2591 self.shell.alias_table[alias] = (nargs,cmd)
2584 self.shell.alias_table_validate(verbose=0)
2592 self.shell.alias_table_validate(verbose=0)
2585 # end magic_alias
2593 # end magic_alias
2586
2594
2587 def magic_unalias(self, parameter_s = ''):
2595 def magic_unalias(self, parameter_s = ''):
2588 """Remove an alias"""
2596 """Remove an alias"""
2589
2597
2590 aname = parameter_s.strip()
2598 aname = parameter_s.strip()
2591 if aname in self.shell.alias_table:
2599 if aname in self.shell.alias_table:
2592 del self.shell.alias_table[aname]
2600 del self.shell.alias_table[aname]
2593 stored = self.db.get('stored_aliases', {} )
2601 stored = self.db.get('stored_aliases', {} )
2594 if aname in stored:
2602 if aname in stored:
2595 print "Removing %stored alias",aname
2603 print "Removing %stored alias",aname
2596 del stored[aname]
2604 del stored[aname]
2597 self.db['stored_aliases'] = stored
2605 self.db['stored_aliases'] = stored
2598
2606
2599
2607
2600 def magic_rehashx(self, parameter_s = ''):
2608 def magic_rehashx(self, parameter_s = ''):
2601 """Update the alias table with all executable files in $PATH.
2609 """Update the alias table with all executable files in $PATH.
2602
2610
2603 This version explicitly checks that every entry in $PATH is a file
2611 This version explicitly checks that every entry in $PATH is a file
2604 with execute access (os.X_OK), so it is much slower than %rehash.
2612 with execute access (os.X_OK), so it is much slower than %rehash.
2605
2613
2606 Under Windows, it checks executability as a match agains a
2614 Under Windows, it checks executability as a match agains a
2607 '|'-separated string of extensions, stored in the IPython config
2615 '|'-separated string of extensions, stored in the IPython config
2608 variable win_exec_ext. This defaults to 'exe|com|bat'.
2616 variable win_exec_ext. This defaults to 'exe|com|bat'.
2609
2617
2610 This function also resets the root module cache of module completer,
2618 This function also resets the root module cache of module completer,
2611 used on slow filesystems.
2619 used on slow filesystems.
2612 """
2620 """
2613
2621
2614
2622
2615 ip = self.api
2623 ip = self.api
2616
2624
2617 # for the benefit of module completer in ipy_completers.py
2625 # for the benefit of module completer in ipy_completers.py
2618 del ip.db['rootmodules']
2626 del ip.db['rootmodules']
2619
2627
2620 path = [os.path.abspath(os.path.expanduser(p)) for p in
2628 path = [os.path.abspath(os.path.expanduser(p)) for p in
2621 os.environ.get('PATH','').split(os.pathsep)]
2629 os.environ.get('PATH','').split(os.pathsep)]
2622 path = filter(os.path.isdir,path)
2630 path = filter(os.path.isdir,path)
2623
2631
2624 alias_table = self.shell.alias_table
2632 alias_table = self.shell.alias_table
2625 syscmdlist = []
2633 syscmdlist = []
2626 if os.name == 'posix':
2634 if os.name == 'posix':
2627 isexec = lambda fname:os.path.isfile(fname) and \
2635 isexec = lambda fname:os.path.isfile(fname) and \
2628 os.access(fname,os.X_OK)
2636 os.access(fname,os.X_OK)
2629 else:
2637 else:
2630
2638
2631 try:
2639 try:
2632 winext = os.environ['pathext'].replace(';','|').replace('.','')
2640 winext = os.environ['pathext'].replace(';','|').replace('.','')
2633 except KeyError:
2641 except KeyError:
2634 winext = 'exe|com|bat|py'
2642 winext = 'exe|com|bat|py'
2635 if 'py' not in winext:
2643 if 'py' not in winext:
2636 winext += '|py'
2644 winext += '|py'
2637 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2645 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2638 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2646 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2639 savedir = os.getcwd()
2647 savedir = os.getcwd()
2640 try:
2648 try:
2641 # write the whole loop for posix/Windows so we don't have an if in
2649 # write the whole loop for posix/Windows so we don't have an if in
2642 # the innermost part
2650 # the innermost part
2643 if os.name == 'posix':
2651 if os.name == 'posix':
2644 for pdir in path:
2652 for pdir in path:
2645 os.chdir(pdir)
2653 os.chdir(pdir)
2646 for ff in os.listdir(pdir):
2654 for ff in os.listdir(pdir):
2647 if isexec(ff) and ff not in self.shell.no_alias:
2655 if isexec(ff) and ff not in self.shell.no_alias:
2648 # each entry in the alias table must be (N,name),
2656 # each entry in the alias table must be (N,name),
2649 # where N is the number of positional arguments of the
2657 # where N is the number of positional arguments of the
2650 # alias.
2658 # alias.
2651 alias_table[ff] = (0,ff)
2659 # Dots will be removed from alias names, since ipython
2660 # assumes names with dots to be python code
2661 alias_table[ff.replace('.','')] = (0,ff)
2652 syscmdlist.append(ff)
2662 syscmdlist.append(ff)
2653 else:
2663 else:
2654 for pdir in path:
2664 for pdir in path:
2655 os.chdir(pdir)
2665 os.chdir(pdir)
2656 for ff in os.listdir(pdir):
2666 for ff in os.listdir(pdir):
2657 base, ext = os.path.splitext(ff)
2667 base, ext = os.path.splitext(ff)
2658 if isexec(ff) and base.lower() not in self.shell.no_alias:
2668 if isexec(ff) and base.lower() not in self.shell.no_alias:
2659 if ext.lower() == '.exe':
2669 if ext.lower() == '.exe':
2660 ff = base
2670 ff = base
2661 alias_table[base.lower()] = (0,ff)
2671 alias_table[base.lower().replace('.','')] = (0,ff)
2662 syscmdlist.append(ff)
2672 syscmdlist.append(ff)
2663 # Make sure the alias table doesn't contain keywords or builtins
2673 # Make sure the alias table doesn't contain keywords or builtins
2664 self.shell.alias_table_validate()
2674 self.shell.alias_table_validate()
2665 # Call again init_auto_alias() so we get 'rm -i' and other
2675 # Call again init_auto_alias() so we get 'rm -i' and other
2666 # modified aliases since %rehashx will probably clobber them
2676 # modified aliases since %rehashx will probably clobber them
2667
2677
2668 # no, we don't want them. if %rehashx clobbers them, good,
2678 # no, we don't want them. if %rehashx clobbers them, good,
2669 # we'll probably get better versions
2679 # we'll probably get better versions
2670 # self.shell.init_auto_alias()
2680 # self.shell.init_auto_alias()
2671 db = ip.db
2681 db = ip.db
2672 db['syscmdlist'] = syscmdlist
2682 db['syscmdlist'] = syscmdlist
2673 finally:
2683 finally:
2674 os.chdir(savedir)
2684 os.chdir(savedir)
2675
2685
2676 def magic_pwd(self, parameter_s = ''):
2686 def magic_pwd(self, parameter_s = ''):
2677 """Return the current working directory path."""
2687 """Return the current working directory path."""
2678 return os.getcwd()
2688 return os.getcwd()
2679
2689
2680 def magic_cd(self, parameter_s=''):
2690 def magic_cd(self, parameter_s=''):
2681 """Change the current working directory.
2691 """Change the current working directory.
2682
2692
2683 This command automatically maintains an internal list of directories
2693 This command automatically maintains an internal list of directories
2684 you visit during your IPython session, in the variable _dh. The
2694 you visit during your IPython session, in the variable _dh. The
2685 command %dhist shows this history nicely formatted. You can also
2695 command %dhist shows this history nicely formatted. You can also
2686 do 'cd -<tab>' to see directory history conveniently.
2696 do 'cd -<tab>' to see directory history conveniently.
2687
2697
2688 Usage:
2698 Usage:
2689
2699
2690 cd 'dir': changes to directory 'dir'.
2700 cd 'dir': changes to directory 'dir'.
2691
2701
2692 cd -: changes to the last visited directory.
2702 cd -: changes to the last visited directory.
2693
2703
2694 cd -<n>: changes to the n-th directory in the directory history.
2704 cd -<n>: changes to the n-th directory in the directory history.
2695
2705
2696 cd --foo: change to directory that matches 'foo' in history
2706 cd --foo: change to directory that matches 'foo' in history
2697
2707
2698 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2708 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2699 (note: cd <bookmark_name> is enough if there is no
2709 (note: cd <bookmark_name> is enough if there is no
2700 directory <bookmark_name>, but a bookmark with the name exists.)
2710 directory <bookmark_name>, but a bookmark with the name exists.)
2701 'cd -b <tab>' allows you to tab-complete bookmark names.
2711 'cd -b <tab>' allows you to tab-complete bookmark names.
2702
2712
2703 Options:
2713 Options:
2704
2714
2705 -q: quiet. Do not print the working directory after the cd command is
2715 -q: quiet. Do not print the working directory after the cd command is
2706 executed. By default IPython's cd command does print this directory,
2716 executed. By default IPython's cd command does print this directory,
2707 since the default prompts do not display path information.
2717 since the default prompts do not display path information.
2708
2718
2709 Note that !cd doesn't work for this purpose because the shell where
2719 Note that !cd doesn't work for this purpose because the shell where
2710 !command runs is immediately discarded after executing 'command'."""
2720 !command runs is immediately discarded after executing 'command'."""
2711
2721
2712 parameter_s = parameter_s.strip()
2722 parameter_s = parameter_s.strip()
2713 #bkms = self.shell.persist.get("bookmarks",{})
2723 #bkms = self.shell.persist.get("bookmarks",{})
2714
2724
2715 oldcwd = os.getcwd()
2725 oldcwd = os.getcwd()
2716 numcd = re.match(r'(-)(\d+)$',parameter_s)
2726 numcd = re.match(r'(-)(\d+)$',parameter_s)
2717 # jump in directory history by number
2727 # jump in directory history by number
2718 if numcd:
2728 if numcd:
2719 nn = int(numcd.group(2))
2729 nn = int(numcd.group(2))
2720 try:
2730 try:
2721 ps = self.shell.user_ns['_dh'][nn]
2731 ps = self.shell.user_ns['_dh'][nn]
2722 except IndexError:
2732 except IndexError:
2723 print 'The requested directory does not exist in history.'
2733 print 'The requested directory does not exist in history.'
2724 return
2734 return
2725 else:
2735 else:
2726 opts = {}
2736 opts = {}
2727 elif parameter_s.startswith('--'):
2737 elif parameter_s.startswith('--'):
2728 ps = None
2738 ps = None
2729 fallback = None
2739 fallback = None
2730 pat = parameter_s[2:]
2740 pat = parameter_s[2:]
2731 dh = self.shell.user_ns['_dh']
2741 dh = self.shell.user_ns['_dh']
2732 # first search only by basename (last component)
2742 # first search only by basename (last component)
2733 for ent in reversed(dh):
2743 for ent in reversed(dh):
2734 if pat in os.path.basename(ent) and os.path.isdir(ent):
2744 if pat in os.path.basename(ent) and os.path.isdir(ent):
2735 ps = ent
2745 ps = ent
2736 break
2746 break
2737
2747
2738 if fallback is None and pat in ent and os.path.isdir(ent):
2748 if fallback is None and pat in ent and os.path.isdir(ent):
2739 fallback = ent
2749 fallback = ent
2740
2750
2741 # if we have no last part match, pick the first full path match
2751 # if we have no last part match, pick the first full path match
2742 if ps is None:
2752 if ps is None:
2743 ps = fallback
2753 ps = fallback
2744
2754
2745 if ps is None:
2755 if ps is None:
2746 print "No matching entry in directory history"
2756 print "No matching entry in directory history"
2747 return
2757 return
2748 else:
2758 else:
2749 opts = {}
2759 opts = {}
2750
2760
2751
2761
2752 else:
2762 else:
2753 #turn all non-space-escaping backslashes to slashes,
2763 #turn all non-space-escaping backslashes to slashes,
2754 # for c:\windows\directory\names\
2764 # for c:\windows\directory\names\
2755 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2765 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2756 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2766 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2757 # jump to previous
2767 # jump to previous
2758 if ps == '-':
2768 if ps == '-':
2759 try:
2769 try:
2760 ps = self.shell.user_ns['_dh'][-2]
2770 ps = self.shell.user_ns['_dh'][-2]
2761 except IndexError:
2771 except IndexError:
2762 raise UsageError('%cd -: No previous directory to change to.')
2772 raise UsageError('%cd -: No previous directory to change to.')
2763 # jump to bookmark if needed
2773 # jump to bookmark if needed
2764 else:
2774 else:
2765 if not os.path.isdir(ps) or opts.has_key('b'):
2775 if not os.path.isdir(ps) or opts.has_key('b'):
2766 bkms = self.db.get('bookmarks', {})
2776 bkms = self.db.get('bookmarks', {})
2767
2777
2768 if bkms.has_key(ps):
2778 if bkms.has_key(ps):
2769 target = bkms[ps]
2779 target = bkms[ps]
2770 print '(bookmark:%s) -> %s' % (ps,target)
2780 print '(bookmark:%s) -> %s' % (ps,target)
2771 ps = target
2781 ps = target
2772 else:
2782 else:
2773 if opts.has_key('b'):
2783 if opts.has_key('b'):
2774 raise UsageError("Bookmark '%s' not found. "
2784 raise UsageError("Bookmark '%s' not found. "
2775 "Use '%%bookmark -l' to see your bookmarks." % ps)
2785 "Use '%%bookmark -l' to see your bookmarks." % ps)
2776
2786
2777 # at this point ps should point to the target dir
2787 # at this point ps should point to the target dir
2778 if ps:
2788 if ps:
2779 try:
2789 try:
2780 os.chdir(os.path.expanduser(ps))
2790 os.chdir(os.path.expanduser(ps))
2781 if self.shell.rc.term_title:
2791 if self.shell.rc.term_title:
2782 #print 'set term title:',self.shell.rc.term_title # dbg
2792 #print 'set term title:',self.shell.rc.term_title # dbg
2783 platutils.set_term_title('IPy ' + abbrev_cwd())
2793 platutils.set_term_title('IPy ' + abbrev_cwd())
2784 except OSError:
2794 except OSError:
2785 print sys.exc_info()[1]
2795 print sys.exc_info()[1]
2786 else:
2796 else:
2787 cwd = os.getcwd()
2797 cwd = os.getcwd()
2788 dhist = self.shell.user_ns['_dh']
2798 dhist = self.shell.user_ns['_dh']
2789 if oldcwd != cwd:
2799 if oldcwd != cwd:
2790 dhist.append(cwd)
2800 dhist.append(cwd)
2791 self.db['dhist'] = compress_dhist(dhist)[-100:]
2801 self.db['dhist'] = compress_dhist(dhist)[-100:]
2792
2802
2793 else:
2803 else:
2794 os.chdir(self.shell.home_dir)
2804 os.chdir(self.shell.home_dir)
2795 if self.shell.rc.term_title:
2805 if self.shell.rc.term_title:
2796 platutils.set_term_title("IPy ~")
2806 platutils.set_term_title("IPy ~")
2797 cwd = os.getcwd()
2807 cwd = os.getcwd()
2798 dhist = self.shell.user_ns['_dh']
2808 dhist = self.shell.user_ns['_dh']
2799
2809
2800 if oldcwd != cwd:
2810 if oldcwd != cwd:
2801 dhist.append(cwd)
2811 dhist.append(cwd)
2802 self.db['dhist'] = compress_dhist(dhist)[-100:]
2812 self.db['dhist'] = compress_dhist(dhist)[-100:]
2803 if not 'q' in opts and self.shell.user_ns['_dh']:
2813 if not 'q' in opts and self.shell.user_ns['_dh']:
2804 print self.shell.user_ns['_dh'][-1]
2814 print self.shell.user_ns['_dh'][-1]
2805
2815
2806
2816
2807 def magic_env(self, parameter_s=''):
2817 def magic_env(self, parameter_s=''):
2808 """List environment variables."""
2818 """List environment variables."""
2809
2819
2810 return os.environ.data
2820 return os.environ.data
2811
2821
2812 def magic_pushd(self, parameter_s=''):
2822 def magic_pushd(self, parameter_s=''):
2813 """Place the current dir on stack and change directory.
2823 """Place the current dir on stack and change directory.
2814
2824
2815 Usage:\\
2825 Usage:\\
2816 %pushd ['dirname']
2826 %pushd ['dirname']
2817 """
2827 """
2818
2828
2819 dir_s = self.shell.dir_stack
2829 dir_s = self.shell.dir_stack
2820 tgt = os.path.expanduser(parameter_s)
2830 tgt = os.path.expanduser(parameter_s)
2821 cwd = os.getcwd().replace(self.home_dir,'~')
2831 cwd = os.getcwd().replace(self.home_dir,'~')
2822 if tgt:
2832 if tgt:
2823 self.magic_cd(parameter_s)
2833 self.magic_cd(parameter_s)
2824 dir_s.insert(0,cwd)
2834 dir_s.insert(0,cwd)
2825 return self.magic_dirs()
2835 return self.magic_dirs()
2826
2836
2827 def magic_popd(self, parameter_s=''):
2837 def magic_popd(self, parameter_s=''):
2828 """Change to directory popped off the top of the stack.
2838 """Change to directory popped off the top of the stack.
2829 """
2839 """
2830 if not self.shell.dir_stack:
2840 if not self.shell.dir_stack:
2831 raise UsageError("%popd on empty stack")
2841 raise UsageError("%popd on empty stack")
2832 top = self.shell.dir_stack.pop(0)
2842 top = self.shell.dir_stack.pop(0)
2833 self.magic_cd(top)
2843 self.magic_cd(top)
2834 print "popd ->",top
2844 print "popd ->",top
2835
2845
2836 def magic_dirs(self, parameter_s=''):
2846 def magic_dirs(self, parameter_s=''):
2837 """Return the current directory stack."""
2847 """Return the current directory stack."""
2838
2848
2839 return self.shell.dir_stack
2849 return self.shell.dir_stack
2840
2850
2841 def magic_dhist(self, parameter_s=''):
2851 def magic_dhist(self, parameter_s=''):
2842 """Print your history of visited directories.
2852 """Print your history of visited directories.
2843
2853
2844 %dhist -> print full history\\
2854 %dhist -> print full history\\
2845 %dhist n -> print last n entries only\\
2855 %dhist n -> print last n entries only\\
2846 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2856 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2847
2857
2848 This history is automatically maintained by the %cd command, and
2858 This history is automatically maintained by the %cd command, and
2849 always available as the global list variable _dh. You can use %cd -<n>
2859 always available as the global list variable _dh. You can use %cd -<n>
2850 to go to directory number <n>.
2860 to go to directory number <n>.
2851
2861
2852 Note that most of time, you should view directory history by entering
2862 Note that most of time, you should view directory history by entering
2853 cd -<TAB>.
2863 cd -<TAB>.
2854
2864
2855 """
2865 """
2856
2866
2857 dh = self.shell.user_ns['_dh']
2867 dh = self.shell.user_ns['_dh']
2858 if parameter_s:
2868 if parameter_s:
2859 try:
2869 try:
2860 args = map(int,parameter_s.split())
2870 args = map(int,parameter_s.split())
2861 except:
2871 except:
2862 self.arg_err(Magic.magic_dhist)
2872 self.arg_err(Magic.magic_dhist)
2863 return
2873 return
2864 if len(args) == 1:
2874 if len(args) == 1:
2865 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2875 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2866 elif len(args) == 2:
2876 elif len(args) == 2:
2867 ini,fin = args
2877 ini,fin = args
2868 else:
2878 else:
2869 self.arg_err(Magic.magic_dhist)
2879 self.arg_err(Magic.magic_dhist)
2870 return
2880 return
2871 else:
2881 else:
2872 ini,fin = 0,len(dh)
2882 ini,fin = 0,len(dh)
2873 nlprint(dh,
2883 nlprint(dh,
2874 header = 'Directory history (kept in _dh)',
2884 header = 'Directory history (kept in _dh)',
2875 start=ini,stop=fin)
2885 start=ini,stop=fin)
2876
2886
2877 @testdec.skip_doctest
2887 @testdec.skip_doctest
2878 def magic_sc(self, parameter_s=''):
2888 def magic_sc(self, parameter_s=''):
2879 """Shell capture - execute a shell command and capture its output.
2889 """Shell capture - execute a shell command and capture its output.
2880
2890
2881 DEPRECATED. Suboptimal, retained for backwards compatibility.
2891 DEPRECATED. Suboptimal, retained for backwards compatibility.
2882
2892
2883 You should use the form 'var = !command' instead. Example:
2893 You should use the form 'var = !command' instead. Example:
2884
2894
2885 "%sc -l myfiles = ls ~" should now be written as
2895 "%sc -l myfiles = ls ~" should now be written as
2886
2896
2887 "myfiles = !ls ~"
2897 "myfiles = !ls ~"
2888
2898
2889 myfiles.s, myfiles.l and myfiles.n still apply as documented
2899 myfiles.s, myfiles.l and myfiles.n still apply as documented
2890 below.
2900 below.
2891
2901
2892 --
2902 --
2893 %sc [options] varname=command
2903 %sc [options] varname=command
2894
2904
2895 IPython will run the given command using commands.getoutput(), and
2905 IPython will run the given command using commands.getoutput(), and
2896 will then update the user's interactive namespace with a variable
2906 will then update the user's interactive namespace with a variable
2897 called varname, containing the value of the call. Your command can
2907 called varname, containing the value of the call. Your command can
2898 contain shell wildcards, pipes, etc.
2908 contain shell wildcards, pipes, etc.
2899
2909
2900 The '=' sign in the syntax is mandatory, and the variable name you
2910 The '=' sign in the syntax is mandatory, and the variable name you
2901 supply must follow Python's standard conventions for valid names.
2911 supply must follow Python's standard conventions for valid names.
2902
2912
2903 (A special format without variable name exists for internal use)
2913 (A special format without variable name exists for internal use)
2904
2914
2905 Options:
2915 Options:
2906
2916
2907 -l: list output. Split the output on newlines into a list before
2917 -l: list output. Split the output on newlines into a list before
2908 assigning it to the given variable. By default the output is stored
2918 assigning it to the given variable. By default the output is stored
2909 as a single string.
2919 as a single string.
2910
2920
2911 -v: verbose. Print the contents of the variable.
2921 -v: verbose. Print the contents of the variable.
2912
2922
2913 In most cases you should not need to split as a list, because the
2923 In most cases you should not need to split as a list, because the
2914 returned value is a special type of string which can automatically
2924 returned value is a special type of string which can automatically
2915 provide its contents either as a list (split on newlines) or as a
2925 provide its contents either as a list (split on newlines) or as a
2916 space-separated string. These are convenient, respectively, either
2926 space-separated string. These are convenient, respectively, either
2917 for sequential processing or to be passed to a shell command.
2927 for sequential processing or to be passed to a shell command.
2918
2928
2919 For example:
2929 For example:
2920
2930
2921 # all-random
2931 # all-random
2922
2932
2923 # Capture into variable a
2933 # Capture into variable a
2924 In [1]: sc a=ls *py
2934 In [1]: sc a=ls *py
2925
2935
2926 # a is a string with embedded newlines
2936 # a is a string with embedded newlines
2927 In [2]: a
2937 In [2]: a
2928 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2938 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2929
2939
2930 # which can be seen as a list:
2940 # which can be seen as a list:
2931 In [3]: a.l
2941 In [3]: a.l
2932 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2942 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2933
2943
2934 # or as a whitespace-separated string:
2944 # or as a whitespace-separated string:
2935 In [4]: a.s
2945 In [4]: a.s
2936 Out[4]: 'setup.py win32_manual_post_install.py'
2946 Out[4]: 'setup.py win32_manual_post_install.py'
2937
2947
2938 # a.s is useful to pass as a single command line:
2948 # a.s is useful to pass as a single command line:
2939 In [5]: !wc -l $a.s
2949 In [5]: !wc -l $a.s
2940 146 setup.py
2950 146 setup.py
2941 130 win32_manual_post_install.py
2951 130 win32_manual_post_install.py
2942 276 total
2952 276 total
2943
2953
2944 # while the list form is useful to loop over:
2954 # while the list form is useful to loop over:
2945 In [6]: for f in a.l:
2955 In [6]: for f in a.l:
2946 ...: !wc -l $f
2956 ...: !wc -l $f
2947 ...:
2957 ...:
2948 146 setup.py
2958 146 setup.py
2949 130 win32_manual_post_install.py
2959 130 win32_manual_post_install.py
2950
2960
2951 Similiarly, the lists returned by the -l option are also special, in
2961 Similiarly, the lists returned by the -l option are also special, in
2952 the sense that you can equally invoke the .s attribute on them to
2962 the sense that you can equally invoke the .s attribute on them to
2953 automatically get a whitespace-separated string from their contents:
2963 automatically get a whitespace-separated string from their contents:
2954
2964
2955 In [7]: sc -l b=ls *py
2965 In [7]: sc -l b=ls *py
2956
2966
2957 In [8]: b
2967 In [8]: b
2958 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2968 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2959
2969
2960 In [9]: b.s
2970 In [9]: b.s
2961 Out[9]: 'setup.py win32_manual_post_install.py'
2971 Out[9]: 'setup.py win32_manual_post_install.py'
2962
2972
2963 In summary, both the lists and strings used for ouptut capture have
2973 In summary, both the lists and strings used for ouptut capture have
2964 the following special attributes:
2974 the following special attributes:
2965
2975
2966 .l (or .list) : value as list.
2976 .l (or .list) : value as list.
2967 .n (or .nlstr): value as newline-separated string.
2977 .n (or .nlstr): value as newline-separated string.
2968 .s (or .spstr): value as space-separated string.
2978 .s (or .spstr): value as space-separated string.
2969 """
2979 """
2970
2980
2971 opts,args = self.parse_options(parameter_s,'lv')
2981 opts,args = self.parse_options(parameter_s,'lv')
2972 # Try to get a variable name and command to run
2982 # Try to get a variable name and command to run
2973 try:
2983 try:
2974 # the variable name must be obtained from the parse_options
2984 # the variable name must be obtained from the parse_options
2975 # output, which uses shlex.split to strip options out.
2985 # output, which uses shlex.split to strip options out.
2976 var,_ = args.split('=',1)
2986 var,_ = args.split('=',1)
2977 var = var.strip()
2987 var = var.strip()
2978 # But the the command has to be extracted from the original input
2988 # But the the command has to be extracted from the original input
2979 # parameter_s, not on what parse_options returns, to avoid the
2989 # parameter_s, not on what parse_options returns, to avoid the
2980 # quote stripping which shlex.split performs on it.
2990 # quote stripping which shlex.split performs on it.
2981 _,cmd = parameter_s.split('=',1)
2991 _,cmd = parameter_s.split('=',1)
2982 except ValueError:
2992 except ValueError:
2983 var,cmd = '',''
2993 var,cmd = '',''
2984 # If all looks ok, proceed
2994 # If all looks ok, proceed
2985 out,err = self.shell.getoutputerror(cmd)
2995 out,err = self.shell.getoutputerror(cmd)
2986 if err:
2996 if err:
2987 print >> Term.cerr,err
2997 print >> Term.cerr,err
2988 if opts.has_key('l'):
2998 if opts.has_key('l'):
2989 out = SList(out.split('\n'))
2999 out = SList(out.split('\n'))
2990 else:
3000 else:
2991 out = LSString(out)
3001 out = LSString(out)
2992 if opts.has_key('v'):
3002 if opts.has_key('v'):
2993 print '%s ==\n%s' % (var,pformat(out))
3003 print '%s ==\n%s' % (var,pformat(out))
2994 if var:
3004 if var:
2995 self.shell.user_ns.update({var:out})
3005 self.shell.user_ns.update({var:out})
2996 else:
3006 else:
2997 return out
3007 return out
2998
3008
2999 def magic_sx(self, parameter_s=''):
3009 def magic_sx(self, parameter_s=''):
3000 """Shell execute - run a shell command and capture its output.
3010 """Shell execute - run a shell command and capture its output.
3001
3011
3002 %sx command
3012 %sx command
3003
3013
3004 IPython will run the given command using commands.getoutput(), and
3014 IPython will run the given command using commands.getoutput(), and
3005 return the result formatted as a list (split on '\\n'). Since the
3015 return the result formatted as a list (split on '\\n'). Since the
3006 output is _returned_, it will be stored in ipython's regular output
3016 output is _returned_, it will be stored in ipython's regular output
3007 cache Out[N] and in the '_N' automatic variables.
3017 cache Out[N] and in the '_N' automatic variables.
3008
3018
3009 Notes:
3019 Notes:
3010
3020
3011 1) If an input line begins with '!!', then %sx is automatically
3021 1) If an input line begins with '!!', then %sx is automatically
3012 invoked. That is, while:
3022 invoked. That is, while:
3013 !ls
3023 !ls
3014 causes ipython to simply issue system('ls'), typing
3024 causes ipython to simply issue system('ls'), typing
3015 !!ls
3025 !!ls
3016 is a shorthand equivalent to:
3026 is a shorthand equivalent to:
3017 %sx ls
3027 %sx ls
3018
3028
3019 2) %sx differs from %sc in that %sx automatically splits into a list,
3029 2) %sx differs from %sc in that %sx automatically splits into a list,
3020 like '%sc -l'. The reason for this is to make it as easy as possible
3030 like '%sc -l'. The reason for this is to make it as easy as possible
3021 to process line-oriented shell output via further python commands.
3031 to process line-oriented shell output via further python commands.
3022 %sc is meant to provide much finer control, but requires more
3032 %sc is meant to provide much finer control, but requires more
3023 typing.
3033 typing.
3024
3034
3025 3) Just like %sc -l, this is a list with special attributes:
3035 3) Just like %sc -l, this is a list with special attributes:
3026
3036
3027 .l (or .list) : value as list.
3037 .l (or .list) : value as list.
3028 .n (or .nlstr): value as newline-separated string.
3038 .n (or .nlstr): value as newline-separated string.
3029 .s (or .spstr): value as whitespace-separated string.
3039 .s (or .spstr): value as whitespace-separated string.
3030
3040
3031 This is very useful when trying to use such lists as arguments to
3041 This is very useful when trying to use such lists as arguments to
3032 system commands."""
3042 system commands."""
3033
3043
3034 if parameter_s:
3044 if parameter_s:
3035 out,err = self.shell.getoutputerror(parameter_s)
3045 out,err = self.shell.getoutputerror(parameter_s)
3036 if err:
3046 if err:
3037 print >> Term.cerr,err
3047 print >> Term.cerr,err
3038 return SList(out.split('\n'))
3048 return SList(out.split('\n'))
3039
3049
3040 def magic_bg(self, parameter_s=''):
3050 def magic_bg(self, parameter_s=''):
3041 """Run a job in the background, in a separate thread.
3051 """Run a job in the background, in a separate thread.
3042
3052
3043 For example,
3053 For example,
3044
3054
3045 %bg myfunc(x,y,z=1)
3055 %bg myfunc(x,y,z=1)
3046
3056
3047 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3057 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3048 execution starts, a message will be printed indicating the job
3058 execution starts, a message will be printed indicating the job
3049 number. If your job number is 5, you can use
3059 number. If your job number is 5, you can use
3050
3060
3051 myvar = jobs.result(5) or myvar = jobs[5].result
3061 myvar = jobs.result(5) or myvar = jobs[5].result
3052
3062
3053 to assign this result to variable 'myvar'.
3063 to assign this result to variable 'myvar'.
3054
3064
3055 IPython has a job manager, accessible via the 'jobs' object. You can
3065 IPython has a job manager, accessible via the 'jobs' object. You can
3056 type jobs? to get more information about it, and use jobs.<TAB> to see
3066 type jobs? to get more information about it, and use jobs.<TAB> to see
3057 its attributes. All attributes not starting with an underscore are
3067 its attributes. All attributes not starting with an underscore are
3058 meant for public use.
3068 meant for public use.
3059
3069
3060 In particular, look at the jobs.new() method, which is used to create
3070 In particular, look at the jobs.new() method, which is used to create
3061 new jobs. This magic %bg function is just a convenience wrapper
3071 new jobs. This magic %bg function is just a convenience wrapper
3062 around jobs.new(), for expression-based jobs. If you want to create a
3072 around jobs.new(), for expression-based jobs. If you want to create a
3063 new job with an explicit function object and arguments, you must call
3073 new job with an explicit function object and arguments, you must call
3064 jobs.new() directly.
3074 jobs.new() directly.
3065
3075
3066 The jobs.new docstring also describes in detail several important
3076 The jobs.new docstring also describes in detail several important
3067 caveats associated with a thread-based model for background job
3077 caveats associated with a thread-based model for background job
3068 execution. Type jobs.new? for details.
3078 execution. Type jobs.new? for details.
3069
3079
3070 You can check the status of all jobs with jobs.status().
3080 You can check the status of all jobs with jobs.status().
3071
3081
3072 The jobs variable is set by IPython into the Python builtin namespace.
3082 The jobs variable is set by IPython into the Python builtin namespace.
3073 If you ever declare a variable named 'jobs', you will shadow this
3083 If you ever declare a variable named 'jobs', you will shadow this
3074 name. You can either delete your global jobs variable to regain
3084 name. You can either delete your global jobs variable to regain
3075 access to the job manager, or make a new name and assign it manually
3085 access to the job manager, or make a new name and assign it manually
3076 to the manager (stored in IPython's namespace). For example, to
3086 to the manager (stored in IPython's namespace). For example, to
3077 assign the job manager to the Jobs name, use:
3087 assign the job manager to the Jobs name, use:
3078
3088
3079 Jobs = __builtins__.jobs"""
3089 Jobs = __builtins__.jobs"""
3080
3090
3081 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3091 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3082
3092
3083 def magic_r(self, parameter_s=''):
3093 def magic_r(self, parameter_s=''):
3084 """Repeat previous input.
3094 """Repeat previous input.
3085
3095
3086 Note: Consider using the more powerfull %rep instead!
3096 Note: Consider using the more powerfull %rep instead!
3087
3097
3088 If given an argument, repeats the previous command which starts with
3098 If given an argument, repeats the previous command which starts with
3089 the same string, otherwise it just repeats the previous input.
3099 the same string, otherwise it just repeats the previous input.
3090
3100
3091 Shell escaped commands (with ! as first character) are not recognized
3101 Shell escaped commands (with ! as first character) are not recognized
3092 by this system, only pure python code and magic commands.
3102 by this system, only pure python code and magic commands.
3093 """
3103 """
3094
3104
3095 start = parameter_s.strip()
3105 start = parameter_s.strip()
3096 esc_magic = self.shell.ESC_MAGIC
3106 esc_magic = self.shell.ESC_MAGIC
3097 # Identify magic commands even if automagic is on (which means
3107 # Identify magic commands even if automagic is on (which means
3098 # the in-memory version is different from that typed by the user).
3108 # the in-memory version is different from that typed by the user).
3099 if self.shell.rc.automagic:
3109 if self.shell.rc.automagic:
3100 start_magic = esc_magic+start
3110 start_magic = esc_magic+start
3101 else:
3111 else:
3102 start_magic = start
3112 start_magic = start
3103 # Look through the input history in reverse
3113 # Look through the input history in reverse
3104 for n in range(len(self.shell.input_hist)-2,0,-1):
3114 for n in range(len(self.shell.input_hist)-2,0,-1):
3105 input = self.shell.input_hist[n]
3115 input = self.shell.input_hist[n]
3106 # skip plain 'r' lines so we don't recurse to infinity
3116 # skip plain 'r' lines so we don't recurse to infinity
3107 if input != '_ip.magic("r")\n' and \
3117 if input != '_ip.magic("r")\n' and \
3108 (input.startswith(start) or input.startswith(start_magic)):
3118 (input.startswith(start) or input.startswith(start_magic)):
3109 #print 'match',`input` # dbg
3119 #print 'match',`input` # dbg
3110 print 'Executing:',input,
3120 print 'Executing:',input,
3111 self.shell.runlines(input)
3121 self.shell.runlines(input)
3112 return
3122 return
3113 print 'No previous input matching `%s` found.' % start
3123 print 'No previous input matching `%s` found.' % start
3114
3124
3115
3125
3116 def magic_bookmark(self, parameter_s=''):
3126 def magic_bookmark(self, parameter_s=''):
3117 """Manage IPython's bookmark system.
3127 """Manage IPython's bookmark system.
3118
3128
3119 %bookmark <name> - set bookmark to current dir
3129 %bookmark <name> - set bookmark to current dir
3120 %bookmark <name> <dir> - set bookmark to <dir>
3130 %bookmark <name> <dir> - set bookmark to <dir>
3121 %bookmark -l - list all bookmarks
3131 %bookmark -l - list all bookmarks
3122 %bookmark -d <name> - remove bookmark
3132 %bookmark -d <name> - remove bookmark
3123 %bookmark -r - remove all bookmarks
3133 %bookmark -r - remove all bookmarks
3124
3134
3125 You can later on access a bookmarked folder with:
3135 You can later on access a bookmarked folder with:
3126 %cd -b <name>
3136 %cd -b <name>
3127 or simply '%cd <name>' if there is no directory called <name> AND
3137 or simply '%cd <name>' if there is no directory called <name> AND
3128 there is such a bookmark defined.
3138 there is such a bookmark defined.
3129
3139
3130 Your bookmarks persist through IPython sessions, but they are
3140 Your bookmarks persist through IPython sessions, but they are
3131 associated with each profile."""
3141 associated with each profile."""
3132
3142
3133 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3143 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3134 if len(args) > 2:
3144 if len(args) > 2:
3135 raise UsageError("%bookmark: too many arguments")
3145 raise UsageError("%bookmark: too many arguments")
3136
3146
3137 bkms = self.db.get('bookmarks',{})
3147 bkms = self.db.get('bookmarks',{})
3138
3148
3139 if opts.has_key('d'):
3149 if opts.has_key('d'):
3140 try:
3150 try:
3141 todel = args[0]
3151 todel = args[0]
3142 except IndexError:
3152 except IndexError:
3143 raise UsageError(
3153 raise UsageError(
3144 "%bookmark -d: must provide a bookmark to delete")
3154 "%bookmark -d: must provide a bookmark to delete")
3145 else:
3155 else:
3146 try:
3156 try:
3147 del bkms[todel]
3157 del bkms[todel]
3148 except KeyError:
3158 except KeyError:
3149 raise UsageError(
3159 raise UsageError(
3150 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3160 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3151
3161
3152 elif opts.has_key('r'):
3162 elif opts.has_key('r'):
3153 bkms = {}
3163 bkms = {}
3154 elif opts.has_key('l'):
3164 elif opts.has_key('l'):
3155 bks = bkms.keys()
3165 bks = bkms.keys()
3156 bks.sort()
3166 bks.sort()
3157 if bks:
3167 if bks:
3158 size = max(map(len,bks))
3168 size = max(map(len,bks))
3159 else:
3169 else:
3160 size = 0
3170 size = 0
3161 fmt = '%-'+str(size)+'s -> %s'
3171 fmt = '%-'+str(size)+'s -> %s'
3162 print 'Current bookmarks:'
3172 print 'Current bookmarks:'
3163 for bk in bks:
3173 for bk in bks:
3164 print fmt % (bk,bkms[bk])
3174 print fmt % (bk,bkms[bk])
3165 else:
3175 else:
3166 if not args:
3176 if not args:
3167 raise UsageError("%bookmark: You must specify the bookmark name")
3177 raise UsageError("%bookmark: You must specify the bookmark name")
3168 elif len(args)==1:
3178 elif len(args)==1:
3169 bkms[args[0]] = os.getcwd()
3179 bkms[args[0]] = os.getcwd()
3170 elif len(args)==2:
3180 elif len(args)==2:
3171 bkms[args[0]] = args[1]
3181 bkms[args[0]] = args[1]
3172 self.db['bookmarks'] = bkms
3182 self.db['bookmarks'] = bkms
3173
3183
3174 def magic_pycat(self, parameter_s=''):
3184 def magic_pycat(self, parameter_s=''):
3175 """Show a syntax-highlighted file through a pager.
3185 """Show a syntax-highlighted file through a pager.
3176
3186
3177 This magic is similar to the cat utility, but it will assume the file
3187 This magic is similar to the cat utility, but it will assume the file
3178 to be Python source and will show it with syntax highlighting. """
3188 to be Python source and will show it with syntax highlighting. """
3179
3189
3180 try:
3190 try:
3181 filename = get_py_filename(parameter_s)
3191 filename = get_py_filename(parameter_s)
3182 cont = file_read(filename)
3192 cont = file_read(filename)
3183 except IOError:
3193 except IOError:
3184 try:
3194 try:
3185 cont = eval(parameter_s,self.user_ns)
3195 cont = eval(parameter_s,self.user_ns)
3186 except NameError:
3196 except NameError:
3187 cont = None
3197 cont = None
3188 if cont is None:
3198 if cont is None:
3189 print "Error: no such file or variable"
3199 print "Error: no such file or variable"
3190 return
3200 return
3191
3201
3192 page(self.shell.pycolorize(cont),
3202 page(self.shell.pycolorize(cont),
3193 screen_lines=self.shell.rc.screen_length)
3203 screen_lines=self.shell.rc.screen_length)
3194
3204
3195 def magic_cpaste(self, parameter_s=''):
3205 def magic_cpaste(self, parameter_s=''):
3196 """Allows you to paste & execute a pre-formatted code block from clipboard.
3206 """Allows you to paste & execute a pre-formatted code block from clipboard.
3197
3207
3198 You must terminate the block with '--' (two minus-signs) alone on the
3208 You must terminate the block with '--' (two minus-signs) alone on the
3199 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3209 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3200 is the new sentinel for this operation)
3210 is the new sentinel for this operation)
3201
3211
3202 The block is dedented prior to execution to enable execution of method
3212 The block is dedented prior to execution to enable execution of method
3203 definitions. '>' and '+' characters at the beginning of a line are
3213 definitions. '>' and '+' characters at the beginning of a line are
3204 ignored, to allow pasting directly from e-mails, diff files and
3214 ignored, to allow pasting directly from e-mails, diff files and
3205 doctests (the '...' continuation prompt is also stripped). The
3215 doctests (the '...' continuation prompt is also stripped). The
3206 executed block is also assigned to variable named 'pasted_block' for
3216 executed block is also assigned to variable named 'pasted_block' for
3207 later editing with '%edit pasted_block'.
3217 later editing with '%edit pasted_block'.
3208
3218
3209 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3219 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3210 This assigns the pasted block to variable 'foo' as string, without
3220 This assigns the pasted block to variable 'foo' as string, without
3211 dedenting or executing it (preceding >>> and + is still stripped)
3221 dedenting or executing it (preceding >>> and + is still stripped)
3212
3222
3223 '%cpaste -r' re-executes the block previously entered by cpaste.
3224
3213 Do not be alarmed by garbled output on Windows (it's a readline bug).
3225 Do not be alarmed by garbled output on Windows (it's a readline bug).
3214 Just press enter and type -- (and press enter again) and the block
3226 Just press enter and type -- (and press enter again) and the block
3215 will be what was just pasted.
3227 will be what was just pasted.
3216
3228
3217 IPython statements (magics, shell escapes) are not supported (yet).
3229 IPython statements (magics, shell escapes) are not supported (yet).
3218 """
3230 """
3219 opts,args = self.parse_options(parameter_s,'s:',mode='string')
3231 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
3220 par = args.strip()
3232 par = args.strip()
3233 if opts.has_key('r'):
3234 b = self.user_ns.get('pasted_block', None)
3235 if b is None:
3236 raise UsageError('No previous pasted block available')
3237 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3238 exec b in self.user_ns
3239 return
3240
3221 sentinel = opts.get('s','--')
3241 sentinel = opts.get('s','--')
3222
3242
3223 # Regular expressions that declare text we strip from the input:
3243 # Regular expressions that declare text we strip from the input:
3224 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3244 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3225 r'^\s*(\s?>)+', # Python input prompt
3245 r'^\s*(\s?>)+', # Python input prompt
3226 r'^\s*\.{3,}', # Continuation prompts
3246 r'^\s*\.{3,}', # Continuation prompts
3227 r'^\++',
3247 r'^\++',
3228 ]
3248 ]
3229
3249
3230 strip_from_start = map(re.compile,strip_re)
3250 strip_from_start = map(re.compile,strip_re)
3231
3251
3232 from IPython import iplib
3252 from IPython import iplib
3233 lines = []
3253 lines = []
3234 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3254 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3235 while 1:
3255 while 1:
3236 l = iplib.raw_input_original(':')
3256 l = iplib.raw_input_original(':')
3237 if l ==sentinel:
3257 if l ==sentinel:
3238 break
3258 break
3239
3259
3240 for pat in strip_from_start:
3260 for pat in strip_from_start:
3241 l = pat.sub('',l)
3261 l = pat.sub('',l)
3242 lines.append(l)
3262 lines.append(l)
3243
3263
3244 block = "\n".join(lines) + '\n'
3264 block = "\n".join(lines) + '\n'
3245 #print "block:\n",block
3265 #print "block:\n",block
3246 if not par:
3266 if not par:
3247 b = textwrap.dedent(block)
3267 b = textwrap.dedent(block)
3248 exec b in self.user_ns
3249 self.user_ns['pasted_block'] = b
3268 self.user_ns['pasted_block'] = b
3269 exec b in self.user_ns
3250 else:
3270 else:
3251 self.user_ns[par] = SList(block.splitlines())
3271 self.user_ns[par] = SList(block.splitlines())
3252 print "Block assigned to '%s'" % par
3272 print "Block assigned to '%s'" % par
3253
3273
3254 def magic_quickref(self,arg):
3274 def magic_quickref(self,arg):
3255 """ Show a quick reference sheet """
3275 """ Show a quick reference sheet """
3256 import IPython.usage
3276 import IPython.usage
3257 qr = IPython.usage.quick_reference + self.magic_magic('-brief')
3277 qr = IPython.usage.quick_reference + self.magic_magic('-brief')
3258
3278
3259 page(qr)
3279 page(qr)
3260
3280
3261 def magic_upgrade(self,arg):
3281 def magic_upgrade(self,arg):
3262 """ Upgrade your IPython installation
3282 """ Upgrade your IPython installation
3263
3283
3264 This will copy the config files that don't yet exist in your
3284 This will copy the config files that don't yet exist in your
3265 ipython dir from the system config dir. Use this after upgrading
3285 ipython dir from the system config dir. Use this after upgrading
3266 IPython if you don't wish to delete your .ipython dir.
3286 IPython if you don't wish to delete your .ipython dir.
3267
3287
3268 Call with -nolegacy to get rid of ipythonrc* files (recommended for
3288 Call with -nolegacy to get rid of ipythonrc* files (recommended for
3269 new users)
3289 new users)
3270
3290
3271 """
3291 """
3272 ip = self.getapi()
3292 ip = self.getapi()
3273 ipinstallation = path(IPython.__file__).dirname()
3293 ipinstallation = path(IPython.__file__).dirname()
3274 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'upgrade_dir.py')
3294 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'upgrade_dir.py')
3275 src_config = ipinstallation / 'UserConfig'
3295 src_config = ipinstallation / 'UserConfig'
3276 userdir = path(ip.options.ipythondir)
3296 userdir = path(ip.options.ipythondir)
3277 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
3297 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
3278 print ">",cmd
3298 print ">",cmd
3279 shell(cmd)
3299 shell(cmd)
3280 if arg == '-nolegacy':
3300 if arg == '-nolegacy':
3281 legacy = userdir.files('ipythonrc*')
3301 legacy = userdir.files('ipythonrc*')
3282 print "Nuking legacy files:",legacy
3302 print "Nuking legacy files:",legacy
3283
3303
3284 [p.remove() for p in legacy]
3304 [p.remove() for p in legacy]
3285 suffix = (sys.platform == 'win32' and '.ini' or '')
3305 suffix = (sys.platform == 'win32' and '.ini' or '')
3286 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
3306 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
3287
3307
3288
3308
3289 def magic_doctest_mode(self,parameter_s=''):
3309 def magic_doctest_mode(self,parameter_s=''):
3290 """Toggle doctest mode on and off.
3310 """Toggle doctest mode on and off.
3291
3311
3292 This mode allows you to toggle the prompt behavior between normal
3312 This mode allows you to toggle the prompt behavior between normal
3293 IPython prompts and ones that are as similar to the default IPython
3313 IPython prompts and ones that are as similar to the default IPython
3294 interpreter as possible.
3314 interpreter as possible.
3295
3315
3296 It also supports the pasting of code snippets that have leading '>>>'
3316 It also supports the pasting of code snippets that have leading '>>>'
3297 and '...' prompts in them. This means that you can paste doctests from
3317 and '...' prompts in them. This means that you can paste doctests from
3298 files or docstrings (even if they have leading whitespace), and the
3318 files or docstrings (even if they have leading whitespace), and the
3299 code will execute correctly. You can then use '%history -tn' to see
3319 code will execute correctly. You can then use '%history -tn' to see
3300 the translated history without line numbers; this will give you the
3320 the translated history without line numbers; this will give you the
3301 input after removal of all the leading prompts and whitespace, which
3321 input after removal of all the leading prompts and whitespace, which
3302 can be pasted back into an editor.
3322 can be pasted back into an editor.
3303
3323
3304 With these features, you can switch into this mode easily whenever you
3324 With these features, you can switch into this mode easily whenever you
3305 need to do testing and changes to doctests, without having to leave
3325 need to do testing and changes to doctests, without having to leave
3306 your existing IPython session.
3326 your existing IPython session.
3307 """
3327 """
3308
3328
3309 # XXX - Fix this to have cleaner activate/deactivate calls.
3329 # XXX - Fix this to have cleaner activate/deactivate calls.
3310 from IPython.Extensions import InterpreterPasteInput as ipaste
3330 from IPython.Extensions import InterpreterPasteInput as ipaste
3311 from IPython.ipstruct import Struct
3331 from IPython.ipstruct import Struct
3312
3332
3313 # Shorthands
3333 # Shorthands
3314 shell = self.shell
3334 shell = self.shell
3315 oc = shell.outputcache
3335 oc = shell.outputcache
3316 rc = shell.rc
3336 rc = shell.rc
3317 meta = shell.meta
3337 meta = shell.meta
3318 # dstore is a data store kept in the instance metadata bag to track any
3338 # dstore is a data store kept in the instance metadata bag to track any
3319 # changes we make, so we can undo them later.
3339 # changes we make, so we can undo them later.
3320 dstore = meta.setdefault('doctest_mode',Struct())
3340 dstore = meta.setdefault('doctest_mode',Struct())
3321 save_dstore = dstore.setdefault
3341 save_dstore = dstore.setdefault
3322
3342
3323 # save a few values we'll need to recover later
3343 # save a few values we'll need to recover later
3324 mode = save_dstore('mode',False)
3344 mode = save_dstore('mode',False)
3325 save_dstore('rc_pprint',rc.pprint)
3345 save_dstore('rc_pprint',rc.pprint)
3326 save_dstore('xmode',shell.InteractiveTB.mode)
3346 save_dstore('xmode',shell.InteractiveTB.mode)
3327 save_dstore('rc_separate_out',rc.separate_out)
3347 save_dstore('rc_separate_out',rc.separate_out)
3328 save_dstore('rc_separate_out2',rc.separate_out2)
3348 save_dstore('rc_separate_out2',rc.separate_out2)
3329 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
3349 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
3330 save_dstore('rc_separate_in',rc.separate_in)
3350 save_dstore('rc_separate_in',rc.separate_in)
3331
3351
3332 if mode == False:
3352 if mode == False:
3333 # turn on
3353 # turn on
3334 ipaste.activate_prefilter()
3354 ipaste.activate_prefilter()
3335
3355
3336 oc.prompt1.p_template = '>>> '
3356 oc.prompt1.p_template = '>>> '
3337 oc.prompt2.p_template = '... '
3357 oc.prompt2.p_template = '... '
3338 oc.prompt_out.p_template = ''
3358 oc.prompt_out.p_template = ''
3339
3359
3340 # Prompt separators like plain python
3360 # Prompt separators like plain python
3341 oc.input_sep = oc.prompt1.sep = ''
3361 oc.input_sep = oc.prompt1.sep = ''
3342 oc.output_sep = ''
3362 oc.output_sep = ''
3343 oc.output_sep2 = ''
3363 oc.output_sep2 = ''
3344
3364
3345 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3365 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3346 oc.prompt_out.pad_left = False
3366 oc.prompt_out.pad_left = False
3347
3367
3348 rc.pprint = False
3368 rc.pprint = False
3349
3369
3350 shell.magic_xmode('Plain')
3370 shell.magic_xmode('Plain')
3351
3371
3352 else:
3372 else:
3353 # turn off
3373 # turn off
3354 ipaste.deactivate_prefilter()
3374 ipaste.deactivate_prefilter()
3355
3375
3356 oc.prompt1.p_template = rc.prompt_in1
3376 oc.prompt1.p_template = rc.prompt_in1
3357 oc.prompt2.p_template = rc.prompt_in2
3377 oc.prompt2.p_template = rc.prompt_in2
3358 oc.prompt_out.p_template = rc.prompt_out
3378 oc.prompt_out.p_template = rc.prompt_out
3359
3379
3360 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3380 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3361
3381
3362 oc.output_sep = dstore.rc_separate_out
3382 oc.output_sep = dstore.rc_separate_out
3363 oc.output_sep2 = dstore.rc_separate_out2
3383 oc.output_sep2 = dstore.rc_separate_out2
3364
3384
3365 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3385 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3366 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3386 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3367
3387
3368 rc.pprint = dstore.rc_pprint
3388 rc.pprint = dstore.rc_pprint
3369
3389
3370 shell.magic_xmode(dstore.xmode)
3390 shell.magic_xmode(dstore.xmode)
3371
3391
3372 # Store new mode and inform
3392 # Store new mode and inform
3373 dstore.mode = bool(1-int(mode))
3393 dstore.mode = bool(1-int(mode))
3374 print 'Doctest mode is:',
3394 print 'Doctest mode is:',
3375 print ['OFF','ON'][dstore.mode]
3395 print ['OFF','ON'][dstore.mode]
3376
3396
3377 # end Magic
3397 # end Magic
@@ -1,97 +1,121 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Release data for the IPython project."""
2 """Release data for the IPython project."""
3
3
4 #*****************************************************************************
4 #*****************************************************************************
5 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
5 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
6 #
6 #
7 # Copyright (c) 2001 Janko Hauser <jhauser@zscout.de> and Nathaniel Gray
7 # Copyright (c) 2001 Janko Hauser <jhauser@zscout.de> and Nathaniel Gray
8 # <n8gray@caltech.edu>
8 # <n8gray@caltech.edu>
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 # Name of the package for release purposes. This is the name which labels
14 # Name of the package for release purposes. This is the name which labels
15 # the tarballs and RPMs made by distutils, so it's best to lowercase it.
15 # the tarballs and RPMs made by distutils, so it's best to lowercase it.
16 name = 'ipython'
16 name = 'ipython'
17
17
18 # For versions with substrings (like 0.6.16.svn), use an extra . to separate
18 # For versions with substrings (like 0.6.16.svn), use an extra . to separate
19 # the new substring. We have to avoid using either dashes or underscores,
19 # the new substring. We have to avoid using either dashes or underscores,
20 # because bdist_rpm does not accept dashes (an RPM) convention, and
20 # because bdist_rpm does not accept dashes (an RPM) convention, and
21 # bdist_deb does not accept underscores (a Debian convention).
21 # bdist_deb does not accept underscores (a Debian convention).
22
22
23 development = False # change this to False to do a release
23 development = False # change this to False to do a release
24 version_base = '0.9.1'
24 version_base = '0.9.1'
25 branch = 'ipython'
25 branch = 'ipython'
26 revision = '1143'
26 revision = '1143'
27
27
28 if development:
28 if development:
29 if branch == 'ipython':
29 if branch == 'ipython':
30 version = '%s.bzr.r%s' % (version_base, revision)
30 version = '%s.bzr.r%s' % (version_base, revision)
31 else:
31 else:
32 version = '%s.bzr.r%s.%s' % (version_base, revision, branch)
32 version = '%s.bzr.r%s.%s' % (version_base, revision, branch)
33 else:
33 else:
34 version = version_base
34 version = version_base
35
35
36
36
37 description = "Tools for interactive development in Python."
37 description = "An interactive computing environment for Python"
38
38
39 long_description = \
39 long_description = \
40 """
40 """
41 IPython provides a replacement for the interactive Python interpreter with
41 The goal of IPython is to create a comprehensive environment for
42 extra functionality.
42 interactive and exploratory computing. To support this goal, IPython
43 has two main components:
43
44
44 Main features:
45 * An enhanced interactive Python shell.
45
46
46 * Comprehensive object introspection.
47 * An architecture for interactive parallel computing.
47
48
48 * Input history, persistent across sessions.
49 The enhanced interactive Python shell has the following main features:
49
50
50 * Caching of output results during a session with automatically generated
51 * Comprehensive object introspection.
51 references.
52
52
53 * Readline based name completion.
53 * Input history, persistent across sessions.
54
54
55 * Extensible system of 'magic' commands for controlling the environment and
55 * Caching of output results during a session with automatically generated
56 performing many tasks related either to IPython or the operating system.
56 references.
57
57
58 * Configuration system with easy switching between different setups (simpler
58 * Readline based name completion.
59 than changing $PYTHONSTARTUP environment variables every time).
60
59
61 * Session logging and reloading.
60 * Extensible system of 'magic' commands for controlling the environment and
61 performing many tasks related either to IPython or the operating system.
62
62
63 * Extensible syntax processing for special purpose situations.
63 * Configuration system with easy switching between different setups (simpler
64 than changing $PYTHONSTARTUP environment variables every time).
64
65
65 * Access to the system shell with user-extensible alias system.
66 * Session logging and reloading.
66
67
67 * Easily embeddable in other Python programs.
68 * Extensible syntax processing for special purpose situations.
68
69
69 * Integrated access to the pdb debugger and the Python profiler.
70 * Access to the system shell with user-extensible alias system.
70
71
71 The latest development version is always available at the IPython subversion
72 * Easily embeddable in other Python programs and wxPython GUIs.
72 repository_.
73
73
74 .. _repository: http://ipython.scipy.org/svn/ipython/ipython/trunk#egg=ipython-dev
74 * Integrated access to the pdb debugger and the Python profiler.
75 """
75
76 The parallel computing architecture has the following main features:
77
78 * Quickly parallelize Python code from an interactive Python/IPython session.
79
80 * A flexible and dynamic process model that be deployed on anything from
81 multicore workstations to supercomputers.
82
83 * An architecture that supports many different styles of parallelism, from
84 message passing to task farming.
85
86 * Both blocking and fully asynchronous interfaces.
87
88 * High level APIs that enable many things to be parallelized in a few lines
89 of code.
90
91 * Share live parallel jobs with other users securely.
92
93 * Dynamically load balanced task farming system.
94
95 * Robust error handling in parallel code.
96
97 The latest development version is always available from IPython's `Launchpad
98 site <http://launchpad.net/ipython>`_.
99 """
76
100
77 license = 'BSD'
101 license = 'BSD'
78
102
79 authors = {'Fernando' : ('Fernando Perez','fperez@colorado.edu'),
103 authors = {'Fernando' : ('Fernando Perez','fperez@colorado.edu'),
80 'Janko' : ('Janko Hauser','jhauser@zscout.de'),
104 'Janko' : ('Janko Hauser','jhauser@zscout.de'),
81 'Nathan' : ('Nathaniel Gray','n8gray@caltech.edu'),
105 'Nathan' : ('Nathaniel Gray','n8gray@caltech.edu'),
82 'Ville' : ('Ville Vainio','vivainio@gmail.com'),
106 'Ville' : ('Ville Vainio','vivainio@gmail.com'),
83 'Brian' : ('Brian E Granger', 'ellisonbg@gmail.com'),
107 'Brian' : ('Brian E Granger', 'ellisonbg@gmail.com'),
84 'Min' : ('Min Ragan-Kelley', 'benjaminrk@gmail.com')
108 'Min' : ('Min Ragan-Kelley', 'benjaminrk@gmail.com')
85 }
109 }
86
110
87 author = 'The IPython Development Team'
111 author = 'The IPython Development Team'
88
112
89 author_email = 'ipython-dev@scipy.org'
113 author_email = 'ipython-dev@scipy.org'
90
114
91 url = 'http://ipython.scipy.org'
115 url = 'http://ipython.scipy.org'
92
116
93 download_url = 'http://ipython.scipy.org/dist'
117 download_url = 'http://ipython.scipy.org/dist'
94
118
95 platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME']
119 platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME']
96
120
97 keywords = ['Interactive','Interpreter','Shell','Parallel','Distributed']
121 keywords = ['Interactive','Interpreter','Shell','Parallel','Distributed']
@@ -1,106 +1,102 b''
1 # encoding: utf-8
1 # encoding: utf-8
2
2
3 """This is the official entry point to IPython's configuration system. """
3 """This is the official entry point to IPython's configuration system. """
4
4
5 __docformat__ = "restructuredtext en"
5 __docformat__ = "restructuredtext en"
6
6
7 #-------------------------------------------------------------------------------
7 #-------------------------------------------------------------------------------
8 # Copyright (C) 2008 The IPython Development Team
8 # Copyright (C) 2008 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 os
18 import os
19 from os.path import join as pjoin
19 from os.path import join as pjoin
20
20
21 from IPython.genutils import get_home_dir, get_ipython_dir
21 from IPython.genutils import get_home_dir, get_ipython_dir
22 from IPython.external.configobj import ConfigObj
22 from IPython.external.configobj import ConfigObj
23
23
24 # Traitlets config imports
25 from IPython.config import traitlets
26 from IPython.config.config import *
27 from traitlets import *
28
24
29 class ConfigObjManager(object):
25 class ConfigObjManager(object):
30
26
31 def __init__(self, configObj, filename):
27 def __init__(self, configObj, filename):
32 self.current = configObj
28 self.current = configObj
33 self.current.indent_type = ' '
29 self.current.indent_type = ' '
34 self.filename = filename
30 self.filename = filename
35 # self.write_default_config_file()
31 # self.write_default_config_file()
36
32
37 def get_config_obj(self):
33 def get_config_obj(self):
38 return self.current
34 return self.current
39
35
40 def update_config_obj(self, newConfig):
36 def update_config_obj(self, newConfig):
41 self.current.merge(newConfig)
37 self.current.merge(newConfig)
42
38
43 def update_config_obj_from_file(self, filename):
39 def update_config_obj_from_file(self, filename):
44 newConfig = ConfigObj(filename, file_error=False)
40 newConfig = ConfigObj(filename, file_error=False)
45 self.current.merge(newConfig)
41 self.current.merge(newConfig)
46
42
47 def update_config_obj_from_default_file(self, ipythondir=None):
43 def update_config_obj_from_default_file(self, ipythondir=None):
48 fname = self.resolve_file_path(self.filename, ipythondir)
44 fname = self.resolve_file_path(self.filename, ipythondir)
49 self.update_config_obj_from_file(fname)
45 self.update_config_obj_from_file(fname)
50
46
51 def write_config_obj_to_file(self, filename):
47 def write_config_obj_to_file(self, filename):
52 f = open(filename, 'w')
48 f = open(filename, 'w')
53 self.current.write(f)
49 self.current.write(f)
54 f.close()
50 f.close()
55
51
56 def write_default_config_file(self):
52 def write_default_config_file(self):
57 ipdir = get_ipython_dir()
53 ipdir = get_ipython_dir()
58 fname = pjoin(ipdir, self.filename)
54 fname = pjoin(ipdir, self.filename)
59 if not os.path.isfile(fname):
55 if not os.path.isfile(fname):
60 print "Writing the configuration file to: " + fname
56 print "Writing the configuration file to: " + fname
61 self.write_config_obj_to_file(fname)
57 self.write_config_obj_to_file(fname)
62
58
63 def _import(self, key):
59 def _import(self, key):
64 package = '.'.join(key.split('.')[0:-1])
60 package = '.'.join(key.split('.')[0:-1])
65 obj = key.split('.')[-1]
61 obj = key.split('.')[-1]
66 execString = 'from %s import %s' % (package, obj)
62 execString = 'from %s import %s' % (package, obj)
67 exec execString
63 exec execString
68 exec 'temp = %s' % obj
64 exec 'temp = %s' % obj
69 return temp
65 return temp
70
66
71 def resolve_file_path(self, filename, ipythondir = None):
67 def resolve_file_path(self, filename, ipythondir = None):
72 """Resolve filenames into absolute paths.
68 """Resolve filenames into absolute paths.
73
69
74 This function looks in the following directories in order:
70 This function looks in the following directories in order:
75
71
76 1. In the current working directory or by absolute path with ~ expanded
72 1. In the current working directory or by absolute path with ~ expanded
77 2. In ipythondir if that is set
73 2. In ipythondir if that is set
78 3. In the IPYTHONDIR environment variable if it exists
74 3. In the IPYTHONDIR environment variable if it exists
79 4. In the ~/.ipython directory
75 4. In the ~/.ipython directory
80
76
81 Note: The IPYTHONDIR is also used by the trunk version of IPython so
77 Note: The IPYTHONDIR is also used by the trunk version of IPython so
82 changing it will also affect it was well.
78 changing it will also affect it was well.
83 """
79 """
84
80
85 # In cwd or by absolute path with ~ expanded
81 # In cwd or by absolute path with ~ expanded
86 trythis = os.path.expanduser(filename)
82 trythis = os.path.expanduser(filename)
87 if os.path.isfile(trythis):
83 if os.path.isfile(trythis):
88 return trythis
84 return trythis
89
85
90 # In ipythondir if it is set
86 # In ipythondir if it is set
91 if ipythondir is not None:
87 if ipythondir is not None:
92 trythis = pjoin(ipythondir, filename)
88 trythis = pjoin(ipythondir, filename)
93 if os.path.isfile(trythis):
89 if os.path.isfile(trythis):
94 return trythis
90 return trythis
95
91
96 trythis = pjoin(get_ipython_dir(), filename)
92 trythis = pjoin(get_ipython_dir(), filename)
97 if os.path.isfile(trythis):
93 if os.path.isfile(trythis):
98 return trythis
94 return trythis
99
95
100 return None
96 return None
101
97
102
98
103
99
104
100
105
101
106
102
@@ -1,272 +1,281 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 """ History related magics and functionality """
3 """ History related magics and functionality """
4
4
5 # Stdlib imports
5 # Stdlib imports
6 import fnmatch
6 import fnmatch
7 import os
7 import os
8
8
9 # IPython imports
9 # IPython imports
10 from IPython.genutils import Term, ask_yes_no
10 from IPython.genutils import Term, ask_yes_no
11 import IPython.ipapi
11
12
12 def magic_history(self, parameter_s = ''):
13 def magic_history(self, parameter_s = ''):
13 """Print input history (_i<n> variables), with most recent last.
14 """Print input history (_i<n> variables), with most recent last.
14
15
15 %history -> print at most 40 inputs (some may be multi-line)\\
16 %history -> print at most 40 inputs (some may be multi-line)\\
16 %history n -> print at most n inputs\\
17 %history n -> print at most n inputs\\
17 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
18 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
18
19
19 Each input's number <n> is shown, and is accessible as the
20 Each input's number <n> is shown, and is accessible as the
20 automatically generated variable _i<n>. Multi-line statements are
21 automatically generated variable _i<n>. Multi-line statements are
21 printed starting at a new line for easy copy/paste.
22 printed starting at a new line for easy copy/paste.
22
23
23
24
24 Options:
25 Options:
25
26
26 -n: do NOT print line numbers. This is useful if you want to get a
27 -n: do NOT print line numbers. This is useful if you want to get a
27 printout of many lines which can be directly pasted into a text
28 printout of many lines which can be directly pasted into a text
28 editor.
29 editor.
29
30
30 This feature is only available if numbered prompts are in use.
31 This feature is only available if numbered prompts are in use.
31
32
32 -t: (default) print the 'translated' history, as IPython understands it.
33 -t: (default) print the 'translated' history, as IPython understands it.
33 IPython filters your input and converts it all into valid Python source
34 IPython filters your input and converts it all into valid Python source
34 before executing it (things like magics or aliases are turned into
35 before executing it (things like magics or aliases are turned into
35 function calls, for example). With this option, you'll see the native
36 function calls, for example). With this option, you'll see the native
36 history instead of the user-entered version: '%cd /' will be seen as
37 history instead of the user-entered version: '%cd /' will be seen as
37 '_ip.magic("%cd /")' instead of '%cd /'.
38 '_ip.magic("%cd /")' instead of '%cd /'.
38
39
39 -r: print the 'raw' history, i.e. the actual commands you typed.
40 -r: print the 'raw' history, i.e. the actual commands you typed.
40
41
41 -g: treat the arg as a pattern to grep for in (full) history.
42 -g: treat the arg as a pattern to grep for in (full) history.
42 This includes the "shadow history" (almost all commands ever written).
43 This includes the "shadow history" (almost all commands ever written).
43 Use '%hist -g' to show full shadow history (may be very long).
44 Use '%hist -g' to show full shadow history (may be very long).
44 In shadow history, every index nuwber starts with 0.
45 In shadow history, every index nuwber starts with 0.
45
46
46 -f FILENAME: instead of printing the output to the screen, redirect it to
47 -f FILENAME: instead of printing the output to the screen, redirect it to
47 the given file. The file is always overwritten, though IPython asks for
48 the given file. The file is always overwritten, though IPython asks for
48 confirmation first if it already exists.
49 confirmation first if it already exists.
49
50
50
51
51 """
52 """
52
53
53 ip = self.api
54 ip = self.api
54 shell = self.shell
55 shell = self.shell
55 if not shell.outputcache.do_full_cache:
56 if not shell.outputcache.do_full_cache:
56 print 'This feature is only available if numbered prompts are in use.'
57 print 'This feature is only available if numbered prompts are in use.'
57 return
58 return
58 opts,args = self.parse_options(parameter_s,'gntsrf:',mode='list')
59 opts,args = self.parse_options(parameter_s,'gntsrf:',mode='list')
59
60
60 # Check if output to specific file was requested.
61 # Check if output to specific file was requested.
61 try:
62 try:
62 outfname = opts['f']
63 outfname = opts['f']
63 except KeyError:
64 except KeyError:
64 outfile = Term.cout
65 outfile = Term.cout
65 # We don't want to close stdout at the end!
66 # We don't want to close stdout at the end!
66 close_at_end = False
67 close_at_end = False
67 else:
68 else:
68 if os.path.exists(outfname):
69 if os.path.exists(outfname):
69 ans = ask_yes_no("File %r exists. Overwrite?" % outfname)
70 ans = ask_yes_no("File %r exists. Overwrite?" % outfname)
70 if not ans:
71 if not ans:
71 print 'Aborting.'
72 print 'Aborting.'
72 return
73 return
73 else:
74 else:
74 outfile = open(outfname,'w')
75 outfile = open(outfname,'w')
75 close_at_end = True
76 close_at_end = True
76
77
77
78
78 if opts.has_key('t'):
79 if opts.has_key('t'):
79 input_hist = shell.input_hist
80 input_hist = shell.input_hist
80 elif opts.has_key('r'):
81 elif opts.has_key('r'):
81 input_hist = shell.input_hist_raw
82 input_hist = shell.input_hist_raw
82 else:
83 else:
83 input_hist = shell.input_hist
84 input_hist = shell.input_hist
84
85
85
86
86 default_length = 40
87 default_length = 40
87 pattern = None
88 pattern = None
88 if opts.has_key('g'):
89 if opts.has_key('g'):
89 init = 1
90 init = 1
90 final = len(input_hist)
91 final = len(input_hist)
91 parts = parameter_s.split(None,1)
92 parts = parameter_s.split(None,1)
92 if len(parts) == 1:
93 if len(parts) == 1:
93 parts += '*'
94 parts += '*'
94 head, pattern = parts
95 head, pattern = parts
95 pattern = "*" + pattern + "*"
96 pattern = "*" + pattern + "*"
96 elif len(args) == 0:
97 elif len(args) == 0:
97 final = len(input_hist)
98 final = len(input_hist)
98 init = max(1,final-default_length)
99 init = max(1,final-default_length)
99 elif len(args) == 1:
100 elif len(args) == 1:
100 final = len(input_hist)
101 final = len(input_hist)
101 init = max(1,final-int(args[0]))
102 init = max(1,final-int(args[0]))
102 elif len(args) == 2:
103 elif len(args) == 2:
103 init,final = map(int,args)
104 init,final = map(int,args)
104 else:
105 else:
105 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
106 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
106 print self.magic_hist.__doc__
107 print self.magic_hist.__doc__
107 return
108 return
108 width = len(str(final))
109 width = len(str(final))
109 line_sep = ['','\n']
110 line_sep = ['','\n']
110 print_nums = not opts.has_key('n')
111 print_nums = not opts.has_key('n')
111
112
112 found = False
113 found = False
113 if pattern is not None:
114 if pattern is not None:
114 sh = ip.IP.shadowhist.all()
115 sh = ip.IP.shadowhist.all()
115 for idx, s in sh:
116 for idx, s in sh:
116 if fnmatch.fnmatch(s, pattern):
117 if fnmatch.fnmatch(s, pattern):
117 print "0%d: %s" %(idx, s)
118 print "0%d: %s" %(idx, s)
118 found = True
119 found = True
119
120
120 if found:
121 if found:
121 print "==="
122 print "==="
122 print "shadow history ends, fetch by %rep <number> (must start with 0)"
123 print "shadow history ends, fetch by %rep <number> (must start with 0)"
123 print "=== start of normal history ==="
124 print "=== start of normal history ==="
124
125
125 for in_num in range(init,final):
126 for in_num in range(init,final):
126 inline = input_hist[in_num]
127 inline = input_hist[in_num]
127 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
128 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
128 continue
129 continue
129
130
130 multiline = int(inline.count('\n') > 1)
131 multiline = int(inline.count('\n') > 1)
131 if print_nums:
132 if print_nums:
132 print >> outfile, \
133 print >> outfile, \
133 '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
134 '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
134 print >> outfile, inline,
135 print >> outfile, inline,
135
136
136 if close_at_end:
137 if close_at_end:
137 outfile.close()
138 outfile.close()
138
139
139
140
140
141
141 def magic_hist(self, parameter_s=''):
142 def magic_hist(self, parameter_s=''):
142 """Alternate name for %history."""
143 """Alternate name for %history."""
143 return self.magic_history(parameter_s)
144 return self.magic_history(parameter_s)
144
145
145
146
146
147
147 def rep_f(self, arg):
148 def rep_f(self, arg):
148 r""" Repeat a command, or get command to input line for editing
149 r""" Repeat a command, or get command to input line for editing
149
150
150 - %rep (no arguments):
151 - %rep (no arguments):
151
152
152 Place a string version of last computation result (stored in the special '_'
153 Place a string version of last computation result (stored in the special '_'
153 variable) to the next input prompt. Allows you to create elaborate command
154 variable) to the next input prompt. Allows you to create elaborate command
154 lines without using copy-paste::
155 lines without using copy-paste::
155
156
156 $ l = ["hei", "vaan"]
157 $ l = ["hei", "vaan"]
157 $ "".join(l)
158 $ "".join(l)
158 ==> heivaan
159 ==> heivaan
159 $ %rep
160 $ %rep
160 $ heivaan_ <== cursor blinking
161 $ heivaan_ <== cursor blinking
161
162
162 %rep 45
163 %rep 45
163
164
164 Place history line 45 to next input prompt. Use %hist to find out the
165 Place history line 45 to next input prompt. Use %hist to find out the
165 number.
166 number.
166
167
167 %rep 1-4 6-7 3
168 %rep 1-4 6-7 3
168
169
169 Repeat the specified lines immediately. Input slice syntax is the same as
170 Repeat the specified lines immediately. Input slice syntax is the same as
170 in %macro and %save.
171 in %macro and %save.
171
172
172 %rep foo
173 %rep foo
173
174
174 Place the most recent line that has the substring "foo" to next input.
175 Place the most recent line that has the substring "foo" to next input.
175 (e.g. 'svn ci -m foobar').
176 (e.g. 'svn ci -m foobar').
176
177
177 """
178 """
178
179
179
180
180 opts,args = self.parse_options(arg,'',mode='list')
181 opts,args = self.parse_options(arg,'',mode='list')
181 ip = self.api
182 ip = self.api
182 if not args:
183 if not args:
183 ip.set_next_input(str(ip.user_ns["_"]))
184 ip.set_next_input(str(ip.user_ns["_"]))
184 return
185 return
185
186
186 if len(args) == 1 and not '-' in args[0]:
187 if len(args) == 1 and not '-' in args[0]:
187 arg = args[0]
188 arg = args[0]
188 if len(arg) > 1 and arg.startswith('0'):
189 if len(arg) > 1 and arg.startswith('0'):
189 # get from shadow hist
190 # get from shadow hist
190 num = int(arg[1:])
191 num = int(arg[1:])
191 line = self.shadowhist.get(num)
192 line = self.shadowhist.get(num)
192 ip.set_next_input(str(line))
193 ip.set_next_input(str(line))
193 return
194 return
194 try:
195 try:
195 num = int(args[0])
196 num = int(args[0])
196 ip.set_next_input(str(ip.IP.input_hist_raw[num]).rstrip())
197 ip.set_next_input(str(ip.IP.input_hist_raw[num]).rstrip())
197 return
198 return
198 except ValueError:
199 except ValueError:
199 pass
200 pass
200
201
201 for h in reversed(self.shell.input_hist_raw):
202 for h in reversed(self.shell.input_hist_raw):
202 if 'rep' in h:
203 if 'rep' in h:
203 continue
204 continue
204 if fnmatch.fnmatch(h,'*' + arg + '*'):
205 if fnmatch.fnmatch(h,'*' + arg + '*'):
205 ip.set_next_input(str(h).rstrip())
206 ip.set_next_input(str(h).rstrip())
206 return
207 return
207
208
208
209
209 try:
210 try:
210 lines = self.extract_input_slices(args, True)
211 lines = self.extract_input_slices(args, True)
211 print "lines",lines
212 print "lines",lines
212 ip.runlines(lines)
213 ip.runlines(lines)
213 except ValueError:
214 except ValueError:
214 print "Not found in recent history:", args
215 print "Not found in recent history:", args
215
216
216
217
217
218
218 _sentinel = object()
219 _sentinel = object()
219
220
220 class ShadowHist:
221 class ShadowHist:
221 def __init__(self,db):
222 def __init__(self,db):
222 # cmd => idx mapping
223 # cmd => idx mapping
223 self.curidx = 0
224 self.curidx = 0
224 self.db = db
225 self.db = db
226 self.disabled = False
225
227
226 def inc_idx(self):
228 def inc_idx(self):
227 idx = self.db.get('shadowhist_idx', 1)
229 idx = self.db.get('shadowhist_idx', 1)
228 self.db['shadowhist_idx'] = idx + 1
230 self.db['shadowhist_idx'] = idx + 1
229 return idx
231 return idx
230
232
231 def add(self, ent):
233 def add(self, ent):
232 old = self.db.hget('shadowhist', ent, _sentinel)
234 if self.disabled:
233 if old is not _sentinel:
234 return
235 return
235 newidx = self.inc_idx()
236 try:
236 #print "new",newidx # dbg
237 old = self.db.hget('shadowhist', ent, _sentinel)
237 self.db.hset('shadowhist',ent, newidx)
238 if old is not _sentinel:
239 return
240 newidx = self.inc_idx()
241 #print "new",newidx # dbg
242 self.db.hset('shadowhist',ent, newidx)
243 except:
244 IPython.ipapi.get().IP.showtraceback()
245 print "WARNING: disabling shadow history"
246 self.disabled = True
238
247
239 def all(self):
248 def all(self):
240 d = self.db.hdict('shadowhist')
249 d = self.db.hdict('shadowhist')
241 items = [(i,s) for (s,i) in d.items()]
250 items = [(i,s) for (s,i) in d.items()]
242 items.sort()
251 items.sort()
243 return items
252 return items
244
253
245 def get(self, idx):
254 def get(self, idx):
246 all = self.all()
255 all = self.all()
247
256
248 for k, v in all:
257 for k, v in all:
249 #print k,v
258 #print k,v
250 if k == idx:
259 if k == idx:
251 return v
260 return v
252
261
253 def test_shist():
262 def test_shist():
254 from IPython.Extensions import pickleshare
263 from IPython.Extensions import pickleshare
255 db = pickleshare.PickleShareDB('~/shist')
264 db = pickleshare.PickleShareDB('~/shist')
256 s = ShadowHist(db)
265 s = ShadowHist(db)
257 s.add('hello')
266 s.add('hello')
258 s.add('world')
267 s.add('world')
259 s.add('hello')
268 s.add('hello')
260 s.add('hello')
269 s.add('hello')
261 s.add('karhu')
270 s.add('karhu')
262 print "all",s.all()
271 print "all",s.all()
263 print s.get(2)
272 print s.get(2)
264
273
265 def init_ipython(ip):
274 def init_ipython(ip):
266 ip.expose_magic("rep",rep_f)
275 ip.expose_magic("rep",rep_f)
267 ip.expose_magic("hist",magic_hist)
276 ip.expose_magic("hist",magic_hist)
268 ip.expose_magic("history",magic_history)
277 ip.expose_magic("history",magic_history)
269
278
270 import ipy_completers
279 import ipy_completers
271 ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
280 ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
272 #test_shist()
281 #test_shist()
@@ -1,68 +1,70 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Test the output capture at the OS level, using file descriptors.
3 Test the output capture at the OS level, using file descriptors.
4 """
4 """
5
5
6 __docformat__ = "restructuredtext en"
6 __docformat__ = "restructuredtext en"
7
7
8 #-------------------------------------------------------------------------------
8 #-------------------------------------------------------------------------------
9 # Copyright (C) 2008 The IPython Development Team
9 # Copyright (C) 2008 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is
11 # Distributed under the terms of the BSD License. The full license is
12 # in the file COPYING, distributed as part of this software.
12 # in the file COPYING, distributed as part of this software.
13 #-------------------------------------------------------------------------------
13 #-------------------------------------------------------------------------------
14
14
15
15
16 # Stdlib imports
16 import os
17 import os
17 from cStringIO import StringIO
18 from cStringIO import StringIO
18
19
19 # FIXME:
20 # Our own imports
20 import nose
21 from IPython.testing import decorators as dec
21 import sys
22 if sys.platform == 'win32':
23 raise nose.SkipTest("These tests are not reliable under windows")
24
22
23 #-----------------------------------------------------------------------------
24 # Test functions
25
26 @dec.skip_win32
25 def test_redirector():
27 def test_redirector():
26 """ Checks that the redirector can be used to do synchronous capture.
28 """ Checks that the redirector can be used to do synchronous capture.
27 """
29 """
28 from IPython.kernel.core.fd_redirector import FDRedirector
30 from IPython.kernel.core.fd_redirector import FDRedirector
29 r = FDRedirector()
31 r = FDRedirector()
30 out = StringIO()
32 out = StringIO()
31 try:
33 try:
32 r.start()
34 r.start()
33 for i in range(10):
35 for i in range(10):
34 os.system('echo %ic' % i)
36 os.system('echo %ic' % i)
35 print >>out, r.getvalue(),
37 print >>out, r.getvalue(),
36 print >>out, i
38 print >>out, i
37 except:
39 except:
38 r.stop()
40 r.stop()
39 raise
41 raise
40 r.stop()
42 r.stop()
41 result1 = out.getvalue()
43 result1 = out.getvalue()
42 result2 = "".join("%ic\n%i\n" %(i, i) for i in range(10))
44 result2 = "".join("%ic\n%i\n" %(i, i) for i in range(10))
43 assert result1 == result2
45 assert result1 == result2
44
46
47
48 @dec.skip_win32
45 def test_redirector_output_trap():
49 def test_redirector_output_trap():
46 """ This test check not only that the redirector_output_trap does
50 """ This test check not only that the redirector_output_trap does
47 trap the output, but also that it does it in a gready way, that
51 trap the output, but also that it does it in a gready way, that
48 is by calling the callback ASAP.
52 is by calling the callback ASAP.
49 """
53 """
50 from IPython.kernel.core.redirector_output_trap import RedirectorOutputTrap
54 from IPython.kernel.core.redirector_output_trap import RedirectorOutputTrap
51 out = StringIO()
55 out = StringIO()
52 trap = RedirectorOutputTrap(out.write, out.write)
56 trap = RedirectorOutputTrap(out.write, out.write)
53 try:
57 try:
54 trap.set()
58 trap.set()
55 for i in range(10):
59 for i in range(10):
56 os.system('echo %ic' % i)
60 os.system('echo %ic' % i)
57 print "%ip" % i
61 print "%ip" % i
58 print >>out, i
62 print >>out, i
59 except:
63 except:
60 trap.unset()
64 trap.unset()
61 raise
65 raise
62 trap.unset()
66 trap.unset()
63 result1 = out.getvalue()
67 result1 = out.getvalue()
64 result2 = "".join("%ic\n%ip\n%i\n" %(i, i, i) for i in range(10))
68 result2 = "".join("%ic\n%ip\n%i\n" %(i, i, i) for i in range(10))
65 assert result1 == result2
69 assert result1 == result2
66
67
70
68
@@ -1,172 +1,172 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 """Start the IPython Engine."""
4 """Start the IPython Engine."""
5
5
6 __docformat__ = "restructuredtext en"
6 __docformat__ = "restructuredtext en"
7
7
8 #-------------------------------------------------------------------------------
8 #-------------------------------------------------------------------------------
9 # Copyright (C) 2008 The IPython Development Team
9 # Copyright (C) 2008 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-------------------------------------------------------------------------------
13 #-------------------------------------------------------------------------------
14
14
15 #-------------------------------------------------------------------------------
15 #-------------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-------------------------------------------------------------------------------
17 #-------------------------------------------------------------------------------
18
18
19 # Python looks for an empty string at the beginning of sys.path to enable
19 # Python looks for an empty string at the beginning of sys.path to enable
20 # importing from the cwd.
20 # importing from the cwd.
21 import sys
21 import sys
22 sys.path.insert(0, '')
22 sys.path.insert(0, '')
23
23
24 import sys, os
24 import sys, os
25 from optparse import OptionParser
25 from optparse import OptionParser
26
26
27 from twisted.application import service
27 from twisted.application import service
28 from twisted.internet import reactor
28 from twisted.internet import reactor
29 from twisted.python import log
29 from twisted.python import log
30
30
31 from IPython.kernel.fcutil import Tub, UnauthenticatedTub
31 from IPython.kernel.fcutil import Tub, UnauthenticatedTub
32
32
33 from IPython.kernel.core.config import config_manager as core_config_manager
33 from IPython.kernel.core.config import config_manager as core_config_manager
34 from IPython.config.cutils import import_item
34 from IPython.config.cutils import import_item
35 from IPython.kernel.engineservice import EngineService
35 from IPython.kernel.engineservice import EngineService
36 from IPython.kernel.config import config_manager as kernel_config_manager
36 from IPython.kernel.config import config_manager as kernel_config_manager
37 from IPython.kernel.engineconnector import EngineConnector
37 from IPython.kernel.engineconnector import EngineConnector
38
38
39
39
40 #-------------------------------------------------------------------------------
40 #-------------------------------------------------------------------------------
41 # Code
41 # Code
42 #-------------------------------------------------------------------------------
42 #-------------------------------------------------------------------------------
43
43
44 def start_engine():
44 def start_engine():
45 """
45 """
46 Start the engine, by creating it and starting the Twisted reactor.
46 Start the engine, by creating it and starting the Twisted reactor.
47
47
48 This method does:
48 This method does:
49
49
50 * If it exists, runs the `mpi_import_statement` to call `MPI_Init`
50 * If it exists, runs the `mpi_import_statement` to call `MPI_Init`
51 * Starts the engine logging
51 * Starts the engine logging
52 * Creates an IPython shell and wraps it in an `EngineService`
52 * Creates an IPython shell and wraps it in an `EngineService`
53 * Creates a `foolscap.Tub` to use in connecting to a controller.
53 * Creates a `foolscap.Tub` to use in connecting to a controller.
54 * Uses the tub and the `EngineService` along with a Foolscap URL
54 * Uses the tub and the `EngineService` along with a Foolscap URL
55 (or FURL) to connect to the controller and register the engine
55 (or FURL) to connect to the controller and register the engine
56 with the controller
56 with the controller
57 """
57 """
58 kernel_config = kernel_config_manager.get_config_obj()
58 kernel_config = kernel_config_manager.get_config_obj()
59 core_config = core_config_manager.get_config_obj()
59 core_config = core_config_manager.get_config_obj()
60
60
61
61
62 # Execute the mpi import statement that needs to call MPI_Init
62 # Execute the mpi import statement that needs to call MPI_Init
63 global mpi
63 global mpi
64 mpikey = kernel_config['mpi']['default']
64 mpikey = kernel_config['mpi']['default']
65 mpi_import_statement = kernel_config['mpi'].get(mpikey, None)
65 mpi_import_statement = kernel_config['mpi'].get(mpikey, None)
66 if mpi_import_statement is not None:
66 if mpi_import_statement is not None:
67 try:
67 try:
68 exec mpi_import_statement in globals()
68 exec mpi_import_statement in globals()
69 except:
69 except:
70 mpi = None
70 mpi = None
71 else:
71 else:
72 mpi = None
72 mpi = None
73
73
74 # Start logging
74 # Start logging
75 logfile = kernel_config['engine']['logfile']
75 logfile = kernel_config['engine']['logfile']
76 if logfile:
76 if logfile:
77 logfile = logfile + str(os.getpid()) + '.log'
77 logfile = logfile + str(os.getpid()) + '.log'
78 try:
78 try:
79 openLogFile = open(logfile, 'w')
79 openLogFile = open(logfile, 'w')
80 except:
80 except:
81 openLogFile = sys.stdout
81 openLogFile = sys.stdout
82 else:
82 else:
83 openLogFile = sys.stdout
83 openLogFile = sys.stdout
84 log.startLogging(openLogFile)
84 log.startLogging(openLogFile)
85
85
86 # Create the underlying shell class and EngineService
86 # Create the underlying shell class and EngineService
87 shell_class = import_item(core_config['shell']['shell_class'])
87 shell_class = import_item(core_config['shell']['shell_class'])
88 engine_service = EngineService(shell_class, mpi=mpi)
88 engine_service = EngineService(shell_class, mpi=mpi)
89 shell_import_statement = core_config['shell']['import_statement']
89 shell_import_statement = core_config['shell']['import_statement']
90 if shell_import_statement:
90 if shell_import_statement:
91 try:
91 try:
92 engine_service.execute(shell_import_statement)
92 engine_service.execute(shell_import_statement)
93 except:
93 except:
94 log.msg("Error running import_statement: %s" % sis)
94 log.msg("Error running import_statement: %s" % shell_import_statement)
95
95
96 # Create the service hierarchy
96 # Create the service hierarchy
97 main_service = service.MultiService()
97 main_service = service.MultiService()
98 engine_service.setServiceParent(main_service)
98 engine_service.setServiceParent(main_service)
99 tub_service = Tub()
99 tub_service = Tub()
100 tub_service.setServiceParent(main_service)
100 tub_service.setServiceParent(main_service)
101 # This needs to be called before the connection is initiated
101 # This needs to be called before the connection is initiated
102 main_service.startService()
102 main_service.startService()
103
103
104 # This initiates the connection to the controller and calls
104 # This initiates the connection to the controller and calls
105 # register_engine to tell the controller we are ready to do work
105 # register_engine to tell the controller we are ready to do work
106 engine_connector = EngineConnector(tub_service)
106 engine_connector = EngineConnector(tub_service)
107 furl_file = kernel_config['engine']['furl_file']
107 furl_file = kernel_config['engine']['furl_file']
108 log.msg("Using furl file: %s" % furl_file)
108 log.msg("Using furl file: %s" % furl_file)
109 d = engine_connector.connect_to_controller(engine_service, furl_file)
109 d = engine_connector.connect_to_controller(engine_service, furl_file)
110 d.addErrback(lambda _: reactor.stop())
110 d.addErrback(lambda _: reactor.stop())
111
111
112 reactor.run()
112 reactor.run()
113
113
114
114
115 def init_config():
115 def init_config():
116 """
116 """
117 Initialize the configuration using default and command line options.
117 Initialize the configuration using default and command line options.
118 """
118 """
119
119
120 parser = OptionParser()
120 parser = OptionParser()
121
121
122 parser.add_option(
122 parser.add_option(
123 "--furl-file",
123 "--furl-file",
124 type="string",
124 type="string",
125 dest="furl_file",
125 dest="furl_file",
126 help="The filename containing the FURL of the controller"
126 help="The filename containing the FURL of the controller"
127 )
127 )
128 parser.add_option(
128 parser.add_option(
129 "--mpi",
129 "--mpi",
130 type="string",
130 type="string",
131 dest="mpi",
131 dest="mpi",
132 help="How to enable MPI (mpi4py, pytrilinos, or empty string to disable)"
132 help="How to enable MPI (mpi4py, pytrilinos, or empty string to disable)"
133 )
133 )
134 parser.add_option(
134 parser.add_option(
135 "-l",
135 "-l",
136 "--logfile",
136 "--logfile",
137 type="string",
137 type="string",
138 dest="logfile",
138 dest="logfile",
139 help="log file name (default is stdout)"
139 help="log file name (default is stdout)"
140 )
140 )
141 parser.add_option(
141 parser.add_option(
142 "--ipythondir",
142 "--ipythondir",
143 type="string",
143 type="string",
144 dest="ipythondir",
144 dest="ipythondir",
145 help="look for config files and profiles in this directory"
145 help="look for config files and profiles in this directory"
146 )
146 )
147
147
148 (options, args) = parser.parse_args()
148 (options, args) = parser.parse_args()
149
149
150 kernel_config_manager.update_config_obj_from_default_file(options.ipythondir)
150 kernel_config_manager.update_config_obj_from_default_file(options.ipythondir)
151 core_config_manager.update_config_obj_from_default_file(options.ipythondir)
151 core_config_manager.update_config_obj_from_default_file(options.ipythondir)
152
152
153 kernel_config = kernel_config_manager.get_config_obj()
153 kernel_config = kernel_config_manager.get_config_obj()
154 # Now override with command line options
154 # Now override with command line options
155 if options.furl_file is not None:
155 if options.furl_file is not None:
156 kernel_config['engine']['furl_file'] = options.furl_file
156 kernel_config['engine']['furl_file'] = options.furl_file
157 if options.logfile is not None:
157 if options.logfile is not None:
158 kernel_config['engine']['logfile'] = options.logfile
158 kernel_config['engine']['logfile'] = options.logfile
159 if options.mpi is not None:
159 if options.mpi is not None:
160 kernel_config['mpi']['default'] = options.mpi
160 kernel_config['mpi']['default'] = options.mpi
161
161
162
162
163 def main():
163 def main():
164 """
164 """
165 After creating the configuration information, start the engine.
165 After creating the configuration information, start the engine.
166 """
166 """
167 init_config()
167 init_config()
168 start_engine()
168 start_engine()
169
169
170
170
171 if __name__ == "__main__":
171 if __name__ == "__main__":
172 main() No newline at end of file
172 main()
@@ -1,147 +1,160 b''
1 """Decorators for labeling test objects.
1 """Decorators for labeling test objects.
2
2
3 Decorators that merely return a modified version of the original
3 Decorators that merely return a modified version of the original
4 function object are straightforward. Decorators that return a new
4 function object are straightforward. Decorators that return a new
5 function object need to use
5 function object need to use
6 nose.tools.make_decorator(original_function)(decorator) in returning
6 nose.tools.make_decorator(original_function)(decorator) in returning
7 the decorator, in order to preserve metadata such as function name,
7 the decorator, in order to preserve metadata such as function name,
8 setup and teardown functions and so on - see nose.tools for more
8 setup and teardown functions and so on - see nose.tools for more
9 information.
9 information.
10
10
11 This module provides a set of useful decorators meant to be ready to use in
12 your own tests. See the bottom of the file for the ready-made ones, and if you
13 find yourself writing a new one that may be of generic use, add it here.
14
11 NOTE: This file contains IPython-specific decorators and imports the
15 NOTE: This file contains IPython-specific decorators and imports the
12 numpy.testing.decorators file, which we've copied verbatim. Any of our own
16 numpy.testing.decorators file, which we've copied verbatim. Any of our own
13 code will be added at the bottom if we end up extending this.
17 code will be added at the bottom if we end up extending this.
14 """
18 """
15
19
16 # Stdlib imports
20 # Stdlib imports
17 import inspect
21 import inspect
22 import sys
18
23
19 # Third-party imports
24 # Third-party imports
20
25
21 # This is Michele Simionato's decorator module, also kept verbatim.
26 # This is Michele Simionato's decorator module, also kept verbatim.
22 from decorator_msim import decorator, update_wrapper
27 from decorator_msim import decorator, update_wrapper
23
28
24 # Grab the numpy-specific decorators which we keep in a file that we
29 # Grab the numpy-specific decorators which we keep in a file that we
25 # occasionally update from upstream: decorators_numpy.py is an IDENTICAL copy
30 # occasionally update from upstream: decorators_numpy.py is an IDENTICAL copy
26 # of numpy.testing.decorators.
31 # of numpy.testing.decorators.
27 from decorators_numpy import *
32 from decorators_numpy import *
28
33
29 ##############################################################################
34 ##############################################################################
30 # Local code begins
35 # Local code begins
31
36
32 # Utility functions
37 # Utility functions
33
38
34 def apply_wrapper(wrapper,func):
39 def apply_wrapper(wrapper,func):
35 """Apply a wrapper to a function for decoration.
40 """Apply a wrapper to a function for decoration.
36
41
37 This mixes Michele Simionato's decorator tool with nose's make_decorator,
42 This mixes Michele Simionato's decorator tool with nose's make_decorator,
38 to apply a wrapper in a decorator so that all nose attributes, as well as
43 to apply a wrapper in a decorator so that all nose attributes, as well as
39 function signature and other properties, survive the decoration cleanly.
44 function signature and other properties, survive the decoration cleanly.
40 This will ensure that wrapped functions can still be well introspected via
45 This will ensure that wrapped functions can still be well introspected via
41 IPython, for example.
46 IPython, for example.
42 """
47 """
43 import nose.tools
48 import nose.tools
44
49
45 return decorator(wrapper,nose.tools.make_decorator(func)(wrapper))
50 return decorator(wrapper,nose.tools.make_decorator(func)(wrapper))
46
51
47
52
48 def make_label_dec(label,ds=None):
53 def make_label_dec(label,ds=None):
49 """Factory function to create a decorator that applies one or more labels.
54 """Factory function to create a decorator that applies one or more labels.
50
55
51 :Parameters:
56 :Parameters:
52 label : string or sequence
57 label : string or sequence
53 One or more labels that will be applied by the decorator to the functions
58 One or more labels that will be applied by the decorator to the functions
54 it decorates. Labels are attributes of the decorated function with their
59 it decorates. Labels are attributes of the decorated function with their
55 value set to True.
60 value set to True.
56
61
57 :Keywords:
62 :Keywords:
58 ds : string
63 ds : string
59 An optional docstring for the resulting decorator. If not given, a
64 An optional docstring for the resulting decorator. If not given, a
60 default docstring is auto-generated.
65 default docstring is auto-generated.
61
66
62 :Returns:
67 :Returns:
63 A decorator.
68 A decorator.
64
69
65 :Examples:
70 :Examples:
66
71
67 A simple labeling decorator:
72 A simple labeling decorator:
68 >>> slow = make_label_dec('slow')
73 >>> slow = make_label_dec('slow')
69 >>> print slow.__doc__
74 >>> print slow.__doc__
70 Labels a test as 'slow'.
75 Labels a test as 'slow'.
71
76
72 And one that uses multiple labels and a custom docstring:
77 And one that uses multiple labels and a custom docstring:
73 >>> rare = make_label_dec(['slow','hard'],
78 >>> rare = make_label_dec(['slow','hard'],
74 ... "Mix labels 'slow' and 'hard' for rare tests.")
79 ... "Mix labels 'slow' and 'hard' for rare tests.")
75 >>> print rare.__doc__
80 >>> print rare.__doc__
76 Mix labels 'slow' and 'hard' for rare tests.
81 Mix labels 'slow' and 'hard' for rare tests.
77
82
78 Now, let's test using this one:
83 Now, let's test using this one:
79 >>> @rare
84 >>> @rare
80 ... def f(): pass
85 ... def f(): pass
81 ...
86 ...
82 >>>
87 >>>
83 >>> f.slow
88 >>> f.slow
84 True
89 True
85 >>> f.hard
90 >>> f.hard
86 True
91 True
87 """
92 """
88
93
89 if isinstance(label,basestring):
94 if isinstance(label,basestring):
90 labels = [label]
95 labels = [label]
91 else:
96 else:
92 labels = label
97 labels = label
93
98
94 # Validate that the given label(s) are OK for use in setattr() by doing a
99 # Validate that the given label(s) are OK for use in setattr() by doing a
95 # dry run on a dummy function.
100 # dry run on a dummy function.
96 tmp = lambda : None
101 tmp = lambda : None
97 for label in labels:
102 for label in labels:
98 setattr(tmp,label,True)
103 setattr(tmp,label,True)
99
104
100 # This is the actual decorator we'll return
105 # This is the actual decorator we'll return
101 def decor(f):
106 def decor(f):
102 for label in labels:
107 for label in labels:
103 setattr(f,label,True)
108 setattr(f,label,True)
104 return f
109 return f
105
110
106 # Apply the user's docstring, or autogenerate a basic one
111 # Apply the user's docstring, or autogenerate a basic one
107 if ds is None:
112 if ds is None:
108 ds = "Labels a test as %r." % label
113 ds = "Labels a test as %r." % label
109 decor.__doc__ = ds
114 decor.__doc__ = ds
110
115
111 return decor
116 return decor
112
117
113 #-----------------------------------------------------------------------------
118 #-----------------------------------------------------------------------------
114 # Decorators for public use
119 # Decorators for public use
115
120
116 skip_doctest = make_label_dec('skip_doctest',
121 skip_doctest = make_label_dec('skip_doctest',
117 """Decorator - mark a function or method for skipping its doctest.
122 """Decorator - mark a function or method for skipping its doctest.
118
123
119 This decorator allows you to mark a function whose docstring you wish to
124 This decorator allows you to mark a function whose docstring you wish to
120 omit from testing, while preserving the docstring for introspection, help,
125 omit from testing, while preserving the docstring for introspection, help,
121 etc.""")
126 etc.""")
122
127
123 def skip(msg=''):
128 def skip(msg=''):
124 """Decorator - mark a test function for skipping from test suite.
129 """Decorator - mark a test function for skipping from test suite.
125
130
131 This function *is* already a decorator, it is not a factory like
132 make_label_dec or some of those in decorators_numpy.
133
126 :Parameters:
134 :Parameters:
127
135
128 func : function
136 func : function
129 Test function to be skipped
137 Test function to be skipped
130
138
131 msg : string
139 msg : string
132 Optional message to be added.
140 Optional message to be added.
133 """
141 """
134
142
135 import nose
143 import nose
136
144
137 def inner(func):
145 def inner(func):
138
146
139 def wrapper(*a,**k):
147 def wrapper(*a,**k):
140 if msg: out = '\n'+msg
148 if msg: out = '\n'+msg
141 else: out = ''
149 else: out = ''
142 raise nose.SkipTest("Skipping test for function: %s%s" %
150 raise nose.SkipTest("Skipping test for function: %s%s" %
143 (func.__name__,out))
151 (func.__name__,out))
144
152
145 return apply_wrapper(wrapper,func)
153 return apply_wrapper(wrapper,func)
146
154
147 return inner
155 return inner
156
157 # Decorators to skip certain tests on specific platforms.
158 skip_win32 = skipif(sys.platform=='win32',"This test does not run under Windows")
159 skip_linux = skipif(sys.platform=='linux2',"This test does not run under Linux")
160 skip_osx = skipif(sys.platform=='darwin',"This test does not run under OSX")
@@ -1,185 +1,51 b''
1 """Some simple tests for the plugin while running scripts.
2 """
1 # Module imports
3 # Module imports
2 # Std lib
4 # Std lib
3 import inspect
5 import inspect
4
6
5 # Third party
6
7 # Our own
7 # Our own
8 from IPython.testing import decorators as dec
8 from IPython.testing import decorators as dec
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Utilities
12
13 # Note: copied from OInspect, kept here so the testing stuff doesn't create
14 # circular dependencies and is easier to reuse.
15 def getargspec(obj):
16 """Get the names and default values of a function's arguments.
17
18 A tuple of four things is returned: (args, varargs, varkw, defaults).
19 'args' is a list of the argument names (it may contain nested lists).
20 'varargs' and 'varkw' are the names of the * and ** arguments or None.
21 'defaults' is an n-tuple of the default values of the last n arguments.
22
23 Modified version of inspect.getargspec from the Python Standard
24 Library."""
25
26 if inspect.isfunction(obj):
27 func_obj = obj
28 elif inspect.ismethod(obj):
29 func_obj = obj.im_func
30 else:
31 raise TypeError, 'arg is not a Python function'
32 args, varargs, varkw = inspect.getargs(func_obj.func_code)
33 return args, varargs, varkw, func_obj.func_defaults
34
35 #-----------------------------------------------------------------------------
36 # Testing functions
11 # Testing functions
37
12
38 def test_trivial():
13 def test_trivial():
39 """A trivial passing test."""
14 """A trivial passing test."""
40 pass
15 pass
41
16
42
43 @dec.skip
44 def test_deliberately_broken():
45 """A deliberately broken test - we want to skip this one."""
46 1/0
47
48 @dec.skip('foo')
49 def test_deliberately_broken2():
50 """Another deliberately broken test - we want to skip this one."""
51 1/0
52
53
54 # Verify that we can correctly skip the doctest for a function at will, but
55 # that the docstring itself is NOT destroyed by the decorator.
56 @dec.skip_doctest
57 def doctest_bad(x,y=1,**k):
58 """A function whose doctest we need to skip.
59
60 >>> 1+1
61 3
62 """
63 print 'x:',x
64 print 'y:',y
65 print 'k:',k
66
67
68 def call_doctest_bad():
69 """Check that we can still call the decorated functions.
70
71 >>> doctest_bad(3,y=4)
72 x: 3
73 y: 4
74 k: {}
75 """
76 pass
77
78
79 # Doctest skipping should work for class methods too
80 class foo(object):
81 """Foo
82
83 Example:
84
85 >>> 1+1
86 2
87 """
88
89 @dec.skip_doctest
90 def __init__(self,x):
91 """Make a foo.
92
93 Example:
94
95 >>> f = foo(3)
96 junk
97 """
98 print 'Making a foo.'
99 self.x = x
100
101 @dec.skip_doctest
102 def bar(self,y):
103 """Example:
104
105 >>> f = foo(3)
106 >>> f.bar(0)
107 boom!
108 >>> 1/0
109 bam!
110 """
111 return 1/y
112
113 def baz(self,y):
114 """Example:
115
116 >>> f = foo(3)
117 Making a foo.
118 >>> f.baz(3)
119 True
120 """
121 return self.x==y
122
123
124 def test_skip_dt_decorator():
125 """Doctest-skipping decorator should preserve the docstring.
126 """
127 # Careful: 'check' must be a *verbatim* copy of the doctest_bad docstring!
128 check = """A function whose doctest we need to skip.
129
130 >>> 1+1
131 3
132 """
133 # Fetch the docstring from doctest_bad after decoration.
134 val = doctest_bad.__doc__
135
136 assert check==val,"doctest_bad docstrings don't match"
137
138
139 def test_skip_dt_decorator2():
140 """Doctest-skipping decorator should preserve function signature.
141 """
142 # Hardcoded correct answer
143 dtargs = (['x', 'y'], None, 'k', (1,))
144 # Introspect out the value
145 dtargsr = getargspec(doctest_bad)
146 assert dtargsr==dtargs, \
147 "Incorrectly reconstructed args for doctest_bad: %s" % (dtargsr,)
148
149
150 def doctest_run():
17 def doctest_run():
151 """Test running a trivial script.
18 """Test running a trivial script.
152
19
153 In [13]: run simplevars.py
20 In [13]: run simplevars.py
154 x is: 1
21 x is: 1
155 """
22 """
156
23
157 #@dec.skip_doctest
158 def doctest_runvars():
24 def doctest_runvars():
159 """Test that variables defined in scripts get loaded correcly via %run.
25 """Test that variables defined in scripts get loaded correcly via %run.
160
26
161 In [13]: run simplevars.py
27 In [13]: run simplevars.py
162 x is: 1
28 x is: 1
163
29
164 In [14]: x
30 In [14]: x
165 Out[14]: 1
31 Out[14]: 1
166 """
32 """
167
33
168 def doctest_ivars():
34 def doctest_ivars():
169 """Test that variables defined interactively are picked up.
35 """Test that variables defined interactively are picked up.
170 In [5]: zz=1
36 In [5]: zz=1
171
37
172 In [6]: zz
38 In [6]: zz
173 Out[6]: 1
39 Out[6]: 1
174 """
40 """
175
41
176 @dec.skip_doctest
42 @dec.skip_doctest
177 def doctest_refs():
43 def doctest_refs():
178 """DocTest reference holding issues when running scripts.
44 """DocTest reference holding issues when running scripts.
179
45
180 In [32]: run show_refs.py
46 In [32]: run show_refs.py
181 c referrers: [<type 'dict'>]
47 c referrers: [<type 'dict'>]
182
48
183 In [33]: map(type,gc.get_referrers(c))
49 In [33]: map(type,gc.get_referrers(c))
184 Out[33]: [<type 'dict'>]
50 Out[33]: [<type 'dict'>]
185 """
51 """
@@ -1,11 +1,11 b''
1 ===============
1 ==============
2 IPython1 README
2 IPython README
3 ===============
3 ==============
4
5 .. contents::
6
4
7 Overview
5 Overview
8 ========
6 ========
9
7
10 Welcome to IPython. New users should consult our documentation, which can be found
8 Welcome to IPython. Our documentation can be found in the docs/source
11 in the docs/source subdirectory.
9 subdirectory. We also have ``.html`` and ``.pdf`` versions of this
10 documentation available on the IPython `website <http://ipython.scipy.org>`_.
11
@@ -1,325 +1,360 b''
1 .. _changes:
1 .. _changes:
2
2
3 ==========
3 ==========
4 What's new
4 What's new
5 ==========
5 ==========
6
6
7 .. contents::
7 .. contents::
8 ..
8 ..
9 1 Release 0.9
9 1 Release 0.9.1
10 1.1 New features
10 2 Release 0.9
11 1.2 Bug fixes
11 2.1 New features
12 1.3 Backwards incompatible changes
12 2.2 Bug fixes
13 1.4 Changes merged in from IPython1
13 2.3 Backwards incompatible changes
14 1.4.1 New features
14 2.4 Changes merged in from IPython1
15 1.4.2 Bug fixes
15 2.4.1 New features
16 1.4.3 Backwards incompatible changes
16 2.4.2 Bug fixes
17 2 Release 0.8.4
17 2.4.3 Backwards incompatible changes
18 3 Release 0.8.3
18 3 Release 0.8.4
19 4 Release 0.8.2
19 4 Release 0.8.3
20 5 Older releases
20 5 Release 0.8.2
21 6 Older releases
21 ..
22 ..
22
23
24 Release DEV
25 ===========
26
27 * cd completer: show bookmarks if no other completions are available.
28
29 * Remove ipy_leo.py. "easy_install ipython-extension" to get it.
30 (done to decouple it from ipython release cycle)
31
32 * sh profile: easy way to give 'title' to prompt: assign to variable
33 '_prompt_title'. It looks like this::
34
35 [~]|1> _prompt_title = 'sudo!'
36 sudo![~]|2>
37
38 * %rehashx: Aliases no longer contain dots. python3.0 binary
39 will create alias python30. Fixes:
40 #259716 "commands with dots in them don't work"
41
42 * %cpaste: %cpaste -r repeats the last pasted block.
43 The block is assigned to pasted_block even if code
44 raises exception.
45
46 * %edit: If you do '%edit pasted_block', pasted_block
47 variable gets updated with new data (so repeated
48 editing makes sense)
49
50
51 Release 0.9.1
52 =============
53
54 This release was quickly made to restore compatibility with Python 2.4, which
55 version 0.9 accidentally broke. No new features were introduced, other than
56 some additional testing support for internal use.
57
23
58
24 Release 0.9
59 Release 0.9
25 ===========
60 ===========
26
61
27 New features
62 New features
28 ------------
63 ------------
29
64
30 * All furl files and security certificates are now put in a read-only directory
65 * All furl files and security certificates are now put in a read-only directory
31 named ~./ipython/security.
66 named ~./ipython/security.
32
67
33 * A single function :func:`get_ipython_dir`, in :mod:`IPython.genutils` that
68 * A single function :func:`get_ipython_dir`, in :mod:`IPython.genutils` that
34 determines the user's IPython directory in a robust manner.
69 determines the user's IPython directory in a robust manner.
35
70
36 * Laurent's WX application has been given a top-level script called ipython-wx,
71 * Laurent's WX application has been given a top-level script called ipython-wx,
37 and it has received numerous fixes. We expect this code to be
72 and it has received numerous fixes. We expect this code to be
38 architecturally better integrated with Gael's WX 'ipython widget' over the
73 architecturally better integrated with Gael's WX 'ipython widget' over the
39 next few releases.
74 next few releases.
40
75
41 * The Editor synchronization work by Vivian De Smedt has been merged in. This
76 * The Editor synchronization work by Vivian De Smedt has been merged in. This
42 code adds a number of new editor hooks to synchronize with editors under
77 code adds a number of new editor hooks to synchronize with editors under
43 Windows.
78 Windows.
44
79
45 * A new, still experimental but highly functional, WX shell by Gael Varoquaux.
80 * A new, still experimental but highly functional, WX shell by Gael Varoquaux.
46 This work was sponsored by Enthought, and while it's still very new, it is
81 This work was sponsored by Enthought, and while it's still very new, it is
47 based on a more cleanly organized arhictecture of the various IPython
82 based on a more cleanly organized arhictecture of the various IPython
48 components. We will continue to develop this over the next few releases as a
83 components. We will continue to develop this over the next few releases as a
49 model for GUI components that use IPython.
84 model for GUI components that use IPython.
50
85
51 * Another GUI frontend, Cocoa based (Cocoa is the OSX native GUI framework),
86 * Another GUI frontend, Cocoa based (Cocoa is the OSX native GUI framework),
52 authored by Barry Wark. Currently the WX and the Cocoa ones have slightly
87 authored by Barry Wark. Currently the WX and the Cocoa ones have slightly
53 different internal organizations, but the whole team is working on finding
88 different internal organizations, but the whole team is working on finding
54 what the right abstraction points are for a unified codebase.
89 what the right abstraction points are for a unified codebase.
55
90
56 * As part of the frontend work, Barry Wark also implemented an experimental
91 * As part of the frontend work, Barry Wark also implemented an experimental
57 event notification system that various ipython components can use. In the
92 event notification system that various ipython components can use. In the
58 next release the implications and use patterns of this system regarding the
93 next release the implications and use patterns of this system regarding the
59 various GUI options will be worked out.
94 various GUI options will be worked out.
60
95
61 * IPython finally has a full test system, that can test docstrings with
96 * IPython finally has a full test system, that can test docstrings with
62 IPython-specific functionality. There are still a few pieces missing for it
97 IPython-specific functionality. There are still a few pieces missing for it
63 to be widely accessible to all users (so they can run the test suite at any
98 to be widely accessible to all users (so they can run the test suite at any
64 time and report problems), but it now works for the developers. We are
99 time and report problems), but it now works for the developers. We are
65 working hard on continuing to improve it, as this was probably IPython's
100 working hard on continuing to improve it, as this was probably IPython's
66 major Achilles heel (the lack of proper test coverage made it effectively
101 major Achilles heel (the lack of proper test coverage made it effectively
67 impossible to do large-scale refactoring). The full test suite can now
102 impossible to do large-scale refactoring). The full test suite can now
68 be run using the :command:`iptest` command line program.
103 be run using the :command:`iptest` command line program.
69
104
70 * The notion of a task has been completely reworked. An `ITask` interface has
105 * The notion of a task has been completely reworked. An `ITask` interface has
71 been created. This interface defines the methods that tasks need to
106 been created. This interface defines the methods that tasks need to
72 implement. These methods are now responsible for things like submitting
107 implement. These methods are now responsible for things like submitting
73 tasks and processing results. There are two basic task types:
108 tasks and processing results. There are two basic task types:
74 :class:`IPython.kernel.task.StringTask` (this is the old `Task` object, but
109 :class:`IPython.kernel.task.StringTask` (this is the old `Task` object, but
75 renamed) and the new :class:`IPython.kernel.task.MapTask`, which is based on
110 renamed) and the new :class:`IPython.kernel.task.MapTask`, which is based on
76 a function.
111 a function.
77
112
78 * A new interface, :class:`IPython.kernel.mapper.IMapper` has been defined to
113 * A new interface, :class:`IPython.kernel.mapper.IMapper` has been defined to
79 standardize the idea of a `map` method. This interface has a single `map`
114 standardize the idea of a `map` method. This interface has a single `map`
80 method that has the same syntax as the built-in `map`. We have also defined
115 method that has the same syntax as the built-in `map`. We have also defined
81 a `mapper` factory interface that creates objects that implement
116 a `mapper` factory interface that creates objects that implement
82 :class:`IPython.kernel.mapper.IMapper` for different controllers. Both the
117 :class:`IPython.kernel.mapper.IMapper` for different controllers. Both the
83 multiengine and task controller now have mapping capabilties.
118 multiengine and task controller now have mapping capabilties.
84
119
85 * The parallel function capabilities have been reworks. The major changes are
120 * The parallel function capabilities have been reworks. The major changes are
86 that i) there is now an `@parallel` magic that creates parallel functions,
121 that i) there is now an `@parallel` magic that creates parallel functions,
87 ii) the syntax for mulitple variable follows that of `map`, iii) both the
122 ii) the syntax for mulitple variable follows that of `map`, iii) both the
88 multiengine and task controller now have a parallel function implementation.
123 multiengine and task controller now have a parallel function implementation.
89
124
90 * All of the parallel computing capabilities from `ipython1-dev` have been
125 * All of the parallel computing capabilities from `ipython1-dev` have been
91 merged into IPython proper. This resulted in the following new subpackages:
126 merged into IPython proper. This resulted in the following new subpackages:
92 :mod:`IPython.kernel`, :mod:`IPython.kernel.core`, :mod:`IPython.config`,
127 :mod:`IPython.kernel`, :mod:`IPython.kernel.core`, :mod:`IPython.config`,
93 :mod:`IPython.tools` and :mod:`IPython.testing`.
128 :mod:`IPython.tools` and :mod:`IPython.testing`.
94
129
95 * As part of merging in the `ipython1-dev` stuff, the `setup.py` script and
130 * As part of merging in the `ipython1-dev` stuff, the `setup.py` script and
96 friends have been completely refactored. Now we are checking for
131 friends have been completely refactored. Now we are checking for
97 dependencies using the approach that matplotlib uses.
132 dependencies using the approach that matplotlib uses.
98
133
99 * The documentation has been completely reorganized to accept the documentation
134 * The documentation has been completely reorganized to accept the documentation
100 from `ipython1-dev`.
135 from `ipython1-dev`.
101
136
102 * We have switched to using Foolscap for all of our network protocols in
137 * We have switched to using Foolscap for all of our network protocols in
103 :mod:`IPython.kernel`. This gives us secure connections that are both
138 :mod:`IPython.kernel`. This gives us secure connections that are both
104 encrypted and authenticated.
139 encrypted and authenticated.
105
140
106 * We have a brand new `COPYING.txt` files that describes the IPython license
141 * We have a brand new `COPYING.txt` files that describes the IPython license
107 and copyright. The biggest change is that we are putting "The IPython
142 and copyright. The biggest change is that we are putting "The IPython
108 Development Team" as the copyright holder. We give more details about
143 Development Team" as the copyright holder. We give more details about
109 exactly what this means in this file. All developer should read this and use
144 exactly what this means in this file. All developer should read this and use
110 the new banner in all IPython source code files.
145 the new banner in all IPython source code files.
111
146
112 * sh profile: ./foo runs foo as system command, no need to do !./foo anymore
147 * sh profile: ./foo runs foo as system command, no need to do !./foo anymore
113
148
114 * String lists now support ``sort(field, nums = True)`` method (to easily sort
149 * String lists now support ``sort(field, nums = True)`` method (to easily sort
115 system command output). Try it with ``a = !ls -l ; a.sort(1, nums=1)``.
150 system command output). Try it with ``a = !ls -l ; a.sort(1, nums=1)``.
116
151
117 * '%cpaste foo' now assigns the pasted block as string list, instead of string
152 * '%cpaste foo' now assigns the pasted block as string list, instead of string
118
153
119 * The ipcluster script now run by default with no security. This is done
154 * The ipcluster script now run by default with no security. This is done
120 because the main usage of the script is for starting things on localhost.
155 because the main usage of the script is for starting things on localhost.
121 Eventually when ipcluster is able to start things on other hosts, we will put
156 Eventually when ipcluster is able to start things on other hosts, we will put
122 security back.
157 security back.
123
158
124 * 'cd --foo' searches directory history for string foo, and jumps to that dir.
159 * 'cd --foo' searches directory history for string foo, and jumps to that dir.
125 Last part of dir name is checked first. If no matches for that are found,
160 Last part of dir name is checked first. If no matches for that are found,
126 look at the whole path.
161 look at the whole path.
127
162
128
163
129 Bug fixes
164 Bug fixes
130 ---------
165 ---------
131
166
132 * The Windows installer has been fixed. Now all IPython scripts have ``.bat``
167 * The Windows installer has been fixed. Now all IPython scripts have ``.bat``
133 versions created. Also, the Start Menu shortcuts have been updated.
168 versions created. Also, the Start Menu shortcuts have been updated.
134
169
135 * The colors escapes in the multiengine client are now turned off on win32 as
170 * The colors escapes in the multiengine client are now turned off on win32 as
136 they don't print correctly.
171 they don't print correctly.
137
172
138 * The :mod:`IPython.kernel.scripts.ipengine` script was exec'ing
173 * The :mod:`IPython.kernel.scripts.ipengine` script was exec'ing
139 mpi_import_statement incorrectly, which was leading the engine to crash when
174 mpi_import_statement incorrectly, which was leading the engine to crash when
140 mpi was enabled.
175 mpi was enabled.
141
176
142 * A few subpackages had missing ``__init__.py`` files.
177 * A few subpackages had missing ``__init__.py`` files.
143
178
144 * The documentation is only created if Sphinx is found. Previously, the
179 * The documentation is only created if Sphinx is found. Previously, the
145 ``setup.py`` script would fail if it was missing.
180 ``setup.py`` script would fail if it was missing.
146
181
147 * Greedy ``cd`` completion has been disabled again (it was enabled in 0.8.4) as
182 * Greedy ``cd`` completion has been disabled again (it was enabled in 0.8.4) as
148 it caused problems on certain platforms.
183 it caused problems on certain platforms.
149
184
150
185
151 Backwards incompatible changes
186 Backwards incompatible changes
152 ------------------------------
187 ------------------------------
153
188
154 * The ``clusterfile`` options of the :command:`ipcluster` command has been
189 * The ``clusterfile`` options of the :command:`ipcluster` command has been
155 removed as it was not working and it will be replaced soon by something much
190 removed as it was not working and it will be replaced soon by something much
156 more robust.
191 more robust.
157
192
158 * The :mod:`IPython.kernel` configuration now properly find the user's
193 * The :mod:`IPython.kernel` configuration now properly find the user's
159 IPython directory.
194 IPython directory.
160
195
161 * In ipapi, the :func:`make_user_ns` function has been replaced with
196 * In ipapi, the :func:`make_user_ns` function has been replaced with
162 :func:`make_user_namespaces`, to support dict subclasses in namespace
197 :func:`make_user_namespaces`, to support dict subclasses in namespace
163 creation.
198 creation.
164
199
165 * :class:`IPython.kernel.client.Task` has been renamed
200 * :class:`IPython.kernel.client.Task` has been renamed
166 :class:`IPython.kernel.client.StringTask` to make way for new task types.
201 :class:`IPython.kernel.client.StringTask` to make way for new task types.
167
202
168 * The keyword argument `style` has been renamed `dist` in `scatter`, `gather`
203 * The keyword argument `style` has been renamed `dist` in `scatter`, `gather`
169 and `map`.
204 and `map`.
170
205
171 * Renamed the values that the rename `dist` keyword argument can have from
206 * Renamed the values that the rename `dist` keyword argument can have from
172 `'basic'` to `'b'`.
207 `'basic'` to `'b'`.
173
208
174 * IPython has a larger set of dependencies if you want all of its capabilities.
209 * IPython has a larger set of dependencies if you want all of its capabilities.
175 See the `setup.py` script for details.
210 See the `setup.py` script for details.
176
211
177 * The constructors for :class:`IPython.kernel.client.MultiEngineClient` and
212 * The constructors for :class:`IPython.kernel.client.MultiEngineClient` and
178 :class:`IPython.kernel.client.TaskClient` no longer take the (ip,port) tuple.
213 :class:`IPython.kernel.client.TaskClient` no longer take the (ip,port) tuple.
179 Instead they take the filename of a file that contains the FURL for that
214 Instead they take the filename of a file that contains the FURL for that
180 client. If the FURL file is in your IPYTHONDIR, it will be found automatically
215 client. If the FURL file is in your IPYTHONDIR, it will be found automatically
181 and the constructor can be left empty.
216 and the constructor can be left empty.
182
217
183 * The asynchronous clients in :mod:`IPython.kernel.asyncclient` are now created
218 * The asynchronous clients in :mod:`IPython.kernel.asyncclient` are now created
184 using the factory functions :func:`get_multiengine_client` and
219 using the factory functions :func:`get_multiengine_client` and
185 :func:`get_task_client`. These return a `Deferred` to the actual client.
220 :func:`get_task_client`. These return a `Deferred` to the actual client.
186
221
187 * The command line options to `ipcontroller` and `ipengine` have changed to
222 * The command line options to `ipcontroller` and `ipengine` have changed to
188 reflect the new Foolscap network protocol and the FURL files. Please see the
223 reflect the new Foolscap network protocol and the FURL files. Please see the
189 help for these scripts for details.
224 help for these scripts for details.
190
225
191 * The configuration files for the kernel have changed because of the Foolscap
226 * The configuration files for the kernel have changed because of the Foolscap
192 stuff. If you were using custom config files before, you should delete them
227 stuff. If you were using custom config files before, you should delete them
193 and regenerate new ones.
228 and regenerate new ones.
194
229
195 Changes merged in from IPython1
230 Changes merged in from IPython1
196 -------------------------------
231 -------------------------------
197
232
198 New features
233 New features
199 ............
234 ............
200
235
201 * Much improved ``setup.py`` and ``setupegg.py`` scripts. Because Twisted and
236 * Much improved ``setup.py`` and ``setupegg.py`` scripts. Because Twisted and
202 zope.interface are now easy installable, we can declare them as dependencies
237 zope.interface are now easy installable, we can declare them as dependencies
203 in our setupegg.py script.
238 in our setupegg.py script.
204
239
205 * IPython is now compatible with Twisted 2.5.0 and 8.x.
240 * IPython is now compatible with Twisted 2.5.0 and 8.x.
206
241
207 * Added a new example of how to use :mod:`ipython1.kernel.asynclient`.
242 * Added a new example of how to use :mod:`ipython1.kernel.asynclient`.
208
243
209 * Initial draft of a process daemon in :mod:`ipython1.daemon`. This has not
244 * Initial draft of a process daemon in :mod:`ipython1.daemon`. This has not
210 been merged into IPython and is still in `ipython1-dev`.
245 been merged into IPython and is still in `ipython1-dev`.
211
246
212 * The ``TaskController`` now has methods for getting the queue status.
247 * The ``TaskController`` now has methods for getting the queue status.
213
248
214 * The ``TaskResult`` objects not have information about how long the task
249 * The ``TaskResult`` objects not have information about how long the task
215 took to run.
250 took to run.
216
251
217 * We are attaching additional attributes to exceptions ``(_ipython_*)`` that
252 * We are attaching additional attributes to exceptions ``(_ipython_*)`` that
218 we use to carry additional info around.
253 we use to carry additional info around.
219
254
220 * New top-level module :mod:`asyncclient` that has asynchronous versions (that
255 * New top-level module :mod:`asyncclient` that has asynchronous versions (that
221 return deferreds) of the client classes. This is designed to users who want
256 return deferreds) of the client classes. This is designed to users who want
222 to run their own Twisted reactor.
257 to run their own Twisted reactor.
223
258
224 * All the clients in :mod:`client` are now based on Twisted. This is done by
259 * All the clients in :mod:`client` are now based on Twisted. This is done by
225 running the Twisted reactor in a separate thread and using the
260 running the Twisted reactor in a separate thread and using the
226 :func:`blockingCallFromThread` function that is in recent versions of Twisted.
261 :func:`blockingCallFromThread` function that is in recent versions of Twisted.
227
262
228 * Functions can now be pushed/pulled to/from engines using
263 * Functions can now be pushed/pulled to/from engines using
229 :meth:`MultiEngineClient.push_function` and
264 :meth:`MultiEngineClient.push_function` and
230 :meth:`MultiEngineClient.pull_function`.
265 :meth:`MultiEngineClient.pull_function`.
231
266
232 * Gather/scatter are now implemented in the client to reduce the work load
267 * Gather/scatter are now implemented in the client to reduce the work load
233 of the controller and improve performance.
268 of the controller and improve performance.
234
269
235 * Complete rewrite of the IPython docuementation. All of the documentation
270 * Complete rewrite of the IPython docuementation. All of the documentation
236 from the IPython website has been moved into docs/source as restructured
271 from the IPython website has been moved into docs/source as restructured
237 text documents. PDF and HTML documentation are being generated using
272 text documents. PDF and HTML documentation are being generated using
238 Sphinx.
273 Sphinx.
239
274
240 * New developer oriented documentation: development guidelines and roadmap.
275 * New developer oriented documentation: development guidelines and roadmap.
241
276
242 * Traditional ``ChangeLog`` has been changed to a more useful ``changes.txt``
277 * Traditional ``ChangeLog`` has been changed to a more useful ``changes.txt``
243 file that is organized by release and is meant to provide something more
278 file that is organized by release and is meant to provide something more
244 relevant for users.
279 relevant for users.
245
280
246 Bug fixes
281 Bug fixes
247 .........
282 .........
248
283
249 * Created a proper ``MANIFEST.in`` file to create source distributions.
284 * Created a proper ``MANIFEST.in`` file to create source distributions.
250
285
251 * Fixed a bug in the ``MultiEngine`` interface. Previously, multi-engine
286 * Fixed a bug in the ``MultiEngine`` interface. Previously, multi-engine
252 actions were being collected with a :class:`DeferredList` with
287 actions were being collected with a :class:`DeferredList` with
253 ``fireononeerrback=1``. This meant that methods were returning
288 ``fireononeerrback=1``. This meant that methods were returning
254 before all engines had given their results. This was causing extremely odd
289 before all engines had given their results. This was causing extremely odd
255 bugs in certain cases. To fix this problem, we have 1) set
290 bugs in certain cases. To fix this problem, we have 1) set
256 ``fireononeerrback=0`` to make sure all results (or exceptions) are in
291 ``fireononeerrback=0`` to make sure all results (or exceptions) are in
257 before returning and 2) introduced a :exc:`CompositeError` exception
292 before returning and 2) introduced a :exc:`CompositeError` exception
258 that wraps all of the engine exceptions. This is a huge change as it means
293 that wraps all of the engine exceptions. This is a huge change as it means
259 that users will have to catch :exc:`CompositeError` rather than the actual
294 that users will have to catch :exc:`CompositeError` rather than the actual
260 exception.
295 exception.
261
296
262 Backwards incompatible changes
297 Backwards incompatible changes
263 ..............................
298 ..............................
264
299
265 * All names have been renamed to conform to the lowercase_with_underscore
300 * All names have been renamed to conform to the lowercase_with_underscore
266 convention. This will require users to change references to all names like
301 convention. This will require users to change references to all names like
267 ``queueStatus`` to ``queue_status``.
302 ``queueStatus`` to ``queue_status``.
268
303
269 * Previously, methods like :meth:`MultiEngineClient.push` and
304 * Previously, methods like :meth:`MultiEngineClient.push` and
270 :meth:`MultiEngineClient.push` used ``*args`` and ``**kwargs``. This was
305 :meth:`MultiEngineClient.push` used ``*args`` and ``**kwargs``. This was
271 becoming a problem as we weren't able to introduce new keyword arguments into
306 becoming a problem as we weren't able to introduce new keyword arguments into
272 the API. Now these methods simple take a dict or sequence. This has also
307 the API. Now these methods simple take a dict or sequence. This has also
273 allowed us to get rid of the ``*All`` methods like :meth:`pushAll` and
308 allowed us to get rid of the ``*All`` methods like :meth:`pushAll` and
274 :meth:`pullAll`. These things are now handled with the ``targets`` keyword
309 :meth:`pullAll`. These things are now handled with the ``targets`` keyword
275 argument that defaults to ``'all'``.
310 argument that defaults to ``'all'``.
276
311
277 * The :attr:`MultiEngineClient.magicTargets` has been renamed to
312 * The :attr:`MultiEngineClient.magicTargets` has been renamed to
278 :attr:`MultiEngineClient.targets`.
313 :attr:`MultiEngineClient.targets`.
279
314
280 * All methods in the MultiEngine interface now accept the optional keyword
315 * All methods in the MultiEngine interface now accept the optional keyword
281 argument ``block``.
316 argument ``block``.
282
317
283 * Renamed :class:`RemoteController` to :class:`MultiEngineClient` and
318 * Renamed :class:`RemoteController` to :class:`MultiEngineClient` and
284 :class:`TaskController` to :class:`TaskClient`.
319 :class:`TaskController` to :class:`TaskClient`.
285
320
286 * Renamed the top-level module from :mod:`api` to :mod:`client`.
321 * Renamed the top-level module from :mod:`api` to :mod:`client`.
287
322
288 * Most methods in the multiengine interface now raise a :exc:`CompositeError`
323 * Most methods in the multiengine interface now raise a :exc:`CompositeError`
289 exception that wraps the user's exceptions, rather than just raising the raw
324 exception that wraps the user's exceptions, rather than just raising the raw
290 user's exception.
325 user's exception.
291
326
292 * Changed the ``setupNS`` and ``resultNames`` in the ``Task`` class to ``push``
327 * Changed the ``setupNS`` and ``resultNames`` in the ``Task`` class to ``push``
293 and ``pull``.
328 and ``pull``.
294
329
295
330
296 Release 0.8.4
331 Release 0.8.4
297 =============
332 =============
298
333
299 This was a quick release to fix an unfortunate bug that slipped into the 0.8.3
334 This was a quick release to fix an unfortunate bug that slipped into the 0.8.3
300 release. The ``--twisted`` option was disabled, as it turned out to be broken
335 release. The ``--twisted`` option was disabled, as it turned out to be broken
301 across several platforms.
336 across several platforms.
302
337
303
338
304 Release 0.8.3
339 Release 0.8.3
305 =============
340 =============
306
341
307 * pydb is now disabled by default (due to %run -d problems). You can enable
342 * pydb is now disabled by default (due to %run -d problems). You can enable
308 it by passing -pydb command line argument to IPython. Note that setting
343 it by passing -pydb command line argument to IPython. Note that setting
309 it in config file won't work.
344 it in config file won't work.
310
345
311
346
312 Release 0.8.2
347 Release 0.8.2
313 =============
348 =============
314
349
315 * %pushd/%popd behave differently; now "pushd /foo" pushes CURRENT directory
350 * %pushd/%popd behave differently; now "pushd /foo" pushes CURRENT directory
316 and jumps to /foo. The current behaviour is closer to the documented
351 and jumps to /foo. The current behaviour is closer to the documented
317 behaviour, and should not trip anyone.
352 behaviour, and should not trip anyone.
318
353
319
354
320 Older releases
355 Older releases
321 ==============
356 ==============
322
357
323 Changes in earlier releases of IPython are described in the older file
358 Changes in earlier releases of IPython are described in the older file
324 ``ChangeLog``. Please refer to this document for details.
359 ``ChangeLog``. Please refer to this document for details.
325
360
@@ -1,426 +1,446 b''
1 .. _development:
1 .. _development:
2
2
3 ==================================
3 ==============================
4 IPython development guidelines
4 IPython development guidelines
5 ==================================
5 ==============================
6
7 .. contents::
8
6
9
7
10 Overview
8 Overview
11 ========
9 ========
12
10
13 IPython is the next generation of IPython. It is named such for two reasons:
11 IPython is the next generation of IPython. It is named such for two reasons:
14
12
15 - Eventually, IPython will become IPython version 1.0.
13 - Eventually, IPython will become IPython version 1.0.
16 - This new code base needs to be able to co-exist with the existing IPython until
14 - This new code base needs to be able to co-exist with the existing IPython until
17 it is a full replacement for it. Thus we needed a different name. We couldn't
15 it is a full replacement for it. Thus we needed a different name. We couldn't
18 use ``ipython`` (lowercase) as some files systems are case insensitive.
16 use ``ipython`` (lowercase) as some files systems are case insensitive.
19
17
20 There are two, no three, main goals of the IPython effort:
18 There are two, no three, main goals of the IPython effort:
21
19
22 1. Clean up the existing codebase and write lots of tests.
20 1. Clean up the existing codebase and write lots of tests.
23 2. Separate the core functionality of IPython from the terminal to enable IPython
21 2. Separate the core functionality of IPython from the terminal to enable IPython
24 to be used from within a variety of GUI applications.
22 to be used from within a variety of GUI applications.
25 3. Implement a system for interactive parallel computing.
23 3. Implement a system for interactive parallel computing.
26
24
27 While the third goal may seem a bit unrelated to the main focus of IPython, it
25 While the third goal may seem a bit unrelated to the main focus of IPython, it
28 turns out that the technologies required for this goal are nearly identical
26 turns out that the technologies required for this goal are nearly identical
29 with those required for goal two. This is the main reason the interactive
27 with those required for goal two. This is the main reason the interactive
30 parallel computing capabilities are being put into IPython proper. Currently
28 parallel computing capabilities are being put into IPython proper. Currently
31 the third of these goals is furthest along.
29 the third of these goals is furthest along.
32
30
33 This document describes IPython from the perspective of developers.
31 This document describes IPython from the perspective of developers.
34
32
35
33
36 Project organization
34 Project organization
37 ====================
35 ====================
38
36
39 Subpackages
37 Subpackages
40 -----------
38 -----------
41
39
42 IPython is organized into semi self-contained subpackages. Each of the
40 IPython is organized into semi self-contained subpackages. Each of the
43 subpackages will have its own:
41 subpackages will have its own:
44
42
45 - **Dependencies**. One of the most important things to keep in mind in
43 - **Dependencies**. One of the most important things to keep in mind in
46 partitioning code amongst subpackages, is that they should be used to cleanly
44 partitioning code amongst subpackages, is that they should be used to cleanly
47 encapsulate dependencies.
45 encapsulate dependencies.
48
46
49 - **Tests**. Each subpackage shoud have its own ``tests`` subdirectory that
47 - **Tests**. Each subpackage shoud have its own ``tests`` subdirectory that
50 contains all of the tests for that package. For information about writing
48 contains all of the tests for that package. For information about writing
51 tests for IPython, see the `Testing System`_ section of this document.
49 tests for IPython, see the `Testing System`_ section of this document.
52
50
53 - **Configuration**. Each subpackage should have its own ``config``
51 - **Configuration**. Each subpackage should have its own ``config``
54 subdirectory that contains the configuration information for the components
52 subdirectory that contains the configuration information for the components
55 of the subpackage. For information about how the IPython configuration
53 of the subpackage. For information about how the IPython configuration
56 system works, see the `Configuration System`_ section of this document.
54 system works, see the `Configuration System`_ section of this document.
57
55
58 - **Scripts**. Each subpackage should have its own ``scripts`` subdirectory
56 - **Scripts**. Each subpackage should have its own ``scripts`` subdirectory
59 that contains all of the command line scripts associated with the subpackage.
57 that contains all of the command line scripts associated with the subpackage.
60
58
61 Installation and dependencies
59 Installation and dependencies
62 -----------------------------
60 -----------------------------
63
61
64 IPython will not use `setuptools`_ for installation. Instead, we will use
62 IPython will not use `setuptools`_ for installation. Instead, we will use
65 standard ``setup.py`` scripts that use `distutils`_. While there are a number a
63 standard ``setup.py`` scripts that use `distutils`_. While there are a number a
66 extremely nice features that `setuptools`_ has (like namespace packages), the
64 extremely nice features that `setuptools`_ has (like namespace packages), the
67 current implementation of `setuptools`_ has performance problems, particularly
65 current implementation of `setuptools`_ has performance problems, particularly
68 on shared file systems. In particular, when Python packages are installed on
66 on shared file systems. In particular, when Python packages are installed on
69 NSF file systems, import times become much too long (up towards 10 seconds).
67 NSF file systems, import times become much too long (up towards 10 seconds).
70
68
71 Because IPython is being used extensively in the context of high performance
69 Because IPython is being used extensively in the context of high performance
72 computing, where performance is critical but shared file systems are common, we
70 computing, where performance is critical but shared file systems are common, we
73 feel these performance hits are not acceptable. Thus, until the performance
71 feel these performance hits are not acceptable. Thus, until the performance
74 problems associated with `setuptools`_ are addressed, we will stick with plain
72 problems associated with `setuptools`_ are addressed, we will stick with plain
75 `distutils`_. We are hopeful that these problems will be addressed and that we
73 `distutils`_. We are hopeful that these problems will be addressed and that we
76 will eventually begin using `setuptools`_. Because of this, we are trying to
74 will eventually begin using `setuptools`_. Because of this, we are trying to
77 organize IPython in a way that will make the eventual transition to
75 organize IPython in a way that will make the eventual transition to
78 `setuptools`_ as painless as possible.
76 `setuptools`_ as painless as possible.
79
77
80 Because we will be using `distutils`_, there will be no method for
78 Because we will be using `distutils`_, there will be no method for
81 automatically installing dependencies. Instead, we are following the approach
79 automatically installing dependencies. Instead, we are following the approach
82 of `Matplotlib`_ which can be summarized as follows:
80 of `Matplotlib`_ which can be summarized as follows:
83
81
84 - Distinguish between required and optional dependencies. However, the required
82 - Distinguish between required and optional dependencies. However, the required
85 dependencies for IPython should be only the Python standard library.
83 dependencies for IPython should be only the Python standard library.
86
84
87 - Upon installation check to see which optional dependencies are present and
85 - Upon installation check to see which optional dependencies are present and
88 tell the user which parts of IPython need which optional dependencies.
86 tell the user which parts of IPython need which optional dependencies.
89
87
90 It is absolutely critical that each subpackage of IPython has a clearly
88 It is absolutely critical that each subpackage of IPython has a clearly
91 specified set of dependencies and that dependencies are not carelessly
89 specified set of dependencies and that dependencies are not carelessly
92 inherited from other IPython subpackages. Furthermore, tests that have certain
90 inherited from other IPython subpackages. Furthermore, tests that have certain
93 dependencies should not fail if those dependencies are not present. Instead
91 dependencies should not fail if those dependencies are not present. Instead
94 they should be skipped and print a message.
92 they should be skipped and print a message.
95
93
96 .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools
94 .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools
97 .. _distutils: http://docs.python.org/lib/module-distutils.html
95 .. _distutils: http://docs.python.org/lib/module-distutils.html
98 .. _Matplotlib: http://matplotlib.sourceforge.net/
96 .. _Matplotlib: http://matplotlib.sourceforge.net/
99
97
100 Specific subpackages
98 Specific subpackages
101 --------------------
99 --------------------
102
100
103 ``core``
101 ``core``
104 This is the core functionality of IPython that is independent of the
102 This is the core functionality of IPython that is independent of the
105 terminal, network and GUIs. Most of the code that is in the current
103 terminal, network and GUIs. Most of the code that is in the current
106 IPython trunk will be refactored, cleaned up and moved here.
104 IPython trunk will be refactored, cleaned up and moved here.
107
105
108 ``kernel``
106 ``kernel``
109 The enables the IPython core to be expose to a the network. This is
107 The enables the IPython core to be expose to a the network. This is
110 also where all of the parallel computing capabilities are to be found.
108 also where all of the parallel computing capabilities are to be found.
111
109
112 ``config``
110 ``config``
113 The configuration package used by IPython.
111 The configuration package used by IPython.
114
112
115 ``frontends``
113 ``frontends``
116 The various frontends for IPython. A frontend is the end-user application
114 The various frontends for IPython. A frontend is the end-user application
117 that exposes the capabilities of IPython to the user. The most basic
115 that exposes the capabilities of IPython to the user. The most basic
118 frontend will simply be a terminal based application that looks just like
116 frontend will simply be a terminal based application that looks just like
119 today 's IPython. Other frontends will likely be more powerful and based
117 today 's IPython. Other frontends will likely be more powerful and based
120 on GUI toolkits.
118 on GUI toolkits.
121
119
122 ``notebook``
120 ``notebook``
123 An application that allows users to work with IPython notebooks.
121 An application that allows users to work with IPython notebooks.
124
122
125 ``tools``
123 ``tools``
126 This is where general utilities go.
124 This is where general utilities go.
127
125
128
126
129 Version control
127 Version control
130 ===============
128 ===============
131
129
132 In the past, IPython development has been done using `Subversion`__. Recently,
130 In the past, IPython development has been done using `Subversion`__. Recently,
133 we made the transition to using `Bazaar`__ and `Launchpad`__. This makes it
131 we made the transition to using `Bazaar`__ and `Launchpad`__. This makes it
134 much easier for people to contribute code to IPython. Here is a sketch of how
132 much easier for people to contribute code to IPython. Here is a sketch of how
135 to use Bazaar for IPython development. First, you should install Bazaar.
133 to use Bazaar for IPython development. First, you should install Bazaar.
136 After you have done that, make sure that it is working by getting the latest
134 After you have done that, make sure that it is working by getting the latest
137 main branch of IPython::
135 main branch of IPython::
138
136
139 $ bzr branch lp:ipython
137 $ bzr branch lp:ipython
140
138
141 Now you can create a new branch for you to do your work in::
139 Now you can create a new branch for you to do your work in::
142
140
143 $ bzr branch ipython ipython-mybranch
141 $ bzr branch ipython ipython-mybranch
144
142
145 The typical work cycle in this branch will be to make changes in
143 The typical work cycle in this branch will be to make changes in
146 ``ipython-mybranch`` and then commit those changes using the commit command::
144 ``ipython-mybranch`` and then commit those changes using the commit command::
147
145
148 $ ...do work in ipython-mybranch...
146 $ ...do work in ipython-mybranch...
149 $ bzr ci -m "the commit message goes here"
147 $ bzr ci -m "the commit message goes here"
150
148
151 Please note that since we now don't use an old-style linear ChangeLog (that
149 Please note that since we now don't use an old-style linear ChangeLog (that
152 tends to cause problems with distributed version control systems), you should
150 tends to cause problems with distributed version control systems), you should
153 ensure that your log messages are reasonably detailed. Use a docstring-like
151 ensure that your log messages are reasonably detailed. Use a docstring-like
154 approach in the commit messages (including the second line being left
152 approach in the commit messages (including the second line being left
155 *blank*)::
153 *blank*)::
156
154
157 Single line summary of changes being committed.
155 Single line summary of changes being committed.
158
156
159 - more details when warranted ...
157 - more details when warranted ...
160 - including crediting outside contributors if they sent the
158 - including crediting outside contributors if they sent the
161 code/bug/idea!
159 code/bug/idea!
162
160
163 If we couple this with a policy of making single commits for each reasonably
161 If we couple this with a policy of making single commits for each reasonably
164 atomic change, the bzr log should give an excellent view of the project, and
162 atomic change, the bzr log should give an excellent view of the project, and
165 the `--short` log option becomes a nice summary.
163 the `--short` log option becomes a nice summary.
166
164
167 While working with this branch, it is a good idea to merge in changes that have
165 While working with this branch, it is a good idea to merge in changes that have
168 been made upstream in the parent branch. This can be done by doing::
166 been made upstream in the parent branch. This can be done by doing::
169
167
170 $ bzr pull
168 $ bzr pull
171
169
172 If this command shows that the branches have diverged, then you should do a
170 If this command shows that the branches have diverged, then you should do a
173 merge instead::
171 merge instead::
174
172
175 $ bzr merge lp:ipython
173 $ bzr merge lp:ipython
176
174
177 If you want others to be able to see your branch, you can create an account
175 If you want others to be able to see your branch, you can create an account
178 with launchpad and push the branch to your own workspace::
176 with launchpad and push the branch to your own workspace::
179
177
180 $ bzr push bzr+ssh://<me>@bazaar.launchpad.net/~<me>/+junk/ipython-mybranch
178 $ bzr push bzr+ssh://<me>@bazaar.launchpad.net/~<me>/+junk/ipython-mybranch
181
179
182 Finally, once the work in your branch is done, you can merge your changes back
180 Finally, once the work in your branch is done, you can merge your changes back
183 into the `ipython` branch by using merge::
181 into the `ipython` branch by using merge::
184
182
185 $ cd ipython
183 $ cd ipython
186 $ merge ../ipython-mybranch
184 $ merge ../ipython-mybranch
187 [resolve any conflicts]
185 [resolve any conflicts]
188 $ bzr ci -m "Fixing that bug"
186 $ bzr ci -m "Fixing that bug"
189 $ bzr push
187 $ bzr push
190
188
191 But this will require you to have write permissions to the `ipython` branch.
189 But this will require you to have write permissions to the `ipython` branch.
192 It you don't you can tell one of the IPython devs about your branch and they
190 It you don't you can tell one of the IPython devs about your branch and they
193 can do the merge for you.
191 can do the merge for you.
194
192
195 More information about Bazaar workflows can be found `here`__.
193 More information about Bazaar workflows can be found `here`__.
196
194
197 .. __: http://subversion.tigris.org/
195 .. __: http://subversion.tigris.org/
198 .. __: http://bazaar-vcs.org/
196 .. __: http://bazaar-vcs.org/
199 .. __: http://www.launchpad.net/ipython
197 .. __: http://www.launchpad.net/ipython
200 .. __: http://doc.bazaar-vcs.org/bzr.dev/en/user-guide/index.html
198 .. __: http://doc.bazaar-vcs.org/bzr.dev/en/user-guide/index.html
201
199
202 Documentation
200 Documentation
203 =============
201 =============
204
202
205 Standalone documentation
203 Standalone documentation
206 ------------------------
204 ------------------------
207
205
208 All standalone documentation should be written in plain text (``.txt``) files
206 All standalone documentation should be written in plain text (``.txt``) files
209 using `reStructuredText`_ for markup and formatting. All such documentation
207 using `reStructuredText`_ for markup and formatting. All such documentation
210 should be placed in the top level directory ``docs`` of the IPython source
208 should be placed in the top level directory ``docs`` of the IPython source
211 tree. Or, when appropriate, a suitably named subdirectory should be used. The
209 tree. Or, when appropriate, a suitably named subdirectory should be used. The
212 documentation in this location will serve as the main source for IPython
210 documentation in this location will serve as the main source for IPython
213 documentation and all existing documentation should be converted to this
211 documentation and all existing documentation should be converted to this
214 format.
212 format.
215
213
216 In the future, the text files in the ``docs`` directory will be used to
214 In the future, the text files in the ``docs`` directory will be used to
217 generate all forms of documentation for IPython. This include documentation on
215 generate all forms of documentation for IPython. This include documentation on
218 the IPython website as well as *pdf* documentation.
216 the IPython website as well as *pdf* documentation.
219
217
220 .. _reStructuredText: http://docutils.sourceforge.net/rst.html
218 .. _reStructuredText: http://docutils.sourceforge.net/rst.html
221
219
222 Docstring format
220 Docstring format
223 ----------------
221 ----------------
224
222
225 Good docstrings are very important. All new code will use `Epydoc`_ for
223 Good docstrings are very important. All new code will use `Epydoc`_ for
226 generating API docs, so we will follow the `Epydoc`_ conventions. More
224 generating API docs, so we will follow the `Epydoc`_ conventions. More
227 specifically, we will use `reStructuredText`_ for markup and formatting, since
225 specifically, we will use `reStructuredText`_ for markup and formatting, since
228 it is understood by a wide variety of tools. This means that if in the future
226 it is understood by a wide variety of tools. This means that if in the future
229 we have any reason to change from `Epydoc`_ to something else, we'll have fewer
227 we have any reason to change from `Epydoc`_ to something else, we'll have fewer
230 transition pains.
228 transition pains.
231
229
232 Details about using `reStructuredText`_ for docstrings can be found `here
230 Details about using `reStructuredText`_ for docstrings can be found `here
233 <http://epydoc.sourceforge.net/manual-othermarkup.html>`_.
231 <http://epydoc.sourceforge.net/manual-othermarkup.html>`_.
234
232
235 .. _Epydoc: http://epydoc.sourceforge.net/
233 .. _Epydoc: http://epydoc.sourceforge.net/
236
234
237 Additional PEPs of interest regarding documentation of code:
235 Additional PEPs of interest regarding documentation of code:
238
236
239 - `Docstring Conventions <http://www.python.org/peps/pep-0257.html>`_
237 - `Docstring Conventions <http://www.python.org/peps/pep-0257.html>`_
240 - `Docstring Processing System Framework <http://www.python.org/peps/pep-0256.html>`_
238 - `Docstring Processing System Framework <http://www.python.org/peps/pep-0256.html>`_
241 - `Docutils Design Specification <http://www.python.org/peps/pep-0258.html>`_
239 - `Docutils Design Specification <http://www.python.org/peps/pep-0258.html>`_
242
240
243
241
244 Coding conventions
242 Coding conventions
245 ==================
243 ==================
246
244
247 General
245 General
248 -------
246 -------
249
247
250 In general, we'll try to follow the standard Python style conventions as
248 In general, we'll try to follow the standard Python style conventions as
251 described here:
249 described here:
252
250
253 - `Style Guide for Python Code <http://www.python.org/peps/pep-0008.html>`_
251 - `Style Guide for Python Code <http://www.python.org/peps/pep-0008.html>`_
254
252
255
253
256 Other comments:
254 Other comments:
257
255
258 - In a large file, top level classes and functions should be
256 - In a large file, top level classes and functions should be
259 separated by 2-3 lines to make it easier to separate them visually.
257 separated by 2-3 lines to make it easier to separate them visually.
260 - Use 4 spaces for indentation.
258 - Use 4 spaces for indentation.
261 - Keep the ordering of methods the same in classes that have the same
259 - Keep the ordering of methods the same in classes that have the same
262 methods. This is particularly true for classes that implement
260 methods. This is particularly true for classes that implement
263 similar interfaces and for interfaces that are similar.
261 similar interfaces and for interfaces that are similar.
264
262
265 Naming conventions
263 Naming conventions
266 ------------------
264 ------------------
267
265
268 In terms of naming conventions, we'll follow the guidelines from the `Style
266 In terms of naming conventions, we'll follow the guidelines from the `Style
269 Guide for Python Code`_.
267 Guide for Python Code`_.
270
268
271 For all new IPython code (and much existing code is being refactored), we'll use:
269 For all new IPython code (and much existing code is being refactored), we'll use:
272
270
273 - All ``lowercase`` module names.
271 - All ``lowercase`` module names.
274
272
275 - ``CamelCase`` for class names.
273 - ``CamelCase`` for class names.
276
274
277 - ``lowercase_with_underscores`` for methods, functions, variables and
275 - ``lowercase_with_underscores`` for methods, functions, variables and
278 attributes.
276 attributes.
279
277
280 This may be confusing as most of the existing IPython codebase uses a different
278 This may be confusing as most of the existing IPython codebase uses a different
281 convention (``lowerCamelCase`` for methods and attributes). Slowly, we will
279 convention (``lowerCamelCase`` for methods and attributes). Slowly, we will
282 move IPython over to the new convention, providing shadow names for backward
280 move IPython over to the new convention, providing shadow names for backward
283 compatibility in public interfaces.
281 compatibility in public interfaces.
284
282
285 There are, however, some important exceptions to these rules. In some cases,
283 There are, however, some important exceptions to these rules. In some cases,
286 IPython code will interface with packages (Twisted, Wx, Qt) that use other
284 IPython code will interface with packages (Twisted, Wx, Qt) that use other
287 conventions. At some level this makes it impossible to adhere to our own
285 conventions. At some level this makes it impossible to adhere to our own
288 standards at all times. In particular, when subclassing classes that use other
286 standards at all times. In particular, when subclassing classes that use other
289 naming conventions, you must follow their naming conventions. To deal with
287 naming conventions, you must follow their naming conventions. To deal with
290 cases like this, we propose the following policy:
288 cases like this, we propose the following policy:
291
289
292 - If you are subclassing a class that uses different conventions, use its
290 - If you are subclassing a class that uses different conventions, use its
293 naming conventions throughout your subclass. Thus, if you are creating a
291 naming conventions throughout your subclass. Thus, if you are creating a
294 Twisted Protocol class, used Twisted's
292 Twisted Protocol class, used Twisted's
295 ``namingSchemeForMethodsAndAttributes.``
293 ``namingSchemeForMethodsAndAttributes.``
296
294
297 - All IPython's official interfaces should use our conventions. In some cases
295 - All IPython's official interfaces should use our conventions. In some cases
298 this will mean that you need to provide shadow names (first implement
296 this will mean that you need to provide shadow names (first implement
299 ``fooBar`` and then ``foo_bar = fooBar``). We want to avoid this at all
297 ``fooBar`` and then ``foo_bar = fooBar``). We want to avoid this at all
300 costs, but it will probably be necessary at times. But, please use this
298 costs, but it will probably be necessary at times. But, please use this
301 sparingly!
299 sparingly!
302
300
303 Implementation-specific *private* methods will use
301 Implementation-specific *private* methods will use
304 ``_single_underscore_prefix``. Names with a leading double underscore will
302 ``_single_underscore_prefix``. Names with a leading double underscore will
305 *only* be used in special cases, as they makes subclassing difficult (such
303 *only* be used in special cases, as they makes subclassing difficult (such
306 names are not easily seen by child classes).
304 names are not easily seen by child classes).
307
305
308 Occasionally some run-in lowercase names are used, but mostly for very short
306 Occasionally some run-in lowercase names are used, but mostly for very short
309 names or where we are implementing methods very similar to existing ones in a
307 names or where we are implementing methods very similar to existing ones in a
310 base class (like ``runlines()`` where ``runsource()`` and ``runcode()`` had
308 base class (like ``runlines()`` where ``runsource()`` and ``runcode()`` had
311 established precedent).
309 established precedent).
312
310
313 The old IPython codebase has a big mix of classes and modules prefixed with an
311 The old IPython codebase has a big mix of classes and modules prefixed with an
314 explicit ``IP``. In Python this is mostly unnecessary, redundant and frowned
312 explicit ``IP``. In Python this is mostly unnecessary, redundant and frowned
315 upon, as namespaces offer cleaner prefixing. The only case where this approach
313 upon, as namespaces offer cleaner prefixing. The only case where this approach
316 is justified is for classes which are expected to be imported into external
314 is justified is for classes which are expected to be imported into external
317 namespaces and a very generic name (like Shell) is too likely to clash with
315 namespaces and a very generic name (like Shell) is too likely to clash with
318 something else. We'll need to revisit this issue as we clean up and refactor
316 something else. We'll need to revisit this issue as we clean up and refactor
319 the code, but in general we should remove as many unnecessary ``IP``/``ip``
317 the code, but in general we should remove as many unnecessary ``IP``/``ip``
320 prefixes as possible. However, if a prefix seems absolutely necessary the more
318 prefixes as possible. However, if a prefix seems absolutely necessary the more
321 specific ``IPY`` or ``ipy`` are preferred.
319 specific ``IPY`` or ``ipy`` are preferred.
322
320
323 .. _devel_testing:
321 .. _devel_testing:
324
322
325 Testing system
323 Testing system
326 ==============
324 ==============
327
325
328 It is extremely important that all code contributed to IPython has tests. Tests
326 It is extremely important that all code contributed to IPython has tests. Tests
329 should be written as unittests, doctests or as entities that the `Nose`_
327 should be written as unittests, doctests or as entities that the `Nose`_
330 testing package will find. Regardless of how the tests are written, we will use
328 testing package will find. Regardless of how the tests are written, we will use
331 `Nose`_ for discovering and running the tests. `Nose`_ will be required to run
329 `Nose`_ for discovering and running the tests. `Nose`_ will be required to run
332 the IPython test suite, but will not be required to simply use IPython.
330 the IPython test suite, but will not be required to simply use IPython.
333
331
334 .. _Nose: http://code.google.com/p/python-nose/
332 .. _Nose: http://code.google.com/p/python-nose/
335
333
336 Tests of `Twisted`__ using code should be written by subclassing the
334 Tests of `Twisted`__ using code should be written by subclassing the
337 ``TestCase`` class that comes with ``twisted.trial.unittest``. When this is
335 ``TestCase`` class that comes with ``twisted.trial.unittest``. When this is
338 done, `Nose`_ will be able to run the tests and the twisted reactor will be
336 done, `Nose`_ will be able to run the tests and the twisted reactor will be
339 handled correctly.
337 handled correctly.
340
338
341 .. __: http://www.twistedmatrix.com
339 .. __: http://www.twistedmatrix.com
342
340
343 Each subpackage in IPython should have its own ``tests`` directory that
341 Each subpackage in IPython should have its own ``tests`` directory that
344 contains all of the tests for that subpackage. This allows each subpackage to
342 contains all of the tests for that subpackage. This allows each subpackage to
345 be self-contained. If a subpackage has any dependencies beyond the Python
343 be self-contained. If a subpackage has any dependencies beyond the Python
346 standard library, the tests for that subpackage should be skipped if the
344 standard library, the tests for that subpackage should be skipped if the
347 dependencies are not found. This is very important so users don't get tests
345 dependencies are not found. This is very important so users don't get tests
348 failing simply because they don't have dependencies.
346 failing simply because they don't have dependencies.
349
347
350 We also need to look into use Noses ability to tag tests to allow a more
348 We also need to look into use Noses ability to tag tests to allow a more
351 modular approach of running tests.
349 modular approach of running tests.
352
350
353 .. _devel_config:
351 .. _devel_config:
354
352
355 Configuration system
353 Configuration system
356 ====================
354 ====================
357
355
358 IPython uses `.ini`_ files for configuration purposes. This represents a huge
356 IPython uses `.ini`_ files for configuration purposes. This represents a huge
359 improvement over the configuration system used in IPython. IPython works with
357 improvement over the configuration system used in IPython. IPython works with
360 these files using the `ConfigObj`_ package, which IPython includes as
358 these files using the `ConfigObj`_ package, which IPython includes as
361 ``ipython1/external/configobj.py``.
359 ``ipython1/external/configobj.py``.
362
360
363 Currently, we are using raw `ConfigObj`_ objects themselves. Each subpackage of
361 Currently, we are using raw `ConfigObj`_ objects themselves. Each subpackage of
364 IPython should contain a ``config`` subdirectory that contains all of the
362 IPython should contain a ``config`` subdirectory that contains all of the
365 configuration information for the subpackage. To see how configuration
363 configuration information for the subpackage. To see how configuration
366 information is defined (along with defaults) see at the examples in
364 information is defined (along with defaults) see at the examples in
367 ``ipython1/kernel/config`` and ``ipython1/core/config``. Likewise, to see how
365 ``ipython1/kernel/config`` and ``ipython1/core/config``. Likewise, to see how
368 the configuration information is used, see examples in
366 the configuration information is used, see examples in
369 ``ipython1/kernel/scripts/ipengine.py``.
367 ``ipython1/kernel/scripts/ipengine.py``.
370
368
371 Eventually, we will add a new layer on top of the raw `ConfigObj`_ objects. We
369 Eventually, we will add a new layer on top of the raw `ConfigObj`_ objects. We
372 are calling this new layer, ``tconfig``, as it will use a `Traits`_-like
370 are calling this new layer, ``tconfig``, as it will use a `Traits`_-like
373 validation model. We won't actually use `Traits`_, but will implement
371 validation model. We won't actually use `Traits`_, but will implement
374 something similar in pure Python. But, even in this new system, we will still
372 something similar in pure Python. But, even in this new system, we will still
375 use `ConfigObj`_ and `.ini`_ files underneath the hood. Talk to Fernando if you
373 use `ConfigObj`_ and `.ini`_ files underneath the hood. Talk to Fernando if you
376 are interested in working on this part of IPython. The current prototype of
374 are interested in working on this part of IPython. The current prototype of
377 ``tconfig`` is located in the IPython sandbox.
375 ``tconfig`` is located in the IPython sandbox.
378
376
379 .. _.ini: http://docs.python.org/lib/module-ConfigParser.html
377 .. _.ini: http://docs.python.org/lib/module-ConfigParser.html
380 .. _ConfigObj: http://www.voidspace.org.uk/python/configobj.html
378 .. _ConfigObj: http://www.voidspace.org.uk/python/configobj.html
381 .. _Traits: http://code.enthought.com/traits/
379 .. _Traits: http://code.enthought.com/traits/
382
380
381
383 Installation and testing scenarios
382 Installation and testing scenarios
384 ==================================
383 ==================================
385
384
386 This section outlines the various scenarios that we need to test before we
385 This section outlines the various scenarios that we need to test before we
387 release an IPython version. These scenarios represent different ways of
386 release an IPython version. These scenarios represent different ways of
388 installing IPython and its dependencies.
387 installing IPython and its dependencies.
389
388
390 Installation scenarios under Linux and OS X
389 Installation scenarios under Linux and OS X
391 -------------------------------------------
390 -------------------------------------------
392
391
393 1. Install from tarball using ``python setup.py install``.
392 1. Install from tarball using ``python setup.py install``.
394 a. With only readline+nose dependencies installed.
393 a. With only readline+nose dependencies installed.
395 b. With all dependencies installed (readline, zope.interface, Twisted,
394 b. With all dependencies installed (readline, zope.interface, Twisted,
396 foolscap, Sphinx, nose, pyOpenSSL).
395 foolscap, Sphinx, nose, pyOpenSSL).
397
396
398 2. Install using easy_install.
397 2. Install using easy_install.
399
398
400 a. With only readline+nose dependencies installed.
399 a. With only readline+nose dependencies installed.
401 i. Default dependencies: ``easy_install ipython-0.9.beta3-py2.5.egg``
400 i. Default dependencies: ``easy_install ipython-0.9.beta3-py2.5.egg``
402 ii. Optional dependency sets: ``easy_install -f ipython-0.9.beta3-py2.5.egg IPython[kernel,doc,test,security]``
401 ii. Optional dependency sets: ``easy_install -f ipython-0.9.beta3-py2.5.egg IPython[kernel,doc,test,security]``
403
402
404 b. With all dependencies already installed.
403 b. With all dependencies already installed.
405
404
406
405
407 Installation scenarios under Win32
406 Installation scenarios under Win32
408 ----------------------------------
407 ----------------------------------
409
408
410 1. Install everything from .exe installers
409 1. Install everything from .exe installers
411 2. easy_install?
410 2. easy_install?
412
411
413
412
414 Tests to run for these scenarios
413 Tests to run for these scenarios
415 --------------------------------
414 --------------------------------
416
415
417 1. Run the full test suite.
416 1. Run the full test suite.
418 2. Start a controller and engines and try a few things by hand.
417 2. Start a controller and engines and try a few things by hand.
419 a. Using ipcluster.
418 a. Using ipcluster.
420 b. Using ipcontroller/ipengine by hand.
419 b. Using ipcontroller/ipengine by hand.
421
420
422 3. Run a few of the parallel examples.
421 3. Run a few of the parallel examples.
423 4. Try the kernel with and without security with and without PyOpenSSL
422 4. Try the kernel with and without security with and without PyOpenSSL
424 installed.
423 installed.
425 5. Beat on the IPython terminal a bunch.
424 5. Beat on the IPython terminal a bunch.
426 6. Make sure that furl files are being put in proper locations.
425 6. Make sure that furl files are being put in proper locations.
426
427
428 Release checklist
429 =================
430
431 Most of the release process is automated by the :file:`release` script in the
432 :file:`tools` directory. This is just a handy reminder for the release manager.
433
434 #. Run the release script, which makes the tar.gz, eggs and Win32 .exe
435 installer. It posts them to the site and registers the release with PyPI.
436
437 #. Updating the website with announcements and links to the updated changes.txt
438 in html form. Remember to put a short note both on the news page of the site
439 and on launcphad.
440
441 #. Drafting a short release announcement with i) highlights and ii) a link to
442 the html changes.txt.
443
444 #. Make sure that the released version of the docs is live on the site.
445
446 #. Celebrate!
@@ -1,32 +1,32 b''
1 =====================
1 =====================
2 IPython Documentation
2 IPython Documentation
3 =====================
3 =====================
4
4
5 .. htmlonly::
5 .. htmlonly::
6
6
7 :Release: |version|
7 :Release: |release|
8 :Date: |today|
8 :Date: |today|
9
9
10 Contents:
10 Contents:
11
11
12 .. toctree::
12 .. toctree::
13 :maxdepth: 2
13 :maxdepth: 2
14
14
15 overview.txt
15 overview.txt
16 install/index.txt
16 install/index.txt
17 interactive/index.txt
17 interactive/index.txt
18 parallel/index.txt
18 parallel/index.txt
19 config/index.txt
19 config/index.txt
20 changes.txt
20 changes.txt
21 development/index.txt
21 development/index.txt
22 faq.txt
22 faq.txt
23 history.txt
23 history.txt
24 license_and_copyright.txt
24 license_and_copyright.txt
25 credits.txt
25 credits.txt
26
26
27
27
28 .. htmlonly::
28 .. htmlonly::
29
29
30 * :ref:`genindex`
30 * :ref:`genindex`
31 * :ref:`modindex`
31 * :ref:`modindex`
32 * :ref:`search`
32 * :ref:`search`
@@ -1,233 +1,233 b''
1 .. _overview:
1 .. _overview:
2
2
3 ============
3 ============
4 Introduction
4 Introduction
5 ============
5 ============
6
6
7 Overview
7 Overview
8 ========
8 ========
9
9
10 One of Python's most useful features is its interactive interpreter.
10 One of Python's most useful features is its interactive interpreter.
11 This system allows very fast testing of ideas without the overhead of
11 This system allows very fast testing of ideas without the overhead of
12 creating test files as is typical in most programming languages.
12 creating test files as is typical in most programming languages.
13 However, the interpreter supplied with the standard Python distribution
13 However, the interpreter supplied with the standard Python distribution
14 is somewhat limited for extended interactive use.
14 is somewhat limited for extended interactive use.
15
15
16 The goal of IPython is to create a comprehensive environment for
16 The goal of IPython is to create a comprehensive environment for
17 interactive and exploratory computing. To support, this goal, IPython
17 interactive and exploratory computing. To support this goal, IPython
18 has two main components:
18 has two main components:
19
19
20 * An enhanced interactive Python shell.
20 * An enhanced interactive Python shell.
21 * An architecture for interactive parallel computing.
21 * An architecture for interactive parallel computing.
22
22
23 All of IPython is open source (released under the revised BSD license).
23 All of IPython is open source (released under the revised BSD license).
24
24
25 Enhanced interactive Python shell
25 Enhanced interactive Python shell
26 =================================
26 =================================
27
27
28 IPython's interactive shell (:command:`ipython`), has the following goals,
28 IPython's interactive shell (:command:`ipython`), has the following goals,
29 amongst others:
29 amongst others:
30
30
31 1. Provide an interactive shell superior to Python's default. IPython
31 1. Provide an interactive shell superior to Python's default. IPython
32 has many features for object introspection, system shell access,
32 has many features for object introspection, system shell access,
33 and its own special command system for adding functionality when
33 and its own special command system for adding functionality when
34 working interactively. It tries to be a very efficient environment
34 working interactively. It tries to be a very efficient environment
35 both for Python code development and for exploration of problems
35 both for Python code development and for exploration of problems
36 using Python objects (in situations like data analysis).
36 using Python objects (in situations like data analysis).
37
37
38 2. Serve as an embeddable, ready to use interpreter for your own
38 2. Serve as an embeddable, ready to use interpreter for your own
39 programs. IPython can be started with a single call from inside
39 programs. IPython can be started with a single call from inside
40 another program, providing access to the current namespace. This
40 another program, providing access to the current namespace. This
41 can be very useful both for debugging purposes and for situations
41 can be very useful both for debugging purposes and for situations
42 where a blend of batch-processing and interactive exploration are
42 where a blend of batch-processing and interactive exploration are
43 needed. New in the 0.9 version of IPython is a reusable wxPython
43 needed. New in the 0.9 version of IPython is a reusable wxPython
44 based IPython widget.
44 based IPython widget.
45
45
46 3. Offer a flexible framework which can be used as the base
46 3. Offer a flexible framework which can be used as the base
47 environment for other systems with Python as the underlying
47 environment for other systems with Python as the underlying
48 language. Specifically scientific environments like Mathematica,
48 language. Specifically scientific environments like Mathematica,
49 IDL and Matlab inspired its design, but similar ideas can be
49 IDL and Matlab inspired its design, but similar ideas can be
50 useful in many fields.
50 useful in many fields.
51
51
52 4. Allow interactive testing of threaded graphical toolkits. IPython
52 4. Allow interactive testing of threaded graphical toolkits. IPython
53 has support for interactive, non-blocking control of GTK, Qt and
53 has support for interactive, non-blocking control of GTK, Qt and
54 WX applications via special threading flags. The normal Python
54 WX applications via special threading flags. The normal Python
55 shell can only do this for Tkinter applications.
55 shell can only do this for Tkinter applications.
56
56
57 Main features of the interactive shell
57 Main features of the interactive shell
58 --------------------------------------
58 --------------------------------------
59
59
60 * Dynamic object introspection. One can access docstrings, function
60 * Dynamic object introspection. One can access docstrings, function
61 definition prototypes, source code, source files and other details
61 definition prototypes, source code, source files and other details
62 of any object accessible to the interpreter with a single
62 of any object accessible to the interpreter with a single
63 keystroke (:samp:`?`, and using :samp:`??` provides additional detail).
63 keystroke (:samp:`?`, and using :samp:`??` provides additional detail).
64
64
65 * Searching through modules and namespaces with :samp:`*` wildcards, both
65 * Searching through modules and namespaces with :samp:`*` wildcards, both
66 when using the :samp:`?` system and via the :samp:`%psearch` command.
66 when using the :samp:`?` system and via the :samp:`%psearch` command.
67
67
68 * Completion in the local namespace, by typing :kbd:`TAB` at the prompt.
68 * Completion in the local namespace, by typing :kbd:`TAB` at the prompt.
69 This works for keywords, modules, methods, variables and files in the
69 This works for keywords, modules, methods, variables and files in the
70 current directory. This is supported via the readline library, and
70 current directory. This is supported via the readline library, and
71 full access to configuring readline's behavior is provided.
71 full access to configuring readline's behavior is provided.
72 Custom completers can be implemented easily for different purposes
72 Custom completers can be implemented easily for different purposes
73 (system commands, magic arguments etc.)
73 (system commands, magic arguments etc.)
74
74
75 * Numbered input/output prompts with command history (persistent
75 * Numbered input/output prompts with command history (persistent
76 across sessions and tied to each profile), full searching in this
76 across sessions and tied to each profile), full searching in this
77 history and caching of all input and output.
77 history and caching of all input and output.
78
78
79 * User-extensible 'magic' commands. A set of commands prefixed with
79 * User-extensible 'magic' commands. A set of commands prefixed with
80 :samp:`%` is available for controlling IPython itself and provides
80 :samp:`%` is available for controlling IPython itself and provides
81 directory control, namespace information and many aliases to
81 directory control, namespace information and many aliases to
82 common system shell commands.
82 common system shell commands.
83
83
84 * Alias facility for defining your own system aliases.
84 * Alias facility for defining your own system aliases.
85
85
86 * Complete system shell access. Lines starting with :samp:`!` are passed
86 * Complete system shell access. Lines starting with :samp:`!` are passed
87 directly to the system shell, and using :samp:`!!` or :samp:`var = !cmd`
87 directly to the system shell, and using :samp:`!!` or :samp:`var = !cmd`
88 captures shell output into python variables for further use.
88 captures shell output into python variables for further use.
89
89
90 * Background execution of Python commands in a separate thread.
90 * Background execution of Python commands in a separate thread.
91 IPython has an internal job manager called jobs, and a
91 IPython has an internal job manager called jobs, and a
92 convenience backgrounding magic function called :samp:`%bg`.
92 convenience backgrounding magic function called :samp:`%bg`.
93
93
94 * The ability to expand python variables when calling the system
94 * The ability to expand python variables when calling the system
95 shell. In a shell command, any python variable prefixed with :samp:`$` is
95 shell. In a shell command, any python variable prefixed with :samp:`$` is
96 expanded. A double :samp:`$$` allows passing a literal :samp:`$` to the shell (for
96 expanded. A double :samp:`$$` allows passing a literal :samp:`$` to the shell (for
97 access to shell and environment variables like :envvar:`PATH`).
97 access to shell and environment variables like :envvar:`PATH`).
98
98
99 * Filesystem navigation, via a magic :samp:`%cd` command, along with a
99 * Filesystem navigation, via a magic :samp:`%cd` command, along with a
100 persistent bookmark system (using :samp:`%bookmark`) for fast access to
100 persistent bookmark system (using :samp:`%bookmark`) for fast access to
101 frequently visited directories.
101 frequently visited directories.
102
102
103 * A lightweight persistence framework via the :samp:`%store` command, which
103 * A lightweight persistence framework via the :samp:`%store` command, which
104 allows you to save arbitrary Python variables. These get restored
104 allows you to save arbitrary Python variables. These get restored
105 automatically when your session restarts.
105 automatically when your session restarts.
106
106
107 * Automatic indentation (optional) of code as you type (through the
107 * Automatic indentation (optional) of code as you type (through the
108 readline library).
108 readline library).
109
109
110 * Macro system for quickly re-executing multiple lines of previous
110 * Macro system for quickly re-executing multiple lines of previous
111 input with a single name. Macros can be stored persistently via
111 input with a single name. Macros can be stored persistently via
112 :samp:`%store` and edited via :samp:`%edit`.
112 :samp:`%store` and edited via :samp:`%edit`.
113
113
114 * Session logging (you can then later use these logs as code in your
114 * Session logging (you can then later use these logs as code in your
115 programs). Logs can optionally timestamp all input, and also store
115 programs). Logs can optionally timestamp all input, and also store
116 session output (marked as comments, so the log remains valid
116 session output (marked as comments, so the log remains valid
117 Python source code).
117 Python source code).
118
118
119 * Session restoring: logs can be replayed to restore a previous
119 * Session restoring: logs can be replayed to restore a previous
120 session to the state where you left it.
120 session to the state where you left it.
121
121
122 * Verbose and colored exception traceback printouts. Easier to parse
122 * Verbose and colored exception traceback printouts. Easier to parse
123 visually, and in verbose mode they produce a lot of useful
123 visually, and in verbose mode they produce a lot of useful
124 debugging information (basically a terminal version of the cgitb
124 debugging information (basically a terminal version of the cgitb
125 module).
125 module).
126
126
127 * Auto-parentheses: callable objects can be executed without
127 * Auto-parentheses: callable objects can be executed without
128 parentheses: :samp:`sin 3` is automatically converted to :samp:`sin(3)`.
128 parentheses: :samp:`sin 3` is automatically converted to :samp:`sin(3)`.
129
129
130 * Auto-quoting: using :samp:`,`, or :samp:`;` as the first character forces
130 * Auto-quoting: using :samp:`,`, or :samp:`;` as the first character forces
131 auto-quoting of the rest of the line: :samp:`,my_function a b` becomes
131 auto-quoting of the rest of the line: :samp:`,my_function a b` becomes
132 automatically :samp:`my_function("a","b")`, while :samp:`;my_function a b`
132 automatically :samp:`my_function("a","b")`, while :samp:`;my_function a b`
133 becomes :samp:`my_function("a b")`.
133 becomes :samp:`my_function("a b")`.
134
134
135 * Extensible input syntax. You can define filters that pre-process
135 * Extensible input syntax. You can define filters that pre-process
136 user input to simplify input in special situations. This allows
136 user input to simplify input in special situations. This allows
137 for example pasting multi-line code fragments which start with
137 for example pasting multi-line code fragments which start with
138 :samp:`>>>` or :samp:`...` such as those from other python sessions or the
138 :samp:`>>>` or :samp:`...` such as those from other python sessions or the
139 standard Python documentation.
139 standard Python documentation.
140
140
141 * Flexible configuration system. It uses a configuration file which
141 * Flexible configuration system. It uses a configuration file which
142 allows permanent setting of all command-line options, module
142 allows permanent setting of all command-line options, module
143 loading, code and file execution. The system allows recursive file
143 loading, code and file execution. The system allows recursive file
144 inclusion, so you can have a base file with defaults and layers
144 inclusion, so you can have a base file with defaults and layers
145 which load other customizations for particular projects.
145 which load other customizations for particular projects.
146
146
147 * Embeddable. You can call IPython as a python shell inside your own
147 * Embeddable. You can call IPython as a python shell inside your own
148 python programs. This can be used both for debugging code or for
148 python programs. This can be used both for debugging code or for
149 providing interactive abilities to your programs with knowledge
149 providing interactive abilities to your programs with knowledge
150 about the local namespaces (very useful in debugging and data
150 about the local namespaces (very useful in debugging and data
151 analysis situations).
151 analysis situations).
152
152
153 * Easy debugger access. You can set IPython to call up an enhanced
153 * Easy debugger access. You can set IPython to call up an enhanced
154 version of the Python debugger (pdb) every time there is an
154 version of the Python debugger (pdb) every time there is an
155 uncaught exception. This drops you inside the code which triggered
155 uncaught exception. This drops you inside the code which triggered
156 the exception with all the data live and it is possible to
156 the exception with all the data live and it is possible to
157 navigate the stack to rapidly isolate the source of a bug. The
157 navigate the stack to rapidly isolate the source of a bug. The
158 :samp:`%run` magic command (with the :samp:`-d` option) can run any script under
158 :samp:`%run` magic command (with the :samp:`-d` option) can run any script under
159 pdb's control, automatically setting initial breakpoints for you.
159 pdb's control, automatically setting initial breakpoints for you.
160 This version of pdb has IPython-specific improvements, including
160 This version of pdb has IPython-specific improvements, including
161 tab-completion and traceback coloring support. For even easier
161 tab-completion and traceback coloring support. For even easier
162 debugger access, try :samp:`%debug` after seeing an exception. winpdb is
162 debugger access, try :samp:`%debug` after seeing an exception. winpdb is
163 also supported, see ipy_winpdb extension.
163 also supported, see ipy_winpdb extension.
164
164
165 * Profiler support. You can run single statements (similar to
165 * Profiler support. You can run single statements (similar to
166 :samp:`profile.run()`) or complete programs under the profiler's control.
166 :samp:`profile.run()`) or complete programs under the profiler's control.
167 While this is possible with standard cProfile or profile modules,
167 While this is possible with standard cProfile or profile modules,
168 IPython wraps this functionality with magic commands (see :samp:`%prun`
168 IPython wraps this functionality with magic commands (see :samp:`%prun`
169 and :samp:`%run -p`) convenient for rapid interactive work.
169 and :samp:`%run -p`) convenient for rapid interactive work.
170
170
171 * Doctest support. The special :samp:`%doctest_mode` command toggles a mode
171 * Doctest support. The special :samp:`%doctest_mode` command toggles a mode
172 that allows you to paste existing doctests (with leading :samp:`>>>`
172 that allows you to paste existing doctests (with leading :samp:`>>>`
173 prompts and whitespace) and uses doctest-compatible prompts and
173 prompts and whitespace) and uses doctest-compatible prompts and
174 output, so you can use IPython sessions as doctest code.
174 output, so you can use IPython sessions as doctest code.
175
175
176 Interactive parallel computing
176 Interactive parallel computing
177 ==============================
177 ==============================
178
178
179 Increasingly, parallel computer hardware, such as multicore CPUs, clusters and supercomputers, is becoming ubiquitous. Over the last 3 years, we have developed an
179 Increasingly, parallel computer hardware, such as multicore CPUs, clusters and supercomputers, is becoming ubiquitous. Over the last 3 years, we have developed an
180 architecture within IPython that allows such hardware to be used quickly and easily
180 architecture within IPython that allows such hardware to be used quickly and easily
181 from Python. Moreover, this architecture is designed to support interactive and
181 from Python. Moreover, this architecture is designed to support interactive and
182 collaborative parallel computing.
182 collaborative parallel computing.
183
183
184 The main features of this system are:
184 The main features of this system are:
185
185
186 * Quickly parallelize Python code from an interactive Python/IPython session.
186 * Quickly parallelize Python code from an interactive Python/IPython session.
187
187
188 * A flexible and dynamic process model that be deployed on anything from
188 * A flexible and dynamic process model that be deployed on anything from
189 multicore workstations to supercomputers.
189 multicore workstations to supercomputers.
190
190
191 * An architecture that supports many different styles of parallelism, from
191 * An architecture that supports many different styles of parallelism, from
192 message passing to task farming. And all of these styles can be handled
192 message passing to task farming. And all of these styles can be handled
193 interactively.
193 interactively.
194
194
195 * Both blocking and fully asynchronous interfaces.
195 * Both blocking and fully asynchronous interfaces.
196
196
197 * High level APIs that enable many things to be parallelized in a few lines
197 * High level APIs that enable many things to be parallelized in a few lines
198 of code.
198 of code.
199
199
200 * Write parallel code that will run unchanged on everything from multicore
200 * Write parallel code that will run unchanged on everything from multicore
201 workstations to supercomputers.
201 workstations to supercomputers.
202
202
203 * Full integration with Message Passing libraries (MPI).
203 * Full integration with Message Passing libraries (MPI).
204
204
205 * Capabilities based security model with full encryption of network connections.
205 * Capabilities based security model with full encryption of network connections.
206
206
207 * Share live parallel jobs with other users securely. We call this collaborative
207 * Share live parallel jobs with other users securely. We call this collaborative
208 parallel computing.
208 parallel computing.
209
209
210 * Dynamically load balanced task farming system.
210 * Dynamically load balanced task farming system.
211
211
212 * Robust error handling. Python exceptions raised in parallel execution are
212 * Robust error handling. Python exceptions raised in parallel execution are
213 gathered and presented to the top-level code.
213 gathered and presented to the top-level code.
214
214
215 For more information, see our :ref:`overview <parallel_index>` of using IPython for
215 For more information, see our :ref:`overview <parallel_index>` of using IPython for
216 parallel computing.
216 parallel computing.
217
217
218 Portability and Python requirements
218 Portability and Python requirements
219 -----------------------------------
219 -----------------------------------
220
220
221 As of the 0.9 release, IPython requires Python 2.4 or greater. We have
221 As of the 0.9 release, IPython requires Python 2.4 or greater. We have
222 not begun to test IPython on Python 2.6 or 3.0, but we expect it will
222 not begun to test IPython on Python 2.6 or 3.0, but we expect it will
223 work with some minor changes.
223 work with some minor changes.
224
224
225 IPython is known to work on the following operating systems:
225 IPython is known to work on the following operating systems:
226
226
227 * Linux
227 * Linux
228 * AIX
228 * AIX
229 * Most other Unix-like OSs (Solaris, BSD, etc.)
229 * Most other Unix-like OSs (Solaris, BSD, etc.)
230 * Mac OS X
230 * Mac OS X
231 * Windows (CygWin, XP, Vista, etc.)
231 * Windows (CygWin, XP, Vista, etc.)
232
232
233 See :ref:`here <install_index>` for instructions on how to install IPython. No newline at end of file
233 See :ref:`here <install_index>` for instructions on how to install IPython.
1 NO CONTENT: file renamed from IPython/config/config.py to sandbox/config.py
NO CONTENT: file renamed from IPython/config/config.py to sandbox/config.py
1 NO CONTENT: file renamed from IPython/config/tests/sample_config.py to sandbox/sample_config.py
NO CONTENT: file renamed from IPython/config/tests/sample_config.py to sandbox/sample_config.py
1 NO CONTENT: file renamed from IPython/config/tests/test_config.py to sandbox/test_config.py
NO CONTENT: file renamed from IPython/config/tests/test_config.py to sandbox/test_config.py
1 NO CONTENT: file renamed from IPython/config/traitlets.py to sandbox/traitlets.py
NO CONTENT: file renamed from IPython/config/traitlets.py to sandbox/traitlets.py
@@ -1,15 +1,15 b''
1 from IPython.external.path import path
1 from IPython.external.path import path
2 fs = path('..').walkfiles('*.py')
2 fs = path('..').walkfiles('*.py')
3
3
4 for f in fs:
4 for f in fs:
5 errs = ''
5 errs = ''
6 cont = f.bytes()
6 cont = f.bytes()
7 if '\t' in cont:
7 if '\t' in cont:
8 errs+='t'
8 errs+='t'
9
9
10 if '\r' in cont:
10 if '\r' in cont:
11 errs+='r'
11 errs+='r'
12
12
13 if errs:
13 if errs:
14 print "%3s" % errs, f
14 print "%3s" % errs, f
15 No newline at end of file
15
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (660 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now