##// END OF EJS Templates
Search of getcwd and replace with getcwdu. Ignoring core/prompts.py
Jörgen Stenarson -
Show More
@@ -1,180 +1,180 b''
1 1 # encoding: utf-8
2 2 """sys.excepthook for IPython itself, leaves a detailed report on disk.
3 3
4 4 Authors:
5 5
6 6 * Fernando Perez
7 7 * Brian E. Granger
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
12 12 # Copyright (C) 2008-2010 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21
22 22 import os
23 23 import sys
24 24 from pprint import pformat
25 25
26 26 from IPython.core import ultratb
27 27 from IPython.utils.sysinfo import sys_info
28 28
29 29 #-----------------------------------------------------------------------------
30 30 # Code
31 31 #-----------------------------------------------------------------------------
32 32
33 33 # Template for the user message.
34 34 _default_message_template = """\
35 35 Oops, {app_name} crashed. We do our best to make it stable, but...
36 36
37 37 A crash report was automatically generated with the following information:
38 38 - A verbatim copy of the crash traceback.
39 39 - A copy of your input history during this session.
40 40 - Data on your current $self.app_name configuration.
41 41
42 42 It was left in the file named:
43 43 \t'{crash_report_fname}'
44 44 If you can email this file to the developers, the information in it will help
45 45 them in understanding and correcting the problem.
46 46
47 47 You can mail it to: $self.contact_name at {contact_email}
48 48 with the subject '{app_name} Crash Report'.
49 49
50 50 If you want to do it now, the following command will work (under Unix):
51 51 mail -s '{app_name} Crash Report' {contact_email} < {crash_report_fname}
52 52
53 53 To ensure accurate tracking of this issue, please file a report about it at:
54 54 {bug_tracker}
55 55 """
56 56
57 57
58 58 class CrashHandler(object):
59 59 """Customizable crash handlers for IPython applications.
60 60
61 61 Instances of this class provide a :meth:`__call__` method which can be
62 62 used as a ``sys.excepthook``. The :meth:`__call__` signature is::
63 63
64 64 def __call__(self, etype, evalue, etb)
65 65 """
66 66
67 67 message_template = _default_message_template
68 68 section_sep = '\n\n'+'*'*75+'\n\n'
69 69
70 70 def __init__(self, app, contact_name=None, contact_email=None,
71 71 bug_tracker=None, show_crash_traceback=True, call_pdb=False):
72 72 """Create a new crash handler
73 73
74 74 Parameters
75 75 ----------
76 76 app : Application
77 77 A running :class:`Application` instance, which will be queried at
78 78 crash time for internal information.
79 79
80 80 contact_name : str
81 81 A string with the name of the person to contact.
82 82
83 83 contact_email : str
84 84 A string with the email address of the contact.
85 85
86 86 bug_tracker : str
87 87 A string with the URL for your project's bug tracker.
88 88
89 89 show_crash_traceback : bool
90 90 If false, don't print the crash traceback on stderr, only generate
91 91 the on-disk report
92 92
93 93 Non-argument instance attributes:
94 94
95 95 These instances contain some non-argument attributes which allow for
96 96 further customization of the crash handler's behavior. Please see the
97 97 source for further details.
98 98 """
99 99 self.crash_report_fname = "Crash_report_%s.txt" % app.name
100 100 self.app = app
101 101 self.call_pdb = call_pdb
102 102 #self.call_pdb = True # dbg
103 103 self.show_crash_traceback = show_crash_traceback
104 104 self.info = dict(app_name = app.name,
105 105 contact_name = contact_name,
106 106 contact_email = contact_email,
107 107 bug_tracker = bug_tracker,
108 108 crash_report_fname = self.crash_report_fname)
109 109
110 110
111 111 def __call__(self, etype, evalue, etb):
112 112 """Handle an exception, call for compatible with sys.excepthook"""
113 113
114 114 # Report tracebacks shouldn't use color in general (safer for users)
115 115 color_scheme = 'NoColor'
116 116
117 117 # Use this ONLY for developer debugging (keep commented out for release)
118 118 #color_scheme = 'Linux' # dbg
119 119 try:
120 120 rptdir = self.app.ipython_dir
121 121 except:
122 rptdir = os.getcwd()
122 rptdir = os.getcwdu()
123 123 if rptdir is None or not os.path.isdir(rptdir):
124 rptdir = os.getcwd()
124 rptdir = os.getcwdu()
125 125 report_name = os.path.join(rptdir,self.crash_report_fname)
126 126 # write the report filename into the instance dict so it can get
127 127 # properly expanded out in the user message template
128 128 self.crash_report_fname = report_name
129 129 TBhandler = ultratb.VerboseTB(
130 130 color_scheme=color_scheme,
131 131 long_header=1,
132 132 call_pdb=self.call_pdb,
133 133 )
134 134 if self.call_pdb:
135 135 TBhandler(etype,evalue,etb)
136 136 return
137 137 else:
138 138 traceback = TBhandler.text(etype,evalue,etb,context=31)
139 139
140 140 # print traceback to screen
141 141 if self.show_crash_traceback:
142 142 print >> sys.stderr, traceback
143 143
144 144 # and generate a complete report on disk
145 145 try:
146 146 report = open(report_name,'w')
147 147 except:
148 148 print >> sys.stderr, 'Could not create crash report on disk.'
149 149 return
150 150
151 151 # Inform user on stderr of what happened
152 152 print >> sys.stderr, '\n'+'*'*70+'\n'
153 153 print >> sys.stderr, self.message_template.format(**self.info)
154 154
155 155 # Construct report on disk
156 156 report.write(self.make_report(traceback))
157 157 report.close()
158 158 raw_input("Hit <Enter> to quit this message (your terminal may close):")
159 159
160 160 def make_report(self,traceback):
161 161 """Return a string containing a crash report."""
162 162
163 163 sec_sep = self.section_sep
164 164
165 165 report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n']
166 166 rpt_add = report.append
167 167 rpt_add(sys_info())
168 168
169 169 try:
170 170 config = pformat(self.app.config)
171 171 rpt_add(sec_sep)
172 172 rpt_add('Application name: %s\n\n' % self.app_name)
173 173 rpt_add('Current user configuration structure:\n\n')
174 174 rpt_add(config)
175 175 except:
176 176 pass
177 177 rpt_add(sec_sep+'Crash traceback:\n\n' + traceback)
178 178
179 179 return ''.join(report)
180 180
@@ -1,799 +1,799 b''
1 1 """ History related magics and functionality """
2 2 #-----------------------------------------------------------------------------
3 3 # Copyright (C) 2010 The IPython Development Team.
4 4 #
5 5 # Distributed under the terms of the BSD License.
6 6 #
7 7 # The full license is in the file COPYING.txt, distributed with this software.
8 8 #-----------------------------------------------------------------------------
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Imports
12 12 #-----------------------------------------------------------------------------
13 13 from __future__ import print_function
14 14
15 15 # Stdlib imports
16 16 import atexit
17 17 import datetime
18 18 import os
19 19 import re
20 20 import sqlite3
21 21 import threading
22 22
23 23 # Our own packages
24 24 from IPython.config.configurable import Configurable
25 25
26 26 from IPython.testing.skipdoctest import skip_doctest
27 27 from IPython.utils import io
28 28 from IPython.utils.traitlets import Bool, Dict, Instance, Int, List, Unicode
29 29 from IPython.utils.warn import warn
30 30
31 31 #-----------------------------------------------------------------------------
32 32 # Classes and functions
33 33 #-----------------------------------------------------------------------------
34 34
35 35 class HistoryManager(Configurable):
36 36 """A class to organize all history-related functionality in one place.
37 37 """
38 38 # Public interface
39 39
40 40 # An instance of the IPython shell we are attached to
41 41 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
42 42 # Lists to hold processed and raw history. These start with a blank entry
43 43 # so that we can index them starting from 1
44 44 input_hist_parsed = List([""])
45 45 input_hist_raw = List([""])
46 46 # A list of directories visited during session
47 47 dir_hist = List()
48 48 def _dir_hist_default(self):
49 49 try:
50 return [os.getcwd()]
50 return [os.getcwdu()]
51 51 except OSError:
52 52 return []
53 53
54 54 # A dict of output history, keyed with ints from the shell's
55 55 # execution count.
56 56 output_hist = Dict()
57 57 # The text/plain repr of outputs.
58 58 output_hist_reprs = Dict()
59 59
60 60 # String holding the path to the history file
61 61 hist_file = Unicode(config=True)
62 62
63 63 # The SQLite database
64 64 db = Instance(sqlite3.Connection)
65 65 # The number of the current session in the history database
66 66 session_number = Int()
67 67 # Should we log output to the database? (default no)
68 68 db_log_output = Bool(False, config=True)
69 69 # Write to database every x commands (higher values save disk access & power)
70 70 # Values of 1 or less effectively disable caching.
71 71 db_cache_size = Int(0, config=True)
72 72 # The input and output caches
73 73 db_input_cache = List()
74 74 db_output_cache = List()
75 75
76 76 # History saving in separate thread
77 77 save_thread = Instance('IPython.core.history.HistorySavingThread')
78 78 # N.B. Event is a function returning an instance of _Event.
79 79 save_flag = Instance(threading._Event)
80 80
81 81 # Private interface
82 82 # Variables used to store the three last inputs from the user. On each new
83 83 # history update, we populate the user's namespace with these, shifted as
84 84 # necessary.
85 85 _i00 = Unicode(u'')
86 86 _i = Unicode(u'')
87 87 _ii = Unicode(u'')
88 88 _iii = Unicode(u'')
89 89
90 90 # A regex matching all forms of the exit command, so that we don't store
91 91 # them in the history (it's annoying to rewind the first entry and land on
92 92 # an exit call).
93 93 _exit_re = re.compile(r"(exit|quit)(\s*\(.*\))?$")
94 94
95 95 def __init__(self, shell, config=None, **traits):
96 96 """Create a new history manager associated with a shell instance.
97 97 """
98 98 # We need a pointer back to the shell for various tasks.
99 99 super(HistoryManager, self).__init__(shell=shell, config=config,
100 100 **traits)
101 101
102 102 if self.hist_file == u'':
103 103 # No one has set the hist_file, yet.
104 104 histfname = 'history'
105 105 self.hist_file = os.path.join(shell.profile_dir.location, histfname + '.sqlite')
106 106
107 107 try:
108 108 self.init_db()
109 109 except sqlite3.DatabaseError:
110 110 if os.path.isfile(self.hist_file):
111 111 # Try to move the file out of the way.
112 112 newpath = os.path.join(self.shell.profile_dir.location, "hist-corrupt.sqlite")
113 113 os.rename(self.hist_file, newpath)
114 114 print("ERROR! History file wasn't a valid SQLite database.",
115 115 "It was moved to %s" % newpath, "and a new file created.")
116 116 self.init_db()
117 117 else:
118 118 # The hist_file is probably :memory: or something else.
119 119 raise
120 120
121 121 self.save_flag = threading.Event()
122 122 self.db_input_cache_lock = threading.Lock()
123 123 self.db_output_cache_lock = threading.Lock()
124 124 self.save_thread = HistorySavingThread(self)
125 125 self.save_thread.start()
126 126
127 127 self.new_session()
128 128
129 129
130 130 def init_db(self):
131 131 """Connect to the database, and create tables if necessary."""
132 132 self.db = sqlite3.connect(self.hist_file)
133 133 self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
134 134 primary key autoincrement, start timestamp,
135 135 end timestamp, num_cmds integer, remark text)""")
136 136 self.db.execute("""CREATE TABLE IF NOT EXISTS history
137 137 (session integer, line integer, source text, source_raw text,
138 138 PRIMARY KEY (session, line))""")
139 139 # Output history is optional, but ensure the table's there so it can be
140 140 # enabled later.
141 141 self.db.execute("""CREATE TABLE IF NOT EXISTS output_history
142 142 (session integer, line integer, output text,
143 143 PRIMARY KEY (session, line))""")
144 144 self.db.commit()
145 145
146 146 def new_session(self, conn=None):
147 147 """Get a new session number."""
148 148 if conn is None:
149 149 conn = self.db
150 150
151 151 with conn:
152 152 cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL,
153 153 NULL, "") """, (datetime.datetime.now(),))
154 154 self.session_number = cur.lastrowid
155 155
156 156 def end_session(self):
157 157 """Close the database session, filling in the end time and line count."""
158 158 self.writeout_cache()
159 159 with self.db:
160 160 self.db.execute("""UPDATE sessions SET end=?, num_cmds=? WHERE
161 161 session==?""", (datetime.datetime.now(),
162 162 len(self.input_hist_parsed)-1, self.session_number))
163 163 self.session_number = 0
164 164
165 165 def name_session(self, name):
166 166 """Give the current session a name in the history database."""
167 167 with self.db:
168 168 self.db.execute("UPDATE sessions SET remark=? WHERE session==?",
169 169 (name, self.session_number))
170 170
171 171 def reset(self, new_session=True):
172 172 """Clear the session history, releasing all object references, and
173 173 optionally open a new session."""
174 174 self.output_hist.clear()
175 175 # The directory history can't be completely empty
176 self.dir_hist[:] = [os.getcwd()]
176 self.dir_hist[:] = [os.getcwdu()]
177 177
178 178 if new_session:
179 179 if self.session_number:
180 180 self.end_session()
181 181 self.input_hist_parsed[:] = [""]
182 182 self.input_hist_raw[:] = [""]
183 183 self.new_session()
184 184
185 185 ## -------------------------------
186 186 ## Methods for retrieving history:
187 187 ## -------------------------------
188 188 def _run_sql(self, sql, params, raw=True, output=False):
189 189 """Prepares and runs an SQL query for the history database.
190 190
191 191 Parameters
192 192 ----------
193 193 sql : str
194 194 Any filtering expressions to go after SELECT ... FROM ...
195 195 params : tuple
196 196 Parameters passed to the SQL query (to replace "?")
197 197 raw, output : bool
198 198 See :meth:`get_range`
199 199
200 200 Returns
201 201 -------
202 202 Tuples as :meth:`get_range`
203 203 """
204 204 toget = 'source_raw' if raw else 'source'
205 205 sqlfrom = "history"
206 206 if output:
207 207 sqlfrom = "history LEFT JOIN output_history USING (session, line)"
208 208 toget = "history.%s, output_history.output" % toget
209 209 cur = self.db.execute("SELECT session, line, %s FROM %s " %\
210 210 (toget, sqlfrom) + sql, params)
211 211 if output: # Regroup into 3-tuples, and parse JSON
212 212 return ((ses, lin, (inp, out)) for ses, lin, inp, out in cur)
213 213 return cur
214 214
215 215
216 216 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
217 217 """Get the last n lines from the history database.
218 218
219 219 Parameters
220 220 ----------
221 221 n : int
222 222 The number of lines to get
223 223 raw, output : bool
224 224 See :meth:`get_range`
225 225 include_latest : bool
226 226 If False (default), n+1 lines are fetched, and the latest one
227 227 is discarded. This is intended to be used where the function
228 228 is called by a user command, which it should not return.
229 229
230 230 Returns
231 231 -------
232 232 Tuples as :meth:`get_range`
233 233 """
234 234 self.writeout_cache()
235 235 if not include_latest:
236 236 n += 1
237 237 cur = self._run_sql("ORDER BY session DESC, line DESC LIMIT ?",
238 238 (n,), raw=raw, output=output)
239 239 if not include_latest:
240 240 return reversed(list(cur)[1:])
241 241 return reversed(list(cur))
242 242
243 243 def search(self, pattern="*", raw=True, search_raw=True,
244 244 output=False):
245 245 """Search the database using unix glob-style matching (wildcards
246 246 * and ?).
247 247
248 248 Parameters
249 249 ----------
250 250 pattern : str
251 251 The wildcarded pattern to match when searching
252 252 search_raw : bool
253 253 If True, search the raw input, otherwise, the parsed input
254 254 raw, output : bool
255 255 See :meth:`get_range`
256 256
257 257 Returns
258 258 -------
259 259 Tuples as :meth:`get_range`
260 260 """
261 261 tosearch = "source_raw" if search_raw else "source"
262 262 if output:
263 263 tosearch = "history." + tosearch
264 264 self.writeout_cache()
265 265 return self._run_sql("WHERE %s GLOB ?" % tosearch, (pattern,),
266 266 raw=raw, output=output)
267 267
268 268 def _get_range_session(self, start=1, stop=None, raw=True, output=False):
269 269 """Get input and output history from the current session. Called by
270 270 get_range, and takes similar parameters."""
271 271 input_hist = self.input_hist_raw if raw else self.input_hist_parsed
272 272
273 273 n = len(input_hist)
274 274 if start < 0:
275 275 start += n
276 276 if not stop:
277 277 stop = n
278 278 elif stop < 0:
279 279 stop += n
280 280
281 281 for i in range(start, stop):
282 282 if output:
283 283 line = (input_hist[i], self.output_hist_reprs.get(i))
284 284 else:
285 285 line = input_hist[i]
286 286 yield (0, i, line)
287 287
288 288 def get_range(self, session=0, start=1, stop=None, raw=True,output=False):
289 289 """Retrieve input by session.
290 290
291 291 Parameters
292 292 ----------
293 293 session : int
294 294 Session number to retrieve. The current session is 0, and negative
295 295 numbers count back from current session, so -1 is previous session.
296 296 start : int
297 297 First line to retrieve.
298 298 stop : int
299 299 End of line range (excluded from output itself). If None, retrieve
300 300 to the end of the session.
301 301 raw : bool
302 302 If True, return untranslated input
303 303 output : bool
304 304 If True, attempt to include output. This will be 'real' Python
305 305 objects for the current session, or text reprs from previous
306 306 sessions if db_log_output was enabled at the time. Where no output
307 307 is found, None is used.
308 308
309 309 Returns
310 310 -------
311 311 An iterator over the desired lines. Each line is a 3-tuple, either
312 312 (session, line, input) if output is False, or
313 313 (session, line, (input, output)) if output is True.
314 314 """
315 315 if session == 0 or session==self.session_number: # Current session
316 316 return self._get_range_session(start, stop, raw, output)
317 317 if session < 0:
318 318 session += self.session_number
319 319
320 320 if stop:
321 321 lineclause = "line >= ? AND line < ?"
322 322 params = (session, start, stop)
323 323 else:
324 324 lineclause = "line>=?"
325 325 params = (session, start)
326 326
327 327 return self._run_sql("WHERE session==? AND %s""" % lineclause,
328 328 params, raw=raw, output=output)
329 329
330 330 def get_range_by_str(self, rangestr, raw=True, output=False):
331 331 """Get lines of history from a string of ranges, as used by magic
332 332 commands %hist, %save, %macro, etc.
333 333
334 334 Parameters
335 335 ----------
336 336 rangestr : str
337 337 A string specifying ranges, e.g. "5 ~2/1-4". See
338 338 :func:`magic_history` for full details.
339 339 raw, output : bool
340 340 As :meth:`get_range`
341 341
342 342 Returns
343 343 -------
344 344 Tuples as :meth:`get_range`
345 345 """
346 346 for sess, s, e in extract_hist_ranges(rangestr):
347 347 for line in self.get_range(sess, s, e, raw=raw, output=output):
348 348 yield line
349 349
350 350 ## ----------------------------
351 351 ## Methods for storing history:
352 352 ## ----------------------------
353 353 def store_inputs(self, line_num, source, source_raw=None):
354 354 """Store source and raw input in history and create input cache
355 355 variables _i*.
356 356
357 357 Parameters
358 358 ----------
359 359 line_num : int
360 360 The prompt number of this input.
361 361
362 362 source : str
363 363 Python input.
364 364
365 365 source_raw : str, optional
366 366 If given, this is the raw input without any IPython transformations
367 367 applied to it. If not given, ``source`` is used.
368 368 """
369 369 if source_raw is None:
370 370 source_raw = source
371 371 source = source.rstrip('\n')
372 372 source_raw = source_raw.rstrip('\n')
373 373
374 374 # do not store exit/quit commands
375 375 if self._exit_re.match(source_raw.strip()):
376 376 return
377 377
378 378 self.input_hist_parsed.append(source)
379 379 self.input_hist_raw.append(source_raw)
380 380
381 381 with self.db_input_cache_lock:
382 382 self.db_input_cache.append((line_num, source, source_raw))
383 383 # Trigger to flush cache and write to DB.
384 384 if len(self.db_input_cache) >= self.db_cache_size:
385 385 self.save_flag.set()
386 386
387 387 # update the auto _i variables
388 388 self._iii = self._ii
389 389 self._ii = self._i
390 390 self._i = self._i00
391 391 self._i00 = source_raw
392 392
393 393 # hackish access to user namespace to create _i1,_i2... dynamically
394 394 new_i = '_i%s' % line_num
395 395 to_main = {'_i': self._i,
396 396 '_ii': self._ii,
397 397 '_iii': self._iii,
398 398 new_i : self._i00 }
399 399 self.shell.user_ns.update(to_main)
400 400
401 401 def store_output(self, line_num):
402 402 """If database output logging is enabled, this saves all the
403 403 outputs from the indicated prompt number to the database. It's
404 404 called by run_cell after code has been executed.
405 405
406 406 Parameters
407 407 ----------
408 408 line_num : int
409 409 The line number from which to save outputs
410 410 """
411 411 if (not self.db_log_output) or (line_num not in self.output_hist_reprs):
412 412 return
413 413 output = self.output_hist_reprs[line_num]
414 414
415 415 with self.db_output_cache_lock:
416 416 self.db_output_cache.append((line_num, output))
417 417 if self.db_cache_size <= 1:
418 418 self.save_flag.set()
419 419
420 420 def _writeout_input_cache(self, conn):
421 421 with conn:
422 422 for line in self.db_input_cache:
423 423 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
424 424 (self.session_number,)+line)
425 425
426 426 def _writeout_output_cache(self, conn):
427 427 with conn:
428 428 for line in self.db_output_cache:
429 429 conn.execute("INSERT INTO output_history VALUES (?, ?, ?)",
430 430 (self.session_number,)+line)
431 431
432 432 def writeout_cache(self, conn=None):
433 433 """Write any entries in the cache to the database."""
434 434 if conn is None:
435 435 conn = self.db
436 436
437 437 with self.db_input_cache_lock:
438 438 try:
439 439 self._writeout_input_cache(conn)
440 440 except sqlite3.IntegrityError:
441 441 self.new_session(conn)
442 442 print("ERROR! Session/line number was not unique in",
443 443 "database. History logging moved to new session",
444 444 self.session_number)
445 445 try: # Try writing to the new session. If this fails, don't recurse
446 446 self._writeout_input_cache(conn)
447 447 except sqlite3.IntegrityError:
448 448 pass
449 449 finally:
450 450 self.db_input_cache = []
451 451
452 452 with self.db_output_cache_lock:
453 453 try:
454 454 self._writeout_output_cache(conn)
455 455 except sqlite3.IntegrityError:
456 456 print("!! Session/line number for output was not unique",
457 457 "in database. Output will not be stored.")
458 458 finally:
459 459 self.db_output_cache = []
460 460
461 461
462 462 class HistorySavingThread(threading.Thread):
463 463 """This thread takes care of writing history to the database, so that
464 464 the UI isn't held up while that happens.
465 465
466 466 It waits for the HistoryManager's save_flag to be set, then writes out
467 467 the history cache. The main thread is responsible for setting the flag when
468 468 the cache size reaches a defined threshold."""
469 469 daemon = True
470 470 stop_now = False
471 471 def __init__(self, history_manager):
472 472 super(HistorySavingThread, self).__init__()
473 473 self.history_manager = history_manager
474 474 atexit.register(self.stop)
475 475
476 476 def run(self):
477 477 # We need a separate db connection per thread:
478 478 try:
479 479 self.db = sqlite3.connect(self.history_manager.hist_file)
480 480 while True:
481 481 self.history_manager.save_flag.wait()
482 482 if self.stop_now:
483 483 return
484 484 self.history_manager.save_flag.clear()
485 485 self.history_manager.writeout_cache(self.db)
486 486 except Exception as e:
487 487 print(("The history saving thread hit an unexpected error (%s)."
488 488 "History will not be written to the database.") % repr(e))
489 489
490 490 def stop(self):
491 491 """This can be called from the main thread to safely stop this thread.
492 492
493 493 Note that it does not attempt to write out remaining history before
494 494 exiting. That should be done by calling the HistoryManager's
495 495 end_session method."""
496 496 self.stop_now = True
497 497 self.history_manager.save_flag.set()
498 498 self.join()
499 499
500 500
501 501 # To match, e.g. ~5/8-~2/3
502 502 range_re = re.compile(r"""
503 503 ((?P<startsess>~?\d+)/)?
504 504 (?P<start>\d+) # Only the start line num is compulsory
505 505 ((?P<sep>[\-:])
506 506 ((?P<endsess>~?\d+)/)?
507 507 (?P<end>\d+))?
508 508 $""", re.VERBOSE)
509 509
510 510 def extract_hist_ranges(ranges_str):
511 511 """Turn a string of history ranges into 3-tuples of (session, start, stop).
512 512
513 513 Examples
514 514 --------
515 515 list(extract_input_ranges("~8/5-~7/4 2"))
516 516 [(-8, 5, None), (-7, 1, 4), (0, 2, 3)]
517 517 """
518 518 for range_str in ranges_str.split():
519 519 rmatch = range_re.match(range_str)
520 520 if not rmatch:
521 521 continue
522 522 start = int(rmatch.group("start"))
523 523 end = rmatch.group("end")
524 524 end = int(end) if end else start+1 # If no end specified, get (a, a+1)
525 525 if rmatch.group("sep") == "-": # 1-3 == 1:4 --> [1, 2, 3]
526 526 end += 1
527 527 startsess = rmatch.group("startsess") or "0"
528 528 endsess = rmatch.group("endsess") or startsess
529 529 startsess = int(startsess.replace("~","-"))
530 530 endsess = int(endsess.replace("~","-"))
531 531 assert endsess >= startsess
532 532
533 533 if endsess == startsess:
534 534 yield (startsess, start, end)
535 535 continue
536 536 # Multiple sessions in one range:
537 537 yield (startsess, start, None)
538 538 for sess in range(startsess+1, endsess):
539 539 yield (sess, 1, None)
540 540 yield (endsess, 1, end)
541 541
542 542 def _format_lineno(session, line):
543 543 """Helper function to format line numbers properly."""
544 544 if session == 0:
545 545 return str(line)
546 546 return "%s#%s" % (session, line)
547 547
548 548 @skip_doctest
549 549 def magic_history(self, parameter_s = ''):
550 550 """Print input history (_i<n> variables), with most recent last.
551 551
552 552 %history -> print at most 40 inputs (some may be multi-line)\\
553 553 %history n -> print at most n inputs\\
554 554 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
555 555
556 556 By default, input history is printed without line numbers so it can be
557 557 directly pasted into an editor. Use -n to show them.
558 558
559 559 Ranges of history can be indicated using the syntax:
560 560 4 : Line 4, current session
561 561 4-6 : Lines 4-6, current session
562 562 243/1-5: Lines 1-5, session 243
563 563 ~2/7 : Line 7, session 2 before current
564 564 ~8/1-~6/5 : From the first line of 8 sessions ago, to the fifth line
565 565 of 6 sessions ago.
566 566 Multiple ranges can be entered, separated by spaces
567 567
568 568 The same syntax is used by %macro, %save, %edit, %rerun
569 569
570 570 Options:
571 571
572 572 -n: print line numbers for each input.
573 573 This feature is only available if numbered prompts are in use.
574 574
575 575 -o: also print outputs for each input.
576 576
577 577 -p: print classic '>>>' python prompts before each input. This is useful
578 578 for making documentation, and in conjunction with -o, for producing
579 579 doctest-ready output.
580 580
581 581 -r: (default) print the 'raw' history, i.e. the actual commands you typed.
582 582
583 583 -t: print the 'translated' history, as IPython understands it. IPython
584 584 filters your input and converts it all into valid Python source before
585 585 executing it (things like magics or aliases are turned into function
586 586 calls, for example). With this option, you'll see the native history
587 587 instead of the user-entered version: '%cd /' will be seen as
588 588 'get_ipython().magic("%cd /")' instead of '%cd /'.
589 589
590 590 -g: treat the arg as a pattern to grep for in (full) history.
591 591 This includes the saved history (almost all commands ever written).
592 592 Use '%hist -g' to show full saved history (may be very long).
593 593
594 594 -l: get the last n lines from all sessions. Specify n as a single arg, or
595 595 the default is the last 10 lines.
596 596
597 597 -f FILENAME: instead of printing the output to the screen, redirect it to
598 598 the given file. The file is always overwritten, though IPython asks for
599 599 confirmation first if it already exists.
600 600
601 601 Examples
602 602 --------
603 603 ::
604 604
605 605 In [6]: %hist -n 4 6
606 606 4:a = 12
607 607 5:print a**2
608 608
609 609 """
610 610
611 611 if not self.shell.displayhook.do_full_cache:
612 612 print('This feature is only available if numbered prompts are in use.')
613 613 return
614 614 opts,args = self.parse_options(parameter_s,'noprtglf:',mode='string')
615 615
616 616 # For brevity
617 617 history_manager = self.shell.history_manager
618 618
619 619 def _format_lineno(session, line):
620 620 """Helper function to format line numbers properly."""
621 621 if session in (0, history_manager.session_number):
622 622 return str(line)
623 623 return "%s/%s" % (session, line)
624 624
625 625 # Check if output to specific file was requested.
626 626 try:
627 627 outfname = opts['f']
628 628 except KeyError:
629 629 outfile = io.stdout # default
630 630 # We don't want to close stdout at the end!
631 631 close_at_end = False
632 632 else:
633 633 if os.path.exists(outfname):
634 634 if not io.ask_yes_no("File %r exists. Overwrite?" % outfname):
635 635 print('Aborting.')
636 636 return
637 637
638 638 outfile = open(outfname,'w')
639 639 close_at_end = True
640 640
641 641 print_nums = 'n' in opts
642 642 get_output = 'o' in opts
643 643 pyprompts = 'p' in opts
644 644 # Raw history is the default
645 645 raw = not('t' in opts)
646 646
647 647 default_length = 40
648 648 pattern = None
649 649
650 650 if 'g' in opts: # Glob search
651 651 pattern = "*" + args + "*" if args else "*"
652 652 hist = history_manager.search(pattern, raw=raw, output=get_output)
653 653 elif 'l' in opts: # Get 'tail'
654 654 try:
655 655 n = int(args)
656 656 except ValueError, IndexError:
657 657 n = 10
658 658 hist = history_manager.get_tail(n, raw=raw, output=get_output)
659 659 else:
660 660 if args: # Get history by ranges
661 661 hist = history_manager.get_range_by_str(args, raw, get_output)
662 662 else: # Just get history for the current session
663 663 hist = history_manager.get_range(raw=raw, output=get_output)
664 664
665 665 # We could be displaying the entire history, so let's not try to pull it
666 666 # into a list in memory. Anything that needs more space will just misalign.
667 667 width = 4
668 668
669 669 for session, lineno, inline in hist:
670 670 # Print user history with tabs expanded to 4 spaces. The GUI clients
671 671 # use hard tabs for easier usability in auto-indented code, but we want
672 672 # to produce PEP-8 compliant history for safe pasting into an editor.
673 673 if get_output:
674 674 inline, output = inline
675 675 inline = inline.expandtabs(4).rstrip()
676 676
677 677 multiline = "\n" in inline
678 678 line_sep = '\n' if multiline else ' '
679 679 if print_nums:
680 680 print('%s:%s' % (_format_lineno(session, lineno).rjust(width),
681 681 line_sep), file=outfile, end='')
682 682 if pyprompts:
683 683 print(">>> ", end="", file=outfile)
684 684 if multiline:
685 685 inline = "\n... ".join(inline.splitlines()) + "\n..."
686 686 print(inline, file=outfile)
687 687 if get_output and output:
688 688 print(output, file=outfile)
689 689
690 690 if close_at_end:
691 691 outfile.close()
692 692
693 693
694 694 def magic_rep(self, arg):
695 695 r""" Repeat a command, or get command to input line for editing
696 696
697 697 - %rep (no arguments):
698 698
699 699 Place a string version of last computation result (stored in the special '_'
700 700 variable) to the next input prompt. Allows you to create elaborate command
701 701 lines without using copy-paste::
702 702
703 703 In[1]: l = ["hei", "vaan"]
704 704 In[2]: "".join(l)
705 705 Out[2]: heivaan
706 706 In[3]: %rep
707 707 In[4]: heivaan_ <== cursor blinking
708 708
709 709 %rep 45
710 710
711 711 Place history line 45 on the next input prompt. Use %hist to find
712 712 out the number.
713 713
714 714 %rep 1-4
715 715
716 716 Combine the specified lines into one cell, and place it on the next
717 717 input prompt. See %history for the slice syntax.
718 718
719 719 %rep foo+bar
720 720
721 721 If foo+bar can be evaluated in the user namespace, the result is
722 722 placed at the next input prompt. Otherwise, the history is searched
723 723 for lines which contain that substring, and the most recent one is
724 724 placed at the next input prompt.
725 725 """
726 726 if not arg: # Last output
727 727 self.set_next_input(str(self.shell.user_ns["_"]))
728 728 return
729 729 # Get history range
730 730 histlines = self.history_manager.get_range_by_str(arg)
731 731 cmd = "\n".join(x[2] for x in histlines)
732 732 if cmd:
733 733 self.set_next_input(cmd.rstrip())
734 734 return
735 735
736 736 try: # Variable in user namespace
737 737 cmd = str(eval(arg, self.shell.user_ns))
738 738 except Exception: # Search for term in history
739 739 histlines = self.history_manager.search("*"+arg+"*")
740 740 for h in reversed([x[2] for x in histlines]):
741 741 if 'rep' in h:
742 742 continue
743 743 self.set_next_input(h.rstrip())
744 744 return
745 745 else:
746 746 self.set_next_input(cmd.rstrip())
747 747 print("Couldn't evaluate or find in history:", arg)
748 748
749 749 def magic_rerun(self, parameter_s=''):
750 750 """Re-run previous input
751 751
752 752 By default, you can specify ranges of input history to be repeated
753 753 (as with %history). With no arguments, it will repeat the last line.
754 754
755 755 Options:
756 756
757 757 -l <n> : Repeat the last n lines of input, not including the
758 758 current command.
759 759
760 760 -g foo : Repeat the most recent line which contains foo
761 761 """
762 762 opts, args = self.parse_options(parameter_s, 'l:g:', mode='string')
763 763 if "l" in opts: # Last n lines
764 764 n = int(opts['l'])
765 765 hist = self.history_manager.get_tail(n)
766 766 elif "g" in opts: # Search
767 767 p = "*"+opts['g']+"*"
768 768 hist = list(self.history_manager.search(p))
769 769 for l in reversed(hist):
770 770 if "rerun" not in l[2]:
771 771 hist = [l] # The last match which isn't a %rerun
772 772 break
773 773 else:
774 774 hist = [] # No matches except %rerun
775 775 elif args: # Specify history ranges
776 776 hist = self.history_manager.get_range_by_str(args)
777 777 else: # Last line
778 778 hist = self.history_manager.get_tail(1)
779 779 hist = [x[2] for x in hist]
780 780 if not hist:
781 781 print("No lines in history match specification")
782 782 return
783 783 histlines = "\n".join(hist)
784 784 print("=== Executing: ===")
785 785 print(histlines)
786 786 print("=== Output: ===")
787 787 self.run_cell("\n".join(hist), store_history=False)
788 788
789 789
790 790 def init_ipython(ip):
791 791 ip.define_magic("rep", magic_rep)
792 792 ip.define_magic("recall", magic_rep)
793 793 ip.define_magic("rerun", magic_rerun)
794 794 ip.define_magic("hist",magic_history) # Alternative name
795 795 ip.define_magic("history",magic_history)
796 796
797 797 # XXX - ipy_completers are in quarantine, need to be updated to new apis
798 798 #import ipy_completers
799 799 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -1,2553 +1,2553 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Main IPython class."""
3 3
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 7 # Copyright (C) 2008-2011 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 from __future__ import with_statement
18 18 from __future__ import absolute_import
19 19
20 20 import __builtin__
21 21 import __future__
22 22 import abc
23 23 import ast
24 24 import atexit
25 25 import codeop
26 26 import inspect
27 27 import os
28 28 import re
29 29 import sys
30 30 import tempfile
31 31 import types
32 32 from contextlib import nested
33 33
34 34 from IPython.config.configurable import SingletonConfigurable
35 35 from IPython.core import debugger, oinspect
36 36 from IPython.core import history as ipcorehist
37 37 from IPython.core import page
38 38 from IPython.core import prefilter
39 39 from IPython.core import shadowns
40 40 from IPython.core import ultratb
41 41 from IPython.core.alias import AliasManager, AliasError
42 42 from IPython.core.autocall import ExitAutocall
43 43 from IPython.core.builtin_trap import BuiltinTrap
44 44 from IPython.core.compilerop import CachingCompiler
45 45 from IPython.core.display_trap import DisplayTrap
46 46 from IPython.core.displayhook import DisplayHook
47 47 from IPython.core.displaypub import DisplayPublisher
48 48 from IPython.core.error import TryNext, UsageError
49 49 from IPython.core.extensions import ExtensionManager
50 50 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
51 51 from IPython.core.formatters import DisplayFormatter
52 52 from IPython.core.history import HistoryManager
53 53 from IPython.core.inputsplitter import IPythonInputSplitter
54 54 from IPython.core.logger import Logger
55 55 from IPython.core.macro import Macro
56 56 from IPython.core.magic import Magic
57 57 from IPython.core.payload import PayloadManager
58 58 from IPython.core.plugin import PluginManager
59 59 from IPython.core.prefilter import PrefilterManager, ESC_MAGIC
60 60 from IPython.core.profiledir import ProfileDir
61 61 from IPython.external.Itpl import ItplNS
62 62 from IPython.utils import PyColorize
63 63 from IPython.utils import io
64 64 from IPython.utils.doctestreload import doctest_reload
65 65 from IPython.utils.io import ask_yes_no, rprint
66 66 from IPython.utils.ipstruct import Struct
67 67 from IPython.utils.path import get_home_dir, get_ipython_dir, HomeDirError
68 68 from IPython.utils.pickleshare import PickleShareDB
69 69 from IPython.utils.process import system, getoutput
70 70 from IPython.utils.strdispatch import StrDispatch
71 71 from IPython.utils.syspathcontext import prepended_to_syspath
72 72 from IPython.utils.text import num_ini_spaces, format_screen, LSString, SList
73 73 from IPython.utils.traitlets import (Int, CBool, CaselessStrEnum, Enum,
74 74 List, Unicode, Instance, Type)
75 75 from IPython.utils.warn import warn, error, fatal
76 76 import IPython.core.hooks
77 77
78 78 #-----------------------------------------------------------------------------
79 79 # Globals
80 80 #-----------------------------------------------------------------------------
81 81
82 82 # compiled regexps for autoindent management
83 83 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
84 84
85 85 #-----------------------------------------------------------------------------
86 86 # Utilities
87 87 #-----------------------------------------------------------------------------
88 88
89 89 # store the builtin raw_input globally, and use this always, in case user code
90 90 # overwrites it (like wx.py.PyShell does)
91 91 raw_input_original = raw_input
92 92
93 93 def softspace(file, newvalue):
94 94 """Copied from code.py, to remove the dependency"""
95 95
96 96 oldvalue = 0
97 97 try:
98 98 oldvalue = file.softspace
99 99 except AttributeError:
100 100 pass
101 101 try:
102 102 file.softspace = newvalue
103 103 except (AttributeError, TypeError):
104 104 # "attribute-less object" or "read-only attributes"
105 105 pass
106 106 return oldvalue
107 107
108 108
109 109 def no_op(*a, **kw): pass
110 110
111 111 class SpaceInInput(Exception): pass
112 112
113 113 class Bunch: pass
114 114
115 115
116 116 def get_default_colors():
117 117 if sys.platform=='darwin':
118 118 return "LightBG"
119 119 elif os.name=='nt':
120 120 return 'Linux'
121 121 else:
122 122 return 'Linux'
123 123
124 124
125 125 class SeparateUnicode(Unicode):
126 126 """A Unicode subclass to validate separate_in, separate_out, etc.
127 127
128 128 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
129 129 """
130 130
131 131 def validate(self, obj, value):
132 132 if value == '0': value = ''
133 133 value = value.replace('\\n','\n')
134 134 return super(SeparateUnicode, self).validate(obj, value)
135 135
136 136
137 137 class ReadlineNoRecord(object):
138 138 """Context manager to execute some code, then reload readline history
139 139 so that interactive input to the code doesn't appear when pressing up."""
140 140 def __init__(self, shell):
141 141 self.shell = shell
142 142 self._nested_level = 0
143 143
144 144 def __enter__(self):
145 145 if self._nested_level == 0:
146 146 try:
147 147 self.orig_length = self.current_length()
148 148 self.readline_tail = self.get_readline_tail()
149 149 except (AttributeError, IndexError): # Can fail with pyreadline
150 150 self.orig_length, self.readline_tail = 999999, []
151 151 self._nested_level += 1
152 152
153 153 def __exit__(self, type, value, traceback):
154 154 self._nested_level -= 1
155 155 if self._nested_level == 0:
156 156 # Try clipping the end if it's got longer
157 157 try:
158 158 e = self.current_length() - self.orig_length
159 159 if e > 0:
160 160 for _ in range(e):
161 161 self.shell.readline.remove_history_item(self.orig_length)
162 162
163 163 # If it still doesn't match, just reload readline history.
164 164 if self.current_length() != self.orig_length \
165 165 or self.get_readline_tail() != self.readline_tail:
166 166 self.shell.refill_readline_hist()
167 167 except (AttributeError, IndexError):
168 168 pass
169 169 # Returning False will cause exceptions to propagate
170 170 return False
171 171
172 172 def current_length(self):
173 173 return self.shell.readline.get_current_history_length()
174 174
175 175 def get_readline_tail(self, n=10):
176 176 """Get the last n items in readline history."""
177 177 end = self.shell.readline.get_current_history_length() + 1
178 178 start = max(end-n, 1)
179 179 ghi = self.shell.readline.get_history_item
180 180 return [ghi(x) for x in range(start, end)]
181 181
182 182
183 183 _autocall_help = """
184 184 Make IPython automatically call any callable object even if
185 185 you didn't type explicit parentheses. For example, 'str 43' becomes 'str(43)'
186 186 automatically. The value can be '0' to disable the feature, '1' for 'smart'
187 187 autocall, where it is not applied if there are no more arguments on the line,
188 188 and '2' for 'full' autocall, where all callable objects are automatically
189 189 called (even if no arguments are present). The default is '1'.
190 190 """
191 191
192 192 #-----------------------------------------------------------------------------
193 193 # Main IPython class
194 194 #-----------------------------------------------------------------------------
195 195
196 196 class InteractiveShell(SingletonConfigurable, Magic):
197 197 """An enhanced, interactive shell for Python."""
198 198
199 199 _instance = None
200 200
201 201 autocall = Enum((0,1,2), default_value=1, config=True, help=
202 202 """
203 203 Make IPython automatically call any callable object even if you didn't
204 204 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
205 205 automatically. The value can be '0' to disable the feature, '1' for
206 206 'smart' autocall, where it is not applied if there are no more
207 207 arguments on the line, and '2' for 'full' autocall, where all callable
208 208 objects are automatically called (even if no arguments are present).
209 209 The default is '1'.
210 210 """
211 211 )
212 212 # TODO: remove all autoindent logic and put into frontends.
213 213 # We can't do this yet because even runlines uses the autoindent.
214 214 autoindent = CBool(True, config=True, help=
215 215 """
216 216 Autoindent IPython code entered interactively.
217 217 """
218 218 )
219 219 automagic = CBool(True, config=True, help=
220 220 """
221 221 Enable magic commands to be called without the leading %.
222 222 """
223 223 )
224 224 cache_size = Int(1000, config=True, help=
225 225 """
226 226 Set the size of the output cache. The default is 1000, you can
227 227 change it permanently in your config file. Setting it to 0 completely
228 228 disables the caching system, and the minimum value accepted is 20 (if
229 229 you provide a value less than 20, it is reset to 0 and a warning is
230 230 issued). This limit is defined because otherwise you'll spend more
231 231 time re-flushing a too small cache than working
232 232 """
233 233 )
234 234 color_info = CBool(True, config=True, help=
235 235 """
236 236 Use colors for displaying information about objects. Because this
237 237 information is passed through a pager (like 'less'), and some pagers
238 238 get confused with color codes, this capability can be turned off.
239 239 """
240 240 )
241 241 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
242 242 default_value=get_default_colors(), config=True,
243 243 help="Set the color scheme (NoColor, Linux, or LightBG)."
244 244 )
245 245 debug = CBool(False, config=True)
246 246 deep_reload = CBool(False, config=True, help=
247 247 """
248 248 Enable deep (recursive) reloading by default. IPython can use the
249 249 deep_reload module which reloads changes in modules recursively (it
250 250 replaces the reload() function, so you don't need to change anything to
251 251 use it). deep_reload() forces a full reload of modules whose code may
252 252 have changed, which the default reload() function does not. When
253 253 deep_reload is off, IPython will use the normal reload(), but
254 254 deep_reload will still be available as dreload().
255 255 """
256 256 )
257 257 display_formatter = Instance(DisplayFormatter)
258 258 displayhook_class = Type(DisplayHook)
259 259 display_pub_class = Type(DisplayPublisher)
260 260
261 261 exit_now = CBool(False)
262 262 exiter = Instance(ExitAutocall)
263 263 def _exiter_default(self):
264 264 return ExitAutocall(self)
265 265 # Monotonically increasing execution counter
266 266 execution_count = Int(1)
267 267 filename = Unicode("<ipython console>")
268 268 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
269 269
270 270 # Input splitter, to split entire cells of input into either individual
271 271 # interactive statements or whole blocks.
272 272 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
273 273 (), {})
274 274 logstart = CBool(False, config=True, help=
275 275 """
276 276 Start logging to the default log file.
277 277 """
278 278 )
279 279 logfile = Unicode('', config=True, help=
280 280 """
281 281 The name of the logfile to use.
282 282 """
283 283 )
284 284 logappend = Unicode('', config=True, help=
285 285 """
286 286 Start logging to the given file in append mode.
287 287 """
288 288 )
289 289 object_info_string_level = Enum((0,1,2), default_value=0,
290 290 config=True)
291 291 pdb = CBool(False, config=True, help=
292 292 """
293 293 Automatically call the pdb debugger after every exception.
294 294 """
295 295 )
296 296
297 297 prompt_in1 = Unicode('In [\\#]: ', config=True)
298 298 prompt_in2 = Unicode(' .\\D.: ', config=True)
299 299 prompt_out = Unicode('Out[\\#]: ', config=True)
300 300 prompts_pad_left = CBool(True, config=True)
301 301 quiet = CBool(False, config=True)
302 302
303 303 history_length = Int(10000, config=True)
304 304
305 305 # The readline stuff will eventually be moved to the terminal subclass
306 306 # but for now, we can't do that as readline is welded in everywhere.
307 307 readline_use = CBool(True, config=True)
308 308 readline_merge_completions = CBool(True, config=True)
309 309 readline_omit__names = Enum((0,1,2), default_value=2, config=True)
310 310 readline_remove_delims = Unicode('-/~', config=True)
311 311 # don't use \M- bindings by default, because they
312 312 # conflict with 8-bit encodings. See gh-58,gh-88
313 313 readline_parse_and_bind = List([
314 314 'tab: complete',
315 315 '"\C-l": clear-screen',
316 316 'set show-all-if-ambiguous on',
317 317 '"\C-o": tab-insert',
318 318 '"\C-r": reverse-search-history',
319 319 '"\C-s": forward-search-history',
320 320 '"\C-p": history-search-backward',
321 321 '"\C-n": history-search-forward',
322 322 '"\e[A": history-search-backward',
323 323 '"\e[B": history-search-forward',
324 324 '"\C-k": kill-line',
325 325 '"\C-u": unix-line-discard',
326 326 ], allow_none=False, config=True)
327 327
328 328 # TODO: this part of prompt management should be moved to the frontends.
329 329 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
330 330 separate_in = SeparateUnicode('\n', config=True)
331 331 separate_out = SeparateUnicode('', config=True)
332 332 separate_out2 = SeparateUnicode('', config=True)
333 333 wildcards_case_sensitive = CBool(True, config=True)
334 334 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
335 335 default_value='Context', config=True)
336 336
337 337 # Subcomponents of InteractiveShell
338 338 alias_manager = Instance('IPython.core.alias.AliasManager')
339 339 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
340 340 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
341 341 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
342 342 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
343 343 plugin_manager = Instance('IPython.core.plugin.PluginManager')
344 344 payload_manager = Instance('IPython.core.payload.PayloadManager')
345 345 history_manager = Instance('IPython.core.history.HistoryManager')
346 346
347 347 profile_dir = Instance('IPython.core.application.ProfileDir')
348 348 @property
349 349 def profile(self):
350 350 if self.profile_dir is not None:
351 351 name = os.path.basename(self.profile_dir.location)
352 352 return name.replace('profile_','')
353 353
354 354
355 355 # Private interface
356 356 _post_execute = Instance(dict)
357 357
358 358 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
359 359 user_ns=None, user_global_ns=None,
360 360 custom_exceptions=((), None)):
361 361
362 362 # This is where traits with a config_key argument are updated
363 363 # from the values on config.
364 364 super(InteractiveShell, self).__init__(config=config)
365 365
366 366 # These are relatively independent and stateless
367 367 self.init_ipython_dir(ipython_dir)
368 368 self.init_profile_dir(profile_dir)
369 369 self.init_instance_attrs()
370 370 self.init_environment()
371 371
372 372 # Create namespaces (user_ns, user_global_ns, etc.)
373 373 self.init_create_namespaces(user_ns, user_global_ns)
374 374 # This has to be done after init_create_namespaces because it uses
375 375 # something in self.user_ns, but before init_sys_modules, which
376 376 # is the first thing to modify sys.
377 377 # TODO: When we override sys.stdout and sys.stderr before this class
378 378 # is created, we are saving the overridden ones here. Not sure if this
379 379 # is what we want to do.
380 380 self.save_sys_module_state()
381 381 self.init_sys_modules()
382 382
383 383 # While we're trying to have each part of the code directly access what
384 384 # it needs without keeping redundant references to objects, we have too
385 385 # much legacy code that expects ip.db to exist.
386 386 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
387 387
388 388 self.init_history()
389 389 self.init_encoding()
390 390 self.init_prefilter()
391 391
392 392 Magic.__init__(self, self)
393 393
394 394 self.init_syntax_highlighting()
395 395 self.init_hooks()
396 396 self.init_pushd_popd_magic()
397 397 # self.init_traceback_handlers use to be here, but we moved it below
398 398 # because it and init_io have to come after init_readline.
399 399 self.init_user_ns()
400 400 self.init_logger()
401 401 self.init_alias()
402 402 self.init_builtins()
403 403
404 404 # pre_config_initialization
405 405
406 406 # The next section should contain everything that was in ipmaker.
407 407 self.init_logstart()
408 408
409 409 # The following was in post_config_initialization
410 410 self.init_inspector()
411 411 # init_readline() must come before init_io(), because init_io uses
412 412 # readline related things.
413 413 self.init_readline()
414 414 # init_completer must come after init_readline, because it needs to
415 415 # know whether readline is present or not system-wide to configure the
416 416 # completers, since the completion machinery can now operate
417 417 # independently of readline (e.g. over the network)
418 418 self.init_completer()
419 419 # TODO: init_io() needs to happen before init_traceback handlers
420 420 # because the traceback handlers hardcode the stdout/stderr streams.
421 421 # This logic in in debugger.Pdb and should eventually be changed.
422 422 self.init_io()
423 423 self.init_traceback_handlers(custom_exceptions)
424 424 self.init_prompts()
425 425 self.init_display_formatter()
426 426 self.init_display_pub()
427 427 self.init_displayhook()
428 428 self.init_reload_doctest()
429 429 self.init_magics()
430 430 self.init_pdb()
431 431 self.init_extension_manager()
432 432 self.init_plugin_manager()
433 433 self.init_payload()
434 434 self.hooks.late_startup_hook()
435 435 atexit.register(self.atexit_operations)
436 436
437 437 def get_ipython(self):
438 438 """Return the currently running IPython instance."""
439 439 return self
440 440
441 441 #-------------------------------------------------------------------------
442 442 # Trait changed handlers
443 443 #-------------------------------------------------------------------------
444 444
445 445 def _ipython_dir_changed(self, name, new):
446 446 if not os.path.isdir(new):
447 447 os.makedirs(new, mode = 0777)
448 448
449 449 def set_autoindent(self,value=None):
450 450 """Set the autoindent flag, checking for readline support.
451 451
452 452 If called with no arguments, it acts as a toggle."""
453 453
454 454 if not self.has_readline:
455 455 if os.name == 'posix':
456 456 warn("The auto-indent feature requires the readline library")
457 457 self.autoindent = 0
458 458 return
459 459 if value is None:
460 460 self.autoindent = not self.autoindent
461 461 else:
462 462 self.autoindent = value
463 463
464 464 #-------------------------------------------------------------------------
465 465 # init_* methods called by __init__
466 466 #-------------------------------------------------------------------------
467 467
468 468 def init_ipython_dir(self, ipython_dir):
469 469 if ipython_dir is not None:
470 470 self.ipython_dir = ipython_dir
471 471 return
472 472
473 473 self.ipython_dir = get_ipython_dir()
474 474
475 475 def init_profile_dir(self, profile_dir):
476 476 if profile_dir is not None:
477 477 self.profile_dir = profile_dir
478 478 return
479 479 self.profile_dir =\
480 480 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
481 481
482 482 def init_instance_attrs(self):
483 483 self.more = False
484 484
485 485 # command compiler
486 486 self.compile = CachingCompiler()
487 487
488 488 # Make an empty namespace, which extension writers can rely on both
489 489 # existing and NEVER being used by ipython itself. This gives them a
490 490 # convenient location for storing additional information and state
491 491 # their extensions may require, without fear of collisions with other
492 492 # ipython names that may develop later.
493 493 self.meta = Struct()
494 494
495 495 # Temporary files used for various purposes. Deleted at exit.
496 496 self.tempfiles = []
497 497
498 498 # Keep track of readline usage (later set by init_readline)
499 499 self.has_readline = False
500 500
501 501 # keep track of where we started running (mainly for crash post-mortem)
502 502 # This is not being used anywhere currently.
503 self.starting_dir = os.getcwd()
503 self.starting_dir = os.getcwdu()
504 504
505 505 # Indentation management
506 506 self.indent_current_nsp = 0
507 507
508 508 # Dict to track post-execution functions that have been registered
509 509 self._post_execute = {}
510 510
511 511 def init_environment(self):
512 512 """Any changes we need to make to the user's environment."""
513 513 pass
514 514
515 515 def init_encoding(self):
516 516 # Get system encoding at startup time. Certain terminals (like Emacs
517 517 # under Win32 have it set to None, and we need to have a known valid
518 518 # encoding to use in the raw_input() method
519 519 try:
520 520 self.stdin_encoding = sys.stdin.encoding or 'ascii'
521 521 except AttributeError:
522 522 self.stdin_encoding = 'ascii'
523 523
524 524 def init_syntax_highlighting(self):
525 525 # Python source parser/formatter for syntax highlighting
526 526 pyformat = PyColorize.Parser().format
527 527 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
528 528
529 529 def init_pushd_popd_magic(self):
530 530 # for pushd/popd management
531 531 try:
532 532 self.home_dir = get_home_dir()
533 533 except HomeDirError, msg:
534 534 fatal(msg)
535 535
536 536 self.dir_stack = []
537 537
538 538 def init_logger(self):
539 539 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
540 540 logmode='rotate')
541 541
542 542 def init_logstart(self):
543 543 """Initialize logging in case it was requested at the command line.
544 544 """
545 545 if self.logappend:
546 546 self.magic_logstart(self.logappend + ' append')
547 547 elif self.logfile:
548 548 self.magic_logstart(self.logfile)
549 549 elif self.logstart:
550 550 self.magic_logstart()
551 551
552 552 def init_builtins(self):
553 553 self.builtin_trap = BuiltinTrap(shell=self)
554 554
555 555 def init_inspector(self):
556 556 # Object inspector
557 557 self.inspector = oinspect.Inspector(oinspect.InspectColors,
558 558 PyColorize.ANSICodeColors,
559 559 'NoColor',
560 560 self.object_info_string_level)
561 561
562 562 def init_io(self):
563 563 # This will just use sys.stdout and sys.stderr. If you want to
564 564 # override sys.stdout and sys.stderr themselves, you need to do that
565 565 # *before* instantiating this class, because io holds onto
566 566 # references to the underlying streams.
567 567 if sys.platform == 'win32' and self.has_readline:
568 568 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
569 569 else:
570 570 io.stdout = io.IOStream(sys.stdout)
571 571 io.stderr = io.IOStream(sys.stderr)
572 572
573 573 def init_prompts(self):
574 574 # TODO: This is a pass for now because the prompts are managed inside
575 575 # the DisplayHook. Once there is a separate prompt manager, this
576 576 # will initialize that object and all prompt related information.
577 577 pass
578 578
579 579 def init_display_formatter(self):
580 580 self.display_formatter = DisplayFormatter(config=self.config)
581 581
582 582 def init_display_pub(self):
583 583 self.display_pub = self.display_pub_class(config=self.config)
584 584
585 585 def init_displayhook(self):
586 586 # Initialize displayhook, set in/out prompts and printing system
587 587 self.displayhook = self.displayhook_class(
588 588 config=self.config,
589 589 shell=self,
590 590 cache_size=self.cache_size,
591 591 input_sep = self.separate_in,
592 592 output_sep = self.separate_out,
593 593 output_sep2 = self.separate_out2,
594 594 ps1 = self.prompt_in1,
595 595 ps2 = self.prompt_in2,
596 596 ps_out = self.prompt_out,
597 597 pad_left = self.prompts_pad_left
598 598 )
599 599 # This is a context manager that installs/revmoes the displayhook at
600 600 # the appropriate time.
601 601 self.display_trap = DisplayTrap(hook=self.displayhook)
602 602
603 603 def init_reload_doctest(self):
604 604 # Do a proper resetting of doctest, including the necessary displayhook
605 605 # monkeypatching
606 606 try:
607 607 doctest_reload()
608 608 except ImportError:
609 609 warn("doctest module does not exist.")
610 610
611 611 #-------------------------------------------------------------------------
612 612 # Things related to injections into the sys module
613 613 #-------------------------------------------------------------------------
614 614
615 615 def save_sys_module_state(self):
616 616 """Save the state of hooks in the sys module.
617 617
618 618 This has to be called after self.user_ns is created.
619 619 """
620 620 self._orig_sys_module_state = {}
621 621 self._orig_sys_module_state['stdin'] = sys.stdin
622 622 self._orig_sys_module_state['stdout'] = sys.stdout
623 623 self._orig_sys_module_state['stderr'] = sys.stderr
624 624 self._orig_sys_module_state['excepthook'] = sys.excepthook
625 625 try:
626 626 self._orig_sys_modules_main_name = self.user_ns['__name__']
627 627 except KeyError:
628 628 pass
629 629
630 630 def restore_sys_module_state(self):
631 631 """Restore the state of the sys module."""
632 632 try:
633 633 for k, v in self._orig_sys_module_state.iteritems():
634 634 setattr(sys, k, v)
635 635 except AttributeError:
636 636 pass
637 637 # Reset what what done in self.init_sys_modules
638 638 try:
639 639 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
640 640 except (AttributeError, KeyError):
641 641 pass
642 642
643 643 #-------------------------------------------------------------------------
644 644 # Things related to hooks
645 645 #-------------------------------------------------------------------------
646 646
647 647 def init_hooks(self):
648 648 # hooks holds pointers used for user-side customizations
649 649 self.hooks = Struct()
650 650
651 651 self.strdispatchers = {}
652 652
653 653 # Set all default hooks, defined in the IPython.hooks module.
654 654 hooks = IPython.core.hooks
655 655 for hook_name in hooks.__all__:
656 656 # default hooks have priority 100, i.e. low; user hooks should have
657 657 # 0-100 priority
658 658 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
659 659
660 660 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
661 661 """set_hook(name,hook) -> sets an internal IPython hook.
662 662
663 663 IPython exposes some of its internal API as user-modifiable hooks. By
664 664 adding your function to one of these hooks, you can modify IPython's
665 665 behavior to call at runtime your own routines."""
666 666
667 667 # At some point in the future, this should validate the hook before it
668 668 # accepts it. Probably at least check that the hook takes the number
669 669 # of args it's supposed to.
670 670
671 671 f = types.MethodType(hook,self)
672 672
673 673 # check if the hook is for strdispatcher first
674 674 if str_key is not None:
675 675 sdp = self.strdispatchers.get(name, StrDispatch())
676 676 sdp.add_s(str_key, f, priority )
677 677 self.strdispatchers[name] = sdp
678 678 return
679 679 if re_key is not None:
680 680 sdp = self.strdispatchers.get(name, StrDispatch())
681 681 sdp.add_re(re.compile(re_key), f, priority )
682 682 self.strdispatchers[name] = sdp
683 683 return
684 684
685 685 dp = getattr(self.hooks, name, None)
686 686 if name not in IPython.core.hooks.__all__:
687 687 print "Warning! Hook '%s' is not one of %s" % \
688 688 (name, IPython.core.hooks.__all__ )
689 689 if not dp:
690 690 dp = IPython.core.hooks.CommandChainDispatcher()
691 691
692 692 try:
693 693 dp.add(f,priority)
694 694 except AttributeError:
695 695 # it was not commandchain, plain old func - replace
696 696 dp = f
697 697
698 698 setattr(self.hooks,name, dp)
699 699
700 700 def register_post_execute(self, func):
701 701 """Register a function for calling after code execution.
702 702 """
703 703 if not callable(func):
704 704 raise ValueError('argument %s must be callable' % func)
705 705 self._post_execute[func] = True
706 706
707 707 #-------------------------------------------------------------------------
708 708 # Things related to the "main" module
709 709 #-------------------------------------------------------------------------
710 710
711 711 def new_main_mod(self,ns=None):
712 712 """Return a new 'main' module object for user code execution.
713 713 """
714 714 main_mod = self._user_main_module
715 715 init_fakemod_dict(main_mod,ns)
716 716 return main_mod
717 717
718 718 def cache_main_mod(self,ns,fname):
719 719 """Cache a main module's namespace.
720 720
721 721 When scripts are executed via %run, we must keep a reference to the
722 722 namespace of their __main__ module (a FakeModule instance) around so
723 723 that Python doesn't clear it, rendering objects defined therein
724 724 useless.
725 725
726 726 This method keeps said reference in a private dict, keyed by the
727 727 absolute path of the module object (which corresponds to the script
728 728 path). This way, for multiple executions of the same script we only
729 729 keep one copy of the namespace (the last one), thus preventing memory
730 730 leaks from old references while allowing the objects from the last
731 731 execution to be accessible.
732 732
733 733 Note: we can not allow the actual FakeModule instances to be deleted,
734 734 because of how Python tears down modules (it hard-sets all their
735 735 references to None without regard for reference counts). This method
736 736 must therefore make a *copy* of the given namespace, to allow the
737 737 original module's __dict__ to be cleared and reused.
738 738
739 739
740 740 Parameters
741 741 ----------
742 742 ns : a namespace (a dict, typically)
743 743
744 744 fname : str
745 745 Filename associated with the namespace.
746 746
747 747 Examples
748 748 --------
749 749
750 750 In [10]: import IPython
751 751
752 752 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
753 753
754 754 In [12]: IPython.__file__ in _ip._main_ns_cache
755 755 Out[12]: True
756 756 """
757 757 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
758 758
759 759 def clear_main_mod_cache(self):
760 760 """Clear the cache of main modules.
761 761
762 762 Mainly for use by utilities like %reset.
763 763
764 764 Examples
765 765 --------
766 766
767 767 In [15]: import IPython
768 768
769 769 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
770 770
771 771 In [17]: len(_ip._main_ns_cache) > 0
772 772 Out[17]: True
773 773
774 774 In [18]: _ip.clear_main_mod_cache()
775 775
776 776 In [19]: len(_ip._main_ns_cache) == 0
777 777 Out[19]: True
778 778 """
779 779 self._main_ns_cache.clear()
780 780
781 781 #-------------------------------------------------------------------------
782 782 # Things related to debugging
783 783 #-------------------------------------------------------------------------
784 784
785 785 def init_pdb(self):
786 786 # Set calling of pdb on exceptions
787 787 # self.call_pdb is a property
788 788 self.call_pdb = self.pdb
789 789
790 790 def _get_call_pdb(self):
791 791 return self._call_pdb
792 792
793 793 def _set_call_pdb(self,val):
794 794
795 795 if val not in (0,1,False,True):
796 796 raise ValueError,'new call_pdb value must be boolean'
797 797
798 798 # store value in instance
799 799 self._call_pdb = val
800 800
801 801 # notify the actual exception handlers
802 802 self.InteractiveTB.call_pdb = val
803 803
804 804 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
805 805 'Control auto-activation of pdb at exceptions')
806 806
807 807 def debugger(self,force=False):
808 808 """Call the pydb/pdb debugger.
809 809
810 810 Keywords:
811 811
812 812 - force(False): by default, this routine checks the instance call_pdb
813 813 flag and does not actually invoke the debugger if the flag is false.
814 814 The 'force' option forces the debugger to activate even if the flag
815 815 is false.
816 816 """
817 817
818 818 if not (force or self.call_pdb):
819 819 return
820 820
821 821 if not hasattr(sys,'last_traceback'):
822 822 error('No traceback has been produced, nothing to debug.')
823 823 return
824 824
825 825 # use pydb if available
826 826 if debugger.has_pydb:
827 827 from pydb import pm
828 828 else:
829 829 # fallback to our internal debugger
830 830 pm = lambda : self.InteractiveTB.debugger(force=True)
831 831
832 832 with self.readline_no_record:
833 833 pm()
834 834
835 835 #-------------------------------------------------------------------------
836 836 # Things related to IPython's various namespaces
837 837 #-------------------------------------------------------------------------
838 838
839 839 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
840 840 # Create the namespace where the user will operate. user_ns is
841 841 # normally the only one used, and it is passed to the exec calls as
842 842 # the locals argument. But we do carry a user_global_ns namespace
843 843 # given as the exec 'globals' argument, This is useful in embedding
844 844 # situations where the ipython shell opens in a context where the
845 845 # distinction between locals and globals is meaningful. For
846 846 # non-embedded contexts, it is just the same object as the user_ns dict.
847 847
848 848 # FIXME. For some strange reason, __builtins__ is showing up at user
849 849 # level as a dict instead of a module. This is a manual fix, but I
850 850 # should really track down where the problem is coming from. Alex
851 851 # Schmolck reported this problem first.
852 852
853 853 # A useful post by Alex Martelli on this topic:
854 854 # Re: inconsistent value from __builtins__
855 855 # Von: Alex Martelli <aleaxit@yahoo.com>
856 856 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
857 857 # Gruppen: comp.lang.python
858 858
859 859 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
860 860 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
861 861 # > <type 'dict'>
862 862 # > >>> print type(__builtins__)
863 863 # > <type 'module'>
864 864 # > Is this difference in return value intentional?
865 865
866 866 # Well, it's documented that '__builtins__' can be either a dictionary
867 867 # or a module, and it's been that way for a long time. Whether it's
868 868 # intentional (or sensible), I don't know. In any case, the idea is
869 869 # that if you need to access the built-in namespace directly, you
870 870 # should start with "import __builtin__" (note, no 's') which will
871 871 # definitely give you a module. Yeah, it's somewhat confusing:-(.
872 872
873 873 # These routines return properly built dicts as needed by the rest of
874 874 # the code, and can also be used by extension writers to generate
875 875 # properly initialized namespaces.
876 876 user_ns, user_global_ns = self.make_user_namespaces(user_ns,
877 877 user_global_ns)
878 878
879 879 # Assign namespaces
880 880 # This is the namespace where all normal user variables live
881 881 self.user_ns = user_ns
882 882 self.user_global_ns = user_global_ns
883 883
884 884 # An auxiliary namespace that checks what parts of the user_ns were
885 885 # loaded at startup, so we can list later only variables defined in
886 886 # actual interactive use. Since it is always a subset of user_ns, it
887 887 # doesn't need to be separately tracked in the ns_table.
888 888 self.user_ns_hidden = {}
889 889
890 890 # A namespace to keep track of internal data structures to prevent
891 891 # them from cluttering user-visible stuff. Will be updated later
892 892 self.internal_ns = {}
893 893
894 894 # Now that FakeModule produces a real module, we've run into a nasty
895 895 # problem: after script execution (via %run), the module where the user
896 896 # code ran is deleted. Now that this object is a true module (needed
897 897 # so docetst and other tools work correctly), the Python module
898 898 # teardown mechanism runs over it, and sets to None every variable
899 899 # present in that module. Top-level references to objects from the
900 900 # script survive, because the user_ns is updated with them. However,
901 901 # calling functions defined in the script that use other things from
902 902 # the script will fail, because the function's closure had references
903 903 # to the original objects, which are now all None. So we must protect
904 904 # these modules from deletion by keeping a cache.
905 905 #
906 906 # To avoid keeping stale modules around (we only need the one from the
907 907 # last run), we use a dict keyed with the full path to the script, so
908 908 # only the last version of the module is held in the cache. Note,
909 909 # however, that we must cache the module *namespace contents* (their
910 910 # __dict__). Because if we try to cache the actual modules, old ones
911 911 # (uncached) could be destroyed while still holding references (such as
912 912 # those held by GUI objects that tend to be long-lived)>
913 913 #
914 914 # The %reset command will flush this cache. See the cache_main_mod()
915 915 # and clear_main_mod_cache() methods for details on use.
916 916
917 917 # This is the cache used for 'main' namespaces
918 918 self._main_ns_cache = {}
919 919 # And this is the single instance of FakeModule whose __dict__ we keep
920 920 # copying and clearing for reuse on each %run
921 921 self._user_main_module = FakeModule()
922 922
923 923 # A table holding all the namespaces IPython deals with, so that
924 924 # introspection facilities can search easily.
925 925 self.ns_table = {'user':user_ns,
926 926 'user_global':user_global_ns,
927 927 'internal':self.internal_ns,
928 928 'builtin':__builtin__.__dict__
929 929 }
930 930
931 931 # Similarly, track all namespaces where references can be held and that
932 932 # we can safely clear (so it can NOT include builtin). This one can be
933 933 # a simple list. Note that the main execution namespaces, user_ns and
934 934 # user_global_ns, can NOT be listed here, as clearing them blindly
935 935 # causes errors in object __del__ methods. Instead, the reset() method
936 936 # clears them manually and carefully.
937 937 self.ns_refs_table = [ self.user_ns_hidden,
938 938 self.internal_ns, self._main_ns_cache ]
939 939
940 940 def make_user_namespaces(self, user_ns=None, user_global_ns=None):
941 941 """Return a valid local and global user interactive namespaces.
942 942
943 943 This builds a dict with the minimal information needed to operate as a
944 944 valid IPython user namespace, which you can pass to the various
945 945 embedding classes in ipython. The default implementation returns the
946 946 same dict for both the locals and the globals to allow functions to
947 947 refer to variables in the namespace. Customized implementations can
948 948 return different dicts. The locals dictionary can actually be anything
949 949 following the basic mapping protocol of a dict, but the globals dict
950 950 must be a true dict, not even a subclass. It is recommended that any
951 951 custom object for the locals namespace synchronize with the globals
952 952 dict somehow.
953 953
954 954 Raises TypeError if the provided globals namespace is not a true dict.
955 955
956 956 Parameters
957 957 ----------
958 958 user_ns : dict-like, optional
959 959 The current user namespace. The items in this namespace should
960 960 be included in the output. If None, an appropriate blank
961 961 namespace should be created.
962 962 user_global_ns : dict, optional
963 963 The current user global namespace. The items in this namespace
964 964 should be included in the output. If None, an appropriate
965 965 blank namespace should be created.
966 966
967 967 Returns
968 968 -------
969 969 A pair of dictionary-like object to be used as the local namespace
970 970 of the interpreter and a dict to be used as the global namespace.
971 971 """
972 972
973 973
974 974 # We must ensure that __builtin__ (without the final 's') is always
975 975 # available and pointing to the __builtin__ *module*. For more details:
976 976 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
977 977
978 978 if user_ns is None:
979 979 # Set __name__ to __main__ to better match the behavior of the
980 980 # normal interpreter.
981 981 user_ns = {'__name__' :'__main__',
982 982 '__builtin__' : __builtin__,
983 983 '__builtins__' : __builtin__,
984 984 }
985 985 else:
986 986 user_ns.setdefault('__name__','__main__')
987 987 user_ns.setdefault('__builtin__',__builtin__)
988 988 user_ns.setdefault('__builtins__',__builtin__)
989 989
990 990 if user_global_ns is None:
991 991 user_global_ns = user_ns
992 992 if type(user_global_ns) is not dict:
993 993 raise TypeError("user_global_ns must be a true dict; got %r"
994 994 % type(user_global_ns))
995 995
996 996 return user_ns, user_global_ns
997 997
998 998 def init_sys_modules(self):
999 999 # We need to insert into sys.modules something that looks like a
1000 1000 # module but which accesses the IPython namespace, for shelve and
1001 1001 # pickle to work interactively. Normally they rely on getting
1002 1002 # everything out of __main__, but for embedding purposes each IPython
1003 1003 # instance has its own private namespace, so we can't go shoving
1004 1004 # everything into __main__.
1005 1005
1006 1006 # note, however, that we should only do this for non-embedded
1007 1007 # ipythons, which really mimic the __main__.__dict__ with their own
1008 1008 # namespace. Embedded instances, on the other hand, should not do
1009 1009 # this because they need to manage the user local/global namespaces
1010 1010 # only, but they live within a 'normal' __main__ (meaning, they
1011 1011 # shouldn't overtake the execution environment of the script they're
1012 1012 # embedded in).
1013 1013
1014 1014 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1015 1015
1016 1016 try:
1017 1017 main_name = self.user_ns['__name__']
1018 1018 except KeyError:
1019 1019 raise KeyError('user_ns dictionary MUST have a "__name__" key')
1020 1020 else:
1021 1021 sys.modules[main_name] = FakeModule(self.user_ns)
1022 1022
1023 1023 def init_user_ns(self):
1024 1024 """Initialize all user-visible namespaces to their minimum defaults.
1025 1025
1026 1026 Certain history lists are also initialized here, as they effectively
1027 1027 act as user namespaces.
1028 1028
1029 1029 Notes
1030 1030 -----
1031 1031 All data structures here are only filled in, they are NOT reset by this
1032 1032 method. If they were not empty before, data will simply be added to
1033 1033 therm.
1034 1034 """
1035 1035 # This function works in two parts: first we put a few things in
1036 1036 # user_ns, and we sync that contents into user_ns_hidden so that these
1037 1037 # initial variables aren't shown by %who. After the sync, we add the
1038 1038 # rest of what we *do* want the user to see with %who even on a new
1039 1039 # session (probably nothing, so theye really only see their own stuff)
1040 1040
1041 1041 # The user dict must *always* have a __builtin__ reference to the
1042 1042 # Python standard __builtin__ namespace, which must be imported.
1043 1043 # This is so that certain operations in prompt evaluation can be
1044 1044 # reliably executed with builtins. Note that we can NOT use
1045 1045 # __builtins__ (note the 's'), because that can either be a dict or a
1046 1046 # module, and can even mutate at runtime, depending on the context
1047 1047 # (Python makes no guarantees on it). In contrast, __builtin__ is
1048 1048 # always a module object, though it must be explicitly imported.
1049 1049
1050 1050 # For more details:
1051 1051 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1052 1052 ns = dict(__builtin__ = __builtin__)
1053 1053
1054 1054 # Put 'help' in the user namespace
1055 1055 try:
1056 1056 from site import _Helper
1057 1057 ns['help'] = _Helper()
1058 1058 except ImportError:
1059 1059 warn('help() not available - check site.py')
1060 1060
1061 1061 # make global variables for user access to the histories
1062 1062 ns['_ih'] = self.history_manager.input_hist_parsed
1063 1063 ns['_oh'] = self.history_manager.output_hist
1064 1064 ns['_dh'] = self.history_manager.dir_hist
1065 1065
1066 1066 ns['_sh'] = shadowns
1067 1067
1068 1068 # user aliases to input and output histories. These shouldn't show up
1069 1069 # in %who, as they can have very large reprs.
1070 1070 ns['In'] = self.history_manager.input_hist_parsed
1071 1071 ns['Out'] = self.history_manager.output_hist
1072 1072
1073 1073 # Store myself as the public api!!!
1074 1074 ns['get_ipython'] = self.get_ipython
1075 1075
1076 1076 ns['exit'] = self.exiter
1077 1077 ns['quit'] = self.exiter
1078 1078
1079 1079 # Sync what we've added so far to user_ns_hidden so these aren't seen
1080 1080 # by %who
1081 1081 self.user_ns_hidden.update(ns)
1082 1082
1083 1083 # Anything put into ns now would show up in %who. Think twice before
1084 1084 # putting anything here, as we really want %who to show the user their
1085 1085 # stuff, not our variables.
1086 1086
1087 1087 # Finally, update the real user's namespace
1088 1088 self.user_ns.update(ns)
1089 1089
1090 1090 def reset(self, new_session=True):
1091 1091 """Clear all internal namespaces, and attempt to release references to
1092 1092 user objects.
1093 1093
1094 1094 If new_session is True, a new history session will be opened.
1095 1095 """
1096 1096 # Clear histories
1097 1097 self.history_manager.reset(new_session)
1098 1098 # Reset counter used to index all histories
1099 1099 if new_session:
1100 1100 self.execution_count = 1
1101 1101
1102 1102 # Flush cached output items
1103 1103 if self.displayhook.do_full_cache:
1104 1104 self.displayhook.flush()
1105 1105
1106 1106 # Restore the user namespaces to minimal usability
1107 1107 for ns in self.ns_refs_table:
1108 1108 ns.clear()
1109 1109
1110 1110 # The main execution namespaces must be cleared very carefully,
1111 1111 # skipping the deletion of the builtin-related keys, because doing so
1112 1112 # would cause errors in many object's __del__ methods.
1113 1113 for ns in [self.user_ns, self.user_global_ns]:
1114 1114 drop_keys = set(ns.keys())
1115 1115 drop_keys.discard('__builtin__')
1116 1116 drop_keys.discard('__builtins__')
1117 1117 for k in drop_keys:
1118 1118 del ns[k]
1119 1119
1120 1120 # Restore the user namespaces to minimal usability
1121 1121 self.init_user_ns()
1122 1122
1123 1123 # Restore the default and user aliases
1124 1124 self.alias_manager.clear_aliases()
1125 1125 self.alias_manager.init_aliases()
1126 1126
1127 1127 # Flush the private list of module references kept for script
1128 1128 # execution protection
1129 1129 self.clear_main_mod_cache()
1130 1130
1131 1131 # Clear out the namespace from the last %run
1132 1132 self.new_main_mod()
1133 1133
1134 1134 def del_var(self, varname, by_name=False):
1135 1135 """Delete a variable from the various namespaces, so that, as
1136 1136 far as possible, we're not keeping any hidden references to it.
1137 1137
1138 1138 Parameters
1139 1139 ----------
1140 1140 varname : str
1141 1141 The name of the variable to delete.
1142 1142 by_name : bool
1143 1143 If True, delete variables with the given name in each
1144 1144 namespace. If False (default), find the variable in the user
1145 1145 namespace, and delete references to it.
1146 1146 """
1147 1147 if varname in ('__builtin__', '__builtins__'):
1148 1148 raise ValueError("Refusing to delete %s" % varname)
1149 1149 ns_refs = self.ns_refs_table + [self.user_ns,
1150 1150 self.user_global_ns, self._user_main_module.__dict__] +\
1151 1151 self._main_ns_cache.values()
1152 1152
1153 1153 if by_name: # Delete by name
1154 1154 for ns in ns_refs:
1155 1155 try:
1156 1156 del ns[varname]
1157 1157 except KeyError:
1158 1158 pass
1159 1159 else: # Delete by object
1160 1160 try:
1161 1161 obj = self.user_ns[varname]
1162 1162 except KeyError:
1163 1163 raise NameError("name '%s' is not defined" % varname)
1164 1164 # Also check in output history
1165 1165 ns_refs.append(self.history_manager.output_hist)
1166 1166 for ns in ns_refs:
1167 1167 to_delete = [n for n, o in ns.iteritems() if o is obj]
1168 1168 for name in to_delete:
1169 1169 del ns[name]
1170 1170
1171 1171 # displayhook keeps extra references, but not in a dictionary
1172 1172 for name in ('_', '__', '___'):
1173 1173 if getattr(self.displayhook, name) is obj:
1174 1174 setattr(self.displayhook, name, None)
1175 1175
1176 1176 def reset_selective(self, regex=None):
1177 1177 """Clear selective variables from internal namespaces based on a
1178 1178 specified regular expression.
1179 1179
1180 1180 Parameters
1181 1181 ----------
1182 1182 regex : string or compiled pattern, optional
1183 1183 A regular expression pattern that will be used in searching
1184 1184 variable names in the users namespaces.
1185 1185 """
1186 1186 if regex is not None:
1187 1187 try:
1188 1188 m = re.compile(regex)
1189 1189 except TypeError:
1190 1190 raise TypeError('regex must be a string or compiled pattern')
1191 1191 # Search for keys in each namespace that match the given regex
1192 1192 # If a match is found, delete the key/value pair.
1193 1193 for ns in self.ns_refs_table:
1194 1194 for var in ns:
1195 1195 if m.search(var):
1196 1196 del ns[var]
1197 1197
1198 1198 def push(self, variables, interactive=True):
1199 1199 """Inject a group of variables into the IPython user namespace.
1200 1200
1201 1201 Parameters
1202 1202 ----------
1203 1203 variables : dict, str or list/tuple of str
1204 1204 The variables to inject into the user's namespace. If a dict, a
1205 1205 simple update is done. If a str, the string is assumed to have
1206 1206 variable names separated by spaces. A list/tuple of str can also
1207 1207 be used to give the variable names. If just the variable names are
1208 1208 give (list/tuple/str) then the variable values looked up in the
1209 1209 callers frame.
1210 1210 interactive : bool
1211 1211 If True (default), the variables will be listed with the ``who``
1212 1212 magic.
1213 1213 """
1214 1214 vdict = None
1215 1215
1216 1216 # We need a dict of name/value pairs to do namespace updates.
1217 1217 if isinstance(variables, dict):
1218 1218 vdict = variables
1219 1219 elif isinstance(variables, (basestring, list, tuple)):
1220 1220 if isinstance(variables, basestring):
1221 1221 vlist = variables.split()
1222 1222 else:
1223 1223 vlist = variables
1224 1224 vdict = {}
1225 1225 cf = sys._getframe(1)
1226 1226 for name in vlist:
1227 1227 try:
1228 1228 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1229 1229 except:
1230 1230 print ('Could not get variable %s from %s' %
1231 1231 (name,cf.f_code.co_name))
1232 1232 else:
1233 1233 raise ValueError('variables must be a dict/str/list/tuple')
1234 1234
1235 1235 # Propagate variables to user namespace
1236 1236 self.user_ns.update(vdict)
1237 1237
1238 1238 # And configure interactive visibility
1239 1239 config_ns = self.user_ns_hidden
1240 1240 if interactive:
1241 1241 for name, val in vdict.iteritems():
1242 1242 config_ns.pop(name, None)
1243 1243 else:
1244 1244 for name,val in vdict.iteritems():
1245 1245 config_ns[name] = val
1246 1246
1247 1247 #-------------------------------------------------------------------------
1248 1248 # Things related to object introspection
1249 1249 #-------------------------------------------------------------------------
1250 1250
1251 1251 def _ofind(self, oname, namespaces=None):
1252 1252 """Find an object in the available namespaces.
1253 1253
1254 1254 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1255 1255
1256 1256 Has special code to detect magic functions.
1257 1257 """
1258 1258 #oname = oname.strip()
1259 1259 #print '1- oname: <%r>' % oname # dbg
1260 1260 try:
1261 1261 oname = oname.strip().encode('ascii')
1262 1262 #print '2- oname: <%r>' % oname # dbg
1263 1263 except UnicodeEncodeError:
1264 1264 print 'Python identifiers can only contain ascii characters.'
1265 1265 return dict(found=False)
1266 1266
1267 1267 alias_ns = None
1268 1268 if namespaces is None:
1269 1269 # Namespaces to search in:
1270 1270 # Put them in a list. The order is important so that we
1271 1271 # find things in the same order that Python finds them.
1272 1272 namespaces = [ ('Interactive', self.user_ns),
1273 1273 ('IPython internal', self.internal_ns),
1274 1274 ('Python builtin', __builtin__.__dict__),
1275 1275 ('Alias', self.alias_manager.alias_table),
1276 1276 ]
1277 1277 alias_ns = self.alias_manager.alias_table
1278 1278
1279 1279 # initialize results to 'null'
1280 1280 found = False; obj = None; ospace = None; ds = None;
1281 1281 ismagic = False; isalias = False; parent = None
1282 1282
1283 1283 # We need to special-case 'print', which as of python2.6 registers as a
1284 1284 # function but should only be treated as one if print_function was
1285 1285 # loaded with a future import. In this case, just bail.
1286 1286 if (oname == 'print' and not (self.compile.compiler_flags &
1287 1287 __future__.CO_FUTURE_PRINT_FUNCTION)):
1288 1288 return {'found':found, 'obj':obj, 'namespace':ospace,
1289 1289 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1290 1290
1291 1291 # Look for the given name by splitting it in parts. If the head is
1292 1292 # found, then we look for all the remaining parts as members, and only
1293 1293 # declare success if we can find them all.
1294 1294 oname_parts = oname.split('.')
1295 1295 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1296 1296 for nsname,ns in namespaces:
1297 1297 try:
1298 1298 obj = ns[oname_head]
1299 1299 except KeyError:
1300 1300 continue
1301 1301 else:
1302 1302 #print 'oname_rest:', oname_rest # dbg
1303 1303 for part in oname_rest:
1304 1304 try:
1305 1305 parent = obj
1306 1306 obj = getattr(obj,part)
1307 1307 except:
1308 1308 # Blanket except b/c some badly implemented objects
1309 1309 # allow __getattr__ to raise exceptions other than
1310 1310 # AttributeError, which then crashes IPython.
1311 1311 break
1312 1312 else:
1313 1313 # If we finish the for loop (no break), we got all members
1314 1314 found = True
1315 1315 ospace = nsname
1316 1316 if ns == alias_ns:
1317 1317 isalias = True
1318 1318 break # namespace loop
1319 1319
1320 1320 # Try to see if it's magic
1321 1321 if not found:
1322 1322 if oname.startswith(ESC_MAGIC):
1323 1323 oname = oname[1:]
1324 1324 obj = getattr(self,'magic_'+oname,None)
1325 1325 if obj is not None:
1326 1326 found = True
1327 1327 ospace = 'IPython internal'
1328 1328 ismagic = True
1329 1329
1330 1330 # Last try: special-case some literals like '', [], {}, etc:
1331 1331 if not found and oname_head in ["''",'""','[]','{}','()']:
1332 1332 obj = eval(oname_head)
1333 1333 found = True
1334 1334 ospace = 'Interactive'
1335 1335
1336 1336 return {'found':found, 'obj':obj, 'namespace':ospace,
1337 1337 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1338 1338
1339 1339 def _ofind_property(self, oname, info):
1340 1340 """Second part of object finding, to look for property details."""
1341 1341 if info.found:
1342 1342 # Get the docstring of the class property if it exists.
1343 1343 path = oname.split('.')
1344 1344 root = '.'.join(path[:-1])
1345 1345 if info.parent is not None:
1346 1346 try:
1347 1347 target = getattr(info.parent, '__class__')
1348 1348 # The object belongs to a class instance.
1349 1349 try:
1350 1350 target = getattr(target, path[-1])
1351 1351 # The class defines the object.
1352 1352 if isinstance(target, property):
1353 1353 oname = root + '.__class__.' + path[-1]
1354 1354 info = Struct(self._ofind(oname))
1355 1355 except AttributeError: pass
1356 1356 except AttributeError: pass
1357 1357
1358 1358 # We return either the new info or the unmodified input if the object
1359 1359 # hadn't been found
1360 1360 return info
1361 1361
1362 1362 def _object_find(self, oname, namespaces=None):
1363 1363 """Find an object and return a struct with info about it."""
1364 1364 inf = Struct(self._ofind(oname, namespaces))
1365 1365 return Struct(self._ofind_property(oname, inf))
1366 1366
1367 1367 def _inspect(self, meth, oname, namespaces=None, **kw):
1368 1368 """Generic interface to the inspector system.
1369 1369
1370 1370 This function is meant to be called by pdef, pdoc & friends."""
1371 1371 info = self._object_find(oname)
1372 1372 if info.found:
1373 1373 pmethod = getattr(self.inspector, meth)
1374 1374 formatter = format_screen if info.ismagic else None
1375 1375 if meth == 'pdoc':
1376 1376 pmethod(info.obj, oname, formatter)
1377 1377 elif meth == 'pinfo':
1378 1378 pmethod(info.obj, oname, formatter, info, **kw)
1379 1379 else:
1380 1380 pmethod(info.obj, oname)
1381 1381 else:
1382 1382 print 'Object `%s` not found.' % oname
1383 1383 return 'not found' # so callers can take other action
1384 1384
1385 1385 def object_inspect(self, oname):
1386 1386 with self.builtin_trap:
1387 1387 info = self._object_find(oname)
1388 1388 if info.found:
1389 1389 return self.inspector.info(info.obj, oname, info=info)
1390 1390 else:
1391 1391 return oinspect.object_info(name=oname, found=False)
1392 1392
1393 1393 #-------------------------------------------------------------------------
1394 1394 # Things related to history management
1395 1395 #-------------------------------------------------------------------------
1396 1396
1397 1397 def init_history(self):
1398 1398 """Sets up the command history, and starts regular autosaves."""
1399 1399 self.history_manager = HistoryManager(shell=self, config=self.config)
1400 1400
1401 1401 #-------------------------------------------------------------------------
1402 1402 # Things related to exception handling and tracebacks (not debugging)
1403 1403 #-------------------------------------------------------------------------
1404 1404
1405 1405 def init_traceback_handlers(self, custom_exceptions):
1406 1406 # Syntax error handler.
1407 1407 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1408 1408
1409 1409 # The interactive one is initialized with an offset, meaning we always
1410 1410 # want to remove the topmost item in the traceback, which is our own
1411 1411 # internal code. Valid modes: ['Plain','Context','Verbose']
1412 1412 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1413 1413 color_scheme='NoColor',
1414 1414 tb_offset = 1,
1415 1415 check_cache=self.compile.check_cache)
1416 1416
1417 1417 # The instance will store a pointer to the system-wide exception hook,
1418 1418 # so that runtime code (such as magics) can access it. This is because
1419 1419 # during the read-eval loop, it may get temporarily overwritten.
1420 1420 self.sys_excepthook = sys.excepthook
1421 1421
1422 1422 # and add any custom exception handlers the user may have specified
1423 1423 self.set_custom_exc(*custom_exceptions)
1424 1424
1425 1425 # Set the exception mode
1426 1426 self.InteractiveTB.set_mode(mode=self.xmode)
1427 1427
1428 1428 def set_custom_exc(self, exc_tuple, handler):
1429 1429 """set_custom_exc(exc_tuple,handler)
1430 1430
1431 1431 Set a custom exception handler, which will be called if any of the
1432 1432 exceptions in exc_tuple occur in the mainloop (specifically, in the
1433 1433 run_code() method.
1434 1434
1435 1435 Inputs:
1436 1436
1437 1437 - exc_tuple: a *tuple* of valid exceptions to call the defined
1438 1438 handler for. It is very important that you use a tuple, and NOT A
1439 1439 LIST here, because of the way Python's except statement works. If
1440 1440 you only want to trap a single exception, use a singleton tuple:
1441 1441
1442 1442 exc_tuple == (MyCustomException,)
1443 1443
1444 1444 - handler: this must be defined as a function with the following
1445 1445 basic interface::
1446 1446
1447 1447 def my_handler(self, etype, value, tb, tb_offset=None)
1448 1448 ...
1449 1449 # The return value must be
1450 1450 return structured_traceback
1451 1451
1452 1452 This will be made into an instance method (via types.MethodType)
1453 1453 of IPython itself, and it will be called if any of the exceptions
1454 1454 listed in the exc_tuple are caught. If the handler is None, an
1455 1455 internal basic one is used, which just prints basic info.
1456 1456
1457 1457 WARNING: by putting in your own exception handler into IPython's main
1458 1458 execution loop, you run a very good chance of nasty crashes. This
1459 1459 facility should only be used if you really know what you are doing."""
1460 1460
1461 1461 assert type(exc_tuple)==type(()) , \
1462 1462 "The custom exceptions must be given AS A TUPLE."
1463 1463
1464 1464 def dummy_handler(self,etype,value,tb):
1465 1465 print '*** Simple custom exception handler ***'
1466 1466 print 'Exception type :',etype
1467 1467 print 'Exception value:',value
1468 1468 print 'Traceback :',tb
1469 1469 #print 'Source code :','\n'.join(self.buffer)
1470 1470
1471 1471 if handler is None: handler = dummy_handler
1472 1472
1473 1473 self.CustomTB = types.MethodType(handler,self)
1474 1474 self.custom_exceptions = exc_tuple
1475 1475
1476 1476 def excepthook(self, etype, value, tb):
1477 1477 """One more defense for GUI apps that call sys.excepthook.
1478 1478
1479 1479 GUI frameworks like wxPython trap exceptions and call
1480 1480 sys.excepthook themselves. I guess this is a feature that
1481 1481 enables them to keep running after exceptions that would
1482 1482 otherwise kill their mainloop. This is a bother for IPython
1483 1483 which excepts to catch all of the program exceptions with a try:
1484 1484 except: statement.
1485 1485
1486 1486 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1487 1487 any app directly invokes sys.excepthook, it will look to the user like
1488 1488 IPython crashed. In order to work around this, we can disable the
1489 1489 CrashHandler and replace it with this excepthook instead, which prints a
1490 1490 regular traceback using our InteractiveTB. In this fashion, apps which
1491 1491 call sys.excepthook will generate a regular-looking exception from
1492 1492 IPython, and the CrashHandler will only be triggered by real IPython
1493 1493 crashes.
1494 1494
1495 1495 This hook should be used sparingly, only in places which are not likely
1496 1496 to be true IPython errors.
1497 1497 """
1498 1498 self.showtraceback((etype,value,tb),tb_offset=0)
1499 1499
1500 1500 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1501 1501 exception_only=False):
1502 1502 """Display the exception that just occurred.
1503 1503
1504 1504 If nothing is known about the exception, this is the method which
1505 1505 should be used throughout the code for presenting user tracebacks,
1506 1506 rather than directly invoking the InteractiveTB object.
1507 1507
1508 1508 A specific showsyntaxerror() also exists, but this method can take
1509 1509 care of calling it if needed, so unless you are explicitly catching a
1510 1510 SyntaxError exception, don't try to analyze the stack manually and
1511 1511 simply call this method."""
1512 1512
1513 1513 try:
1514 1514 if exc_tuple is None:
1515 1515 etype, value, tb = sys.exc_info()
1516 1516 else:
1517 1517 etype, value, tb = exc_tuple
1518 1518
1519 1519 if etype is None:
1520 1520 if hasattr(sys, 'last_type'):
1521 1521 etype, value, tb = sys.last_type, sys.last_value, \
1522 1522 sys.last_traceback
1523 1523 else:
1524 1524 self.write_err('No traceback available to show.\n')
1525 1525 return
1526 1526
1527 1527 if etype is SyntaxError:
1528 1528 # Though this won't be called by syntax errors in the input
1529 1529 # line, there may be SyntaxError cases whith imported code.
1530 1530 self.showsyntaxerror(filename)
1531 1531 elif etype is UsageError:
1532 1532 print "UsageError:", value
1533 1533 else:
1534 1534 # WARNING: these variables are somewhat deprecated and not
1535 1535 # necessarily safe to use in a threaded environment, but tools
1536 1536 # like pdb depend on their existence, so let's set them. If we
1537 1537 # find problems in the field, we'll need to revisit their use.
1538 1538 sys.last_type = etype
1539 1539 sys.last_value = value
1540 1540 sys.last_traceback = tb
1541 1541 if etype in self.custom_exceptions:
1542 1542 # FIXME: Old custom traceback objects may just return a
1543 1543 # string, in that case we just put it into a list
1544 1544 stb = self.CustomTB(etype, value, tb, tb_offset)
1545 1545 if isinstance(ctb, basestring):
1546 1546 stb = [stb]
1547 1547 else:
1548 1548 if exception_only:
1549 1549 stb = ['An exception has occurred, use %tb to see '
1550 1550 'the full traceback.\n']
1551 1551 stb.extend(self.InteractiveTB.get_exception_only(etype,
1552 1552 value))
1553 1553 else:
1554 1554 stb = self.InteractiveTB.structured_traceback(etype,
1555 1555 value, tb, tb_offset=tb_offset)
1556 1556
1557 1557 if self.call_pdb:
1558 1558 # drop into debugger
1559 1559 self.debugger(force=True)
1560 1560
1561 1561 # Actually show the traceback
1562 1562 self._showtraceback(etype, value, stb)
1563 1563
1564 1564 except KeyboardInterrupt:
1565 1565 self.write_err("\nKeyboardInterrupt\n")
1566 1566
1567 1567 def _showtraceback(self, etype, evalue, stb):
1568 1568 """Actually show a traceback.
1569 1569
1570 1570 Subclasses may override this method to put the traceback on a different
1571 1571 place, like a side channel.
1572 1572 """
1573 1573 print >> io.stdout, self.InteractiveTB.stb2text(stb)
1574 1574
1575 1575 def showsyntaxerror(self, filename=None):
1576 1576 """Display the syntax error that just occurred.
1577 1577
1578 1578 This doesn't display a stack trace because there isn't one.
1579 1579
1580 1580 If a filename is given, it is stuffed in the exception instead
1581 1581 of what was there before (because Python's parser always uses
1582 1582 "<string>" when reading from a string).
1583 1583 """
1584 1584 etype, value, last_traceback = sys.exc_info()
1585 1585
1586 1586 # See note about these variables in showtraceback() above
1587 1587 sys.last_type = etype
1588 1588 sys.last_value = value
1589 1589 sys.last_traceback = last_traceback
1590 1590
1591 1591 if filename and etype is SyntaxError:
1592 1592 # Work hard to stuff the correct filename in the exception
1593 1593 try:
1594 1594 msg, (dummy_filename, lineno, offset, line) = value
1595 1595 except:
1596 1596 # Not the format we expect; leave it alone
1597 1597 pass
1598 1598 else:
1599 1599 # Stuff in the right filename
1600 1600 try:
1601 1601 # Assume SyntaxError is a class exception
1602 1602 value = SyntaxError(msg, (filename, lineno, offset, line))
1603 1603 except:
1604 1604 # If that failed, assume SyntaxError is a string
1605 1605 value = msg, (filename, lineno, offset, line)
1606 1606 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1607 1607 self._showtraceback(etype, value, stb)
1608 1608
1609 1609 #-------------------------------------------------------------------------
1610 1610 # Things related to readline
1611 1611 #-------------------------------------------------------------------------
1612 1612
1613 1613 def init_readline(self):
1614 1614 """Command history completion/saving/reloading."""
1615 1615
1616 1616 if self.readline_use:
1617 1617 import IPython.utils.rlineimpl as readline
1618 1618
1619 1619 self.rl_next_input = None
1620 1620 self.rl_do_indent = False
1621 1621
1622 1622 if not self.readline_use or not readline.have_readline:
1623 1623 self.has_readline = False
1624 1624 self.readline = None
1625 1625 # Set a number of methods that depend on readline to be no-op
1626 1626 self.set_readline_completer = no_op
1627 1627 self.set_custom_completer = no_op
1628 1628 self.set_completer_frame = no_op
1629 1629 warn('Readline services not available or not loaded.')
1630 1630 else:
1631 1631 self.has_readline = True
1632 1632 self.readline = readline
1633 1633 sys.modules['readline'] = readline
1634 1634
1635 1635 # Platform-specific configuration
1636 1636 if os.name == 'nt':
1637 1637 # FIXME - check with Frederick to see if we can harmonize
1638 1638 # naming conventions with pyreadline to avoid this
1639 1639 # platform-dependent check
1640 1640 self.readline_startup_hook = readline.set_pre_input_hook
1641 1641 else:
1642 1642 self.readline_startup_hook = readline.set_startup_hook
1643 1643
1644 1644 # Load user's initrc file (readline config)
1645 1645 # Or if libedit is used, load editrc.
1646 1646 inputrc_name = os.environ.get('INPUTRC')
1647 1647 if inputrc_name is None:
1648 1648 home_dir = get_home_dir()
1649 1649 if home_dir is not None:
1650 1650 inputrc_name = '.inputrc'
1651 1651 if readline.uses_libedit:
1652 1652 inputrc_name = '.editrc'
1653 1653 inputrc_name = os.path.join(home_dir, inputrc_name)
1654 1654 if os.path.isfile(inputrc_name):
1655 1655 try:
1656 1656 readline.read_init_file(inputrc_name)
1657 1657 except:
1658 1658 warn('Problems reading readline initialization file <%s>'
1659 1659 % inputrc_name)
1660 1660
1661 1661 # Configure readline according to user's prefs
1662 1662 # This is only done if GNU readline is being used. If libedit
1663 1663 # is being used (as on Leopard) the readline config is
1664 1664 # not run as the syntax for libedit is different.
1665 1665 if not readline.uses_libedit:
1666 1666 for rlcommand in self.readline_parse_and_bind:
1667 1667 #print "loading rl:",rlcommand # dbg
1668 1668 readline.parse_and_bind(rlcommand)
1669 1669
1670 1670 # Remove some chars from the delimiters list. If we encounter
1671 1671 # unicode chars, discard them.
1672 1672 delims = readline.get_completer_delims().encode("ascii", "ignore")
1673 1673 for d in self.readline_remove_delims:
1674 1674 delims = delims.replace(d, "")
1675 1675 delims = delims.replace(ESC_MAGIC, '')
1676 1676 readline.set_completer_delims(delims)
1677 1677 # otherwise we end up with a monster history after a while:
1678 1678 readline.set_history_length(self.history_length)
1679 1679
1680 1680 self.refill_readline_hist()
1681 1681 self.readline_no_record = ReadlineNoRecord(self)
1682 1682
1683 1683 # Configure auto-indent for all platforms
1684 1684 self.set_autoindent(self.autoindent)
1685 1685
1686 1686 def refill_readline_hist(self):
1687 1687 # Load the last 1000 lines from history
1688 1688 self.readline.clear_history()
1689 1689 stdin_encoding = sys.stdin.encoding or "utf-8"
1690 1690 for _, _, cell in self.history_manager.get_tail(1000,
1691 1691 include_latest=True):
1692 1692 if cell.strip(): # Ignore blank lines
1693 1693 for line in cell.splitlines():
1694 1694 self.readline.add_history(line.encode(stdin_encoding, 'replace'))
1695 1695
1696 1696 def set_next_input(self, s):
1697 1697 """ Sets the 'default' input string for the next command line.
1698 1698
1699 1699 Requires readline.
1700 1700
1701 1701 Example:
1702 1702
1703 1703 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1704 1704 [D:\ipython]|2> Hello Word_ # cursor is here
1705 1705 """
1706 1706 if isinstance(s, unicode):
1707 1707 s = s.encode(self.stdin_encoding, 'replace')
1708 1708 self.rl_next_input = s
1709 1709
1710 1710 # Maybe move this to the terminal subclass?
1711 1711 def pre_readline(self):
1712 1712 """readline hook to be used at the start of each line.
1713 1713
1714 1714 Currently it handles auto-indent only."""
1715 1715
1716 1716 if self.rl_do_indent:
1717 1717 self.readline.insert_text(self._indent_current_str())
1718 1718 if self.rl_next_input is not None:
1719 1719 self.readline.insert_text(self.rl_next_input)
1720 1720 self.rl_next_input = None
1721 1721
1722 1722 def _indent_current_str(self):
1723 1723 """return the current level of indentation as a string"""
1724 1724 return self.input_splitter.indent_spaces * ' '
1725 1725
1726 1726 #-------------------------------------------------------------------------
1727 1727 # Things related to text completion
1728 1728 #-------------------------------------------------------------------------
1729 1729
1730 1730 def init_completer(self):
1731 1731 """Initialize the completion machinery.
1732 1732
1733 1733 This creates completion machinery that can be used by client code,
1734 1734 either interactively in-process (typically triggered by the readline
1735 1735 library), programatically (such as in test suites) or out-of-prcess
1736 1736 (typically over the network by remote frontends).
1737 1737 """
1738 1738 from IPython.core.completer import IPCompleter
1739 1739 from IPython.core.completerlib import (module_completer,
1740 1740 magic_run_completer, cd_completer)
1741 1741
1742 1742 self.Completer = IPCompleter(self,
1743 1743 self.user_ns,
1744 1744 self.user_global_ns,
1745 1745 self.readline_omit__names,
1746 1746 self.alias_manager.alias_table,
1747 1747 self.has_readline)
1748 1748
1749 1749 # Add custom completers to the basic ones built into IPCompleter
1750 1750 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1751 1751 self.strdispatchers['complete_command'] = sdisp
1752 1752 self.Completer.custom_completers = sdisp
1753 1753
1754 1754 self.set_hook('complete_command', module_completer, str_key = 'import')
1755 1755 self.set_hook('complete_command', module_completer, str_key = 'from')
1756 1756 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1757 1757 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1758 1758
1759 1759 # Only configure readline if we truly are using readline. IPython can
1760 1760 # do tab-completion over the network, in GUIs, etc, where readline
1761 1761 # itself may be absent
1762 1762 if self.has_readline:
1763 1763 self.set_readline_completer()
1764 1764
1765 1765 def complete(self, text, line=None, cursor_pos=None):
1766 1766 """Return the completed text and a list of completions.
1767 1767
1768 1768 Parameters
1769 1769 ----------
1770 1770
1771 1771 text : string
1772 1772 A string of text to be completed on. It can be given as empty and
1773 1773 instead a line/position pair are given. In this case, the
1774 1774 completer itself will split the line like readline does.
1775 1775
1776 1776 line : string, optional
1777 1777 The complete line that text is part of.
1778 1778
1779 1779 cursor_pos : int, optional
1780 1780 The position of the cursor on the input line.
1781 1781
1782 1782 Returns
1783 1783 -------
1784 1784 text : string
1785 1785 The actual text that was completed.
1786 1786
1787 1787 matches : list
1788 1788 A sorted list with all possible completions.
1789 1789
1790 1790 The optional arguments allow the completion to take more context into
1791 1791 account, and are part of the low-level completion API.
1792 1792
1793 1793 This is a wrapper around the completion mechanism, similar to what
1794 1794 readline does at the command line when the TAB key is hit. By
1795 1795 exposing it as a method, it can be used by other non-readline
1796 1796 environments (such as GUIs) for text completion.
1797 1797
1798 1798 Simple usage example:
1799 1799
1800 1800 In [1]: x = 'hello'
1801 1801
1802 1802 In [2]: _ip.complete('x.l')
1803 1803 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1804 1804 """
1805 1805
1806 1806 # Inject names into __builtin__ so we can complete on the added names.
1807 1807 with self.builtin_trap:
1808 1808 return self.Completer.complete(text, line, cursor_pos)
1809 1809
1810 1810 def set_custom_completer(self, completer, pos=0):
1811 1811 """Adds a new custom completer function.
1812 1812
1813 1813 The position argument (defaults to 0) is the index in the completers
1814 1814 list where you want the completer to be inserted."""
1815 1815
1816 1816 newcomp = types.MethodType(completer,self.Completer)
1817 1817 self.Completer.matchers.insert(pos,newcomp)
1818 1818
1819 1819 def set_readline_completer(self):
1820 1820 """Reset readline's completer to be our own."""
1821 1821 self.readline.set_completer(self.Completer.rlcomplete)
1822 1822
1823 1823 def set_completer_frame(self, frame=None):
1824 1824 """Set the frame of the completer."""
1825 1825 if frame:
1826 1826 self.Completer.namespace = frame.f_locals
1827 1827 self.Completer.global_namespace = frame.f_globals
1828 1828 else:
1829 1829 self.Completer.namespace = self.user_ns
1830 1830 self.Completer.global_namespace = self.user_global_ns
1831 1831
1832 1832 #-------------------------------------------------------------------------
1833 1833 # Things related to magics
1834 1834 #-------------------------------------------------------------------------
1835 1835
1836 1836 def init_magics(self):
1837 1837 # FIXME: Move the color initialization to the DisplayHook, which
1838 1838 # should be split into a prompt manager and displayhook. We probably
1839 1839 # even need a centralize colors management object.
1840 1840 self.magic_colors(self.colors)
1841 1841 # History was moved to a separate module
1842 1842 from . import history
1843 1843 history.init_ipython(self)
1844 1844
1845 1845 def magic(self, arg_s, next_input=None):
1846 1846 """Call a magic function by name.
1847 1847
1848 1848 Input: a string containing the name of the magic function to call and
1849 1849 any additional arguments to be passed to the magic.
1850 1850
1851 1851 magic('name -opt foo bar') is equivalent to typing at the ipython
1852 1852 prompt:
1853 1853
1854 1854 In[1]: %name -opt foo bar
1855 1855
1856 1856 To call a magic without arguments, simply use magic('name').
1857 1857
1858 1858 This provides a proper Python function to call IPython's magics in any
1859 1859 valid Python code you can type at the interpreter, including loops and
1860 1860 compound statements.
1861 1861 """
1862 1862 # Allow setting the next input - this is used if the user does `a=abs?`.
1863 1863 # We do this first so that magic functions can override it.
1864 1864 if next_input:
1865 1865 self.set_next_input(next_input)
1866 1866
1867 1867 args = arg_s.split(' ',1)
1868 1868 magic_name = args[0]
1869 1869 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1870 1870
1871 1871 try:
1872 1872 magic_args = args[1]
1873 1873 except IndexError:
1874 1874 magic_args = ''
1875 1875 fn = getattr(self,'magic_'+magic_name,None)
1876 1876 if fn is None:
1877 1877 error("Magic function `%s` not found." % magic_name)
1878 1878 else:
1879 1879 magic_args = self.var_expand(magic_args,1)
1880 1880 # Grab local namespace if we need it:
1881 1881 if getattr(fn, "needs_local_scope", False):
1882 1882 self._magic_locals = sys._getframe(1).f_locals
1883 1883 with self.builtin_trap:
1884 1884 result = fn(magic_args)
1885 1885 # Ensure we're not keeping object references around:
1886 1886 self._magic_locals = {}
1887 1887 return result
1888 1888
1889 1889 def define_magic(self, magicname, func):
1890 1890 """Expose own function as magic function for ipython
1891 1891
1892 1892 def foo_impl(self,parameter_s=''):
1893 1893 'My very own magic!. (Use docstrings, IPython reads them).'
1894 1894 print 'Magic function. Passed parameter is between < >:'
1895 1895 print '<%s>' % parameter_s
1896 1896 print 'The self object is:',self
1897 1897
1898 1898 self.define_magic('foo',foo_impl)
1899 1899 """
1900 1900
1901 1901 import new
1902 1902 im = types.MethodType(func,self)
1903 1903 old = getattr(self, "magic_" + magicname, None)
1904 1904 setattr(self, "magic_" + magicname, im)
1905 1905 return old
1906 1906
1907 1907 #-------------------------------------------------------------------------
1908 1908 # Things related to macros
1909 1909 #-------------------------------------------------------------------------
1910 1910
1911 1911 def define_macro(self, name, themacro):
1912 1912 """Define a new macro
1913 1913
1914 1914 Parameters
1915 1915 ----------
1916 1916 name : str
1917 1917 The name of the macro.
1918 1918 themacro : str or Macro
1919 1919 The action to do upon invoking the macro. If a string, a new
1920 1920 Macro object is created by passing the string to it.
1921 1921 """
1922 1922
1923 1923 from IPython.core import macro
1924 1924
1925 1925 if isinstance(themacro, basestring):
1926 1926 themacro = macro.Macro(themacro)
1927 1927 if not isinstance(themacro, macro.Macro):
1928 1928 raise ValueError('A macro must be a string or a Macro instance.')
1929 1929 self.user_ns[name] = themacro
1930 1930
1931 1931 #-------------------------------------------------------------------------
1932 1932 # Things related to the running of system commands
1933 1933 #-------------------------------------------------------------------------
1934 1934
1935 1935 def system_piped(self, cmd):
1936 1936 """Call the given cmd in a subprocess, piping stdout/err
1937 1937
1938 1938 Parameters
1939 1939 ----------
1940 1940 cmd : str
1941 1941 Command to execute (can not end in '&', as background processes are
1942 1942 not supported. Should not be a command that expects input
1943 1943 other than simple text.
1944 1944 """
1945 1945 if cmd.rstrip().endswith('&'):
1946 1946 # this is *far* from a rigorous test
1947 1947 # We do not support backgrounding processes because we either use
1948 1948 # pexpect or pipes to read from. Users can always just call
1949 1949 # os.system() or use ip.system=ip.system_raw
1950 1950 # if they really want a background process.
1951 1951 raise OSError("Background processes not supported.")
1952 1952
1953 1953 # we explicitly do NOT return the subprocess status code, because
1954 1954 # a non-None value would trigger :func:`sys.displayhook` calls.
1955 1955 # Instead, we store the exit_code in user_ns.
1956 1956 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=2))
1957 1957
1958 1958 def system_raw(self, cmd):
1959 1959 """Call the given cmd in a subprocess using os.system
1960 1960
1961 1961 Parameters
1962 1962 ----------
1963 1963 cmd : str
1964 1964 Command to execute.
1965 1965 """
1966 1966 # We explicitly do NOT return the subprocess status code, because
1967 1967 # a non-None value would trigger :func:`sys.displayhook` calls.
1968 1968 # Instead, we store the exit_code in user_ns.
1969 1969 self.user_ns['_exit_code'] = os.system(self.var_expand(cmd, depth=2))
1970 1970
1971 1971 # use piped system by default, because it is better behaved
1972 1972 system = system_piped
1973 1973
1974 1974 def getoutput(self, cmd, split=True):
1975 1975 """Get output (possibly including stderr) from a subprocess.
1976 1976
1977 1977 Parameters
1978 1978 ----------
1979 1979 cmd : str
1980 1980 Command to execute (can not end in '&', as background processes are
1981 1981 not supported.
1982 1982 split : bool, optional
1983 1983
1984 1984 If True, split the output into an IPython SList. Otherwise, an
1985 1985 IPython LSString is returned. These are objects similar to normal
1986 1986 lists and strings, with a few convenience attributes for easier
1987 1987 manipulation of line-based output. You can use '?' on them for
1988 1988 details.
1989 1989 """
1990 1990 if cmd.rstrip().endswith('&'):
1991 1991 # this is *far* from a rigorous test
1992 1992 raise OSError("Background processes not supported.")
1993 1993 out = getoutput(self.var_expand(cmd, depth=2))
1994 1994 if split:
1995 1995 out = SList(out.splitlines())
1996 1996 else:
1997 1997 out = LSString(out)
1998 1998 return out
1999 1999
2000 2000 #-------------------------------------------------------------------------
2001 2001 # Things related to aliases
2002 2002 #-------------------------------------------------------------------------
2003 2003
2004 2004 def init_alias(self):
2005 2005 self.alias_manager = AliasManager(shell=self, config=self.config)
2006 2006 self.ns_table['alias'] = self.alias_manager.alias_table,
2007 2007
2008 2008 #-------------------------------------------------------------------------
2009 2009 # Things related to extensions and plugins
2010 2010 #-------------------------------------------------------------------------
2011 2011
2012 2012 def init_extension_manager(self):
2013 2013 self.extension_manager = ExtensionManager(shell=self, config=self.config)
2014 2014
2015 2015 def init_plugin_manager(self):
2016 2016 self.plugin_manager = PluginManager(config=self.config)
2017 2017
2018 2018 #-------------------------------------------------------------------------
2019 2019 # Things related to payloads
2020 2020 #-------------------------------------------------------------------------
2021 2021
2022 2022 def init_payload(self):
2023 2023 self.payload_manager = PayloadManager(config=self.config)
2024 2024
2025 2025 #-------------------------------------------------------------------------
2026 2026 # Things related to the prefilter
2027 2027 #-------------------------------------------------------------------------
2028 2028
2029 2029 def init_prefilter(self):
2030 2030 self.prefilter_manager = PrefilterManager(shell=self, config=self.config)
2031 2031 # Ultimately this will be refactored in the new interpreter code, but
2032 2032 # for now, we should expose the main prefilter method (there's legacy
2033 2033 # code out there that may rely on this).
2034 2034 self.prefilter = self.prefilter_manager.prefilter_lines
2035 2035
2036 2036 def auto_rewrite_input(self, cmd):
2037 2037 """Print to the screen the rewritten form of the user's command.
2038 2038
2039 2039 This shows visual feedback by rewriting input lines that cause
2040 2040 automatic calling to kick in, like::
2041 2041
2042 2042 /f x
2043 2043
2044 2044 into::
2045 2045
2046 2046 ------> f(x)
2047 2047
2048 2048 after the user's input prompt. This helps the user understand that the
2049 2049 input line was transformed automatically by IPython.
2050 2050 """
2051 2051 rw = self.displayhook.prompt1.auto_rewrite() + cmd
2052 2052
2053 2053 try:
2054 2054 # plain ascii works better w/ pyreadline, on some machines, so
2055 2055 # we use it and only print uncolored rewrite if we have unicode
2056 2056 rw = str(rw)
2057 2057 print >> io.stdout, rw
2058 2058 except UnicodeEncodeError:
2059 2059 print "------> " + cmd
2060 2060
2061 2061 #-------------------------------------------------------------------------
2062 2062 # Things related to extracting values/expressions from kernel and user_ns
2063 2063 #-------------------------------------------------------------------------
2064 2064
2065 2065 def _simple_error(self):
2066 2066 etype, value = sys.exc_info()[:2]
2067 2067 return u'[ERROR] {e.__name__}: {v}'.format(e=etype, v=value)
2068 2068
2069 2069 def user_variables(self, names):
2070 2070 """Get a list of variable names from the user's namespace.
2071 2071
2072 2072 Parameters
2073 2073 ----------
2074 2074 names : list of strings
2075 2075 A list of names of variables to be read from the user namespace.
2076 2076
2077 2077 Returns
2078 2078 -------
2079 2079 A dict, keyed by the input names and with the repr() of each value.
2080 2080 """
2081 2081 out = {}
2082 2082 user_ns = self.user_ns
2083 2083 for varname in names:
2084 2084 try:
2085 2085 value = repr(user_ns[varname])
2086 2086 except:
2087 2087 value = self._simple_error()
2088 2088 out[varname] = value
2089 2089 return out
2090 2090
2091 2091 def user_expressions(self, expressions):
2092 2092 """Evaluate a dict of expressions in the user's namespace.
2093 2093
2094 2094 Parameters
2095 2095 ----------
2096 2096 expressions : dict
2097 2097 A dict with string keys and string values. The expression values
2098 2098 should be valid Python expressions, each of which will be evaluated
2099 2099 in the user namespace.
2100 2100
2101 2101 Returns
2102 2102 -------
2103 2103 A dict, keyed like the input expressions dict, with the repr() of each
2104 2104 value.
2105 2105 """
2106 2106 out = {}
2107 2107 user_ns = self.user_ns
2108 2108 global_ns = self.user_global_ns
2109 2109 for key, expr in expressions.iteritems():
2110 2110 try:
2111 2111 value = repr(eval(expr, global_ns, user_ns))
2112 2112 except:
2113 2113 value = self._simple_error()
2114 2114 out[key] = value
2115 2115 return out
2116 2116
2117 2117 #-------------------------------------------------------------------------
2118 2118 # Things related to the running of code
2119 2119 #-------------------------------------------------------------------------
2120 2120
2121 2121 def ex(self, cmd):
2122 2122 """Execute a normal python statement in user namespace."""
2123 2123 with self.builtin_trap:
2124 2124 exec cmd in self.user_global_ns, self.user_ns
2125 2125
2126 2126 def ev(self, expr):
2127 2127 """Evaluate python expression expr in user namespace.
2128 2128
2129 2129 Returns the result of evaluation
2130 2130 """
2131 2131 with self.builtin_trap:
2132 2132 return eval(expr, self.user_global_ns, self.user_ns)
2133 2133
2134 2134 def safe_execfile(self, fname, *where, **kw):
2135 2135 """A safe version of the builtin execfile().
2136 2136
2137 2137 This version will never throw an exception, but instead print
2138 2138 helpful error messages to the screen. This only works on pure
2139 2139 Python files with the .py extension.
2140 2140
2141 2141 Parameters
2142 2142 ----------
2143 2143 fname : string
2144 2144 The name of the file to be executed.
2145 2145 where : tuple
2146 2146 One or two namespaces, passed to execfile() as (globals,locals).
2147 2147 If only one is given, it is passed as both.
2148 2148 exit_ignore : bool (False)
2149 2149 If True, then silence SystemExit for non-zero status (it is always
2150 2150 silenced for zero status, as it is so common).
2151 2151 """
2152 2152 kw.setdefault('exit_ignore', False)
2153 2153
2154 2154 fname = os.path.abspath(os.path.expanduser(fname))
2155 2155
2156 2156 # Make sure we can open the file
2157 2157 try:
2158 2158 with open(fname) as thefile:
2159 2159 pass
2160 2160 except:
2161 2161 warn('Could not open file <%s> for safe execution.' % fname)
2162 2162 return
2163 2163
2164 2164 # Find things also in current directory. This is needed to mimic the
2165 2165 # behavior of running a script from the system command line, where
2166 2166 # Python inserts the script's directory into sys.path
2167 2167 dname = os.path.dirname(fname)
2168 2168
2169 2169 if isinstance(fname, unicode):
2170 2170 # execfile uses default encoding instead of filesystem encoding
2171 2171 # so unicode filenames will fail
2172 2172 fname = fname.encode(sys.getfilesystemencoding() or sys.getdefaultencoding())
2173 2173
2174 2174 with prepended_to_syspath(dname):
2175 2175 try:
2176 2176 execfile(fname,*where)
2177 2177 except SystemExit, status:
2178 2178 # If the call was made with 0 or None exit status (sys.exit(0)
2179 2179 # or sys.exit() ), don't bother showing a traceback, as both of
2180 2180 # these are considered normal by the OS:
2181 2181 # > python -c'import sys;sys.exit(0)'; echo $?
2182 2182 # 0
2183 2183 # > python -c'import sys;sys.exit()'; echo $?
2184 2184 # 0
2185 2185 # For other exit status, we show the exception unless
2186 2186 # explicitly silenced, but only in short form.
2187 2187 if status.code not in (0, None) and not kw['exit_ignore']:
2188 2188 self.showtraceback(exception_only=True)
2189 2189 except:
2190 2190 self.showtraceback()
2191 2191
2192 2192 def safe_execfile_ipy(self, fname):
2193 2193 """Like safe_execfile, but for .ipy files with IPython syntax.
2194 2194
2195 2195 Parameters
2196 2196 ----------
2197 2197 fname : str
2198 2198 The name of the file to execute. The filename must have a
2199 2199 .ipy extension.
2200 2200 """
2201 2201 fname = os.path.abspath(os.path.expanduser(fname))
2202 2202
2203 2203 # Make sure we can open the file
2204 2204 try:
2205 2205 with open(fname) as thefile:
2206 2206 pass
2207 2207 except:
2208 2208 warn('Could not open file <%s> for safe execution.' % fname)
2209 2209 return
2210 2210
2211 2211 # Find things also in current directory. This is needed to mimic the
2212 2212 # behavior of running a script from the system command line, where
2213 2213 # Python inserts the script's directory into sys.path
2214 2214 dname = os.path.dirname(fname)
2215 2215
2216 2216 with prepended_to_syspath(dname):
2217 2217 try:
2218 2218 with open(fname) as thefile:
2219 2219 # self.run_cell currently captures all exceptions
2220 2220 # raised in user code. It would be nice if there were
2221 2221 # versions of runlines, execfile that did raise, so
2222 2222 # we could catch the errors.
2223 2223 self.run_cell(thefile.read(), store_history=False)
2224 2224 except:
2225 2225 self.showtraceback()
2226 2226 warn('Unknown failure executing file: <%s>' % fname)
2227 2227
2228 2228 def run_cell(self, raw_cell, store_history=True):
2229 2229 """Run a complete IPython cell.
2230 2230
2231 2231 Parameters
2232 2232 ----------
2233 2233 raw_cell : str
2234 2234 The code (including IPython code such as %magic functions) to run.
2235 2235 store_history : bool
2236 2236 If True, the raw and translated cell will be stored in IPython's
2237 2237 history. For user code calling back into IPython's machinery, this
2238 2238 should be set to False.
2239 2239 """
2240 2240 if (not raw_cell) or raw_cell.isspace():
2241 2241 return
2242 2242
2243 2243 for line in raw_cell.splitlines():
2244 2244 self.input_splitter.push(line)
2245 2245 cell = self.input_splitter.source_reset()
2246 2246
2247 2247 with self.builtin_trap:
2248 2248 prefilter_failed = False
2249 2249 if len(cell.splitlines()) == 1:
2250 2250 try:
2251 2251 # use prefilter_lines to handle trailing newlines
2252 2252 # restore trailing newline for ast.parse
2253 2253 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2254 2254 except AliasError as e:
2255 2255 error(e)
2256 2256 prefilter_failed=True
2257 2257 except Exception:
2258 2258 # don't allow prefilter errors to crash IPython
2259 2259 self.showtraceback()
2260 2260 prefilter_failed = True
2261 2261
2262 2262 # Store raw and processed history
2263 2263 if store_history:
2264 2264 self.history_manager.store_inputs(self.execution_count,
2265 2265 cell, raw_cell)
2266 2266
2267 2267 self.logger.log(cell, raw_cell)
2268 2268
2269 2269 if not prefilter_failed:
2270 2270 # don't run if prefilter failed
2271 2271 cell_name = self.compile.cache(cell, self.execution_count)
2272 2272
2273 2273 with self.display_trap:
2274 2274 try:
2275 2275 code_ast = ast.parse(cell, filename=cell_name)
2276 2276 except (OverflowError, SyntaxError, ValueError, TypeError,
2277 2277 MemoryError):
2278 2278 self.showsyntaxerror()
2279 2279 self.execution_count += 1
2280 2280 return None
2281 2281
2282 2282 self.run_ast_nodes(code_ast.body, cell_name,
2283 2283 interactivity="last_expr")
2284 2284
2285 2285 # Execute any registered post-execution functions.
2286 2286 for func, status in self._post_execute.iteritems():
2287 2287 if not status:
2288 2288 continue
2289 2289 try:
2290 2290 func()
2291 2291 except:
2292 2292 self.showtraceback()
2293 2293 # Deactivate failing function
2294 2294 self._post_execute[func] = False
2295 2295
2296 2296 if store_history:
2297 2297 # Write output to the database. Does nothing unless
2298 2298 # history output logging is enabled.
2299 2299 self.history_manager.store_output(self.execution_count)
2300 2300 # Each cell is a *single* input, regardless of how many lines it has
2301 2301 self.execution_count += 1
2302 2302
2303 2303 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr'):
2304 2304 """Run a sequence of AST nodes. The execution mode depends on the
2305 2305 interactivity parameter.
2306 2306
2307 2307 Parameters
2308 2308 ----------
2309 2309 nodelist : list
2310 2310 A sequence of AST nodes to run.
2311 2311 cell_name : str
2312 2312 Will be passed to the compiler as the filename of the cell. Typically
2313 2313 the value returned by ip.compile.cache(cell).
2314 2314 interactivity : str
2315 2315 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2316 2316 run interactively (displaying output from expressions). 'last_expr'
2317 2317 will run the last node interactively only if it is an expression (i.e.
2318 2318 expressions in loops or other blocks are not displayed. Other values
2319 2319 for this parameter will raise a ValueError.
2320 2320 """
2321 2321 if not nodelist:
2322 2322 return
2323 2323
2324 2324 if interactivity == 'last_expr':
2325 2325 if isinstance(nodelist[-1], ast.Expr):
2326 2326 interactivity = "last"
2327 2327 else:
2328 2328 interactivity = "none"
2329 2329
2330 2330 if interactivity == 'none':
2331 2331 to_run_exec, to_run_interactive = nodelist, []
2332 2332 elif interactivity == 'last':
2333 2333 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2334 2334 elif interactivity == 'all':
2335 2335 to_run_exec, to_run_interactive = [], nodelist
2336 2336 else:
2337 2337 raise ValueError("Interactivity was %r" % interactivity)
2338 2338
2339 2339 exec_count = self.execution_count
2340 2340
2341 2341 for i, node in enumerate(to_run_exec):
2342 2342 mod = ast.Module([node])
2343 2343 code = self.compile(mod, cell_name, "exec")
2344 2344 if self.run_code(code):
2345 2345 return True
2346 2346
2347 2347 for i, node in enumerate(to_run_interactive):
2348 2348 mod = ast.Interactive([node])
2349 2349 code = self.compile(mod, cell_name, "single")
2350 2350 if self.run_code(code):
2351 2351 return True
2352 2352
2353 2353 return False
2354 2354
2355 2355 def run_code(self, code_obj):
2356 2356 """Execute a code object.
2357 2357
2358 2358 When an exception occurs, self.showtraceback() is called to display a
2359 2359 traceback.
2360 2360
2361 2361 Parameters
2362 2362 ----------
2363 2363 code_obj : code object
2364 2364 A compiled code object, to be executed
2365 2365 post_execute : bool [default: True]
2366 2366 whether to call post_execute hooks after this particular execution.
2367 2367
2368 2368 Returns
2369 2369 -------
2370 2370 False : successful execution.
2371 2371 True : an error occurred.
2372 2372 """
2373 2373
2374 2374 # Set our own excepthook in case the user code tries to call it
2375 2375 # directly, so that the IPython crash handler doesn't get triggered
2376 2376 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2377 2377
2378 2378 # we save the original sys.excepthook in the instance, in case config
2379 2379 # code (such as magics) needs access to it.
2380 2380 self.sys_excepthook = old_excepthook
2381 2381 outflag = 1 # happens in more places, so it's easier as default
2382 2382 try:
2383 2383 try:
2384 2384 self.hooks.pre_run_code_hook()
2385 2385 #rprint('Running code', repr(code_obj)) # dbg
2386 2386 exec code_obj in self.user_global_ns, self.user_ns
2387 2387 finally:
2388 2388 # Reset our crash handler in place
2389 2389 sys.excepthook = old_excepthook
2390 2390 except SystemExit:
2391 2391 self.showtraceback(exception_only=True)
2392 2392 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2393 2393 except self.custom_exceptions:
2394 2394 etype,value,tb = sys.exc_info()
2395 2395 self.CustomTB(etype,value,tb)
2396 2396 except:
2397 2397 self.showtraceback()
2398 2398 else:
2399 2399 outflag = 0
2400 2400 if softspace(sys.stdout, 0):
2401 2401 print
2402 2402
2403 2403 return outflag
2404 2404
2405 2405 # For backwards compatibility
2406 2406 runcode = run_code
2407 2407
2408 2408 #-------------------------------------------------------------------------
2409 2409 # Things related to GUI support and pylab
2410 2410 #-------------------------------------------------------------------------
2411 2411
2412 2412 def enable_pylab(self, gui=None, import_all=True):
2413 2413 raise NotImplementedError('Implement enable_pylab in a subclass')
2414 2414
2415 2415 #-------------------------------------------------------------------------
2416 2416 # Utilities
2417 2417 #-------------------------------------------------------------------------
2418 2418
2419 2419 def var_expand(self,cmd,depth=0):
2420 2420 """Expand python variables in a string.
2421 2421
2422 2422 The depth argument indicates how many frames above the caller should
2423 2423 be walked to look for the local namespace where to expand variables.
2424 2424
2425 2425 The global namespace for expansion is always the user's interactive
2426 2426 namespace.
2427 2427 """
2428 2428 res = ItplNS(cmd, self.user_ns, # globals
2429 2429 # Skip our own frame in searching for locals:
2430 2430 sys._getframe(depth+1).f_locals # locals
2431 2431 )
2432 2432 return str(res).decode(res.codec)
2433 2433
2434 2434 def mktempfile(self, data=None, prefix='ipython_edit_'):
2435 2435 """Make a new tempfile and return its filename.
2436 2436
2437 2437 This makes a call to tempfile.mktemp, but it registers the created
2438 2438 filename internally so ipython cleans it up at exit time.
2439 2439
2440 2440 Optional inputs:
2441 2441
2442 2442 - data(None): if data is given, it gets written out to the temp file
2443 2443 immediately, and the file is closed again."""
2444 2444
2445 2445 filename = tempfile.mktemp('.py', prefix)
2446 2446 self.tempfiles.append(filename)
2447 2447
2448 2448 if data:
2449 2449 tmp_file = open(filename,'w')
2450 2450 tmp_file.write(data)
2451 2451 tmp_file.close()
2452 2452 return filename
2453 2453
2454 2454 # TODO: This should be removed when Term is refactored.
2455 2455 def write(self,data):
2456 2456 """Write a string to the default output"""
2457 2457 io.stdout.write(data)
2458 2458
2459 2459 # TODO: This should be removed when Term is refactored.
2460 2460 def write_err(self,data):
2461 2461 """Write a string to the default error output"""
2462 2462 io.stderr.write(data)
2463 2463
2464 2464 def ask_yes_no(self,prompt,default=True):
2465 2465 if self.quiet:
2466 2466 return True
2467 2467 return ask_yes_no(prompt,default)
2468 2468
2469 2469 def show_usage(self):
2470 2470 """Show a usage message"""
2471 2471 page.page(IPython.core.usage.interactive_usage)
2472 2472
2473 2473 def find_user_code(self, target, raw=True):
2474 2474 """Get a code string from history, file, or a string or macro.
2475 2475
2476 2476 This is mainly used by magic functions.
2477 2477
2478 2478 Parameters
2479 2479 ----------
2480 2480 target : str
2481 2481 A string specifying code to retrieve. This will be tried respectively
2482 2482 as: ranges of input history (see %history for syntax), a filename, or
2483 2483 an expression evaluating to a string or Macro in the user namespace.
2484 2484 raw : bool
2485 2485 If true (default), retrieve raw history. Has no effect on the other
2486 2486 retrieval mechanisms.
2487 2487
2488 2488 Returns
2489 2489 -------
2490 2490 A string of code.
2491 2491
2492 2492 ValueError is raised if nothing is found, and TypeError if it evaluates
2493 2493 to an object of another type. In each case, .args[0] is a printable
2494 2494 message.
2495 2495 """
2496 2496 code = self.extract_input_lines(target, raw=raw) # Grab history
2497 2497 if code:
2498 2498 return code
2499 2499 if os.path.isfile(target): # Read file
2500 2500 return open(target, "r").read()
2501 2501
2502 2502 try: # User namespace
2503 2503 codeobj = eval(target, self.user_ns)
2504 2504 except Exception:
2505 2505 raise ValueError(("'%s' was not found in history, as a file, nor in"
2506 2506 " the user namespace.") % target)
2507 2507 if isinstance(codeobj, basestring):
2508 2508 return codeobj
2509 2509 elif isinstance(codeobj, Macro):
2510 2510 return codeobj.value
2511 2511
2512 2512 raise TypeError("%s is neither a string nor a macro." % target,
2513 2513 codeobj)
2514 2514
2515 2515 #-------------------------------------------------------------------------
2516 2516 # Things related to IPython exiting
2517 2517 #-------------------------------------------------------------------------
2518 2518 def atexit_operations(self):
2519 2519 """This will be executed at the time of exit.
2520 2520
2521 2521 Cleanup operations and saving of persistent data that is done
2522 2522 unconditionally by IPython should be performed here.
2523 2523
2524 2524 For things that may depend on startup flags or platform specifics (such
2525 2525 as having readline or not), register a separate atexit function in the
2526 2526 code that has the appropriate information, rather than trying to
2527 2527 clutter
2528 2528 """
2529 2529 # Cleanup all tempfiles left around
2530 2530 for tfile in self.tempfiles:
2531 2531 try:
2532 2532 os.unlink(tfile)
2533 2533 except OSError:
2534 2534 pass
2535 2535
2536 2536 # Close the history session (this stores the end time and line count)
2537 2537 self.history_manager.end_session()
2538 2538
2539 2539 # Clear all user namespaces to release all references cleanly.
2540 2540 self.reset(new_session=False)
2541 2541
2542 2542 # Run user hooks
2543 2543 self.hooks.shutdown_hook()
2544 2544
2545 2545 def cleanup(self):
2546 2546 self.restore_sys_module_state()
2547 2547
2548 2548
2549 2549 class InteractiveShellABC(object):
2550 2550 """An abstract base class for InteractiveShell."""
2551 2551 __metaclass__ = abc.ABCMeta
2552 2552
2553 2553 InteractiveShellABC.register(InteractiveShell)
@@ -1,3508 +1,3508 b''
1 1 # encoding: utf-8
2 2 """Magic functions for InteractiveShell.
3 3 """
4 4
5 5 #-----------------------------------------------------------------------------
6 6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
8 8 # Copyright (C) 2008-2009 The IPython Development Team
9 9
10 10 # Distributed under the terms of the BSD License. The full license is in
11 11 # the file COPYING, distributed as part of this software.
12 12 #-----------------------------------------------------------------------------
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17
18 18 import __builtin__
19 19 import __future__
20 20 import bdb
21 21 import inspect
22 22 import os
23 23 import sys
24 24 import shutil
25 25 import re
26 26 import time
27 27 import textwrap
28 28 from cStringIO import StringIO
29 29 from getopt import getopt,GetoptError
30 30 from pprint import pformat
31 31 from xmlrpclib import ServerProxy
32 32
33 33 # cProfile was added in Python2.5
34 34 try:
35 35 import cProfile as profile
36 36 import pstats
37 37 except ImportError:
38 38 # profile isn't bundled by default in Debian for license reasons
39 39 try:
40 40 import profile,pstats
41 41 except ImportError:
42 42 profile = pstats = None
43 43
44 44 import IPython
45 45 from IPython.core import debugger, oinspect
46 46 from IPython.core.error import TryNext
47 47 from IPython.core.error import UsageError
48 48 from IPython.core.fakemodule import FakeModule
49 49 from IPython.core.profiledir import ProfileDir
50 50 from IPython.core.macro import Macro
51 51 from IPython.core import page
52 52 from IPython.core.prefilter import ESC_MAGIC
53 53 from IPython.lib.pylabtools import mpl_runner
54 54 from IPython.testing.skipdoctest import skip_doctest
55 55 from IPython.utils.io import file_read, nlprint
56 56 from IPython.utils.path import get_py_filename
57 57 from IPython.utils.process import arg_split, abbrev_cwd
58 58 from IPython.utils.terminal import set_term_title
59 59 from IPython.utils.text import LSString, SList, format_screen
60 60 from IPython.utils.timing import clock, clock2
61 61 from IPython.utils.warn import warn, error
62 62 from IPython.utils.ipstruct import Struct
63 63 import IPython.utils.generics
64 64
65 65 #-----------------------------------------------------------------------------
66 66 # Utility functions
67 67 #-----------------------------------------------------------------------------
68 68
69 69 def on_off(tag):
70 70 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
71 71 return ['OFF','ON'][tag]
72 72
73 73 class Bunch: pass
74 74
75 75 def compress_dhist(dh):
76 76 head, tail = dh[:-10], dh[-10:]
77 77
78 78 newhead = []
79 79 done = set()
80 80 for h in head:
81 81 if h in done:
82 82 continue
83 83 newhead.append(h)
84 84 done.add(h)
85 85
86 86 return newhead + tail
87 87
88 88 def needs_local_scope(func):
89 89 """Decorator to mark magic functions which need to local scope to run."""
90 90 func.needs_local_scope = True
91 91 return func
92 92
93 93 # Used for exception handling in magic_edit
94 94 class MacroToEdit(ValueError): pass
95 95
96 96 #***************************************************************************
97 97 # Main class implementing Magic functionality
98 98
99 99 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
100 100 # on construction of the main InteractiveShell object. Something odd is going
101 101 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
102 102 # eventually this needs to be clarified.
103 103 # BG: This is because InteractiveShell inherits from this, but is itself a
104 104 # Configurable. This messes up the MRO in some way. The fix is that we need to
105 105 # make Magic a configurable that InteractiveShell does not subclass.
106 106
107 107 class Magic:
108 108 """Magic functions for InteractiveShell.
109 109
110 110 Shell functions which can be reached as %function_name. All magic
111 111 functions should accept a string, which they can parse for their own
112 112 needs. This can make some functions easier to type, eg `%cd ../`
113 113 vs. `%cd("../")`
114 114
115 115 ALL definitions MUST begin with the prefix magic_. The user won't need it
116 116 at the command line, but it is is needed in the definition. """
117 117
118 118 # class globals
119 119 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
120 120 'Automagic is ON, % prefix NOT needed for magic functions.']
121 121
122 122 #......................................................................
123 123 # some utility functions
124 124
125 125 def __init__(self,shell):
126 126
127 127 self.options_table = {}
128 128 if profile is None:
129 129 self.magic_prun = self.profile_missing_notice
130 130 self.shell = shell
131 131
132 132 # namespace for holding state we may need
133 133 self._magic_state = Bunch()
134 134
135 135 def profile_missing_notice(self, *args, **kwargs):
136 136 error("""\
137 137 The profile module could not be found. It has been removed from the standard
138 138 python packages because of its non-free license. To use profiling, install the
139 139 python-profiler package from non-free.""")
140 140
141 141 def default_option(self,fn,optstr):
142 142 """Make an entry in the options_table for fn, with value optstr"""
143 143
144 144 if fn not in self.lsmagic():
145 145 error("%s is not a magic function" % fn)
146 146 self.options_table[fn] = optstr
147 147
148 148 def lsmagic(self):
149 149 """Return a list of currently available magic functions.
150 150
151 151 Gives a list of the bare names after mangling (['ls','cd', ...], not
152 152 ['magic_ls','magic_cd',...]"""
153 153
154 154 # FIXME. This needs a cleanup, in the way the magics list is built.
155 155
156 156 # magics in class definition
157 157 class_magic = lambda fn: fn.startswith('magic_') and \
158 158 callable(Magic.__dict__[fn])
159 159 # in instance namespace (run-time user additions)
160 160 inst_magic = lambda fn: fn.startswith('magic_') and \
161 161 callable(self.__dict__[fn])
162 162 # and bound magics by user (so they can access self):
163 163 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
164 164 callable(self.__class__.__dict__[fn])
165 165 magics = filter(class_magic,Magic.__dict__.keys()) + \
166 166 filter(inst_magic,self.__dict__.keys()) + \
167 167 filter(inst_bound_magic,self.__class__.__dict__.keys())
168 168 out = []
169 169 for fn in set(magics):
170 170 out.append(fn.replace('magic_','',1))
171 171 out.sort()
172 172 return out
173 173
174 174 def extract_input_lines(self, range_str, raw=False):
175 175 """Return as a string a set of input history slices.
176 176
177 177 Inputs:
178 178
179 179 - range_str: the set of slices is given as a string, like
180 180 "~5/6-~4/2 4:8 9", since this function is for use by magic functions
181 181 which get their arguments as strings. The number before the / is the
182 182 session number: ~n goes n back from the current session.
183 183
184 184 Optional inputs:
185 185
186 186 - raw(False): by default, the processed input is used. If this is
187 187 true, the raw input history is used instead.
188 188
189 189 Note that slices can be called with two notations:
190 190
191 191 N:M -> standard python form, means including items N...(M-1).
192 192
193 193 N-M -> include items N..M (closed endpoint)."""
194 194 lines = self.shell.history_manager.\
195 195 get_range_by_str(range_str, raw=raw)
196 196 return "\n".join(x for _, _, x in lines)
197 197
198 198 def arg_err(self,func):
199 199 """Print docstring if incorrect arguments were passed"""
200 200 print 'Error in arguments:'
201 201 print oinspect.getdoc(func)
202 202
203 203 def format_latex(self,strng):
204 204 """Format a string for latex inclusion."""
205 205
206 206 # Characters that need to be escaped for latex:
207 207 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
208 208 # Magic command names as headers:
209 209 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
210 210 re.MULTILINE)
211 211 # Magic commands
212 212 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
213 213 re.MULTILINE)
214 214 # Paragraph continue
215 215 par_re = re.compile(r'\\$',re.MULTILINE)
216 216
217 217 # The "\n" symbol
218 218 newline_re = re.compile(r'\\n')
219 219
220 220 # Now build the string for output:
221 221 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
222 222 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
223 223 strng)
224 224 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
225 225 strng = par_re.sub(r'\\\\',strng)
226 226 strng = escape_re.sub(r'\\\1',strng)
227 227 strng = newline_re.sub(r'\\textbackslash{}n',strng)
228 228 return strng
229 229
230 230 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
231 231 """Parse options passed to an argument string.
232 232
233 233 The interface is similar to that of getopt(), but it returns back a
234 234 Struct with the options as keys and the stripped argument string still
235 235 as a string.
236 236
237 237 arg_str is quoted as a true sys.argv vector by using shlex.split.
238 238 This allows us to easily expand variables, glob files, quote
239 239 arguments, etc.
240 240
241 241 Options:
242 242 -mode: default 'string'. If given as 'list', the argument string is
243 243 returned as a list (split on whitespace) instead of a string.
244 244
245 245 -list_all: put all option values in lists. Normally only options
246 246 appearing more than once are put in a list.
247 247
248 248 -posix (True): whether to split the input line in POSIX mode or not,
249 249 as per the conventions outlined in the shlex module from the
250 250 standard library."""
251 251
252 252 # inject default options at the beginning of the input line
253 253 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
254 254 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
255 255
256 256 mode = kw.get('mode','string')
257 257 if mode not in ['string','list']:
258 258 raise ValueError,'incorrect mode given: %s' % mode
259 259 # Get options
260 260 list_all = kw.get('list_all',0)
261 261 posix = kw.get('posix', os.name == 'posix')
262 262
263 263 # Check if we have more than one argument to warrant extra processing:
264 264 odict = {} # Dictionary with options
265 265 args = arg_str.split()
266 266 if len(args) >= 1:
267 267 # If the list of inputs only has 0 or 1 thing in it, there's no
268 268 # need to look for options
269 269 argv = arg_split(arg_str,posix)
270 270 # Do regular option processing
271 271 try:
272 272 opts,args = getopt(argv,opt_str,*long_opts)
273 273 except GetoptError,e:
274 274 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
275 275 " ".join(long_opts)))
276 276 for o,a in opts:
277 277 if o.startswith('--'):
278 278 o = o[2:]
279 279 else:
280 280 o = o[1:]
281 281 try:
282 282 odict[o].append(a)
283 283 except AttributeError:
284 284 odict[o] = [odict[o],a]
285 285 except KeyError:
286 286 if list_all:
287 287 odict[o] = [a]
288 288 else:
289 289 odict[o] = a
290 290
291 291 # Prepare opts,args for return
292 292 opts = Struct(odict)
293 293 if mode == 'string':
294 294 args = ' '.join(args)
295 295
296 296 return opts,args
297 297
298 298 #......................................................................
299 299 # And now the actual magic functions
300 300
301 301 # Functions for IPython shell work (vars,funcs, config, etc)
302 302 def magic_lsmagic(self, parameter_s = ''):
303 303 """List currently available magic functions."""
304 304 mesc = ESC_MAGIC
305 305 print 'Available magic functions:\n'+mesc+\
306 306 (' '+mesc).join(self.lsmagic())
307 307 print '\n' + Magic.auto_status[self.shell.automagic]
308 308 return None
309 309
310 310 def magic_magic(self, parameter_s = ''):
311 311 """Print information about the magic function system.
312 312
313 313 Supported formats: -latex, -brief, -rest
314 314 """
315 315
316 316 mode = ''
317 317 try:
318 318 if parameter_s.split()[0] == '-latex':
319 319 mode = 'latex'
320 320 if parameter_s.split()[0] == '-brief':
321 321 mode = 'brief'
322 322 if parameter_s.split()[0] == '-rest':
323 323 mode = 'rest'
324 324 rest_docs = []
325 325 except:
326 326 pass
327 327
328 328 magic_docs = []
329 329 for fname in self.lsmagic():
330 330 mname = 'magic_' + fname
331 331 for space in (Magic,self,self.__class__):
332 332 try:
333 333 fn = space.__dict__[mname]
334 334 except KeyError:
335 335 pass
336 336 else:
337 337 break
338 338 if mode == 'brief':
339 339 # only first line
340 340 if fn.__doc__:
341 341 fndoc = fn.__doc__.split('\n',1)[0]
342 342 else:
343 343 fndoc = 'No documentation'
344 344 else:
345 345 if fn.__doc__:
346 346 fndoc = fn.__doc__.rstrip()
347 347 else:
348 348 fndoc = 'No documentation'
349 349
350 350
351 351 if mode == 'rest':
352 352 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
353 353 fname,fndoc))
354 354
355 355 else:
356 356 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
357 357 fname,fndoc))
358 358
359 359 magic_docs = ''.join(magic_docs)
360 360
361 361 if mode == 'rest':
362 362 return "".join(rest_docs)
363 363
364 364 if mode == 'latex':
365 365 print self.format_latex(magic_docs)
366 366 return
367 367 else:
368 368 magic_docs = format_screen(magic_docs)
369 369 if mode == 'brief':
370 370 return magic_docs
371 371
372 372 outmsg = """
373 373 IPython's 'magic' functions
374 374 ===========================
375 375
376 376 The magic function system provides a series of functions which allow you to
377 377 control the behavior of IPython itself, plus a lot of system-type
378 378 features. All these functions are prefixed with a % character, but parameters
379 379 are given without parentheses or quotes.
380 380
381 381 NOTE: If you have 'automagic' enabled (via the command line option or with the
382 382 %automagic function), you don't need to type in the % explicitly. By default,
383 383 IPython ships with automagic on, so you should only rarely need the % escape.
384 384
385 385 Example: typing '%cd mydir' (without the quotes) changes you working directory
386 386 to 'mydir', if it exists.
387 387
388 388 You can define your own magic functions to extend the system. See the supplied
389 389 ipythonrc and example-magic.py files for details (in your ipython
390 390 configuration directory, typically $HOME/.config/ipython on Linux or $HOME/.ipython elsewhere).
391 391
392 392 You can also define your own aliased names for magic functions. In your
393 393 ipythonrc file, placing a line like:
394 394
395 395 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
396 396
397 397 will define %pf as a new name for %profile.
398 398
399 399 You can also call magics in code using the magic() function, which IPython
400 400 automatically adds to the builtin namespace. Type 'magic?' for details.
401 401
402 402 For a list of the available magic functions, use %lsmagic. For a description
403 403 of any of them, type %magic_name?, e.g. '%cd?'.
404 404
405 405 Currently the magic system has the following functions:\n"""
406 406
407 407 mesc = ESC_MAGIC
408 408 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
409 409 "\n\n%s%s\n\n%s" % (outmsg,
410 410 magic_docs,mesc,mesc,
411 411 (' '+mesc).join(self.lsmagic()),
412 412 Magic.auto_status[self.shell.automagic] ) )
413 413 page.page(outmsg)
414 414
415 415 def magic_automagic(self, parameter_s = ''):
416 416 """Make magic functions callable without having to type the initial %.
417 417
418 418 Without argumentsl toggles on/off (when off, you must call it as
419 419 %automagic, of course). With arguments it sets the value, and you can
420 420 use any of (case insensitive):
421 421
422 422 - on,1,True: to activate
423 423
424 424 - off,0,False: to deactivate.
425 425
426 426 Note that magic functions have lowest priority, so if there's a
427 427 variable whose name collides with that of a magic fn, automagic won't
428 428 work for that function (you get the variable instead). However, if you
429 429 delete the variable (del var), the previously shadowed magic function
430 430 becomes visible to automagic again."""
431 431
432 432 arg = parameter_s.lower()
433 433 if parameter_s in ('on','1','true'):
434 434 self.shell.automagic = True
435 435 elif parameter_s in ('off','0','false'):
436 436 self.shell.automagic = False
437 437 else:
438 438 self.shell.automagic = not self.shell.automagic
439 439 print '\n' + Magic.auto_status[self.shell.automagic]
440 440
441 441 @skip_doctest
442 442 def magic_autocall(self, parameter_s = ''):
443 443 """Make functions callable without having to type parentheses.
444 444
445 445 Usage:
446 446
447 447 %autocall [mode]
448 448
449 449 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
450 450 value is toggled on and off (remembering the previous state).
451 451
452 452 In more detail, these values mean:
453 453
454 454 0 -> fully disabled
455 455
456 456 1 -> active, but do not apply if there are no arguments on the line.
457 457
458 458 In this mode, you get:
459 459
460 460 In [1]: callable
461 461 Out[1]: <built-in function callable>
462 462
463 463 In [2]: callable 'hello'
464 464 ------> callable('hello')
465 465 Out[2]: False
466 466
467 467 2 -> Active always. Even if no arguments are present, the callable
468 468 object is called:
469 469
470 470 In [2]: float
471 471 ------> float()
472 472 Out[2]: 0.0
473 473
474 474 Note that even with autocall off, you can still use '/' at the start of
475 475 a line to treat the first argument on the command line as a function
476 476 and add parentheses to it:
477 477
478 478 In [8]: /str 43
479 479 ------> str(43)
480 480 Out[8]: '43'
481 481
482 482 # all-random (note for auto-testing)
483 483 """
484 484
485 485 if parameter_s:
486 486 arg = int(parameter_s)
487 487 else:
488 488 arg = 'toggle'
489 489
490 490 if not arg in (0,1,2,'toggle'):
491 491 error('Valid modes: (0->Off, 1->Smart, 2->Full')
492 492 return
493 493
494 494 if arg in (0,1,2):
495 495 self.shell.autocall = arg
496 496 else: # toggle
497 497 if self.shell.autocall:
498 498 self._magic_state.autocall_save = self.shell.autocall
499 499 self.shell.autocall = 0
500 500 else:
501 501 try:
502 502 self.shell.autocall = self._magic_state.autocall_save
503 503 except AttributeError:
504 504 self.shell.autocall = self._magic_state.autocall_save = 1
505 505
506 506 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
507 507
508 508
509 509 def magic_page(self, parameter_s=''):
510 510 """Pretty print the object and display it through a pager.
511 511
512 512 %page [options] OBJECT
513 513
514 514 If no object is given, use _ (last output).
515 515
516 516 Options:
517 517
518 518 -r: page str(object), don't pretty-print it."""
519 519
520 520 # After a function contributed by Olivier Aubert, slightly modified.
521 521
522 522 # Process options/args
523 523 opts,args = self.parse_options(parameter_s,'r')
524 524 raw = 'r' in opts
525 525
526 526 oname = args and args or '_'
527 527 info = self._ofind(oname)
528 528 if info['found']:
529 529 txt = (raw and str or pformat)( info['obj'] )
530 530 page.page(txt)
531 531 else:
532 532 print 'Object `%s` not found' % oname
533 533
534 534 def magic_profile(self, parameter_s=''):
535 535 """Print your currently active IPython profile."""
536 536 print self.shell.profile
537 537
538 538 def magic_pinfo(self, parameter_s='', namespaces=None):
539 539 """Provide detailed information about an object.
540 540
541 541 '%pinfo object' is just a synonym for object? or ?object."""
542 542
543 543 #print 'pinfo par: <%s>' % parameter_s # dbg
544 544
545 545
546 546 # detail_level: 0 -> obj? , 1 -> obj??
547 547 detail_level = 0
548 548 # We need to detect if we got called as 'pinfo pinfo foo', which can
549 549 # happen if the user types 'pinfo foo?' at the cmd line.
550 550 pinfo,qmark1,oname,qmark2 = \
551 551 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
552 552 if pinfo or qmark1 or qmark2:
553 553 detail_level = 1
554 554 if "*" in oname:
555 555 self.magic_psearch(oname)
556 556 else:
557 557 self.shell._inspect('pinfo', oname, detail_level=detail_level,
558 558 namespaces=namespaces)
559 559
560 560 def magic_pinfo2(self, parameter_s='', namespaces=None):
561 561 """Provide extra detailed information about an object.
562 562
563 563 '%pinfo2 object' is just a synonym for object?? or ??object."""
564 564 self.shell._inspect('pinfo', parameter_s, detail_level=1,
565 565 namespaces=namespaces)
566 566
567 567 @skip_doctest
568 568 def magic_pdef(self, parameter_s='', namespaces=None):
569 569 """Print the definition header for any callable object.
570 570
571 571 If the object is a class, print the constructor information.
572 572
573 573 Examples
574 574 --------
575 575 ::
576 576
577 577 In [3]: %pdef urllib.urlopen
578 578 urllib.urlopen(url, data=None, proxies=None)
579 579 """
580 580 self._inspect('pdef',parameter_s, namespaces)
581 581
582 582 def magic_pdoc(self, parameter_s='', namespaces=None):
583 583 """Print the docstring for an object.
584 584
585 585 If the given object is a class, it will print both the class and the
586 586 constructor docstrings."""
587 587 self._inspect('pdoc',parameter_s, namespaces)
588 588
589 589 def magic_psource(self, parameter_s='', namespaces=None):
590 590 """Print (or run through pager) the source code for an object."""
591 591 self._inspect('psource',parameter_s, namespaces)
592 592
593 593 def magic_pfile(self, parameter_s=''):
594 594 """Print (or run through pager) the file where an object is defined.
595 595
596 596 The file opens at the line where the object definition begins. IPython
597 597 will honor the environment variable PAGER if set, and otherwise will
598 598 do its best to print the file in a convenient form.
599 599
600 600 If the given argument is not an object currently defined, IPython will
601 601 try to interpret it as a filename (automatically adding a .py extension
602 602 if needed). You can thus use %pfile as a syntax highlighting code
603 603 viewer."""
604 604
605 605 # first interpret argument as an object name
606 606 out = self._inspect('pfile',parameter_s)
607 607 # if not, try the input as a filename
608 608 if out == 'not found':
609 609 try:
610 610 filename = get_py_filename(parameter_s)
611 611 except IOError,msg:
612 612 print msg
613 613 return
614 614 page.page(self.shell.inspector.format(file(filename).read()))
615 615
616 616 def magic_psearch(self, parameter_s=''):
617 617 """Search for object in namespaces by wildcard.
618 618
619 619 %psearch [options] PATTERN [OBJECT TYPE]
620 620
621 621 Note: ? can be used as a synonym for %psearch, at the beginning or at
622 622 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
623 623 rest of the command line must be unchanged (options come first), so
624 624 for example the following forms are equivalent
625 625
626 626 %psearch -i a* function
627 627 -i a* function?
628 628 ?-i a* function
629 629
630 630 Arguments:
631 631
632 632 PATTERN
633 633
634 634 where PATTERN is a string containing * as a wildcard similar to its
635 635 use in a shell. The pattern is matched in all namespaces on the
636 636 search path. By default objects starting with a single _ are not
637 637 matched, many IPython generated objects have a single
638 638 underscore. The default is case insensitive matching. Matching is
639 639 also done on the attributes of objects and not only on the objects
640 640 in a module.
641 641
642 642 [OBJECT TYPE]
643 643
644 644 Is the name of a python type from the types module. The name is
645 645 given in lowercase without the ending type, ex. StringType is
646 646 written string. By adding a type here only objects matching the
647 647 given type are matched. Using all here makes the pattern match all
648 648 types (this is the default).
649 649
650 650 Options:
651 651
652 652 -a: makes the pattern match even objects whose names start with a
653 653 single underscore. These names are normally ommitted from the
654 654 search.
655 655
656 656 -i/-c: make the pattern case insensitive/sensitive. If neither of
657 657 these options is given, the default is read from your ipythonrc
658 658 file. The option name which sets this value is
659 659 'wildcards_case_sensitive'. If this option is not specified in your
660 660 ipythonrc file, IPython's internal default is to do a case sensitive
661 661 search.
662 662
663 663 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
664 664 specifiy can be searched in any of the following namespaces:
665 665 'builtin', 'user', 'user_global','internal', 'alias', where
666 666 'builtin' and 'user' are the search defaults. Note that you should
667 667 not use quotes when specifying namespaces.
668 668
669 669 'Builtin' contains the python module builtin, 'user' contains all
670 670 user data, 'alias' only contain the shell aliases and no python
671 671 objects, 'internal' contains objects used by IPython. The
672 672 'user_global' namespace is only used by embedded IPython instances,
673 673 and it contains module-level globals. You can add namespaces to the
674 674 search with -s or exclude them with -e (these options can be given
675 675 more than once).
676 676
677 677 Examples:
678 678
679 679 %psearch a* -> objects beginning with an a
680 680 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
681 681 %psearch a* function -> all functions beginning with an a
682 682 %psearch re.e* -> objects beginning with an e in module re
683 683 %psearch r*.e* -> objects that start with e in modules starting in r
684 684 %psearch r*.* string -> all strings in modules beginning with r
685 685
686 686 Case sensitve search:
687 687
688 688 %psearch -c a* list all object beginning with lower case a
689 689
690 690 Show objects beginning with a single _:
691 691
692 692 %psearch -a _* list objects beginning with a single underscore"""
693 693 try:
694 694 parameter_s = parameter_s.encode('ascii')
695 695 except UnicodeEncodeError:
696 696 print 'Python identifiers can only contain ascii characters.'
697 697 return
698 698
699 699 # default namespaces to be searched
700 700 def_search = ['user','builtin']
701 701
702 702 # Process options/args
703 703 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
704 704 opt = opts.get
705 705 shell = self.shell
706 706 psearch = shell.inspector.psearch
707 707
708 708 # select case options
709 709 if opts.has_key('i'):
710 710 ignore_case = True
711 711 elif opts.has_key('c'):
712 712 ignore_case = False
713 713 else:
714 714 ignore_case = not shell.wildcards_case_sensitive
715 715
716 716 # Build list of namespaces to search from user options
717 717 def_search.extend(opt('s',[]))
718 718 ns_exclude = ns_exclude=opt('e',[])
719 719 ns_search = [nm for nm in def_search if nm not in ns_exclude]
720 720
721 721 # Call the actual search
722 722 try:
723 723 psearch(args,shell.ns_table,ns_search,
724 724 show_all=opt('a'),ignore_case=ignore_case)
725 725 except:
726 726 shell.showtraceback()
727 727
728 728 @skip_doctest
729 729 def magic_who_ls(self, parameter_s=''):
730 730 """Return a sorted list of all interactive variables.
731 731
732 732 If arguments are given, only variables of types matching these
733 733 arguments are returned.
734 734
735 735 Examples
736 736 --------
737 737
738 738 Define two variables and list them with who_ls::
739 739
740 740 In [1]: alpha = 123
741 741
742 742 In [2]: beta = 'test'
743 743
744 744 In [3]: %who_ls
745 745 Out[3]: ['alpha', 'beta']
746 746
747 747 In [4]: %who_ls int
748 748 Out[4]: ['alpha']
749 749
750 750 In [5]: %who_ls str
751 751 Out[5]: ['beta']
752 752 """
753 753
754 754 user_ns = self.shell.user_ns
755 755 internal_ns = self.shell.internal_ns
756 756 user_ns_hidden = self.shell.user_ns_hidden
757 757 out = [ i for i in user_ns
758 758 if not i.startswith('_') \
759 759 and not (i in internal_ns or i in user_ns_hidden) ]
760 760
761 761 typelist = parameter_s.split()
762 762 if typelist:
763 763 typeset = set(typelist)
764 764 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
765 765
766 766 out.sort()
767 767 return out
768 768
769 769 @skip_doctest
770 770 def magic_who(self, parameter_s=''):
771 771 """Print all interactive variables, with some minimal formatting.
772 772
773 773 If any arguments are given, only variables whose type matches one of
774 774 these are printed. For example:
775 775
776 776 %who function str
777 777
778 778 will only list functions and strings, excluding all other types of
779 779 variables. To find the proper type names, simply use type(var) at a
780 780 command line to see how python prints type names. For example:
781 781
782 782 In [1]: type('hello')\\
783 783 Out[1]: <type 'str'>
784 784
785 785 indicates that the type name for strings is 'str'.
786 786
787 787 %who always excludes executed names loaded through your configuration
788 788 file and things which are internal to IPython.
789 789
790 790 This is deliberate, as typically you may load many modules and the
791 791 purpose of %who is to show you only what you've manually defined.
792 792
793 793 Examples
794 794 --------
795 795
796 796 Define two variables and list them with who::
797 797
798 798 In [1]: alpha = 123
799 799
800 800 In [2]: beta = 'test'
801 801
802 802 In [3]: %who
803 803 alpha beta
804 804
805 805 In [4]: %who int
806 806 alpha
807 807
808 808 In [5]: %who str
809 809 beta
810 810 """
811 811
812 812 varlist = self.magic_who_ls(parameter_s)
813 813 if not varlist:
814 814 if parameter_s:
815 815 print 'No variables match your requested type.'
816 816 else:
817 817 print 'Interactive namespace is empty.'
818 818 return
819 819
820 820 # if we have variables, move on...
821 821 count = 0
822 822 for i in varlist:
823 823 print i+'\t',
824 824 count += 1
825 825 if count > 8:
826 826 count = 0
827 827 print
828 828 print
829 829
830 830 @skip_doctest
831 831 def magic_whos(self, parameter_s=''):
832 832 """Like %who, but gives some extra information about each variable.
833 833
834 834 The same type filtering of %who can be applied here.
835 835
836 836 For all variables, the type is printed. Additionally it prints:
837 837
838 838 - For {},[],(): their length.
839 839
840 840 - For numpy arrays, a summary with shape, number of
841 841 elements, typecode and size in memory.
842 842
843 843 - Everything else: a string representation, snipping their middle if
844 844 too long.
845 845
846 846 Examples
847 847 --------
848 848
849 849 Define two variables and list them with whos::
850 850
851 851 In [1]: alpha = 123
852 852
853 853 In [2]: beta = 'test'
854 854
855 855 In [3]: %whos
856 856 Variable Type Data/Info
857 857 --------------------------------
858 858 alpha int 123
859 859 beta str test
860 860 """
861 861
862 862 varnames = self.magic_who_ls(parameter_s)
863 863 if not varnames:
864 864 if parameter_s:
865 865 print 'No variables match your requested type.'
866 866 else:
867 867 print 'Interactive namespace is empty.'
868 868 return
869 869
870 870 # if we have variables, move on...
871 871
872 872 # for these types, show len() instead of data:
873 873 seq_types = ['dict', 'list', 'tuple']
874 874
875 875 # for numpy/Numeric arrays, display summary info
876 876 try:
877 877 import numpy
878 878 except ImportError:
879 879 ndarray_type = None
880 880 else:
881 881 ndarray_type = numpy.ndarray.__name__
882 882 try:
883 883 import Numeric
884 884 except ImportError:
885 885 array_type = None
886 886 else:
887 887 array_type = Numeric.ArrayType.__name__
888 888
889 889 # Find all variable names and types so we can figure out column sizes
890 890 def get_vars(i):
891 891 return self.shell.user_ns[i]
892 892
893 893 # some types are well known and can be shorter
894 894 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
895 895 def type_name(v):
896 896 tn = type(v).__name__
897 897 return abbrevs.get(tn,tn)
898 898
899 899 varlist = map(get_vars,varnames)
900 900
901 901 typelist = []
902 902 for vv in varlist:
903 903 tt = type_name(vv)
904 904
905 905 if tt=='instance':
906 906 typelist.append( abbrevs.get(str(vv.__class__),
907 907 str(vv.__class__)))
908 908 else:
909 909 typelist.append(tt)
910 910
911 911 # column labels and # of spaces as separator
912 912 varlabel = 'Variable'
913 913 typelabel = 'Type'
914 914 datalabel = 'Data/Info'
915 915 colsep = 3
916 916 # variable format strings
917 917 vformat = "{0:<{varwidth}}{1:<{typewidth}}"
918 918 aformat = "%s: %s elems, type `%s`, %s bytes"
919 919 # find the size of the columns to format the output nicely
920 920 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
921 921 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
922 922 # table header
923 923 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
924 924 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
925 925 # and the table itself
926 926 kb = 1024
927 927 Mb = 1048576 # kb**2
928 928 for vname,var,vtype in zip(varnames,varlist,typelist):
929 929 print vformat.format(vname, vtype, varwidth=varwidth, typewidth=typewidth),
930 930 if vtype in seq_types:
931 931 print "n="+str(len(var))
932 932 elif vtype in [array_type,ndarray_type]:
933 933 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
934 934 if vtype==ndarray_type:
935 935 # numpy
936 936 vsize = var.size
937 937 vbytes = vsize*var.itemsize
938 938 vdtype = var.dtype
939 939 else:
940 940 # Numeric
941 941 vsize = Numeric.size(var)
942 942 vbytes = vsize*var.itemsize()
943 943 vdtype = var.typecode()
944 944
945 945 if vbytes < 100000:
946 946 print aformat % (vshape,vsize,vdtype,vbytes)
947 947 else:
948 948 print aformat % (vshape,vsize,vdtype,vbytes),
949 949 if vbytes < Mb:
950 950 print '(%s kb)' % (vbytes/kb,)
951 951 else:
952 952 print '(%s Mb)' % (vbytes/Mb,)
953 953 else:
954 954 try:
955 955 vstr = str(var)
956 956 except UnicodeEncodeError:
957 957 vstr = unicode(var).encode(sys.getdefaultencoding(),
958 958 'backslashreplace')
959 959 vstr = vstr.replace('\n','\\n')
960 960 if len(vstr) < 50:
961 961 print vstr
962 962 else:
963 963 print vstr[:25] + "<...>" + vstr[-25:]
964 964
965 965 def magic_reset(self, parameter_s=''):
966 966 """Resets the namespace by removing all names defined by the user.
967 967
968 968 Parameters
969 969 ----------
970 970 -f : force reset without asking for confirmation.
971 971
972 972 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
973 973 References to objects may be kept. By default (without this option),
974 974 we do a 'hard' reset, giving you a new session and removing all
975 975 references to objects from the current session.
976 976
977 977 Examples
978 978 --------
979 979 In [6]: a = 1
980 980
981 981 In [7]: a
982 982 Out[7]: 1
983 983
984 984 In [8]: 'a' in _ip.user_ns
985 985 Out[8]: True
986 986
987 987 In [9]: %reset -f
988 988
989 989 In [1]: 'a' in _ip.user_ns
990 990 Out[1]: False
991 991 """
992 992 opts, args = self.parse_options(parameter_s,'sf')
993 993 if 'f' in opts:
994 994 ans = True
995 995 else:
996 996 ans = self.shell.ask_yes_no(
997 997 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
998 998 if not ans:
999 999 print 'Nothing done.'
1000 1000 return
1001 1001
1002 1002 if 's' in opts: # Soft reset
1003 1003 user_ns = self.shell.user_ns
1004 1004 for i in self.magic_who_ls():
1005 1005 del(user_ns[i])
1006 1006
1007 1007 else: # Hard reset
1008 1008 self.shell.reset(new_session = False)
1009 1009
1010 1010
1011 1011
1012 1012 def magic_reset_selective(self, parameter_s=''):
1013 1013 """Resets the namespace by removing names defined by the user.
1014 1014
1015 1015 Input/Output history are left around in case you need them.
1016 1016
1017 1017 %reset_selective [-f] regex
1018 1018
1019 1019 No action is taken if regex is not included
1020 1020
1021 1021 Options
1022 1022 -f : force reset without asking for confirmation.
1023 1023
1024 1024 Examples
1025 1025 --------
1026 1026
1027 1027 We first fully reset the namespace so your output looks identical to
1028 1028 this example for pedagogical reasons; in practice you do not need a
1029 1029 full reset.
1030 1030
1031 1031 In [1]: %reset -f
1032 1032
1033 1033 Now, with a clean namespace we can make a few variables and use
1034 1034 %reset_selective to only delete names that match our regexp:
1035 1035
1036 1036 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1037 1037
1038 1038 In [3]: who_ls
1039 1039 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1040 1040
1041 1041 In [4]: %reset_selective -f b[2-3]m
1042 1042
1043 1043 In [5]: who_ls
1044 1044 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1045 1045
1046 1046 In [6]: %reset_selective -f d
1047 1047
1048 1048 In [7]: who_ls
1049 1049 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1050 1050
1051 1051 In [8]: %reset_selective -f c
1052 1052
1053 1053 In [9]: who_ls
1054 1054 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1055 1055
1056 1056 In [10]: %reset_selective -f b
1057 1057
1058 1058 In [11]: who_ls
1059 1059 Out[11]: ['a']
1060 1060 """
1061 1061
1062 1062 opts, regex = self.parse_options(parameter_s,'f')
1063 1063
1064 1064 if opts.has_key('f'):
1065 1065 ans = True
1066 1066 else:
1067 1067 ans = self.shell.ask_yes_no(
1068 1068 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1069 1069 if not ans:
1070 1070 print 'Nothing done.'
1071 1071 return
1072 1072 user_ns = self.shell.user_ns
1073 1073 if not regex:
1074 1074 print 'No regex pattern specified. Nothing done.'
1075 1075 return
1076 1076 else:
1077 1077 try:
1078 1078 m = re.compile(regex)
1079 1079 except TypeError:
1080 1080 raise TypeError('regex must be a string or compiled pattern')
1081 1081 for i in self.magic_who_ls():
1082 1082 if m.search(i):
1083 1083 del(user_ns[i])
1084 1084
1085 1085 def magic_xdel(self, parameter_s=''):
1086 1086 """Delete a variable, trying to clear it from anywhere that
1087 1087 IPython's machinery has references to it. By default, this uses
1088 1088 the identity of the named object in the user namespace to remove
1089 1089 references held under other names. The object is also removed
1090 1090 from the output history.
1091 1091
1092 1092 Options
1093 1093 -n : Delete the specified name from all namespaces, without
1094 1094 checking their identity.
1095 1095 """
1096 1096 opts, varname = self.parse_options(parameter_s,'n')
1097 1097 try:
1098 1098 self.shell.del_var(varname, ('n' in opts))
1099 1099 except (NameError, ValueError) as e:
1100 1100 print type(e).__name__ +": "+ str(e)
1101 1101
1102 1102 def magic_logstart(self,parameter_s=''):
1103 1103 """Start logging anywhere in a session.
1104 1104
1105 1105 %logstart [-o|-r|-t] [log_name [log_mode]]
1106 1106
1107 1107 If no name is given, it defaults to a file named 'ipython_log.py' in your
1108 1108 current directory, in 'rotate' mode (see below).
1109 1109
1110 1110 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1111 1111 history up to that point and then continues logging.
1112 1112
1113 1113 %logstart takes a second optional parameter: logging mode. This can be one
1114 1114 of (note that the modes are given unquoted):\\
1115 1115 append: well, that says it.\\
1116 1116 backup: rename (if exists) to name~ and start name.\\
1117 1117 global: single logfile in your home dir, appended to.\\
1118 1118 over : overwrite existing log.\\
1119 1119 rotate: create rotating logs name.1~, name.2~, etc.
1120 1120
1121 1121 Options:
1122 1122
1123 1123 -o: log also IPython's output. In this mode, all commands which
1124 1124 generate an Out[NN] prompt are recorded to the logfile, right after
1125 1125 their corresponding input line. The output lines are always
1126 1126 prepended with a '#[Out]# ' marker, so that the log remains valid
1127 1127 Python code.
1128 1128
1129 1129 Since this marker is always the same, filtering only the output from
1130 1130 a log is very easy, using for example a simple awk call:
1131 1131
1132 1132 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1133 1133
1134 1134 -r: log 'raw' input. Normally, IPython's logs contain the processed
1135 1135 input, so that user lines are logged in their final form, converted
1136 1136 into valid Python. For example, %Exit is logged as
1137 1137 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1138 1138 exactly as typed, with no transformations applied.
1139 1139
1140 1140 -t: put timestamps before each input line logged (these are put in
1141 1141 comments)."""
1142 1142
1143 1143 opts,par = self.parse_options(parameter_s,'ort')
1144 1144 log_output = 'o' in opts
1145 1145 log_raw_input = 'r' in opts
1146 1146 timestamp = 't' in opts
1147 1147
1148 1148 logger = self.shell.logger
1149 1149
1150 1150 # if no args are given, the defaults set in the logger constructor by
1151 1151 # ipytohn remain valid
1152 1152 if par:
1153 1153 try:
1154 1154 logfname,logmode = par.split()
1155 1155 except:
1156 1156 logfname = par
1157 1157 logmode = 'backup'
1158 1158 else:
1159 1159 logfname = logger.logfname
1160 1160 logmode = logger.logmode
1161 1161 # put logfname into rc struct as if it had been called on the command
1162 1162 # line, so it ends up saved in the log header Save it in case we need
1163 1163 # to restore it...
1164 1164 old_logfile = self.shell.logfile
1165 1165 if logfname:
1166 1166 logfname = os.path.expanduser(logfname)
1167 1167 self.shell.logfile = logfname
1168 1168
1169 1169 loghead = '# IPython log file\n\n'
1170 1170 try:
1171 1171 started = logger.logstart(logfname,loghead,logmode,
1172 1172 log_output,timestamp,log_raw_input)
1173 1173 except:
1174 1174 self.shell.logfile = old_logfile
1175 1175 warn("Couldn't start log: %s" % sys.exc_info()[1])
1176 1176 else:
1177 1177 # log input history up to this point, optionally interleaving
1178 1178 # output if requested
1179 1179
1180 1180 if timestamp:
1181 1181 # disable timestamping for the previous history, since we've
1182 1182 # lost those already (no time machine here).
1183 1183 logger.timestamp = False
1184 1184
1185 1185 if log_raw_input:
1186 1186 input_hist = self.shell.history_manager.input_hist_raw
1187 1187 else:
1188 1188 input_hist = self.shell.history_manager.input_hist_parsed
1189 1189
1190 1190 if log_output:
1191 1191 log_write = logger.log_write
1192 1192 output_hist = self.shell.history_manager.output_hist
1193 1193 for n in range(1,len(input_hist)-1):
1194 1194 log_write(input_hist[n].rstrip() + '\n')
1195 1195 if n in output_hist:
1196 1196 log_write(repr(output_hist[n]),'output')
1197 1197 else:
1198 1198 logger.log_write('\n'.join(input_hist[1:]))
1199 1199 logger.log_write('\n')
1200 1200 if timestamp:
1201 1201 # re-enable timestamping
1202 1202 logger.timestamp = True
1203 1203
1204 1204 print ('Activating auto-logging. '
1205 1205 'Current session state plus future input saved.')
1206 1206 logger.logstate()
1207 1207
1208 1208 def magic_logstop(self,parameter_s=''):
1209 1209 """Fully stop logging and close log file.
1210 1210
1211 1211 In order to start logging again, a new %logstart call needs to be made,
1212 1212 possibly (though not necessarily) with a new filename, mode and other
1213 1213 options."""
1214 1214 self.logger.logstop()
1215 1215
1216 1216 def magic_logoff(self,parameter_s=''):
1217 1217 """Temporarily stop logging.
1218 1218
1219 1219 You must have previously started logging."""
1220 1220 self.shell.logger.switch_log(0)
1221 1221
1222 1222 def magic_logon(self,parameter_s=''):
1223 1223 """Restart logging.
1224 1224
1225 1225 This function is for restarting logging which you've temporarily
1226 1226 stopped with %logoff. For starting logging for the first time, you
1227 1227 must use the %logstart function, which allows you to specify an
1228 1228 optional log filename."""
1229 1229
1230 1230 self.shell.logger.switch_log(1)
1231 1231
1232 1232 def magic_logstate(self,parameter_s=''):
1233 1233 """Print the status of the logging system."""
1234 1234
1235 1235 self.shell.logger.logstate()
1236 1236
1237 1237 def magic_pdb(self, parameter_s=''):
1238 1238 """Control the automatic calling of the pdb interactive debugger.
1239 1239
1240 1240 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1241 1241 argument it works as a toggle.
1242 1242
1243 1243 When an exception is triggered, IPython can optionally call the
1244 1244 interactive pdb debugger after the traceback printout. %pdb toggles
1245 1245 this feature on and off.
1246 1246
1247 1247 The initial state of this feature is set in your ipythonrc
1248 1248 configuration file (the variable is called 'pdb').
1249 1249
1250 1250 If you want to just activate the debugger AFTER an exception has fired,
1251 1251 without having to type '%pdb on' and rerunning your code, you can use
1252 1252 the %debug magic."""
1253 1253
1254 1254 par = parameter_s.strip().lower()
1255 1255
1256 1256 if par:
1257 1257 try:
1258 1258 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1259 1259 except KeyError:
1260 1260 print ('Incorrect argument. Use on/1, off/0, '
1261 1261 'or nothing for a toggle.')
1262 1262 return
1263 1263 else:
1264 1264 # toggle
1265 1265 new_pdb = not self.shell.call_pdb
1266 1266
1267 1267 # set on the shell
1268 1268 self.shell.call_pdb = new_pdb
1269 1269 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1270 1270
1271 1271 def magic_debug(self, parameter_s=''):
1272 1272 """Activate the interactive debugger in post-mortem mode.
1273 1273
1274 1274 If an exception has just occurred, this lets you inspect its stack
1275 1275 frames interactively. Note that this will always work only on the last
1276 1276 traceback that occurred, so you must call this quickly after an
1277 1277 exception that you wish to inspect has fired, because if another one
1278 1278 occurs, it clobbers the previous one.
1279 1279
1280 1280 If you want IPython to automatically do this on every exception, see
1281 1281 the %pdb magic for more details.
1282 1282 """
1283 1283 self.shell.debugger(force=True)
1284 1284
1285 1285 @skip_doctest
1286 1286 def magic_prun(self, parameter_s ='',user_mode=1,
1287 1287 opts=None,arg_lst=None,prog_ns=None):
1288 1288
1289 1289 """Run a statement through the python code profiler.
1290 1290
1291 1291 Usage:
1292 1292 %prun [options] statement
1293 1293
1294 1294 The given statement (which doesn't require quote marks) is run via the
1295 1295 python profiler in a manner similar to the profile.run() function.
1296 1296 Namespaces are internally managed to work correctly; profile.run
1297 1297 cannot be used in IPython because it makes certain assumptions about
1298 1298 namespaces which do not hold under IPython.
1299 1299
1300 1300 Options:
1301 1301
1302 1302 -l <limit>: you can place restrictions on what or how much of the
1303 1303 profile gets printed. The limit value can be:
1304 1304
1305 1305 * A string: only information for function names containing this string
1306 1306 is printed.
1307 1307
1308 1308 * An integer: only these many lines are printed.
1309 1309
1310 1310 * A float (between 0 and 1): this fraction of the report is printed
1311 1311 (for example, use a limit of 0.4 to see the topmost 40% only).
1312 1312
1313 1313 You can combine several limits with repeated use of the option. For
1314 1314 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1315 1315 information about class constructors.
1316 1316
1317 1317 -r: return the pstats.Stats object generated by the profiling. This
1318 1318 object has all the information about the profile in it, and you can
1319 1319 later use it for further analysis or in other functions.
1320 1320
1321 1321 -s <key>: sort profile by given key. You can provide more than one key
1322 1322 by using the option several times: '-s key1 -s key2 -s key3...'. The
1323 1323 default sorting key is 'time'.
1324 1324
1325 1325 The following is copied verbatim from the profile documentation
1326 1326 referenced below:
1327 1327
1328 1328 When more than one key is provided, additional keys are used as
1329 1329 secondary criteria when the there is equality in all keys selected
1330 1330 before them.
1331 1331
1332 1332 Abbreviations can be used for any key names, as long as the
1333 1333 abbreviation is unambiguous. The following are the keys currently
1334 1334 defined:
1335 1335
1336 1336 Valid Arg Meaning
1337 1337 "calls" call count
1338 1338 "cumulative" cumulative time
1339 1339 "file" file name
1340 1340 "module" file name
1341 1341 "pcalls" primitive call count
1342 1342 "line" line number
1343 1343 "name" function name
1344 1344 "nfl" name/file/line
1345 1345 "stdname" standard name
1346 1346 "time" internal time
1347 1347
1348 1348 Note that all sorts on statistics are in descending order (placing
1349 1349 most time consuming items first), where as name, file, and line number
1350 1350 searches are in ascending order (i.e., alphabetical). The subtle
1351 1351 distinction between "nfl" and "stdname" is that the standard name is a
1352 1352 sort of the name as printed, which means that the embedded line
1353 1353 numbers get compared in an odd way. For example, lines 3, 20, and 40
1354 1354 would (if the file names were the same) appear in the string order
1355 1355 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1356 1356 line numbers. In fact, sort_stats("nfl") is the same as
1357 1357 sort_stats("name", "file", "line").
1358 1358
1359 1359 -T <filename>: save profile results as shown on screen to a text
1360 1360 file. The profile is still shown on screen.
1361 1361
1362 1362 -D <filename>: save (via dump_stats) profile statistics to given
1363 1363 filename. This data is in a format understod by the pstats module, and
1364 1364 is generated by a call to the dump_stats() method of profile
1365 1365 objects. The profile is still shown on screen.
1366 1366
1367 1367 If you want to run complete programs under the profiler's control, use
1368 1368 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1369 1369 contains profiler specific options as described here.
1370 1370
1371 1371 You can read the complete documentation for the profile module with::
1372 1372
1373 1373 In [1]: import profile; profile.help()
1374 1374 """
1375 1375
1376 1376 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1377 1377 # protect user quote marks
1378 1378 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1379 1379
1380 1380 if user_mode: # regular user call
1381 1381 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1382 1382 list_all=1)
1383 1383 namespace = self.shell.user_ns
1384 1384 else: # called to run a program by %run -p
1385 1385 try:
1386 1386 filename = get_py_filename(arg_lst[0])
1387 1387 except IOError,msg:
1388 1388 error(msg)
1389 1389 return
1390 1390
1391 1391 arg_str = 'execfile(filename,prog_ns)'
1392 1392 namespace = locals()
1393 1393
1394 1394 opts.merge(opts_def)
1395 1395
1396 1396 prof = profile.Profile()
1397 1397 try:
1398 1398 prof = prof.runctx(arg_str,namespace,namespace)
1399 1399 sys_exit = ''
1400 1400 except SystemExit:
1401 1401 sys_exit = """*** SystemExit exception caught in code being profiled."""
1402 1402
1403 1403 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1404 1404
1405 1405 lims = opts.l
1406 1406 if lims:
1407 1407 lims = [] # rebuild lims with ints/floats/strings
1408 1408 for lim in opts.l:
1409 1409 try:
1410 1410 lims.append(int(lim))
1411 1411 except ValueError:
1412 1412 try:
1413 1413 lims.append(float(lim))
1414 1414 except ValueError:
1415 1415 lims.append(lim)
1416 1416
1417 1417 # Trap output.
1418 1418 stdout_trap = StringIO()
1419 1419
1420 1420 if hasattr(stats,'stream'):
1421 1421 # In newer versions of python, the stats object has a 'stream'
1422 1422 # attribute to write into.
1423 1423 stats.stream = stdout_trap
1424 1424 stats.print_stats(*lims)
1425 1425 else:
1426 1426 # For older versions, we manually redirect stdout during printing
1427 1427 sys_stdout = sys.stdout
1428 1428 try:
1429 1429 sys.stdout = stdout_trap
1430 1430 stats.print_stats(*lims)
1431 1431 finally:
1432 1432 sys.stdout = sys_stdout
1433 1433
1434 1434 output = stdout_trap.getvalue()
1435 1435 output = output.rstrip()
1436 1436
1437 1437 page.page(output)
1438 1438 print sys_exit,
1439 1439
1440 1440 dump_file = opts.D[0]
1441 1441 text_file = opts.T[0]
1442 1442 if dump_file:
1443 1443 prof.dump_stats(dump_file)
1444 1444 print '\n*** Profile stats marshalled to file',\
1445 1445 `dump_file`+'.',sys_exit
1446 1446 if text_file:
1447 1447 pfile = file(text_file,'w')
1448 1448 pfile.write(output)
1449 1449 pfile.close()
1450 1450 print '\n*** Profile printout saved to text file',\
1451 1451 `text_file`+'.',sys_exit
1452 1452
1453 1453 if opts.has_key('r'):
1454 1454 return stats
1455 1455 else:
1456 1456 return None
1457 1457
1458 1458 @skip_doctest
1459 1459 def magic_run(self, parameter_s ='',runner=None,
1460 1460 file_finder=get_py_filename):
1461 1461 """Run the named file inside IPython as a program.
1462 1462
1463 1463 Usage:\\
1464 1464 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1465 1465
1466 1466 Parameters after the filename are passed as command-line arguments to
1467 1467 the program (put in sys.argv). Then, control returns to IPython's
1468 1468 prompt.
1469 1469
1470 1470 This is similar to running at a system prompt:\\
1471 1471 $ python file args\\
1472 1472 but with the advantage of giving you IPython's tracebacks, and of
1473 1473 loading all variables into your interactive namespace for further use
1474 1474 (unless -p is used, see below).
1475 1475
1476 1476 The file is executed in a namespace initially consisting only of
1477 1477 __name__=='__main__' and sys.argv constructed as indicated. It thus
1478 1478 sees its environment as if it were being run as a stand-alone program
1479 1479 (except for sharing global objects such as previously imported
1480 1480 modules). But after execution, the IPython interactive namespace gets
1481 1481 updated with all variables defined in the program (except for __name__
1482 1482 and sys.argv). This allows for very convenient loading of code for
1483 1483 interactive work, while giving each program a 'clean sheet' to run in.
1484 1484
1485 1485 Options:
1486 1486
1487 1487 -n: __name__ is NOT set to '__main__', but to the running file's name
1488 1488 without extension (as python does under import). This allows running
1489 1489 scripts and reloading the definitions in them without calling code
1490 1490 protected by an ' if __name__ == "__main__" ' clause.
1491 1491
1492 1492 -i: run the file in IPython's namespace instead of an empty one. This
1493 1493 is useful if you are experimenting with code written in a text editor
1494 1494 which depends on variables defined interactively.
1495 1495
1496 1496 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1497 1497 being run. This is particularly useful if IPython is being used to
1498 1498 run unittests, which always exit with a sys.exit() call. In such
1499 1499 cases you are interested in the output of the test results, not in
1500 1500 seeing a traceback of the unittest module.
1501 1501
1502 1502 -t: print timing information at the end of the run. IPython will give
1503 1503 you an estimated CPU time consumption for your script, which under
1504 1504 Unix uses the resource module to avoid the wraparound problems of
1505 1505 time.clock(). Under Unix, an estimate of time spent on system tasks
1506 1506 is also given (for Windows platforms this is reported as 0.0).
1507 1507
1508 1508 If -t is given, an additional -N<N> option can be given, where <N>
1509 1509 must be an integer indicating how many times you want the script to
1510 1510 run. The final timing report will include total and per run results.
1511 1511
1512 1512 For example (testing the script uniq_stable.py):
1513 1513
1514 1514 In [1]: run -t uniq_stable
1515 1515
1516 1516 IPython CPU timings (estimated):\\
1517 1517 User : 0.19597 s.\\
1518 1518 System: 0.0 s.\\
1519 1519
1520 1520 In [2]: run -t -N5 uniq_stable
1521 1521
1522 1522 IPython CPU timings (estimated):\\
1523 1523 Total runs performed: 5\\
1524 1524 Times : Total Per run\\
1525 1525 User : 0.910862 s, 0.1821724 s.\\
1526 1526 System: 0.0 s, 0.0 s.
1527 1527
1528 1528 -d: run your program under the control of pdb, the Python debugger.
1529 1529 This allows you to execute your program step by step, watch variables,
1530 1530 etc. Internally, what IPython does is similar to calling:
1531 1531
1532 1532 pdb.run('execfile("YOURFILENAME")')
1533 1533
1534 1534 with a breakpoint set on line 1 of your file. You can change the line
1535 1535 number for this automatic breakpoint to be <N> by using the -bN option
1536 1536 (where N must be an integer). For example:
1537 1537
1538 1538 %run -d -b40 myscript
1539 1539
1540 1540 will set the first breakpoint at line 40 in myscript.py. Note that
1541 1541 the first breakpoint must be set on a line which actually does
1542 1542 something (not a comment or docstring) for it to stop execution.
1543 1543
1544 1544 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1545 1545 first enter 'c' (without qoutes) to start execution up to the first
1546 1546 breakpoint.
1547 1547
1548 1548 Entering 'help' gives information about the use of the debugger. You
1549 1549 can easily see pdb's full documentation with "import pdb;pdb.help()"
1550 1550 at a prompt.
1551 1551
1552 1552 -p: run program under the control of the Python profiler module (which
1553 1553 prints a detailed report of execution times, function calls, etc).
1554 1554
1555 1555 You can pass other options after -p which affect the behavior of the
1556 1556 profiler itself. See the docs for %prun for details.
1557 1557
1558 1558 In this mode, the program's variables do NOT propagate back to the
1559 1559 IPython interactive namespace (because they remain in the namespace
1560 1560 where the profiler executes them).
1561 1561
1562 1562 Internally this triggers a call to %prun, see its documentation for
1563 1563 details on the options available specifically for profiling.
1564 1564
1565 1565 There is one special usage for which the text above doesn't apply:
1566 1566 if the filename ends with .ipy, the file is run as ipython script,
1567 1567 just as if the commands were written on IPython prompt.
1568 1568 """
1569 1569
1570 1570 # get arguments and set sys.argv for program to be run.
1571 1571 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1572 1572 mode='list',list_all=1)
1573 1573
1574 1574 try:
1575 1575 filename = file_finder(arg_lst[0])
1576 1576 except IndexError:
1577 1577 warn('you must provide at least a filename.')
1578 1578 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1579 1579 return
1580 1580 except IOError,msg:
1581 1581 error(msg)
1582 1582 return
1583 1583
1584 1584 if filename.lower().endswith('.ipy'):
1585 1585 self.shell.safe_execfile_ipy(filename)
1586 1586 return
1587 1587
1588 1588 # Control the response to exit() calls made by the script being run
1589 1589 exit_ignore = opts.has_key('e')
1590 1590
1591 1591 # Make sure that the running script gets a proper sys.argv as if it
1592 1592 # were run from a system shell.
1593 1593 save_argv = sys.argv # save it for later restoring
1594 1594 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1595 1595
1596 1596 if opts.has_key('i'):
1597 1597 # Run in user's interactive namespace
1598 1598 prog_ns = self.shell.user_ns
1599 1599 __name__save = self.shell.user_ns['__name__']
1600 1600 prog_ns['__name__'] = '__main__'
1601 1601 main_mod = self.shell.new_main_mod(prog_ns)
1602 1602 else:
1603 1603 # Run in a fresh, empty namespace
1604 1604 if opts.has_key('n'):
1605 1605 name = os.path.splitext(os.path.basename(filename))[0]
1606 1606 else:
1607 1607 name = '__main__'
1608 1608
1609 1609 main_mod = self.shell.new_main_mod()
1610 1610 prog_ns = main_mod.__dict__
1611 1611 prog_ns['__name__'] = name
1612 1612
1613 1613 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1614 1614 # set the __file__ global in the script's namespace
1615 1615 prog_ns['__file__'] = filename
1616 1616
1617 1617 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1618 1618 # that, if we overwrite __main__, we replace it at the end
1619 1619 main_mod_name = prog_ns['__name__']
1620 1620
1621 1621 if main_mod_name == '__main__':
1622 1622 restore_main = sys.modules['__main__']
1623 1623 else:
1624 1624 restore_main = False
1625 1625
1626 1626 # This needs to be undone at the end to prevent holding references to
1627 1627 # every single object ever created.
1628 1628 sys.modules[main_mod_name] = main_mod
1629 1629
1630 1630 try:
1631 1631 stats = None
1632 1632 with self.readline_no_record:
1633 1633 if opts.has_key('p'):
1634 1634 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1635 1635 else:
1636 1636 if opts.has_key('d'):
1637 1637 deb = debugger.Pdb(self.shell.colors)
1638 1638 # reset Breakpoint state, which is moronically kept
1639 1639 # in a class
1640 1640 bdb.Breakpoint.next = 1
1641 1641 bdb.Breakpoint.bplist = {}
1642 1642 bdb.Breakpoint.bpbynumber = [None]
1643 1643 # Set an initial breakpoint to stop execution
1644 1644 maxtries = 10
1645 1645 bp = int(opts.get('b',[1])[0])
1646 1646 checkline = deb.checkline(filename,bp)
1647 1647 if not checkline:
1648 1648 for bp in range(bp+1,bp+maxtries+1):
1649 1649 if deb.checkline(filename,bp):
1650 1650 break
1651 1651 else:
1652 1652 msg = ("\nI failed to find a valid line to set "
1653 1653 "a breakpoint\n"
1654 1654 "after trying up to line: %s.\n"
1655 1655 "Please set a valid breakpoint manually "
1656 1656 "with the -b option." % bp)
1657 1657 error(msg)
1658 1658 return
1659 1659 # if we find a good linenumber, set the breakpoint
1660 1660 deb.do_break('%s:%s' % (filename,bp))
1661 1661 # Start file run
1662 1662 print "NOTE: Enter 'c' at the",
1663 1663 print "%s prompt to start your script." % deb.prompt
1664 1664 try:
1665 1665 deb.run('execfile("%s")' % filename,prog_ns)
1666 1666
1667 1667 except:
1668 1668 etype, value, tb = sys.exc_info()
1669 1669 # Skip three frames in the traceback: the %run one,
1670 1670 # one inside bdb.py, and the command-line typed by the
1671 1671 # user (run by exec in pdb itself).
1672 1672 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1673 1673 else:
1674 1674 if runner is None:
1675 1675 runner = self.shell.safe_execfile
1676 1676 if opts.has_key('t'):
1677 1677 # timed execution
1678 1678 try:
1679 1679 nruns = int(opts['N'][0])
1680 1680 if nruns < 1:
1681 1681 error('Number of runs must be >=1')
1682 1682 return
1683 1683 except (KeyError):
1684 1684 nruns = 1
1685 1685 twall0 = time.time()
1686 1686 if nruns == 1:
1687 1687 t0 = clock2()
1688 1688 runner(filename,prog_ns,prog_ns,
1689 1689 exit_ignore=exit_ignore)
1690 1690 t1 = clock2()
1691 1691 t_usr = t1[0]-t0[0]
1692 1692 t_sys = t1[1]-t0[1]
1693 1693 print "\nIPython CPU timings (estimated):"
1694 1694 print " User : %10.2f s." % t_usr
1695 1695 print " System : %10.2f s." % t_sys
1696 1696 else:
1697 1697 runs = range(nruns)
1698 1698 t0 = clock2()
1699 1699 for nr in runs:
1700 1700 runner(filename,prog_ns,prog_ns,
1701 1701 exit_ignore=exit_ignore)
1702 1702 t1 = clock2()
1703 1703 t_usr = t1[0]-t0[0]
1704 1704 t_sys = t1[1]-t0[1]
1705 1705 print "\nIPython CPU timings (estimated):"
1706 1706 print "Total runs performed:",nruns
1707 1707 print " Times : %10.2f %10.2f" % ('Total','Per run')
1708 1708 print " User : %10.2f s, %10.2f s." % (t_usr,t_usr/nruns)
1709 1709 print " System : %10.2f s, %10.2f s." % (t_sys,t_sys/nruns)
1710 1710 twall1 = time.time()
1711 1711 print "Wall time: %10.2f s." % (twall1-twall0)
1712 1712
1713 1713 else:
1714 1714 # regular execution
1715 1715 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1716 1716
1717 1717 if opts.has_key('i'):
1718 1718 self.shell.user_ns['__name__'] = __name__save
1719 1719 else:
1720 1720 # The shell MUST hold a reference to prog_ns so after %run
1721 1721 # exits, the python deletion mechanism doesn't zero it out
1722 1722 # (leaving dangling references).
1723 1723 self.shell.cache_main_mod(prog_ns,filename)
1724 1724 # update IPython interactive namespace
1725 1725
1726 1726 # Some forms of read errors on the file may mean the
1727 1727 # __name__ key was never set; using pop we don't have to
1728 1728 # worry about a possible KeyError.
1729 1729 prog_ns.pop('__name__', None)
1730 1730
1731 1731 self.shell.user_ns.update(prog_ns)
1732 1732 finally:
1733 1733 # It's a bit of a mystery why, but __builtins__ can change from
1734 1734 # being a module to becoming a dict missing some key data after
1735 1735 # %run. As best I can see, this is NOT something IPython is doing
1736 1736 # at all, and similar problems have been reported before:
1737 1737 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1738 1738 # Since this seems to be done by the interpreter itself, the best
1739 1739 # we can do is to at least restore __builtins__ for the user on
1740 1740 # exit.
1741 1741 self.shell.user_ns['__builtins__'] = __builtin__
1742 1742
1743 1743 # Ensure key global structures are restored
1744 1744 sys.argv = save_argv
1745 1745 if restore_main:
1746 1746 sys.modules['__main__'] = restore_main
1747 1747 else:
1748 1748 # Remove from sys.modules the reference to main_mod we'd
1749 1749 # added. Otherwise it will trap references to objects
1750 1750 # contained therein.
1751 1751 del sys.modules[main_mod_name]
1752 1752
1753 1753 return stats
1754 1754
1755 1755 @skip_doctest
1756 1756 def magic_timeit(self, parameter_s =''):
1757 1757 """Time execution of a Python statement or expression
1758 1758
1759 1759 Usage:\\
1760 1760 %timeit [-n<N> -r<R> [-t|-c]] statement
1761 1761
1762 1762 Time execution of a Python statement or expression using the timeit
1763 1763 module.
1764 1764
1765 1765 Options:
1766 1766 -n<N>: execute the given statement <N> times in a loop. If this value
1767 1767 is not given, a fitting value is chosen.
1768 1768
1769 1769 -r<R>: repeat the loop iteration <R> times and take the best result.
1770 1770 Default: 3
1771 1771
1772 1772 -t: use time.time to measure the time, which is the default on Unix.
1773 1773 This function measures wall time.
1774 1774
1775 1775 -c: use time.clock to measure the time, which is the default on
1776 1776 Windows and measures wall time. On Unix, resource.getrusage is used
1777 1777 instead and returns the CPU user time.
1778 1778
1779 1779 -p<P>: use a precision of <P> digits to display the timing result.
1780 1780 Default: 3
1781 1781
1782 1782
1783 1783 Examples:
1784 1784
1785 1785 In [1]: %timeit pass
1786 1786 10000000 loops, best of 3: 53.3 ns per loop
1787 1787
1788 1788 In [2]: u = None
1789 1789
1790 1790 In [3]: %timeit u is None
1791 1791 10000000 loops, best of 3: 184 ns per loop
1792 1792
1793 1793 In [4]: %timeit -r 4 u == None
1794 1794 1000000 loops, best of 4: 242 ns per loop
1795 1795
1796 1796 In [5]: import time
1797 1797
1798 1798 In [6]: %timeit -n1 time.sleep(2)
1799 1799 1 loops, best of 3: 2 s per loop
1800 1800
1801 1801
1802 1802 The times reported by %timeit will be slightly higher than those
1803 1803 reported by the timeit.py script when variables are accessed. This is
1804 1804 due to the fact that %timeit executes the statement in the namespace
1805 1805 of the shell, compared with timeit.py, which uses a single setup
1806 1806 statement to import function or create variables. Generally, the bias
1807 1807 does not matter as long as results from timeit.py are not mixed with
1808 1808 those from %timeit."""
1809 1809
1810 1810 import timeit
1811 1811 import math
1812 1812
1813 1813 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1814 1814 # certain terminals. Until we figure out a robust way of
1815 1815 # auto-detecting if the terminal can deal with it, use plain 'us' for
1816 1816 # microseconds. I am really NOT happy about disabling the proper
1817 1817 # 'micro' prefix, but crashing is worse... If anyone knows what the
1818 1818 # right solution for this is, I'm all ears...
1819 1819 #
1820 1820 # Note: using
1821 1821 #
1822 1822 # s = u'\xb5'
1823 1823 # s.encode(sys.getdefaultencoding())
1824 1824 #
1825 1825 # is not sufficient, as I've seen terminals where that fails but
1826 1826 # print s
1827 1827 #
1828 1828 # succeeds
1829 1829 #
1830 1830 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1831 1831
1832 1832 #units = [u"s", u"ms",u'\xb5',"ns"]
1833 1833 units = [u"s", u"ms",u'us',"ns"]
1834 1834
1835 1835 scaling = [1, 1e3, 1e6, 1e9]
1836 1836
1837 1837 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1838 1838 posix=False)
1839 1839 if stmt == "":
1840 1840 return
1841 1841 timefunc = timeit.default_timer
1842 1842 number = int(getattr(opts, "n", 0))
1843 1843 repeat = int(getattr(opts, "r", timeit.default_repeat))
1844 1844 precision = int(getattr(opts, "p", 3))
1845 1845 if hasattr(opts, "t"):
1846 1846 timefunc = time.time
1847 1847 if hasattr(opts, "c"):
1848 1848 timefunc = clock
1849 1849
1850 1850 timer = timeit.Timer(timer=timefunc)
1851 1851 # this code has tight coupling to the inner workings of timeit.Timer,
1852 1852 # but is there a better way to achieve that the code stmt has access
1853 1853 # to the shell namespace?
1854 1854
1855 1855 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1856 1856 'setup': "pass"}
1857 1857 # Track compilation time so it can be reported if too long
1858 1858 # Minimum time above which compilation time will be reported
1859 1859 tc_min = 0.1
1860 1860
1861 1861 t0 = clock()
1862 1862 code = compile(src, "<magic-timeit>", "exec")
1863 1863 tc = clock()-t0
1864 1864
1865 1865 ns = {}
1866 1866 exec code in self.shell.user_ns, ns
1867 1867 timer.inner = ns["inner"]
1868 1868
1869 1869 if number == 0:
1870 1870 # determine number so that 0.2 <= total time < 2.0
1871 1871 number = 1
1872 1872 for i in range(1, 10):
1873 1873 if timer.timeit(number) >= 0.2:
1874 1874 break
1875 1875 number *= 10
1876 1876
1877 1877 best = min(timer.repeat(repeat, number)) / number
1878 1878
1879 1879 if best > 0.0 and best < 1000.0:
1880 1880 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1881 1881 elif best >= 1000.0:
1882 1882 order = 0
1883 1883 else:
1884 1884 order = 3
1885 1885 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1886 1886 precision,
1887 1887 best * scaling[order],
1888 1888 units[order])
1889 1889 if tc > tc_min:
1890 1890 print "Compiler time: %.2f s" % tc
1891 1891
1892 1892 @skip_doctest
1893 1893 @needs_local_scope
1894 1894 def magic_time(self,parameter_s = ''):
1895 1895 """Time execution of a Python statement or expression.
1896 1896
1897 1897 The CPU and wall clock times are printed, and the value of the
1898 1898 expression (if any) is returned. Note that under Win32, system time
1899 1899 is always reported as 0, since it can not be measured.
1900 1900
1901 1901 This function provides very basic timing functionality. In Python
1902 1902 2.3, the timeit module offers more control and sophistication, so this
1903 1903 could be rewritten to use it (patches welcome).
1904 1904
1905 1905 Some examples:
1906 1906
1907 1907 In [1]: time 2**128
1908 1908 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1909 1909 Wall time: 0.00
1910 1910 Out[1]: 340282366920938463463374607431768211456L
1911 1911
1912 1912 In [2]: n = 1000000
1913 1913
1914 1914 In [3]: time sum(range(n))
1915 1915 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1916 1916 Wall time: 1.37
1917 1917 Out[3]: 499999500000L
1918 1918
1919 1919 In [4]: time print 'hello world'
1920 1920 hello world
1921 1921 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1922 1922 Wall time: 0.00
1923 1923
1924 1924 Note that the time needed by Python to compile the given expression
1925 1925 will be reported if it is more than 0.1s. In this example, the
1926 1926 actual exponentiation is done by Python at compilation time, so while
1927 1927 the expression can take a noticeable amount of time to compute, that
1928 1928 time is purely due to the compilation:
1929 1929
1930 1930 In [5]: time 3**9999;
1931 1931 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1932 1932 Wall time: 0.00 s
1933 1933
1934 1934 In [6]: time 3**999999;
1935 1935 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1936 1936 Wall time: 0.00 s
1937 1937 Compiler : 0.78 s
1938 1938 """
1939 1939
1940 1940 # fail immediately if the given expression can't be compiled
1941 1941
1942 1942 expr = self.shell.prefilter(parameter_s,False)
1943 1943
1944 1944 # Minimum time above which compilation time will be reported
1945 1945 tc_min = 0.1
1946 1946
1947 1947 try:
1948 1948 mode = 'eval'
1949 1949 t0 = clock()
1950 1950 code = compile(expr,'<timed eval>',mode)
1951 1951 tc = clock()-t0
1952 1952 except SyntaxError:
1953 1953 mode = 'exec'
1954 1954 t0 = clock()
1955 1955 code = compile(expr,'<timed exec>',mode)
1956 1956 tc = clock()-t0
1957 1957 # skew measurement as little as possible
1958 1958 glob = self.shell.user_ns
1959 1959 locs = self._magic_locals
1960 1960 clk = clock2
1961 1961 wtime = time.time
1962 1962 # time execution
1963 1963 wall_st = wtime()
1964 1964 if mode=='eval':
1965 1965 st = clk()
1966 1966 out = eval(code, glob, locs)
1967 1967 end = clk()
1968 1968 else:
1969 1969 st = clk()
1970 1970 exec code in glob, locs
1971 1971 end = clk()
1972 1972 out = None
1973 1973 wall_end = wtime()
1974 1974 # Compute actual times and report
1975 1975 wall_time = wall_end-wall_st
1976 1976 cpu_user = end[0]-st[0]
1977 1977 cpu_sys = end[1]-st[1]
1978 1978 cpu_tot = cpu_user+cpu_sys
1979 1979 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1980 1980 (cpu_user,cpu_sys,cpu_tot)
1981 1981 print "Wall time: %.2f s" % wall_time
1982 1982 if tc > tc_min:
1983 1983 print "Compiler : %.2f s" % tc
1984 1984 return out
1985 1985
1986 1986 @skip_doctest
1987 1987 def magic_macro(self,parameter_s = ''):
1988 1988 """Define a macro for future re-execution. It accepts ranges of history,
1989 1989 filenames or string objects.
1990 1990
1991 1991 Usage:\\
1992 1992 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1993 1993
1994 1994 Options:
1995 1995
1996 1996 -r: use 'raw' input. By default, the 'processed' history is used,
1997 1997 so that magics are loaded in their transformed version to valid
1998 1998 Python. If this option is given, the raw input as typed as the
1999 1999 command line is used instead.
2000 2000
2001 2001 This will define a global variable called `name` which is a string
2002 2002 made of joining the slices and lines you specify (n1,n2,... numbers
2003 2003 above) from your input history into a single string. This variable
2004 2004 acts like an automatic function which re-executes those lines as if
2005 2005 you had typed them. You just type 'name' at the prompt and the code
2006 2006 executes.
2007 2007
2008 2008 The syntax for indicating input ranges is described in %history.
2009 2009
2010 2010 Note: as a 'hidden' feature, you can also use traditional python slice
2011 2011 notation, where N:M means numbers N through M-1.
2012 2012
2013 2013 For example, if your history contains (%hist prints it):
2014 2014
2015 2015 44: x=1
2016 2016 45: y=3
2017 2017 46: z=x+y
2018 2018 47: print x
2019 2019 48: a=5
2020 2020 49: print 'x',x,'y',y
2021 2021
2022 2022 you can create a macro with lines 44 through 47 (included) and line 49
2023 2023 called my_macro with:
2024 2024
2025 2025 In [55]: %macro my_macro 44-47 49
2026 2026
2027 2027 Now, typing `my_macro` (without quotes) will re-execute all this code
2028 2028 in one pass.
2029 2029
2030 2030 You don't need to give the line-numbers in order, and any given line
2031 2031 number can appear multiple times. You can assemble macros with any
2032 2032 lines from your input history in any order.
2033 2033
2034 2034 The macro is a simple object which holds its value in an attribute,
2035 2035 but IPython's display system checks for macros and executes them as
2036 2036 code instead of printing them when you type their name.
2037 2037
2038 2038 You can view a macro's contents by explicitly printing it with:
2039 2039
2040 2040 'print macro_name'.
2041 2041
2042 2042 """
2043 2043 opts,args = self.parse_options(parameter_s,'r',mode='list')
2044 2044 if not args: # List existing macros
2045 2045 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
2046 2046 isinstance(v, Macro))
2047 2047 if len(args) == 1:
2048 2048 raise UsageError(
2049 2049 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2050 2050 name, codefrom = args[0], " ".join(args[1:])
2051 2051
2052 2052 #print 'rng',ranges # dbg
2053 2053 try:
2054 2054 lines = self.shell.find_user_code(codefrom, 'r' in opts)
2055 2055 except (ValueError, TypeError) as e:
2056 2056 print e.args[0]
2057 2057 return
2058 2058 macro = Macro(lines)
2059 2059 self.shell.define_macro(name, macro)
2060 2060 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2061 2061 print '=== Macro contents: ==='
2062 2062 print macro,
2063 2063
2064 2064 def magic_save(self,parameter_s = ''):
2065 2065 """Save a set of lines or a macro to a given filename.
2066 2066
2067 2067 Usage:\\
2068 2068 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2069 2069
2070 2070 Options:
2071 2071
2072 2072 -r: use 'raw' input. By default, the 'processed' history is used,
2073 2073 so that magics are loaded in their transformed version to valid
2074 2074 Python. If this option is given, the raw input as typed as the
2075 2075 command line is used instead.
2076 2076
2077 2077 This function uses the same syntax as %history for input ranges,
2078 2078 then saves the lines to the filename you specify.
2079 2079
2080 2080 It adds a '.py' extension to the file if you don't do so yourself, and
2081 2081 it asks for confirmation before overwriting existing files."""
2082 2082
2083 2083 opts,args = self.parse_options(parameter_s,'r',mode='list')
2084 2084 fname, codefrom = args[0], " ".join(args[1:])
2085 2085 if not fname.endswith('.py'):
2086 2086 fname += '.py'
2087 2087 if os.path.isfile(fname):
2088 2088 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2089 2089 if ans.lower() not in ['y','yes']:
2090 2090 print 'Operation cancelled.'
2091 2091 return
2092 2092 try:
2093 2093 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
2094 2094 except (TypeError, ValueError) as e:
2095 2095 print e.args[0]
2096 2096 return
2097 2097 if isinstance(cmds, unicode):
2098 2098 cmds = cmds.encode("utf-8")
2099 2099 with open(fname,'w') as f:
2100 2100 f.write("# coding: utf-8\n")
2101 2101 f.write(cmds)
2102 2102 print 'The following commands were written to file `%s`:' % fname
2103 2103 print cmds
2104 2104
2105 2105 def magic_pastebin(self, parameter_s = ''):
2106 2106 """Upload code to the 'Lodge it' paste bin, returning the URL."""
2107 2107 try:
2108 2108 code = self.shell.find_user_code(parameter_s)
2109 2109 except (ValueError, TypeError) as e:
2110 2110 print e.args[0]
2111 2111 return
2112 2112 pbserver = ServerProxy('http://paste.pocoo.org/xmlrpc/')
2113 2113 id = pbserver.pastes.newPaste("python", code)
2114 2114 return "http://paste.pocoo.org/show/" + id
2115 2115
2116 2116 def magic_loadpy(self, arg_s):
2117 2117 """Load a .py python script into the GUI console.
2118 2118
2119 2119 This magic command can either take a local filename or a url::
2120 2120
2121 2121 %loadpy myscript.py
2122 2122 %loadpy http://www.example.com/myscript.py
2123 2123 """
2124 2124 if not arg_s.endswith('.py'):
2125 2125 raise ValueError('%%load only works with .py files: %s' % arg_s)
2126 2126 if arg_s.startswith('http'):
2127 2127 import urllib2
2128 2128 response = urllib2.urlopen(arg_s)
2129 2129 content = response.read()
2130 2130 else:
2131 2131 content = open(arg_s).read()
2132 2132 self.set_next_input(content)
2133 2133
2134 2134 def _find_edit_target(self, args, opts, last_call):
2135 2135 """Utility method used by magic_edit to find what to edit."""
2136 2136
2137 2137 def make_filename(arg):
2138 2138 "Make a filename from the given args"
2139 2139 try:
2140 2140 filename = get_py_filename(arg)
2141 2141 except IOError:
2142 2142 # If it ends with .py but doesn't already exist, assume we want
2143 2143 # a new file.
2144 2144 if args.endswith('.py'):
2145 2145 filename = arg
2146 2146 else:
2147 2147 filename = None
2148 2148 return filename
2149 2149
2150 2150 # Set a few locals from the options for convenience:
2151 2151 opts_prev = 'p' in opts
2152 2152 opts_raw = 'r' in opts
2153 2153
2154 2154 # custom exceptions
2155 2155 class DataIsObject(Exception): pass
2156 2156
2157 2157 # Default line number value
2158 2158 lineno = opts.get('n',None)
2159 2159
2160 2160 if opts_prev:
2161 2161 args = '_%s' % last_call[0]
2162 2162 if not self.shell.user_ns.has_key(args):
2163 2163 args = last_call[1]
2164 2164
2165 2165 # use last_call to remember the state of the previous call, but don't
2166 2166 # let it be clobbered by successive '-p' calls.
2167 2167 try:
2168 2168 last_call[0] = self.shell.displayhook.prompt_count
2169 2169 if not opts_prev:
2170 2170 last_call[1] = parameter_s
2171 2171 except:
2172 2172 pass
2173 2173
2174 2174 # by default this is done with temp files, except when the given
2175 2175 # arg is a filename
2176 2176 use_temp = True
2177 2177
2178 2178 data = ''
2179 2179
2180 2180 # First, see if the arguments should be a filename.
2181 2181 filename = make_filename(args)
2182 2182 if filename:
2183 2183 use_temp = False
2184 2184 elif args:
2185 2185 # Mode where user specifies ranges of lines, like in %macro.
2186 2186 data = self.extract_input_lines(args, opts_raw)
2187 2187 if not data:
2188 2188 try:
2189 2189 # Load the parameter given as a variable. If not a string,
2190 2190 # process it as an object instead (below)
2191 2191
2192 2192 #print '*** args',args,'type',type(args) # dbg
2193 2193 data = eval(args, self.shell.user_ns)
2194 2194 if not isinstance(data, basestring):
2195 2195 raise DataIsObject
2196 2196
2197 2197 except (NameError,SyntaxError):
2198 2198 # given argument is not a variable, try as a filename
2199 2199 filename = make_filename(args)
2200 2200 if filename is None:
2201 2201 warn("Argument given (%s) can't be found as a variable "
2202 2202 "or as a filename." % args)
2203 2203 return
2204 2204 use_temp = False
2205 2205
2206 2206 except DataIsObject:
2207 2207 # macros have a special edit function
2208 2208 if isinstance(data, Macro):
2209 2209 raise MacroToEdit(data)
2210 2210
2211 2211 # For objects, try to edit the file where they are defined
2212 2212 try:
2213 2213 filename = inspect.getabsfile(data)
2214 2214 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2215 2215 # class created by %edit? Try to find source
2216 2216 # by looking for method definitions instead, the
2217 2217 # __module__ in those classes is FakeModule.
2218 2218 attrs = [getattr(data, aname) for aname in dir(data)]
2219 2219 for attr in attrs:
2220 2220 if not inspect.ismethod(attr):
2221 2221 continue
2222 2222 filename = inspect.getabsfile(attr)
2223 2223 if filename and 'fakemodule' not in filename.lower():
2224 2224 # change the attribute to be the edit target instead
2225 2225 data = attr
2226 2226 break
2227 2227
2228 2228 datafile = 1
2229 2229 except TypeError:
2230 2230 filename = make_filename(args)
2231 2231 datafile = 1
2232 2232 warn('Could not find file where `%s` is defined.\n'
2233 2233 'Opening a file named `%s`' % (args,filename))
2234 2234 # Now, make sure we can actually read the source (if it was in
2235 2235 # a temp file it's gone by now).
2236 2236 if datafile:
2237 2237 try:
2238 2238 if lineno is None:
2239 2239 lineno = inspect.getsourcelines(data)[1]
2240 2240 except IOError:
2241 2241 filename = make_filename(args)
2242 2242 if filename is None:
2243 2243 warn('The file `%s` where `%s` was defined cannot '
2244 2244 'be read.' % (filename,data))
2245 2245 return
2246 2246 use_temp = False
2247 2247
2248 2248 if use_temp:
2249 2249 filename = self.shell.mktempfile(data)
2250 2250 print 'IPython will make a temporary file named:',filename
2251 2251
2252 2252 return filename, lineno, use_temp
2253 2253
2254 2254 def _edit_macro(self,mname,macro):
2255 2255 """open an editor with the macro data in a file"""
2256 2256 filename = self.shell.mktempfile(macro.value)
2257 2257 self.shell.hooks.editor(filename)
2258 2258
2259 2259 # and make a new macro object, to replace the old one
2260 2260 mfile = open(filename)
2261 2261 mvalue = mfile.read()
2262 2262 mfile.close()
2263 2263 self.shell.user_ns[mname] = Macro(mvalue)
2264 2264
2265 2265 def magic_ed(self,parameter_s=''):
2266 2266 """Alias to %edit."""
2267 2267 return self.magic_edit(parameter_s)
2268 2268
2269 2269 @skip_doctest
2270 2270 def magic_edit(self,parameter_s='',last_call=['','']):
2271 2271 """Bring up an editor and execute the resulting code.
2272 2272
2273 2273 Usage:
2274 2274 %edit [options] [args]
2275 2275
2276 2276 %edit runs IPython's editor hook. The default version of this hook is
2277 2277 set to call the __IPYTHON__.rc.editor command. This is read from your
2278 2278 environment variable $EDITOR. If this isn't found, it will default to
2279 2279 vi under Linux/Unix and to notepad under Windows. See the end of this
2280 2280 docstring for how to change the editor hook.
2281 2281
2282 2282 You can also set the value of this editor via the command line option
2283 2283 '-editor' or in your ipythonrc file. This is useful if you wish to use
2284 2284 specifically for IPython an editor different from your typical default
2285 2285 (and for Windows users who typically don't set environment variables).
2286 2286
2287 2287 This command allows you to conveniently edit multi-line code right in
2288 2288 your IPython session.
2289 2289
2290 2290 If called without arguments, %edit opens up an empty editor with a
2291 2291 temporary file and will execute the contents of this file when you
2292 2292 close it (don't forget to save it!).
2293 2293
2294 2294
2295 2295 Options:
2296 2296
2297 2297 -n <number>: open the editor at a specified line number. By default,
2298 2298 the IPython editor hook uses the unix syntax 'editor +N filename', but
2299 2299 you can configure this by providing your own modified hook if your
2300 2300 favorite editor supports line-number specifications with a different
2301 2301 syntax.
2302 2302
2303 2303 -p: this will call the editor with the same data as the previous time
2304 2304 it was used, regardless of how long ago (in your current session) it
2305 2305 was.
2306 2306
2307 2307 -r: use 'raw' input. This option only applies to input taken from the
2308 2308 user's history. By default, the 'processed' history is used, so that
2309 2309 magics are loaded in their transformed version to valid Python. If
2310 2310 this option is given, the raw input as typed as the command line is
2311 2311 used instead. When you exit the editor, it will be executed by
2312 2312 IPython's own processor.
2313 2313
2314 2314 -x: do not execute the edited code immediately upon exit. This is
2315 2315 mainly useful if you are editing programs which need to be called with
2316 2316 command line arguments, which you can then do using %run.
2317 2317
2318 2318
2319 2319 Arguments:
2320 2320
2321 2321 If arguments are given, the following possibilites exist:
2322 2322
2323 2323 - If the argument is a filename, IPython will load that into the
2324 2324 editor. It will execute its contents with execfile() when you exit,
2325 2325 loading any code in the file into your interactive namespace.
2326 2326
2327 2327 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
2328 2328 The syntax is the same as in the %history magic.
2329 2329
2330 2330 - If the argument is a string variable, its contents are loaded
2331 2331 into the editor. You can thus edit any string which contains
2332 2332 python code (including the result of previous edits).
2333 2333
2334 2334 - If the argument is the name of an object (other than a string),
2335 2335 IPython will try to locate the file where it was defined and open the
2336 2336 editor at the point where it is defined. You can use `%edit function`
2337 2337 to load an editor exactly at the point where 'function' is defined,
2338 2338 edit it and have the file be executed automatically.
2339 2339
2340 2340 If the object is a macro (see %macro for details), this opens up your
2341 2341 specified editor with a temporary file containing the macro's data.
2342 2342 Upon exit, the macro is reloaded with the contents of the file.
2343 2343
2344 2344 Note: opening at an exact line is only supported under Unix, and some
2345 2345 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2346 2346 '+NUMBER' parameter necessary for this feature. Good editors like
2347 2347 (X)Emacs, vi, jed, pico and joe all do.
2348 2348
2349 2349 After executing your code, %edit will return as output the code you
2350 2350 typed in the editor (except when it was an existing file). This way
2351 2351 you can reload the code in further invocations of %edit as a variable,
2352 2352 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2353 2353 the output.
2354 2354
2355 2355 Note that %edit is also available through the alias %ed.
2356 2356
2357 2357 This is an example of creating a simple function inside the editor and
2358 2358 then modifying it. First, start up the editor:
2359 2359
2360 2360 In [1]: ed
2361 2361 Editing... done. Executing edited code...
2362 2362 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2363 2363
2364 2364 We can then call the function foo():
2365 2365
2366 2366 In [2]: foo()
2367 2367 foo() was defined in an editing session
2368 2368
2369 2369 Now we edit foo. IPython automatically loads the editor with the
2370 2370 (temporary) file where foo() was previously defined:
2371 2371
2372 2372 In [3]: ed foo
2373 2373 Editing... done. Executing edited code...
2374 2374
2375 2375 And if we call foo() again we get the modified version:
2376 2376
2377 2377 In [4]: foo()
2378 2378 foo() has now been changed!
2379 2379
2380 2380 Here is an example of how to edit a code snippet successive
2381 2381 times. First we call the editor:
2382 2382
2383 2383 In [5]: ed
2384 2384 Editing... done. Executing edited code...
2385 2385 hello
2386 2386 Out[5]: "print 'hello'n"
2387 2387
2388 2388 Now we call it again with the previous output (stored in _):
2389 2389
2390 2390 In [6]: ed _
2391 2391 Editing... done. Executing edited code...
2392 2392 hello world
2393 2393 Out[6]: "print 'hello world'n"
2394 2394
2395 2395 Now we call it with the output #8 (stored in _8, also as Out[8]):
2396 2396
2397 2397 In [7]: ed _8
2398 2398 Editing... done. Executing edited code...
2399 2399 hello again
2400 2400 Out[7]: "print 'hello again'n"
2401 2401
2402 2402
2403 2403 Changing the default editor hook:
2404 2404
2405 2405 If you wish to write your own editor hook, you can put it in a
2406 2406 configuration file which you load at startup time. The default hook
2407 2407 is defined in the IPython.core.hooks module, and you can use that as a
2408 2408 starting example for further modifications. That file also has
2409 2409 general instructions on how to set a new hook for use once you've
2410 2410 defined it."""
2411 2411 opts,args = self.parse_options(parameter_s,'prxn:')
2412 2412
2413 2413 try:
2414 2414 filename, lineno, is_temp = self._find_edit_target(args, opts, last_call)
2415 2415 except MacroToEdit as e:
2416 2416 self._edit_macro(args, e.args[0])
2417 2417 return
2418 2418
2419 2419 # do actual editing here
2420 2420 print 'Editing...',
2421 2421 sys.stdout.flush()
2422 2422 try:
2423 2423 # Quote filenames that may have spaces in them
2424 2424 if ' ' in filename:
2425 2425 filename = "'%s'" % filename
2426 2426 self.shell.hooks.editor(filename,lineno)
2427 2427 except TryNext:
2428 2428 warn('Could not open editor')
2429 2429 return
2430 2430
2431 2431 # XXX TODO: should this be generalized for all string vars?
2432 2432 # For now, this is special-cased to blocks created by cpaste
2433 2433 if args.strip() == 'pasted_block':
2434 2434 self.shell.user_ns['pasted_block'] = file_read(filename)
2435 2435
2436 2436 if 'x' in opts: # -x prevents actual execution
2437 2437 print
2438 2438 else:
2439 2439 print 'done. Executing edited code...'
2440 2440 if 'r' in opts: # Untranslated IPython code
2441 2441 self.shell.run_cell(file_read(filename),
2442 2442 store_history=False)
2443 2443 else:
2444 2444 self.shell.safe_execfile(filename,self.shell.user_ns,
2445 2445 self.shell.user_ns)
2446 2446
2447 2447 if is_temp:
2448 2448 try:
2449 2449 return open(filename).read()
2450 2450 except IOError,msg:
2451 2451 if msg.filename == filename:
2452 2452 warn('File not found. Did you forget to save?')
2453 2453 return
2454 2454 else:
2455 2455 self.shell.showtraceback()
2456 2456
2457 2457 def magic_xmode(self,parameter_s = ''):
2458 2458 """Switch modes for the exception handlers.
2459 2459
2460 2460 Valid modes: Plain, Context and Verbose.
2461 2461
2462 2462 If called without arguments, acts as a toggle."""
2463 2463
2464 2464 def xmode_switch_err(name):
2465 2465 warn('Error changing %s exception modes.\n%s' %
2466 2466 (name,sys.exc_info()[1]))
2467 2467
2468 2468 shell = self.shell
2469 2469 new_mode = parameter_s.strip().capitalize()
2470 2470 try:
2471 2471 shell.InteractiveTB.set_mode(mode=new_mode)
2472 2472 print 'Exception reporting mode:',shell.InteractiveTB.mode
2473 2473 except:
2474 2474 xmode_switch_err('user')
2475 2475
2476 2476 def magic_colors(self,parameter_s = ''):
2477 2477 """Switch color scheme for prompts, info system and exception handlers.
2478 2478
2479 2479 Currently implemented schemes: NoColor, Linux, LightBG.
2480 2480
2481 2481 Color scheme names are not case-sensitive.
2482 2482
2483 2483 Examples
2484 2484 --------
2485 2485 To get a plain black and white terminal::
2486 2486
2487 2487 %colors nocolor
2488 2488 """
2489 2489
2490 2490 def color_switch_err(name):
2491 2491 warn('Error changing %s color schemes.\n%s' %
2492 2492 (name,sys.exc_info()[1]))
2493 2493
2494 2494
2495 2495 new_scheme = parameter_s.strip()
2496 2496 if not new_scheme:
2497 2497 raise UsageError(
2498 2498 "%colors: you must specify a color scheme. See '%colors?'")
2499 2499 return
2500 2500 # local shortcut
2501 2501 shell = self.shell
2502 2502
2503 2503 import IPython.utils.rlineimpl as readline
2504 2504
2505 2505 if not readline.have_readline and sys.platform == "win32":
2506 2506 msg = """\
2507 2507 Proper color support under MS Windows requires the pyreadline library.
2508 2508 You can find it at:
2509 2509 http://ipython.scipy.org/moin/PyReadline/Intro
2510 2510 Gary's readline needs the ctypes module, from:
2511 2511 http://starship.python.net/crew/theller/ctypes
2512 2512 (Note that ctypes is already part of Python versions 2.5 and newer).
2513 2513
2514 2514 Defaulting color scheme to 'NoColor'"""
2515 2515 new_scheme = 'NoColor'
2516 2516 warn(msg)
2517 2517
2518 2518 # readline option is 0
2519 2519 if not shell.has_readline:
2520 2520 new_scheme = 'NoColor'
2521 2521
2522 2522 # Set prompt colors
2523 2523 try:
2524 2524 shell.displayhook.set_colors(new_scheme)
2525 2525 except:
2526 2526 color_switch_err('prompt')
2527 2527 else:
2528 2528 shell.colors = \
2529 2529 shell.displayhook.color_table.active_scheme_name
2530 2530 # Set exception colors
2531 2531 try:
2532 2532 shell.InteractiveTB.set_colors(scheme = new_scheme)
2533 2533 shell.SyntaxTB.set_colors(scheme = new_scheme)
2534 2534 except:
2535 2535 color_switch_err('exception')
2536 2536
2537 2537 # Set info (for 'object?') colors
2538 2538 if shell.color_info:
2539 2539 try:
2540 2540 shell.inspector.set_active_scheme(new_scheme)
2541 2541 except:
2542 2542 color_switch_err('object inspector')
2543 2543 else:
2544 2544 shell.inspector.set_active_scheme('NoColor')
2545 2545
2546 2546 def magic_pprint(self, parameter_s=''):
2547 2547 """Toggle pretty printing on/off."""
2548 2548 ptformatter = self.shell.display_formatter.formatters['text/plain']
2549 2549 ptformatter.pprint = bool(1 - ptformatter.pprint)
2550 2550 print 'Pretty printing has been turned', \
2551 2551 ['OFF','ON'][ptformatter.pprint]
2552 2552
2553 2553 #......................................................................
2554 2554 # Functions to implement unix shell-type things
2555 2555
2556 2556 @skip_doctest
2557 2557 def magic_alias(self, parameter_s = ''):
2558 2558 """Define an alias for a system command.
2559 2559
2560 2560 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2561 2561
2562 2562 Then, typing 'alias_name params' will execute the system command 'cmd
2563 2563 params' (from your underlying operating system).
2564 2564
2565 2565 Aliases have lower precedence than magic functions and Python normal
2566 2566 variables, so if 'foo' is both a Python variable and an alias, the
2567 2567 alias can not be executed until 'del foo' removes the Python variable.
2568 2568
2569 2569 You can use the %l specifier in an alias definition to represent the
2570 2570 whole line when the alias is called. For example:
2571 2571
2572 2572 In [2]: alias bracket echo "Input in brackets: <%l>"
2573 2573 In [3]: bracket hello world
2574 2574 Input in brackets: <hello world>
2575 2575
2576 2576 You can also define aliases with parameters using %s specifiers (one
2577 2577 per parameter):
2578 2578
2579 2579 In [1]: alias parts echo first %s second %s
2580 2580 In [2]: %parts A B
2581 2581 first A second B
2582 2582 In [3]: %parts A
2583 2583 Incorrect number of arguments: 2 expected.
2584 2584 parts is an alias to: 'echo first %s second %s'
2585 2585
2586 2586 Note that %l and %s are mutually exclusive. You can only use one or
2587 2587 the other in your aliases.
2588 2588
2589 2589 Aliases expand Python variables just like system calls using ! or !!
2590 2590 do: all expressions prefixed with '$' get expanded. For details of
2591 2591 the semantic rules, see PEP-215:
2592 2592 http://www.python.org/peps/pep-0215.html. This is the library used by
2593 2593 IPython for variable expansion. If you want to access a true shell
2594 2594 variable, an extra $ is necessary to prevent its expansion by IPython:
2595 2595
2596 2596 In [6]: alias show echo
2597 2597 In [7]: PATH='A Python string'
2598 2598 In [8]: show $PATH
2599 2599 A Python string
2600 2600 In [9]: show $$PATH
2601 2601 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2602 2602
2603 2603 You can use the alias facility to acess all of $PATH. See the %rehash
2604 2604 and %rehashx functions, which automatically create aliases for the
2605 2605 contents of your $PATH.
2606 2606
2607 2607 If called with no parameters, %alias prints the current alias table."""
2608 2608
2609 2609 par = parameter_s.strip()
2610 2610 if not par:
2611 2611 stored = self.db.get('stored_aliases', {} )
2612 2612 aliases = sorted(self.shell.alias_manager.aliases)
2613 2613 # for k, v in stored:
2614 2614 # atab.append(k, v[0])
2615 2615
2616 2616 print "Total number of aliases:", len(aliases)
2617 2617 sys.stdout.flush()
2618 2618 return aliases
2619 2619
2620 2620 # Now try to define a new one
2621 2621 try:
2622 2622 alias,cmd = par.split(None, 1)
2623 2623 except:
2624 2624 print oinspect.getdoc(self.magic_alias)
2625 2625 else:
2626 2626 self.shell.alias_manager.soft_define_alias(alias, cmd)
2627 2627 # end magic_alias
2628 2628
2629 2629 def magic_unalias(self, parameter_s = ''):
2630 2630 """Remove an alias"""
2631 2631
2632 2632 aname = parameter_s.strip()
2633 2633 self.shell.alias_manager.undefine_alias(aname)
2634 2634 stored = self.db.get('stored_aliases', {} )
2635 2635 if aname in stored:
2636 2636 print "Removing %stored alias",aname
2637 2637 del stored[aname]
2638 2638 self.db['stored_aliases'] = stored
2639 2639
2640 2640 def magic_rehashx(self, parameter_s = ''):
2641 2641 """Update the alias table with all executable files in $PATH.
2642 2642
2643 2643 This version explicitly checks that every entry in $PATH is a file
2644 2644 with execute access (os.X_OK), so it is much slower than %rehash.
2645 2645
2646 2646 Under Windows, it checks executability as a match agains a
2647 2647 '|'-separated string of extensions, stored in the IPython config
2648 2648 variable win_exec_ext. This defaults to 'exe|com|bat'.
2649 2649
2650 2650 This function also resets the root module cache of module completer,
2651 2651 used on slow filesystems.
2652 2652 """
2653 2653 from IPython.core.alias import InvalidAliasError
2654 2654
2655 2655 # for the benefit of module completer in ipy_completers.py
2656 2656 del self.db['rootmodules']
2657 2657
2658 2658 path = [os.path.abspath(os.path.expanduser(p)) for p in
2659 2659 os.environ.get('PATH','').split(os.pathsep)]
2660 2660 path = filter(os.path.isdir,path)
2661 2661
2662 2662 syscmdlist = []
2663 2663 # Now define isexec in a cross platform manner.
2664 2664 if os.name == 'posix':
2665 2665 isexec = lambda fname:os.path.isfile(fname) and \
2666 2666 os.access(fname,os.X_OK)
2667 2667 else:
2668 2668 try:
2669 2669 winext = os.environ['pathext'].replace(';','|').replace('.','')
2670 2670 except KeyError:
2671 2671 winext = 'exe|com|bat|py'
2672 2672 if 'py' not in winext:
2673 2673 winext += '|py'
2674 2674 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2675 2675 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2676 savedir = os.getcwd()
2676 savedir = os.getcwdu()
2677 2677
2678 2678 # Now walk the paths looking for executables to alias.
2679 2679 try:
2680 2680 # write the whole loop for posix/Windows so we don't have an if in
2681 2681 # the innermost part
2682 2682 if os.name == 'posix':
2683 2683 for pdir in path:
2684 2684 os.chdir(pdir)
2685 2685 for ff in os.listdir(pdir):
2686 2686 if isexec(ff):
2687 2687 try:
2688 2688 # Removes dots from the name since ipython
2689 2689 # will assume names with dots to be python.
2690 2690 self.shell.alias_manager.define_alias(
2691 2691 ff.replace('.',''), ff)
2692 2692 except InvalidAliasError:
2693 2693 pass
2694 2694 else:
2695 2695 syscmdlist.append(ff)
2696 2696 else:
2697 2697 no_alias = self.shell.alias_manager.no_alias
2698 2698 for pdir in path:
2699 2699 os.chdir(pdir)
2700 2700 for ff in os.listdir(pdir):
2701 2701 base, ext = os.path.splitext(ff)
2702 2702 if isexec(ff) and base.lower() not in no_alias:
2703 2703 if ext.lower() == '.exe':
2704 2704 ff = base
2705 2705 try:
2706 2706 # Removes dots from the name since ipython
2707 2707 # will assume names with dots to be python.
2708 2708 self.shell.alias_manager.define_alias(
2709 2709 base.lower().replace('.',''), ff)
2710 2710 except InvalidAliasError:
2711 2711 pass
2712 2712 syscmdlist.append(ff)
2713 2713 db = self.db
2714 2714 db['syscmdlist'] = syscmdlist
2715 2715 finally:
2716 2716 os.chdir(savedir)
2717 2717
2718 2718 @skip_doctest
2719 2719 def magic_pwd(self, parameter_s = ''):
2720 2720 """Return the current working directory path.
2721 2721
2722 2722 Examples
2723 2723 --------
2724 2724 ::
2725 2725
2726 2726 In [9]: pwd
2727 2727 Out[9]: '/home/tsuser/sprint/ipython'
2728 2728 """
2729 return os.getcwd()
2729 return os.getcwdu()
2730 2730
2731 2731 @skip_doctest
2732 2732 def magic_cd(self, parameter_s=''):
2733 2733 """Change the current working directory.
2734 2734
2735 2735 This command automatically maintains an internal list of directories
2736 2736 you visit during your IPython session, in the variable _dh. The
2737 2737 command %dhist shows this history nicely formatted. You can also
2738 2738 do 'cd -<tab>' to see directory history conveniently.
2739 2739
2740 2740 Usage:
2741 2741
2742 2742 cd 'dir': changes to directory 'dir'.
2743 2743
2744 2744 cd -: changes to the last visited directory.
2745 2745
2746 2746 cd -<n>: changes to the n-th directory in the directory history.
2747 2747
2748 2748 cd --foo: change to directory that matches 'foo' in history
2749 2749
2750 2750 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2751 2751 (note: cd <bookmark_name> is enough if there is no
2752 2752 directory <bookmark_name>, but a bookmark with the name exists.)
2753 2753 'cd -b <tab>' allows you to tab-complete bookmark names.
2754 2754
2755 2755 Options:
2756 2756
2757 2757 -q: quiet. Do not print the working directory after the cd command is
2758 2758 executed. By default IPython's cd command does print this directory,
2759 2759 since the default prompts do not display path information.
2760 2760
2761 2761 Note that !cd doesn't work for this purpose because the shell where
2762 2762 !command runs is immediately discarded after executing 'command'.
2763 2763
2764 2764 Examples
2765 2765 --------
2766 2766 ::
2767 2767
2768 2768 In [10]: cd parent/child
2769 2769 /home/tsuser/parent/child
2770 2770 """
2771 2771
2772 2772 parameter_s = parameter_s.strip()
2773 2773 #bkms = self.shell.persist.get("bookmarks",{})
2774 2774
2775 oldcwd = os.getcwd()
2775 oldcwd = os.getcwdu()
2776 2776 numcd = re.match(r'(-)(\d+)$',parameter_s)
2777 2777 # jump in directory history by number
2778 2778 if numcd:
2779 2779 nn = int(numcd.group(2))
2780 2780 try:
2781 2781 ps = self.shell.user_ns['_dh'][nn]
2782 2782 except IndexError:
2783 2783 print 'The requested directory does not exist in history.'
2784 2784 return
2785 2785 else:
2786 2786 opts = {}
2787 2787 elif parameter_s.startswith('--'):
2788 2788 ps = None
2789 2789 fallback = None
2790 2790 pat = parameter_s[2:]
2791 2791 dh = self.shell.user_ns['_dh']
2792 2792 # first search only by basename (last component)
2793 2793 for ent in reversed(dh):
2794 2794 if pat in os.path.basename(ent) and os.path.isdir(ent):
2795 2795 ps = ent
2796 2796 break
2797 2797
2798 2798 if fallback is None and pat in ent and os.path.isdir(ent):
2799 2799 fallback = ent
2800 2800
2801 2801 # if we have no last part match, pick the first full path match
2802 2802 if ps is None:
2803 2803 ps = fallback
2804 2804
2805 2805 if ps is None:
2806 2806 print "No matching entry in directory history"
2807 2807 return
2808 2808 else:
2809 2809 opts = {}
2810 2810
2811 2811
2812 2812 else:
2813 2813 #turn all non-space-escaping backslashes to slashes,
2814 2814 # for c:\windows\directory\names\
2815 2815 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2816 2816 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2817 2817 # jump to previous
2818 2818 if ps == '-':
2819 2819 try:
2820 2820 ps = self.shell.user_ns['_dh'][-2]
2821 2821 except IndexError:
2822 2822 raise UsageError('%cd -: No previous directory to change to.')
2823 2823 # jump to bookmark if needed
2824 2824 else:
2825 2825 if not os.path.isdir(ps) or opts.has_key('b'):
2826 2826 bkms = self.db.get('bookmarks', {})
2827 2827
2828 2828 if bkms.has_key(ps):
2829 2829 target = bkms[ps]
2830 2830 print '(bookmark:%s) -> %s' % (ps,target)
2831 2831 ps = target
2832 2832 else:
2833 2833 if opts.has_key('b'):
2834 2834 raise UsageError("Bookmark '%s' not found. "
2835 2835 "Use '%%bookmark -l' to see your bookmarks." % ps)
2836 2836
2837 2837 # strip extra quotes on Windows, because os.chdir doesn't like them
2838 2838 if sys.platform == 'win32':
2839 2839 ps = ps.strip('\'"')
2840 2840 # at this point ps should point to the target dir
2841 2841 if ps:
2842 2842 try:
2843 2843 os.chdir(os.path.expanduser(ps))
2844 2844 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2845 2845 set_term_title('IPython: ' + abbrev_cwd())
2846 2846 except OSError:
2847 2847 print sys.exc_info()[1]
2848 2848 else:
2849 cwd = os.getcwd()
2849 cwd = os.getcwdu()
2850 2850 dhist = self.shell.user_ns['_dh']
2851 2851 if oldcwd != cwd:
2852 2852 dhist.append(cwd)
2853 2853 self.db['dhist'] = compress_dhist(dhist)[-100:]
2854 2854
2855 2855 else:
2856 2856 os.chdir(self.shell.home_dir)
2857 2857 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2858 2858 set_term_title('IPython: ' + '~')
2859 cwd = os.getcwd()
2859 cwd = os.getcwdu()
2860 2860 dhist = self.shell.user_ns['_dh']
2861 2861
2862 2862 if oldcwd != cwd:
2863 2863 dhist.append(cwd)
2864 2864 self.db['dhist'] = compress_dhist(dhist)[-100:]
2865 2865 if not 'q' in opts and self.shell.user_ns['_dh']:
2866 2866 print self.shell.user_ns['_dh'][-1]
2867 2867
2868 2868
2869 2869 def magic_env(self, parameter_s=''):
2870 2870 """List environment variables."""
2871 2871
2872 2872 return os.environ.data
2873 2873
2874 2874 def magic_pushd(self, parameter_s=''):
2875 2875 """Place the current dir on stack and change directory.
2876 2876
2877 2877 Usage:\\
2878 2878 %pushd ['dirname']
2879 2879 """
2880 2880
2881 2881 dir_s = self.shell.dir_stack
2882 2882 tgt = os.path.expanduser(parameter_s)
2883 cwd = os.getcwd().replace(self.home_dir,'~')
2883 cwd = os.getcwdu().replace(self.home_dir,'~')
2884 2884 if tgt:
2885 2885 self.magic_cd(parameter_s)
2886 2886 dir_s.insert(0,cwd)
2887 2887 return self.magic_dirs()
2888 2888
2889 2889 def magic_popd(self, parameter_s=''):
2890 2890 """Change to directory popped off the top of the stack.
2891 2891 """
2892 2892 if not self.shell.dir_stack:
2893 2893 raise UsageError("%popd on empty stack")
2894 2894 top = self.shell.dir_stack.pop(0)
2895 2895 self.magic_cd(top)
2896 2896 print "popd ->",top
2897 2897
2898 2898 def magic_dirs(self, parameter_s=''):
2899 2899 """Return the current directory stack."""
2900 2900
2901 2901 return self.shell.dir_stack
2902 2902
2903 2903 def magic_dhist(self, parameter_s=''):
2904 2904 """Print your history of visited directories.
2905 2905
2906 2906 %dhist -> print full history\\
2907 2907 %dhist n -> print last n entries only\\
2908 2908 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2909 2909
2910 2910 This history is automatically maintained by the %cd command, and
2911 2911 always available as the global list variable _dh. You can use %cd -<n>
2912 2912 to go to directory number <n>.
2913 2913
2914 2914 Note that most of time, you should view directory history by entering
2915 2915 cd -<TAB>.
2916 2916
2917 2917 """
2918 2918
2919 2919 dh = self.shell.user_ns['_dh']
2920 2920 if parameter_s:
2921 2921 try:
2922 2922 args = map(int,parameter_s.split())
2923 2923 except:
2924 2924 self.arg_err(Magic.magic_dhist)
2925 2925 return
2926 2926 if len(args) == 1:
2927 2927 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2928 2928 elif len(args) == 2:
2929 2929 ini,fin = args
2930 2930 else:
2931 2931 self.arg_err(Magic.magic_dhist)
2932 2932 return
2933 2933 else:
2934 2934 ini,fin = 0,len(dh)
2935 2935 nlprint(dh,
2936 2936 header = 'Directory history (kept in _dh)',
2937 2937 start=ini,stop=fin)
2938 2938
2939 2939 @skip_doctest
2940 2940 def magic_sc(self, parameter_s=''):
2941 2941 """Shell capture - execute a shell command and capture its output.
2942 2942
2943 2943 DEPRECATED. Suboptimal, retained for backwards compatibility.
2944 2944
2945 2945 You should use the form 'var = !command' instead. Example:
2946 2946
2947 2947 "%sc -l myfiles = ls ~" should now be written as
2948 2948
2949 2949 "myfiles = !ls ~"
2950 2950
2951 2951 myfiles.s, myfiles.l and myfiles.n still apply as documented
2952 2952 below.
2953 2953
2954 2954 --
2955 2955 %sc [options] varname=command
2956 2956
2957 2957 IPython will run the given command using commands.getoutput(), and
2958 2958 will then update the user's interactive namespace with a variable
2959 2959 called varname, containing the value of the call. Your command can
2960 2960 contain shell wildcards, pipes, etc.
2961 2961
2962 2962 The '=' sign in the syntax is mandatory, and the variable name you
2963 2963 supply must follow Python's standard conventions for valid names.
2964 2964
2965 2965 (A special format without variable name exists for internal use)
2966 2966
2967 2967 Options:
2968 2968
2969 2969 -l: list output. Split the output on newlines into a list before
2970 2970 assigning it to the given variable. By default the output is stored
2971 2971 as a single string.
2972 2972
2973 2973 -v: verbose. Print the contents of the variable.
2974 2974
2975 2975 In most cases you should not need to split as a list, because the
2976 2976 returned value is a special type of string which can automatically
2977 2977 provide its contents either as a list (split on newlines) or as a
2978 2978 space-separated string. These are convenient, respectively, either
2979 2979 for sequential processing or to be passed to a shell command.
2980 2980
2981 2981 For example:
2982 2982
2983 2983 # all-random
2984 2984
2985 2985 # Capture into variable a
2986 2986 In [1]: sc a=ls *py
2987 2987
2988 2988 # a is a string with embedded newlines
2989 2989 In [2]: a
2990 2990 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2991 2991
2992 2992 # which can be seen as a list:
2993 2993 In [3]: a.l
2994 2994 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2995 2995
2996 2996 # or as a whitespace-separated string:
2997 2997 In [4]: a.s
2998 2998 Out[4]: 'setup.py win32_manual_post_install.py'
2999 2999
3000 3000 # a.s is useful to pass as a single command line:
3001 3001 In [5]: !wc -l $a.s
3002 3002 146 setup.py
3003 3003 130 win32_manual_post_install.py
3004 3004 276 total
3005 3005
3006 3006 # while the list form is useful to loop over:
3007 3007 In [6]: for f in a.l:
3008 3008 ...: !wc -l $f
3009 3009 ...:
3010 3010 146 setup.py
3011 3011 130 win32_manual_post_install.py
3012 3012
3013 3013 Similiarly, the lists returned by the -l option are also special, in
3014 3014 the sense that you can equally invoke the .s attribute on them to
3015 3015 automatically get a whitespace-separated string from their contents:
3016 3016
3017 3017 In [7]: sc -l b=ls *py
3018 3018
3019 3019 In [8]: b
3020 3020 Out[8]: ['setup.py', 'win32_manual_post_install.py']
3021 3021
3022 3022 In [9]: b.s
3023 3023 Out[9]: 'setup.py win32_manual_post_install.py'
3024 3024
3025 3025 In summary, both the lists and strings used for ouptut capture have
3026 3026 the following special attributes:
3027 3027
3028 3028 .l (or .list) : value as list.
3029 3029 .n (or .nlstr): value as newline-separated string.
3030 3030 .s (or .spstr): value as space-separated string.
3031 3031 """
3032 3032
3033 3033 opts,args = self.parse_options(parameter_s,'lv')
3034 3034 # Try to get a variable name and command to run
3035 3035 try:
3036 3036 # the variable name must be obtained from the parse_options
3037 3037 # output, which uses shlex.split to strip options out.
3038 3038 var,_ = args.split('=',1)
3039 3039 var = var.strip()
3040 3040 # But the the command has to be extracted from the original input
3041 3041 # parameter_s, not on what parse_options returns, to avoid the
3042 3042 # quote stripping which shlex.split performs on it.
3043 3043 _,cmd = parameter_s.split('=',1)
3044 3044 except ValueError:
3045 3045 var,cmd = '',''
3046 3046 # If all looks ok, proceed
3047 3047 split = 'l' in opts
3048 3048 out = self.shell.getoutput(cmd, split=split)
3049 3049 if opts.has_key('v'):
3050 3050 print '%s ==\n%s' % (var,pformat(out))
3051 3051 if var:
3052 3052 self.shell.user_ns.update({var:out})
3053 3053 else:
3054 3054 return out
3055 3055
3056 3056 def magic_sx(self, parameter_s=''):
3057 3057 """Shell execute - run a shell command and capture its output.
3058 3058
3059 3059 %sx command
3060 3060
3061 3061 IPython will run the given command using commands.getoutput(), and
3062 3062 return the result formatted as a list (split on '\\n'). Since the
3063 3063 output is _returned_, it will be stored in ipython's regular output
3064 3064 cache Out[N] and in the '_N' automatic variables.
3065 3065
3066 3066 Notes:
3067 3067
3068 3068 1) If an input line begins with '!!', then %sx is automatically
3069 3069 invoked. That is, while:
3070 3070 !ls
3071 3071 causes ipython to simply issue system('ls'), typing
3072 3072 !!ls
3073 3073 is a shorthand equivalent to:
3074 3074 %sx ls
3075 3075
3076 3076 2) %sx differs from %sc in that %sx automatically splits into a list,
3077 3077 like '%sc -l'. The reason for this is to make it as easy as possible
3078 3078 to process line-oriented shell output via further python commands.
3079 3079 %sc is meant to provide much finer control, but requires more
3080 3080 typing.
3081 3081
3082 3082 3) Just like %sc -l, this is a list with special attributes:
3083 3083
3084 3084 .l (or .list) : value as list.
3085 3085 .n (or .nlstr): value as newline-separated string.
3086 3086 .s (or .spstr): value as whitespace-separated string.
3087 3087
3088 3088 This is very useful when trying to use such lists as arguments to
3089 3089 system commands."""
3090 3090
3091 3091 if parameter_s:
3092 3092 return self.shell.getoutput(parameter_s)
3093 3093
3094 3094
3095 3095 def magic_bookmark(self, parameter_s=''):
3096 3096 """Manage IPython's bookmark system.
3097 3097
3098 3098 %bookmark <name> - set bookmark to current dir
3099 3099 %bookmark <name> <dir> - set bookmark to <dir>
3100 3100 %bookmark -l - list all bookmarks
3101 3101 %bookmark -d <name> - remove bookmark
3102 3102 %bookmark -r - remove all bookmarks
3103 3103
3104 3104 You can later on access a bookmarked folder with:
3105 3105 %cd -b <name>
3106 3106 or simply '%cd <name>' if there is no directory called <name> AND
3107 3107 there is such a bookmark defined.
3108 3108
3109 3109 Your bookmarks persist through IPython sessions, but they are
3110 3110 associated with each profile."""
3111 3111
3112 3112 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3113 3113 if len(args) > 2:
3114 3114 raise UsageError("%bookmark: too many arguments")
3115 3115
3116 3116 bkms = self.db.get('bookmarks',{})
3117 3117
3118 3118 if opts.has_key('d'):
3119 3119 try:
3120 3120 todel = args[0]
3121 3121 except IndexError:
3122 3122 raise UsageError(
3123 3123 "%bookmark -d: must provide a bookmark to delete")
3124 3124 else:
3125 3125 try:
3126 3126 del bkms[todel]
3127 3127 except KeyError:
3128 3128 raise UsageError(
3129 3129 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3130 3130
3131 3131 elif opts.has_key('r'):
3132 3132 bkms = {}
3133 3133 elif opts.has_key('l'):
3134 3134 bks = bkms.keys()
3135 3135 bks.sort()
3136 3136 if bks:
3137 3137 size = max(map(len,bks))
3138 3138 else:
3139 3139 size = 0
3140 3140 fmt = '%-'+str(size)+'s -> %s'
3141 3141 print 'Current bookmarks:'
3142 3142 for bk in bks:
3143 3143 print fmt % (bk,bkms[bk])
3144 3144 else:
3145 3145 if not args:
3146 3146 raise UsageError("%bookmark: You must specify the bookmark name")
3147 3147 elif len(args)==1:
3148 bkms[args[0]] = os.getcwd()
3148 bkms[args[0]] = os.getcwdu()
3149 3149 elif len(args)==2:
3150 3150 bkms[args[0]] = args[1]
3151 3151 self.db['bookmarks'] = bkms
3152 3152
3153 3153 def magic_pycat(self, parameter_s=''):
3154 3154 """Show a syntax-highlighted file through a pager.
3155 3155
3156 3156 This magic is similar to the cat utility, but it will assume the file
3157 3157 to be Python source and will show it with syntax highlighting. """
3158 3158
3159 3159 try:
3160 3160 filename = get_py_filename(parameter_s)
3161 3161 cont = file_read(filename)
3162 3162 except IOError:
3163 3163 try:
3164 3164 cont = eval(parameter_s,self.user_ns)
3165 3165 except NameError:
3166 3166 cont = None
3167 3167 if cont is None:
3168 3168 print "Error: no such file or variable"
3169 3169 return
3170 3170
3171 3171 page.page(self.shell.pycolorize(cont))
3172 3172
3173 3173 def _rerun_pasted(self):
3174 3174 """ Rerun a previously pasted command.
3175 3175 """
3176 3176 b = self.user_ns.get('pasted_block', None)
3177 3177 if b is None:
3178 3178 raise UsageError('No previous pasted block available')
3179 3179 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3180 3180 exec b in self.user_ns
3181 3181
3182 3182 def _get_pasted_lines(self, sentinel):
3183 3183 """ Yield pasted lines until the user enters the given sentinel value.
3184 3184 """
3185 3185 from IPython.core import interactiveshell
3186 3186 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3187 3187 while True:
3188 3188 l = interactiveshell.raw_input_original(':')
3189 3189 if l == sentinel:
3190 3190 return
3191 3191 else:
3192 3192 yield l
3193 3193
3194 3194 def _strip_pasted_lines_for_code(self, raw_lines):
3195 3195 """ Strip non-code parts of a sequence of lines to return a block of
3196 3196 code.
3197 3197 """
3198 3198 # Regular expressions that declare text we strip from the input:
3199 3199 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3200 3200 r'^\s*(\s?>)+', # Python input prompt
3201 3201 r'^\s*\.{3,}', # Continuation prompts
3202 3202 r'^\++',
3203 3203 ]
3204 3204
3205 3205 strip_from_start = map(re.compile,strip_re)
3206 3206
3207 3207 lines = []
3208 3208 for l in raw_lines:
3209 3209 for pat in strip_from_start:
3210 3210 l = pat.sub('',l)
3211 3211 lines.append(l)
3212 3212
3213 3213 block = "\n".join(lines) + '\n'
3214 3214 #print "block:\n",block
3215 3215 return block
3216 3216
3217 3217 def _execute_block(self, block, par):
3218 3218 """ Execute a block, or store it in a variable, per the user's request.
3219 3219 """
3220 3220 if not par:
3221 3221 b = textwrap.dedent(block)
3222 3222 self.user_ns['pasted_block'] = b
3223 3223 exec b in self.user_ns
3224 3224 else:
3225 3225 self.user_ns[par] = SList(block.splitlines())
3226 3226 print "Block assigned to '%s'" % par
3227 3227
3228 3228 def magic_quickref(self,arg):
3229 3229 """ Show a quick reference sheet """
3230 3230 import IPython.core.usage
3231 3231 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3232 3232
3233 3233 page.page(qr)
3234 3234
3235 3235 def magic_doctest_mode(self,parameter_s=''):
3236 3236 """Toggle doctest mode on and off.
3237 3237
3238 3238 This mode is intended to make IPython behave as much as possible like a
3239 3239 plain Python shell, from the perspective of how its prompts, exceptions
3240 3240 and output look. This makes it easy to copy and paste parts of a
3241 3241 session into doctests. It does so by:
3242 3242
3243 3243 - Changing the prompts to the classic ``>>>`` ones.
3244 3244 - Changing the exception reporting mode to 'Plain'.
3245 3245 - Disabling pretty-printing of output.
3246 3246
3247 3247 Note that IPython also supports the pasting of code snippets that have
3248 3248 leading '>>>' and '...' prompts in them. This means that you can paste
3249 3249 doctests from files or docstrings (even if they have leading
3250 3250 whitespace), and the code will execute correctly. You can then use
3251 3251 '%history -t' to see the translated history; this will give you the
3252 3252 input after removal of all the leading prompts and whitespace, which
3253 3253 can be pasted back into an editor.
3254 3254
3255 3255 With these features, you can switch into this mode easily whenever you
3256 3256 need to do testing and changes to doctests, without having to leave
3257 3257 your existing IPython session.
3258 3258 """
3259 3259
3260 3260 from IPython.utils.ipstruct import Struct
3261 3261
3262 3262 # Shorthands
3263 3263 shell = self.shell
3264 3264 oc = shell.displayhook
3265 3265 meta = shell.meta
3266 3266 disp_formatter = self.shell.display_formatter
3267 3267 ptformatter = disp_formatter.formatters['text/plain']
3268 3268 # dstore is a data store kept in the instance metadata bag to track any
3269 3269 # changes we make, so we can undo them later.
3270 3270 dstore = meta.setdefault('doctest_mode',Struct())
3271 3271 save_dstore = dstore.setdefault
3272 3272
3273 3273 # save a few values we'll need to recover later
3274 3274 mode = save_dstore('mode',False)
3275 3275 save_dstore('rc_pprint',ptformatter.pprint)
3276 3276 save_dstore('xmode',shell.InteractiveTB.mode)
3277 3277 save_dstore('rc_separate_out',shell.separate_out)
3278 3278 save_dstore('rc_separate_out2',shell.separate_out2)
3279 3279 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3280 3280 save_dstore('rc_separate_in',shell.separate_in)
3281 3281 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3282 3282
3283 3283 if mode == False:
3284 3284 # turn on
3285 3285 oc.prompt1.p_template = '>>> '
3286 3286 oc.prompt2.p_template = '... '
3287 3287 oc.prompt_out.p_template = ''
3288 3288
3289 3289 # Prompt separators like plain python
3290 3290 oc.input_sep = oc.prompt1.sep = ''
3291 3291 oc.output_sep = ''
3292 3292 oc.output_sep2 = ''
3293 3293
3294 3294 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3295 3295 oc.prompt_out.pad_left = False
3296 3296
3297 3297 ptformatter.pprint = False
3298 3298 disp_formatter.plain_text_only = True
3299 3299
3300 3300 shell.magic_xmode('Plain')
3301 3301 else:
3302 3302 # turn off
3303 3303 oc.prompt1.p_template = shell.prompt_in1
3304 3304 oc.prompt2.p_template = shell.prompt_in2
3305 3305 oc.prompt_out.p_template = shell.prompt_out
3306 3306
3307 3307 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3308 3308
3309 3309 oc.output_sep = dstore.rc_separate_out
3310 3310 oc.output_sep2 = dstore.rc_separate_out2
3311 3311
3312 3312 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3313 3313 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3314 3314
3315 3315 ptformatter.pprint = dstore.rc_pprint
3316 3316 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3317 3317
3318 3318 shell.magic_xmode(dstore.xmode)
3319 3319
3320 3320 # Store new mode and inform
3321 3321 dstore.mode = bool(1-int(mode))
3322 3322 mode_label = ['OFF','ON'][dstore.mode]
3323 3323 print 'Doctest mode is:', mode_label
3324 3324
3325 3325 def magic_gui(self, parameter_s=''):
3326 3326 """Enable or disable IPython GUI event loop integration.
3327 3327
3328 3328 %gui [GUINAME]
3329 3329
3330 3330 This magic replaces IPython's threaded shells that were activated
3331 3331 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3332 3332 can now be enabled, disabled and changed at runtime and keyboard
3333 3333 interrupts should work without any problems. The following toolkits
3334 3334 are supported: wxPython, PyQt4, PyGTK, and Tk::
3335 3335
3336 3336 %gui wx # enable wxPython event loop integration
3337 3337 %gui qt4|qt # enable PyQt4 event loop integration
3338 3338 %gui gtk # enable PyGTK event loop integration
3339 3339 %gui tk # enable Tk event loop integration
3340 3340 %gui # disable all event loop integration
3341 3341
3342 3342 WARNING: after any of these has been called you can simply create
3343 3343 an application object, but DO NOT start the event loop yourself, as
3344 3344 we have already handled that.
3345 3345 """
3346 3346 from IPython.lib.inputhook import enable_gui
3347 3347 opts, arg = self.parse_options(parameter_s, '')
3348 3348 if arg=='': arg = None
3349 3349 return enable_gui(arg)
3350 3350
3351 3351 def magic_load_ext(self, module_str):
3352 3352 """Load an IPython extension by its module name."""
3353 3353 return self.extension_manager.load_extension(module_str)
3354 3354
3355 3355 def magic_unload_ext(self, module_str):
3356 3356 """Unload an IPython extension by its module name."""
3357 3357 self.extension_manager.unload_extension(module_str)
3358 3358
3359 3359 def magic_reload_ext(self, module_str):
3360 3360 """Reload an IPython extension by its module name."""
3361 3361 self.extension_manager.reload_extension(module_str)
3362 3362
3363 3363 @skip_doctest
3364 3364 def magic_install_profiles(self, s):
3365 3365 """Install the default IPython profiles into the .ipython dir.
3366 3366
3367 3367 If the default profiles have already been installed, they will not
3368 3368 be overwritten. You can force overwriting them by using the ``-o``
3369 3369 option::
3370 3370
3371 3371 In [1]: %install_profiles -o
3372 3372 """
3373 3373 if '-o' in s:
3374 3374 overwrite = True
3375 3375 else:
3376 3376 overwrite = False
3377 3377 from IPython.config import profile
3378 3378 profile_dir = os.path.dirname(profile.__file__)
3379 3379 ipython_dir = self.ipython_dir
3380 3380 print "Installing profiles to: %s [overwrite=%s]"%(ipython_dir,overwrite)
3381 3381 for src in os.listdir(profile_dir):
3382 3382 if src.startswith('profile_'):
3383 3383 name = src.replace('profile_', '')
3384 3384 print " %s"%name
3385 3385 pd = ProfileDir.create_profile_dir_by_name(ipython_dir, name)
3386 3386 pd.copy_config_file('ipython_config.py', path=src,
3387 3387 overwrite=overwrite)
3388 3388
3389 3389 @skip_doctest
3390 3390 def magic_install_default_config(self, s):
3391 3391 """Install IPython's default config file into the .ipython dir.
3392 3392
3393 3393 If the default config file (:file:`ipython_config.py`) is already
3394 3394 installed, it will not be overwritten. You can force overwriting
3395 3395 by using the ``-o`` option::
3396 3396
3397 3397 In [1]: %install_default_config
3398 3398 """
3399 3399 if '-o' in s:
3400 3400 overwrite = True
3401 3401 else:
3402 3402 overwrite = False
3403 3403 pd = self.shell.profile_dir
3404 3404 print "Installing default config file in: %s" % pd.location
3405 3405 pd.copy_config_file('ipython_config.py', overwrite=overwrite)
3406 3406
3407 3407 # Pylab support: simple wrappers that activate pylab, load gui input
3408 3408 # handling and modify slightly %run
3409 3409
3410 3410 @skip_doctest
3411 3411 def _pylab_magic_run(self, parameter_s=''):
3412 3412 Magic.magic_run(self, parameter_s,
3413 3413 runner=mpl_runner(self.shell.safe_execfile))
3414 3414
3415 3415 _pylab_magic_run.__doc__ = magic_run.__doc__
3416 3416
3417 3417 @skip_doctest
3418 3418 def magic_pylab(self, s):
3419 3419 """Load numpy and matplotlib to work interactively.
3420 3420
3421 3421 %pylab [GUINAME]
3422 3422
3423 3423 This function lets you activate pylab (matplotlib, numpy and
3424 3424 interactive support) at any point during an IPython session.
3425 3425
3426 3426 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3427 3427 pylab and mlab, as well as all names from numpy and pylab.
3428 3428
3429 3429 Parameters
3430 3430 ----------
3431 3431 guiname : optional
3432 3432 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk', 'osx' or
3433 3433 'tk'). If given, the corresponding Matplotlib backend is used,
3434 3434 otherwise matplotlib's default (which you can override in your
3435 3435 matplotlib config file) is used.
3436 3436
3437 3437 Examples
3438 3438 --------
3439 3439 In this case, where the MPL default is TkAgg:
3440 3440 In [2]: %pylab
3441 3441
3442 3442 Welcome to pylab, a matplotlib-based Python environment.
3443 3443 Backend in use: TkAgg
3444 3444 For more information, type 'help(pylab)'.
3445 3445
3446 3446 But you can explicitly request a different backend:
3447 3447 In [3]: %pylab qt
3448 3448
3449 3449 Welcome to pylab, a matplotlib-based Python environment.
3450 3450 Backend in use: Qt4Agg
3451 3451 For more information, type 'help(pylab)'.
3452 3452 """
3453 3453 self.shell.enable_pylab(s)
3454 3454
3455 3455 def magic_tb(self, s):
3456 3456 """Print the last traceback with the currently active exception mode.
3457 3457
3458 3458 See %xmode for changing exception reporting modes."""
3459 3459 self.shell.showtraceback()
3460 3460
3461 3461 @skip_doctest
3462 3462 def magic_precision(self, s=''):
3463 3463 """Set floating point precision for pretty printing.
3464 3464
3465 3465 Can set either integer precision or a format string.
3466 3466
3467 3467 If numpy has been imported and precision is an int,
3468 3468 numpy display precision will also be set, via ``numpy.set_printoptions``.
3469 3469
3470 3470 If no argument is given, defaults will be restored.
3471 3471
3472 3472 Examples
3473 3473 --------
3474 3474 ::
3475 3475
3476 3476 In [1]: from math import pi
3477 3477
3478 3478 In [2]: %precision 3
3479 3479 Out[2]: u'%.3f'
3480 3480
3481 3481 In [3]: pi
3482 3482 Out[3]: 3.142
3483 3483
3484 3484 In [4]: %precision %i
3485 3485 Out[4]: u'%i'
3486 3486
3487 3487 In [5]: pi
3488 3488 Out[5]: 3
3489 3489
3490 3490 In [6]: %precision %e
3491 3491 Out[6]: u'%e'
3492 3492
3493 3493 In [7]: pi**10
3494 3494 Out[7]: 9.364805e+04
3495 3495
3496 3496 In [8]: %precision
3497 3497 Out[8]: u'%r'
3498 3498
3499 3499 In [9]: pi**10
3500 3500 Out[9]: 93648.047476082982
3501 3501
3502 3502 """
3503 3503
3504 3504 ptformatter = self.shell.display_formatter.formatters['text/plain']
3505 3505 ptformatter.float_precision = s
3506 3506 return ptformatter.float_format
3507 3507
3508 3508 # end Magic
@@ -1,207 +1,207 b''
1 1 # encoding: utf-8
2 2 """
3 3 An object for managing IPython profile directories.
4 4
5 5 Authors:
6 6
7 7 * Brian Granger
8 8 * Fernando Perez
9 9 * Min RK
10 10
11 11 """
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Copyright (C) 2008-2011 The IPython Development Team
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Imports
22 22 #-----------------------------------------------------------------------------
23 23
24 24 import os
25 25 import shutil
26 26 import sys
27 27
28 28 from IPython.config.configurable import Configurable
29 29 from IPython.config.loader import Config
30 30 from IPython.utils.path import get_ipython_package_dir, expand_path
31 31 from IPython.utils.traitlets import List, Unicode, Bool
32 32
33 33 #-----------------------------------------------------------------------------
34 34 # Classes and functions
35 35 #-----------------------------------------------------------------------------
36 36
37 37
38 38 #-----------------------------------------------------------------------------
39 39 # Module errors
40 40 #-----------------------------------------------------------------------------
41 41
42 42 class ProfileDirError(Exception):
43 43 pass
44 44
45 45
46 46 #-----------------------------------------------------------------------------
47 47 # Class for managing profile directories
48 48 #-----------------------------------------------------------------------------
49 49
50 50 class ProfileDir(Configurable):
51 51 """An object to manage the profile directory and its resources.
52 52
53 53 The profile directory is used by all IPython applications, to manage
54 54 configuration, logging and security.
55 55
56 56 This object knows how to find, create and manage these directories. This
57 57 should be used by any code that wants to handle profiles.
58 58 """
59 59
60 60 security_dir_name = Unicode('security')
61 61 log_dir_name = Unicode('log')
62 62 pid_dir_name = Unicode('pid')
63 63 security_dir = Unicode(u'')
64 64 log_dir = Unicode(u'')
65 65 pid_dir = Unicode(u'')
66 66
67 67 location = Unicode(u'', config=True,
68 68 help="""Set the profile location directly. This overrides the logic used by the
69 69 `profile` option.""",
70 70 )
71 71
72 72 _location_isset = Bool(False) # flag for detecting multiply set location
73 73
74 74 def _location_changed(self, name, old, new):
75 75 if self._location_isset:
76 76 raise RuntimeError("Cannot set profile location more than once.")
77 77 self._location_isset = True
78 78 if not os.path.isdir(new):
79 79 os.makedirs(new)
80 80
81 81 # ensure config files exist:
82 82 self.security_dir = os.path.join(new, self.security_dir_name)
83 83 self.log_dir = os.path.join(new, self.log_dir_name)
84 84 self.pid_dir = os.path.join(new, self.pid_dir_name)
85 85 self.check_dirs()
86 86
87 87 def _log_dir_changed(self, name, old, new):
88 88 self.check_log_dir()
89 89
90 90 def check_log_dir(self):
91 91 if not os.path.isdir(self.log_dir):
92 92 os.mkdir(self.log_dir)
93 93
94 94 def _security_dir_changed(self, name, old, new):
95 95 self.check_security_dir()
96 96
97 97 def check_security_dir(self):
98 98 if not os.path.isdir(self.security_dir):
99 99 os.mkdir(self.security_dir, 0700)
100 100 else:
101 101 os.chmod(self.security_dir, 0700)
102 102
103 103 def _pid_dir_changed(self, name, old, new):
104 104 self.check_pid_dir()
105 105
106 106 def check_pid_dir(self):
107 107 if not os.path.isdir(self.pid_dir):
108 108 os.mkdir(self.pid_dir, 0700)
109 109 else:
110 110 os.chmod(self.pid_dir, 0700)
111 111
112 112 def check_dirs(self):
113 113 self.check_security_dir()
114 114 self.check_log_dir()
115 115 self.check_pid_dir()
116 116
117 117 def copy_config_file(self, config_file, path=None, overwrite=False):
118 118 """Copy a default config file into the active profile directory.
119 119
120 120 Default configuration files are kept in :mod:`IPython.config.default`.
121 121 This function moves these from that location to the working profile
122 122 directory.
123 123 """
124 124 dst = os.path.join(self.location, config_file)
125 125 if os.path.isfile(dst) and not overwrite:
126 126 return False
127 127 if path is None:
128 128 path = os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default')
129 129 src = os.path.join(path, config_file)
130 130 shutil.copy(src, dst)
131 131 return True
132 132
133 133 @classmethod
134 134 def create_profile_dir(cls, profile_dir, config=None):
135 135 """Create a new profile directory given a full path.
136 136
137 137 Parameters
138 138 ----------
139 139 profile_dir : str
140 140 The full path to the profile directory. If it does exist, it will
141 141 be used. If not, it will be created.
142 142 """
143 143 return cls(location=profile_dir, config=config)
144 144
145 145 @classmethod
146 146 def create_profile_dir_by_name(cls, path, name=u'default', config=None):
147 147 """Create a profile dir by profile name and path.
148 148
149 149 Parameters
150 150 ----------
151 151 path : unicode
152 152 The path (directory) to put the profile directory in.
153 153 name : unicode
154 154 The name of the profile. The name of the profile directory will
155 155 be "profile_<profile>".
156 156 """
157 157 if not os.path.isdir(path):
158 158 raise ProfileDirError('Directory not found: %s' % path)
159 159 profile_dir = os.path.join(path, u'profile_' + name)
160 160 return cls(location=profile_dir, config=config)
161 161
162 162 @classmethod
163 163 def find_profile_dir_by_name(cls, ipython_dir, name=u'default', config=None):
164 164 """Find an existing profile dir by profile name, return its ProfileDir.
165 165
166 166 This searches through a sequence of paths for a profile dir. If it
167 167 is not found, a :class:`ProfileDirError` exception will be raised.
168 168
169 169 The search path algorithm is:
170 1. ``os.getcwd()``
170 1. ``os.getcwdu()``
171 171 2. ``ipython_dir``
172 172
173 173 Parameters
174 174 ----------
175 175 ipython_dir : unicode or str
176 176 The IPython directory to use.
177 177 name : unicode or str
178 178 The name of the profile. The name of the profile directory
179 179 will be "profile_<profile>".
180 180 """
181 181 dirname = u'profile_' + name
182 182 paths = [os.getcwdu(), ipython_dir]
183 183 for p in paths:
184 184 profile_dir = os.path.join(p, dirname)
185 185 if os.path.isdir(profile_dir):
186 186 return cls(location=profile_dir, config=config)
187 187 else:
188 188 raise ProfileDirError('Profile directory not found in paths: %s' % dirname)
189 189
190 190 @classmethod
191 191 def find_profile_dir(cls, profile_dir, config=None):
192 192 """Find/create a profile dir and return its ProfileDir.
193 193
194 194 This will create the profile directory if it doesn't exist.
195 195
196 196 Parameters
197 197 ----------
198 198 profile_dir : unicode or str
199 199 The path of the profile directory. This is expanded using
200 200 :func:`IPython.utils.genutils.expand_path`.
201 201 """
202 202 profile_dir = expand_path(profile_dir)
203 203 if not os.path.isdir(profile_dir):
204 204 raise ProfileDirError('Profile directory not found: %s' % profile_dir)
205 205 return cls(location=profile_dir, config=config)
206 206
207 207
@@ -1,436 +1,436 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Classes for handling input/output prompts.
3 3
4 4 Authors:
5 5
6 6 * Fernando Perez
7 7 * Brian Granger
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (C) 2008-2010 The IPython Development Team
12 12 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21
22 22 import os
23 23 import re
24 24 import socket
25 25 import sys
26 26
27 27 from IPython.core import release
28 28 from IPython.external.Itpl import ItplNS
29 29 from IPython.utils import coloransi
30 30
31 31 #-----------------------------------------------------------------------------
32 32 # Color schemes for prompts
33 33 #-----------------------------------------------------------------------------
34 34
35 35 PromptColors = coloransi.ColorSchemeTable()
36 36 InputColors = coloransi.InputTermColors # just a shorthand
37 37 Colors = coloransi.TermColors # just a shorthand
38 38
39 39 PromptColors.add_scheme(coloransi.ColorScheme(
40 40 'NoColor',
41 41 in_prompt = InputColors.NoColor, # Input prompt
42 42 in_number = InputColors.NoColor, # Input prompt number
43 43 in_prompt2 = InputColors.NoColor, # Continuation prompt
44 44 in_normal = InputColors.NoColor, # color off (usu. Colors.Normal)
45 45
46 46 out_prompt = Colors.NoColor, # Output prompt
47 47 out_number = Colors.NoColor, # Output prompt number
48 48
49 49 normal = Colors.NoColor # color off (usu. Colors.Normal)
50 50 ))
51 51
52 52 # make some schemes as instances so we can copy them for modification easily:
53 53 __PColLinux = coloransi.ColorScheme(
54 54 'Linux',
55 55 in_prompt = InputColors.Green,
56 56 in_number = InputColors.LightGreen,
57 57 in_prompt2 = InputColors.Green,
58 58 in_normal = InputColors.Normal, # color off (usu. Colors.Normal)
59 59
60 60 out_prompt = Colors.Red,
61 61 out_number = Colors.LightRed,
62 62
63 63 normal = Colors.Normal
64 64 )
65 65 # Don't forget to enter it into the table!
66 66 PromptColors.add_scheme(__PColLinux)
67 67
68 68 # Slightly modified Linux for light backgrounds
69 69 __PColLightBG = __PColLinux.copy('LightBG')
70 70
71 71 __PColLightBG.colors.update(
72 72 in_prompt = InputColors.Blue,
73 73 in_number = InputColors.LightBlue,
74 74 in_prompt2 = InputColors.Blue
75 75 )
76 76 PromptColors.add_scheme(__PColLightBG)
77 77
78 78 del Colors,InputColors
79 79
80 80 #-----------------------------------------------------------------------------
81 81 # Utilities
82 82 #-----------------------------------------------------------------------------
83 83
84 84 def multiple_replace(dict, text):
85 85 """ Replace in 'text' all occurences of any key in the given
86 86 dictionary by its corresponding value. Returns the new string."""
87 87
88 88 # Function by Xavier Defrang, originally found at:
89 89 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81330
90 90
91 91 # Create a regular expression from the dictionary keys
92 92 regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
93 93 # For each match, look-up corresponding value in dictionary
94 94 return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text)
95 95
96 96 #-----------------------------------------------------------------------------
97 97 # Special characters that can be used in prompt templates, mainly bash-like
98 98 #-----------------------------------------------------------------------------
99 99
100 100 # If $HOME isn't defined (Windows), make it an absurd string so that it can
101 101 # never be expanded out into '~'. Basically anything which can never be a
102 102 # reasonable directory name will do, we just want the $HOME -> '~' operation
103 103 # to become a no-op. We pre-compute $HOME here so it's not done on every
104 104 # prompt call.
105 105
106 106 # FIXME:
107 107
108 108 # - This should be turned into a class which does proper namespace management,
109 109 # since the prompt specials need to be evaluated in a certain namespace.
110 110 # Currently it's just globals, which need to be managed manually by code
111 111 # below.
112 112
113 113 # - I also need to split up the color schemes from the prompt specials
114 114 # somehow. I don't have a clean design for that quite yet.
115 115
116 116 HOME = os.environ.get("HOME","//////:::::ZZZZZ,,,~~~")
117 117
118 118 # We precompute a few more strings here for the prompt_specials, which are
119 119 # fixed once ipython starts. This reduces the runtime overhead of computing
120 120 # prompt strings.
121 121 USER = os.environ.get("USER")
122 122 HOSTNAME = socket.gethostname()
123 123 HOSTNAME_SHORT = HOSTNAME.split(".")[0]
124 124 ROOT_SYMBOL = "$#"[os.name=='nt' or os.getuid()==0]
125 125
126 126 prompt_specials_color = {
127 127 # Prompt/history count
128 128 '%n' : '${self.col_num}' '${self.cache.prompt_count}' '${self.col_p}',
129 129 r'\#': '${self.col_num}' '${self.cache.prompt_count}' '${self.col_p}',
130 130 # Just the prompt counter number, WITHOUT any coloring wrappers, so users
131 131 # can get numbers displayed in whatever color they want.
132 132 r'\N': '${self.cache.prompt_count}',
133 133
134 134 # Prompt/history count, with the actual digits replaced by dots. Used
135 135 # mainly in continuation prompts (prompt_in2)
136 136 #r'\D': '${"."*len(str(self.cache.prompt_count))}',
137 137
138 138 # More robust form of the above expression, that uses the __builtin__
139 139 # module. Note that we can NOT use __builtins__ (note the 's'), because
140 140 # that can either be a dict or a module, and can even mutate at runtime,
141 141 # depending on the context (Python makes no guarantees on it). In
142 142 # contrast, __builtin__ is always a module object, though it must be
143 143 # explicitly imported.
144 144 r'\D': '${"."*__builtin__.len(__builtin__.str(self.cache.prompt_count))}',
145 145
146 146 # Current working directory
147 147 r'\w': '${os.getcwd()}',
148 148 # Current time
149 149 r'\t' : '${time.strftime("%H:%M:%S")}',
150 150 # Basename of current working directory.
151 151 # (use os.sep to make this portable across OSes)
152 152 r'\W' : '${os.getcwd().split("%s")[-1]}' % os.sep,
153 153 # These X<N> are an extension to the normal bash prompts. They return
154 154 # N terms of the path, after replacing $HOME with '~'
155 155 r'\X0': '${os.getcwd().replace("%s","~")}' % HOME,
156 156 r'\X1': '${self.cwd_filt(1)}',
157 157 r'\X2': '${self.cwd_filt(2)}',
158 158 r'\X3': '${self.cwd_filt(3)}',
159 159 r'\X4': '${self.cwd_filt(4)}',
160 160 r'\X5': '${self.cwd_filt(5)}',
161 161 # Y<N> are similar to X<N>, but they show '~' if it's the directory
162 162 # N+1 in the list. Somewhat like %cN in tcsh.
163 163 r'\Y0': '${self.cwd_filt2(0)}',
164 164 r'\Y1': '${self.cwd_filt2(1)}',
165 165 r'\Y2': '${self.cwd_filt2(2)}',
166 166 r'\Y3': '${self.cwd_filt2(3)}',
167 167 r'\Y4': '${self.cwd_filt2(4)}',
168 168 r'\Y5': '${self.cwd_filt2(5)}',
169 169 # Hostname up to first .
170 170 r'\h': HOSTNAME_SHORT,
171 171 # Full hostname
172 172 r'\H': HOSTNAME,
173 173 # Username of current user
174 174 r'\u': USER,
175 175 # Escaped '\'
176 176 '\\\\': '\\',
177 177 # Newline
178 178 r'\n': '\n',
179 179 # Carriage return
180 180 r'\r': '\r',
181 181 # Release version
182 182 r'\v': release.version,
183 183 # Root symbol ($ or #)
184 184 r'\$': ROOT_SYMBOL,
185 185 }
186 186
187 187 # A copy of the prompt_specials dictionary but with all color escapes removed,
188 188 # so we can correctly compute the prompt length for the auto_rewrite method.
189 189 prompt_specials_nocolor = prompt_specials_color.copy()
190 190 prompt_specials_nocolor['%n'] = '${self.cache.prompt_count}'
191 191 prompt_specials_nocolor[r'\#'] = '${self.cache.prompt_count}'
192 192
193 193 # Add in all the InputTermColors color escapes as valid prompt characters.
194 194 # They all get added as \\C_COLORNAME, so that we don't have any conflicts
195 195 # with a color name which may begin with a letter used by any other of the
196 196 # allowed specials. This of course means that \\C will never be allowed for
197 197 # anything else.
198 198 input_colors = coloransi.InputTermColors
199 199 for _color in dir(input_colors):
200 200 if _color[0] != '_':
201 201 c_name = r'\C_'+_color
202 202 prompt_specials_color[c_name] = getattr(input_colors,_color)
203 203 prompt_specials_nocolor[c_name] = ''
204 204
205 205 # we default to no color for safety. Note that prompt_specials is a global
206 206 # variable used by all prompt objects.
207 207 prompt_specials = prompt_specials_nocolor
208 208
209 209 #-----------------------------------------------------------------------------
210 210 # More utilities
211 211 #-----------------------------------------------------------------------------
212 212
213 213 def str_safe(arg):
214 214 """Convert to a string, without ever raising an exception.
215 215
216 216 If str(arg) fails, <ERROR: ... > is returned, where ... is the exception
217 217 error message."""
218 218
219 219 try:
220 220 out = str(arg)
221 221 except UnicodeError:
222 222 try:
223 223 out = arg.encode('utf_8','replace')
224 224 except Exception,msg:
225 225 # let's keep this little duplication here, so that the most common
226 226 # case doesn't suffer from a double try wrapping.
227 out = '<ERROR: %s>' % msg
227 out = '<ERRORx: %s>' % msg
228 228 except Exception,msg:
229 out = '<ERROR: %s>' % msg
229 out = '<ERRORy: %s>' % msg
230 230 #raise # dbg
231 231 return out
232 232
233 233 #-----------------------------------------------------------------------------
234 234 # Prompt classes
235 235 #-----------------------------------------------------------------------------
236 236
237 237 class BasePrompt(object):
238 238 """Interactive prompt similar to Mathematica's."""
239 239
240 240 def _get_p_template(self):
241 241 return self._p_template
242 242
243 243 def _set_p_template(self,val):
244 244 self._p_template = val
245 245 self.set_p_str()
246 246
247 247 p_template = property(_get_p_template,_set_p_template,
248 248 doc='Template for prompt string creation')
249 249
250 250 def __init__(self, cache, sep, prompt, pad_left=False):
251 251
252 252 # Hack: we access information about the primary prompt through the
253 253 # cache argument. We need this, because we want the secondary prompt
254 254 # to be aligned with the primary one. Color table info is also shared
255 255 # by all prompt classes through the cache. Nice OO spaghetti code!
256 256 self.cache = cache
257 257 self.sep = sep
258 258
259 259 # regexp to count the number of spaces at the end of a prompt
260 260 # expression, useful for prompt auto-rewriting
261 261 self.rspace = re.compile(r'(\s*)$')
262 262 # Flag to left-pad prompt strings to match the length of the primary
263 263 # prompt
264 264 self.pad_left = pad_left
265 265
266 266 # Set template to create each actual prompt (where numbers change).
267 267 # Use a property
268 268 self.p_template = prompt
269 269 self.set_p_str()
270 270
271 271 def set_p_str(self):
272 272 """ Set the interpolating prompt strings.
273 273
274 274 This must be called every time the color settings change, because the
275 275 prompt_specials global may have changed."""
276 276
277 277 import os,time # needed in locals for prompt string handling
278 278 loc = locals()
279 279 try:
280 280 self.p_str = ItplNS('%s%s%s' %
281 281 ('${self.sep}${self.col_p}',
282 282 multiple_replace(prompt_specials, self.p_template),
283 283 '${self.col_norm}'),self.cache.shell.user_ns,loc)
284 284
285 285 self.p_str_nocolor = ItplNS(multiple_replace(prompt_specials_nocolor,
286 286 self.p_template),
287 287 self.cache.shell.user_ns,loc)
288 288 except:
289 289 print "Illegal prompt template (check $ usage!):",self.p_template
290 290 self.p_str = self.p_template
291 291 self.p_str_nocolor = self.p_template
292 292
293 293 def write(self, msg):
294 294 sys.stdout.write(msg)
295 295 return ''
296 296
297 297 def __str__(self):
298 298 """Return a string form of the prompt.
299 299
300 300 This for is useful for continuation and output prompts, since it is
301 301 left-padded to match lengths with the primary one (if the
302 302 self.pad_left attribute is set)."""
303 303
304 304 out_str = str_safe(self.p_str)
305 305 if self.pad_left:
306 306 # We must find the amount of padding required to match lengths,
307 307 # taking the color escapes (which are invisible on-screen) into
308 308 # account.
309 309 esc_pad = len(out_str) - len(str_safe(self.p_str_nocolor))
310 310 format = '%%%ss' % (len(str(self.cache.last_prompt))+esc_pad)
311 311 return format % out_str
312 312 else:
313 313 return out_str
314 314
315 315 # these path filters are put in as methods so that we can control the
316 316 # namespace where the prompt strings get evaluated
317 317 def cwd_filt(self, depth):
318 318 """Return the last depth elements of the current working directory.
319 319
320 320 $HOME is always replaced with '~'.
321 321 If depth==0, the full path is returned."""
322 322
323 323 cwd = os.getcwd().replace(HOME,"~")
324 324 out = os.sep.join(cwd.split(os.sep)[-depth:])
325 325 if out:
326 326 return out
327 327 else:
328 328 return os.sep
329 329
330 330 def cwd_filt2(self, depth):
331 331 """Return the last depth elements of the current working directory.
332 332
333 333 $HOME is always replaced with '~'.
334 334 If depth==0, the full path is returned."""
335 335
336 336 full_cwd = os.getcwd()
337 337 cwd = full_cwd.replace(HOME,"~").split(os.sep)
338 338 if '~' in cwd and len(cwd) == depth+1:
339 339 depth += 1
340 340 drivepart = ''
341 341 if sys.platform == 'win32' and len(cwd) > depth:
342 342 drivepart = os.path.splitdrive(full_cwd)[0]
343 343 out = drivepart + '/'.join(cwd[-depth:])
344 344
345 345 if out:
346 346 return out
347 347 else:
348 348 return os.sep
349 349
350 350 def __nonzero__(self):
351 351 """Implement boolean behavior.
352 352
353 353 Checks whether the p_str attribute is non-empty"""
354 354
355 355 return bool(self.p_template)
356 356
357 357
358 358 class Prompt1(BasePrompt):
359 359 """Input interactive prompt similar to Mathematica's."""
360 360
361 361 def __init__(self, cache, sep='\n', prompt='In [\\#]: ', pad_left=True):
362 362 BasePrompt.__init__(self, cache, sep, prompt, pad_left)
363 363
364 364 def set_colors(self):
365 365 self.set_p_str()
366 366 Colors = self.cache.color_table.active_colors # shorthand
367 367 self.col_p = Colors.in_prompt
368 368 self.col_num = Colors.in_number
369 369 self.col_norm = Colors.in_normal
370 370 # We need a non-input version of these escapes for the '--->'
371 371 # auto-call prompts used in the auto_rewrite() method.
372 372 self.col_p_ni = self.col_p.replace('\001','').replace('\002','')
373 373 self.col_norm_ni = Colors.normal
374 374
375 375 def __str__(self):
376 376 self.cache.last_prompt = str_safe(self.p_str_nocolor).split('\n')[-1]
377 377 return str_safe(self.p_str)
378 378
379 379 def auto_rewrite(self):
380 380 """Return a string of the form '--->' which lines up with the previous
381 381 input string. Useful for systems which re-write the user input when
382 382 handling automatically special syntaxes."""
383 383
384 384 curr = str(self.cache.last_prompt)
385 385 nrspaces = len(self.rspace.search(curr).group())
386 386 return '%s%s>%s%s' % (self.col_p_ni,'-'*(len(curr)-nrspaces-1),
387 387 ' '*nrspaces,self.col_norm_ni)
388 388
389 389
390 390 class PromptOut(BasePrompt):
391 391 """Output interactive prompt similar to Mathematica's."""
392 392
393 393 def __init__(self, cache, sep='', prompt='Out[\\#]: ', pad_left=True):
394 394 BasePrompt.__init__(self, cache, sep, prompt, pad_left)
395 395 if not self.p_template:
396 396 self.__str__ = lambda: ''
397 397
398 398 def set_colors(self):
399 399 self.set_p_str()
400 400 Colors = self.cache.color_table.active_colors # shorthand
401 401 self.col_p = Colors.out_prompt
402 402 self.col_num = Colors.out_number
403 403 self.col_norm = Colors.normal
404 404
405 405
406 406 class Prompt2(BasePrompt):
407 407 """Interactive continuation prompt."""
408 408
409 409 def __init__(self, cache, prompt=' .\\D.: ', pad_left=True):
410 410 self.cache = cache
411 411 self.p_template = prompt
412 412 self.pad_left = pad_left
413 413 self.set_p_str()
414 414
415 415 def set_p_str(self):
416 416 import os,time # needed in locals for prompt string handling
417 417 loc = locals()
418 418 self.p_str = ItplNS('%s%s%s' %
419 419 ('${self.col_p2}',
420 420 multiple_replace(prompt_specials, self.p_template),
421 421 '$self.col_norm'),
422 422 self.cache.shell.user_ns,loc)
423 423 self.p_str_nocolor = ItplNS(multiple_replace(prompt_specials_nocolor,
424 424 self.p_template),
425 425 self.cache.shell.user_ns,loc)
426 426
427 427 def set_colors(self):
428 428 self.set_p_str()
429 429 Colors = self.cache.color_table.active_colors
430 430 self.col_p2 = Colors.in_prompt2
431 431 self.col_norm = Colors.in_normal
432 432 # FIXME (2004-06-16) HACK: prevent crashes for users who haven't
433 433 # updated their prompt_in2 definitions. Remove eventually.
434 434 self.col_p = Colors.out_prompt
435 435 self.col_num = Colors.out_number
436 436
@@ -1,49 +1,49 b''
1 1 # coding: utf-8
2 2 """Tests for IPython.core.application"""
3 3
4 4 import os
5 5 import tempfile
6 6
7 7 from IPython.core.application import BaseIPythonApplication
8 8 from IPython.testing import decorators as testdec
9 9
10 10 @testdec.onlyif_unicode_paths
11 11 def test_unicode_cwd():
12 12 """Check that IPython starts with non-ascii characters in the path."""
13 13 wd = tempfile.mkdtemp(suffix=u"€")
14 14
15 15 old_wd = os.getcwdu()
16 16 os.chdir(wd)
17 #raise Exception(repr(os.getcwd()))
17 #raise Exception(repr(os.getcwdu()))
18 18 try:
19 19 app = BaseIPythonApplication()
20 20 # The lines below are copied from Application.initialize()
21 21 app.init_profile_dir()
22 22 app.init_config_files()
23 23 app.load_config_file(suppress_errors=False)
24 24 finally:
25 25 os.chdir(old_wd)
26 26
27 27 @testdec.onlyif_unicode_paths
28 28 def test_unicode_ipdir():
29 29 """Check that IPython starts with non-ascii characters in the IP dir."""
30 30 ipdir = tempfile.mkdtemp(suffix=u"€")
31 31
32 32 # Create the config file, so it tries to load it.
33 33 with open(os.path.join(ipdir, 'ipython_config.py'), "w") as f:
34 34 pass
35 35
36 36 old_ipdir1 = os.environ.pop("IPYTHONDIR", None)
37 37 old_ipdir2 = os.environ.pop("IPYTHON_DIR", None)
38 38 os.environ["IPYTHONDIR"] = ipdir.encode("utf-8")
39 39 try:
40 40 app = BaseIPythonApplication()
41 41 # The lines below are copied from Application.initialize()
42 42 app.init_profile_dir()
43 43 app.init_config_files()
44 44 app.load_config_file(suppress_errors=False)
45 45 finally:
46 46 if old_ipdir1:
47 47 os.environ["IPYTHONDIR"] = old_ipdir1
48 48 if old_ipdir2:
49 49 os.environ["IPYTHONDIR"] = old_ipdir2
@@ -1,274 +1,277 b''
1 1 # -*- coding: utf-8 -*-
2 2 """String interpolation for Python (by Ka-Ping Yee, 14 Feb 2000).
3 3
4 4 This module lets you quickly and conveniently interpolate values into
5 5 strings (in the flavour of Perl or Tcl, but with less extraneous
6 6 punctuation). You get a bit more power than in the other languages,
7 7 because this module allows subscripting, slicing, function calls,
8 8 attribute lookup, or arbitrary expressions. Variables and expressions
9 9 are evaluated in the namespace of the caller.
10 10
11 11 The itpl() function returns the result of interpolating a string, and
12 12 printpl() prints out an interpolated string. Here are some examples:
13 13
14 14 from Itpl import printpl
15 15 printpl("Here is a $string.")
16 16 printpl("Here is a $module.member.")
17 17 printpl("Here is an $object.member.")
18 18 printpl("Here is a $functioncall(with, arguments).")
19 19 printpl("Here is an ${arbitrary + expression}.")
20 20 printpl("Here is an $array[3] member.")
21 21 printpl("Here is a $dictionary['member'].")
22 22
23 23 The filter() function filters a file object so that output through it
24 24 is interpolated. This lets you produce the illusion that Python knows
25 25 how to do interpolation:
26 26
27 27 import Itpl
28 28 sys.stdout = Itpl.filter()
29 29 f = "fancy"
30 30 print "Is this not $f?"
31 31 print "Standard output has been replaced with a $sys.stdout object."
32 32 sys.stdout = Itpl.unfilter()
33 33 print "Okay, back $to $normal."
34 34
35 35 Under the hood, the Itpl class represents a string that knows how to
36 36 interpolate values. An instance of the class parses the string once
37 37 upon initialization; the evaluation and substitution can then be done
38 38 each time the instance is evaluated with str(instance). For example:
39 39
40 40 from Itpl import Itpl
41 41 s = Itpl("Here is $foo.")
42 42 foo = 5
43 43 print str(s)
44 44 foo = "bar"
45 45 print str(s)
46 46 """
47 47
48 48 #*****************************************************************************
49 49 #
50 50 # Copyright (c) 2001 Ka-Ping Yee <ping@lfw.org>
51 51 #
52 52 #
53 53 # Published under the terms of the MIT license, hereby reproduced:
54 54 #
55 55 # Permission is hereby granted, free of charge, to any person obtaining a copy
56 56 # of this software and associated documentation files (the "Software"), to
57 57 # deal in the Software without restriction, including without limitation the
58 58 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
59 59 # sell copies of the Software, and to permit persons to whom the Software is
60 60 # furnished to do so, subject to the following conditions:
61 61 #
62 62 # The above copyright notice and this permission notice shall be included in
63 63 # all copies or substantial portions of the Software.
64 64 #
65 65 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
66 66 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
67 67 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
68 68 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
69 69 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
70 70 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
71 71 # IN THE SOFTWARE.
72 72 #
73 73 #*****************************************************************************
74 74
75 75 __author__ = 'Ka-Ping Yee <ping@lfw.org>'
76 76 __license__ = 'MIT'
77 77
78 78 import sys
79 79 from tokenize import tokenprog
80 80
81 81 class ItplError(ValueError):
82 82 def __init__(self, text, pos):
83 83 self.text = text
84 84 self.pos = pos
85 85 def __str__(self):
86 86 return "unfinished expression in %s at char %d" % (
87 87 repr(self.text), self.pos)
88 88
89 89 def matchorfail(text, pos):
90 90 match = tokenprog.match(text, pos)
91 91 if match is None:
92 92 raise ItplError(text, pos)
93 93 return match, match.end()
94 94
95 95 class Itpl:
96 96 """Class representing a string with interpolation abilities.
97 97
98 98 Upon creation, an instance works out what parts of the format
99 99 string are literal and what parts need to be evaluated. The
100 100 evaluation and substitution happens in the namespace of the
101 101 caller when str(instance) is called."""
102 102
103 103 def __init__(self, format,codec='utf_8',encoding_errors='backslashreplace'):
104 104 """The single mandatory argument to this constructor is a format
105 105 string.
106 106
107 107 The format string is parsed according to the following rules:
108 108
109 109 1. A dollar sign and a name, possibly followed by any of:
110 110 - an open-paren, and anything up to the matching paren
111 111 - an open-bracket, and anything up to the matching bracket
112 112 - a period and a name
113 113 any number of times, is evaluated as a Python expression.
114 114
115 115 2. A dollar sign immediately followed by an open-brace, and
116 116 anything up to the matching close-brace, is evaluated as
117 117 a Python expression.
118 118
119 119 3. Outside of the expressions described in the above two rules,
120 120 two dollar signs in a row give you one literal dollar sign.
121 121
122 122 Optional arguments:
123 123
124 124 - codec('utf_8'): a string containing the name of a valid Python
125 125 codec.
126 126
127 127 - encoding_errors('backslashreplace'): a string with a valid error handling
128 128 policy. See the codecs module documentation for details.
129 129
130 130 These are used to encode the format string if a call to str() fails on
131 131 the expanded result."""
132 132
133 133 if not isinstance(format,basestring):
134 134 raise TypeError, "needs string initializer"
135 135 self.format = format
136 136 self.codec = codec
137 137 self.encoding_errors = encoding_errors
138 138
139 139 namechars = "abcdefghijklmnopqrstuvwxyz" \
140 140 "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
141 141 chunks = []
142 142 pos = 0
143 143
144 144 while 1:
145 145 dollar = format.find("$", pos)
146 146 if dollar < 0: break
147 147 nextchar = format[dollar+1]
148 148
149 149 if nextchar == "{":
150 150 chunks.append((0, format[pos:dollar]))
151 151 pos, level = dollar+2, 1
152 152 while level:
153 153 match, pos = matchorfail(format, pos)
154 154 tstart, tend = match.regs[3]
155 155 token = format[tstart:tend]
156 156 if token == "{": level = level+1
157 157 elif token == "}": level = level-1
158 158 chunks.append((1, format[dollar+2:pos-1]))
159 159
160 160 elif nextchar in namechars:
161 161 chunks.append((0, format[pos:dollar]))
162 162 match, pos = matchorfail(format, dollar+1)
163 163 while pos < len(format):
164 164 if format[pos] == "." and \
165 165 pos+1 < len(format) and format[pos+1] in namechars:
166 166 match, pos = matchorfail(format, pos+1)
167 167 elif format[pos] in "([":
168 168 pos, level = pos+1, 1
169 169 while level:
170 170 match, pos = matchorfail(format, pos)
171 171 tstart, tend = match.regs[3]
172 172 token = format[tstart:tend]
173 173 if token[0] in "([": level = level+1
174 174 elif token[0] in ")]": level = level-1
175 175 else: break
176 176 chunks.append((1, format[dollar+1:pos]))
177 177
178 178 else:
179 179 chunks.append((0, format[pos:dollar+1]))
180 180 pos = dollar + 1 + (nextchar == "$")
181 181
182 182 if pos < len(format): chunks.append((0, format[pos:]))
183 183 self.chunks = chunks
184 184
185 185 def __repr__(self):
186 186 return "<Itpl %s >" % repr(self.format)
187 187
188 188 def _str(self,glob,loc):
189 189 """Evaluate to a string in the given globals/locals.
190 190
191 191 The final output is built by calling str(), but if this fails, the
192 192 result is encoded with the instance's codec and error handling policy,
193 193 via a call to out.encode(self.codec,self.encoding_errors)"""
194 194 result = []
195 195 app = result.append
196 196 for live, chunk in self.chunks:
197 197 if live: app(str(eval(chunk,glob,loc)))
198 198 else: app(chunk)
199 out = ''.join(result)
199 out = u''.join(result)
200 200 try:
201 201 return str(out)
202 202 except UnicodeError:
203 203 return out.encode(self.codec,self.encoding_errors)
204 204
205 205 def __str__(self):
206 206 """Evaluate and substitute the appropriate parts of the string."""
207 207
208 208 # We need to skip enough frames to get to the actual caller outside of
209 209 # Itpl.
210 210 frame = sys._getframe(1)
211 211 while frame.f_globals["__name__"] == __name__: frame = frame.f_back
212 212 loc, glob = frame.f_locals, frame.f_globals
213 213
214 214 return self._str(glob,loc)
215
216 def encode(self, encoding, errors):
217 return str(self)#.encode(encoding, errors)
215 218
216 219 class ItplNS(Itpl):
217 220 """Class representing a string with interpolation abilities.
218 221
219 222 This inherits from Itpl, but at creation time a namespace is provided
220 223 where the evaluation will occur. The interpolation becomes a bit more
221 224 efficient, as no traceback needs to be extracte. It also allows the
222 225 caller to supply a different namespace for the interpolation to occur than
223 226 its own."""
224 227
225 228 def __init__(self, format,globals,locals=None,
226 229 codec='utf_8',encoding_errors='backslashreplace'):
227 230 """ItplNS(format,globals[,locals]) -> interpolating string instance.
228 231
229 232 This constructor, besides a format string, takes a globals dictionary
230 233 and optionally a locals (which defaults to globals if not provided).
231 234
232 235 For further details, see the Itpl constructor."""
233 236
234 237 if locals is None:
235 238 locals = globals
236 239 self.globals = globals
237 240 self.locals = locals
238 241 Itpl.__init__(self,format,codec,encoding_errors)
239 242
240 243 def __str__(self):
241 244 """Evaluate and substitute the appropriate parts of the string."""
242 245 return self._str(self.globals,self.locals)
243 246
244 247 def __repr__(self):
245 248 return "<ItplNS %s >" % repr(self.format)
246 249
247 250 # utilities for fast printing
248 251 def itpl(text): return str(Itpl(text))
249 252 def printpl(text): print itpl(text)
250 253 # versions with namespace
251 254 def itplns(text,globals,locals=None): return str(ItplNS(text,globals,locals))
252 255 def printplns(text,globals,locals=None): print itplns(text,globals,locals)
253 256
254 257 class ItplFile:
255 258 """A file object that filters each write() through an interpolator."""
256 259 def __init__(self, file): self.file = file
257 260 def __repr__(self): return "<interpolated " + repr(self.file) + ">"
258 261 def __getattr__(self, attr): return getattr(self.file, attr)
259 262 def write(self, text): self.file.write(str(Itpl(text)))
260 263
261 264 def filter(file=sys.stdout):
262 265 """Return an ItplFile that filters writes to the given file object.
263 266
264 267 'file = filter(file)' replaces 'file' with a filtered object that
265 268 has a write() method. When called with no argument, this creates
266 269 a filter to sys.stdout."""
267 270 return ItplFile(file)
268 271
269 272 def unfilter(ifile=None):
270 273 """Return the original file that corresponds to the given ItplFile.
271 274
272 275 'file = unfilter(file)' undoes the effect of 'file = filter(file)'.
273 276 'sys.stdout = unfilter()' undoes the effect of 'sys.stdout = filter()'."""
274 277 return ifile and ifile.file or sys.stdout.file
@@ -1,944 +1,944 b''
1 1 """ path.py - An object representing a path to a file or directory.
2 2
3 3 Example:
4 4
5 5 from IPython.external.path import path
6 6 d = path('/home/guido/bin')
7 7 for f in d.files('*.py'):
8 8 f.chmod(0755)
9 9
10 10 This module requires Python 2.5 or later.
11 11
12 12
13 13 URL: http://www.jorendorff.com/articles/python/path
14 14 Author: Jason Orendorff <jason.orendorff\x40gmail\x2ecom> (and others - see the url!)
15 15 Date: 9 Mar 2007
16 16 """
17 17
18 18
19 19 # TODO
20 20 # - Tree-walking functions don't avoid symlink loops. Matt Harrison
21 21 # sent me a patch for this.
22 22 # - Bug in write_text(). It doesn't support Universal newline mode.
23 23 # - Better error message in listdir() when self isn't a
24 24 # directory. (On Windows, the error message really sucks.)
25 25 # - Make sure everything has a good docstring.
26 26 # - Add methods for regex find and replace.
27 27 # - guess_content_type() method?
28 28 # - Perhaps support arguments to touch().
29 29
30 30 from __future__ import generators
31 31
32 32 import sys, warnings, os, fnmatch, glob, shutil, codecs
33 33 from hashlib import md5
34 34
35 35 __version__ = '2.2'
36 36 __all__ = ['path']
37 37
38 38 # Platform-specific support for path.owner
39 39 if os.name == 'nt':
40 40 try:
41 41 import win32security
42 42 except ImportError:
43 43 win32security = None
44 44 else:
45 45 try:
46 46 import pwd
47 47 except ImportError:
48 48 pwd = None
49 49
50 50
51 51 class TreeWalkWarning(Warning):
52 52 pass
53 53
54 54 class path(unicode):
55 55 """ Represents a filesystem path.
56 56
57 57 For documentation on individual methods, consult their
58 58 counterparts in os.path.
59 59 """
60 60
61 61 # --- Special Python methods.
62 62
63 63 def __repr__(self):
64 64 return 'path(%s)' % unicode.__repr__(self)
65 65
66 66 # Adding a path and a string yields a path.
67 67 def __add__(self, more):
68 68 try:
69 69 resultStr = unicode.__add__(self, more)
70 70 except TypeError: #Python bug
71 71 resultStr = NotImplemented
72 72 if resultStr is NotImplemented:
73 73 return resultStr
74 74 return self.__class__(resultStr)
75 75
76 76 def __radd__(self, other):
77 77 if isinstance(other, basestring):
78 78 return self.__class__(other.__add__(self))
79 79 else:
80 80 return NotImplemented
81 81
82 82 # The / operator joins paths.
83 83 def __div__(self, rel):
84 84 """ fp.__div__(rel) == fp / rel == fp.joinpath(rel)
85 85
86 86 Join two path components, adding a separator character if
87 87 needed.
88 88 """
89 89 return self.__class__(os.path.join(self, rel))
90 90
91 91 # Make the / operator work even when true division is enabled.
92 92 __truediv__ = __div__
93 93
94 94 def getcwd(cls):
95 95 """ Return the current working directory as a path object. """
96 96 return cls(os.getcwdu())
97 97 getcwd = classmethod(getcwd)
98 98
99 99
100 100 # --- Operations on path strings.
101 101
102 102 isabs = os.path.isabs
103 103 def abspath(self): return self.__class__(os.path.abspath(self))
104 104 def normcase(self): return self.__class__(os.path.normcase(self))
105 105 def normpath(self): return self.__class__(os.path.normpath(self))
106 106 def realpath(self): return self.__class__(os.path.realpath(self))
107 107 def expanduser(self): return self.__class__(os.path.expanduser(self))
108 108 def expandvars(self): return self.__class__(os.path.expandvars(self))
109 109 def dirname(self): return self.__class__(os.path.dirname(self))
110 110 basename = os.path.basename
111 111
112 112 def expand(self):
113 113 """ Clean up a filename by calling expandvars(),
114 114 expanduser(), and normpath() on it.
115 115
116 116 This is commonly everything needed to clean up a filename
117 117 read from a configuration file, for example.
118 118 """
119 119 return self.expandvars().expanduser().normpath()
120 120
121 121 def _get_namebase(self):
122 122 base, ext = os.path.splitext(self.name)
123 123 return base
124 124
125 125 def _get_ext(self):
126 126 f, ext = os.path.splitext(unicode(self))
127 127 return ext
128 128
129 129 def _get_drive(self):
130 130 drive, r = os.path.splitdrive(self)
131 131 return self.__class__(drive)
132 132
133 133 parent = property(
134 134 dirname, None, None,
135 135 """ This path's parent directory, as a new path object.
136 136
137 137 For example, path('/usr/local/lib/libpython.so').parent == path('/usr/local/lib')
138 138 """)
139 139
140 140 name = property(
141 141 basename, None, None,
142 142 """ The name of this file or directory without the full path.
143 143
144 144 For example, path('/usr/local/lib/libpython.so').name == 'libpython.so'
145 145 """)
146 146
147 147 namebase = property(
148 148 _get_namebase, None, None,
149 149 """ The same as path.name, but with one file extension stripped off.
150 150
151 151 For example, path('/home/guido/python.tar.gz').name == 'python.tar.gz',
152 152 but path('/home/guido/python.tar.gz').namebase == 'python.tar'
153 153 """)
154 154
155 155 ext = property(
156 156 _get_ext, None, None,
157 157 """ The file extension, for example '.py'. """)
158 158
159 159 drive = property(
160 160 _get_drive, None, None,
161 161 """ The drive specifier, for example 'C:'.
162 162 This is always empty on systems that don't use drive specifiers.
163 163 """)
164 164
165 165 def splitpath(self):
166 166 """ p.splitpath() -> Return (p.parent, p.name). """
167 167 parent, child = os.path.split(self)
168 168 return self.__class__(parent), child
169 169
170 170 def splitdrive(self):
171 171 """ p.splitdrive() -> Return (p.drive, <the rest of p>).
172 172
173 173 Split the drive specifier from this path. If there is
174 174 no drive specifier, p.drive is empty, so the return value
175 175 is simply (path(''), p). This is always the case on Unix.
176 176 """
177 177 drive, rel = os.path.splitdrive(self)
178 178 return self.__class__(drive), rel
179 179
180 180 def splitext(self):
181 181 """ p.splitext() -> Return (p.stripext(), p.ext).
182 182
183 183 Split the filename extension from this path and return
184 184 the two parts. Either part may be empty.
185 185
186 186 The extension is everything from '.' to the end of the
187 187 last path segment. This has the property that if
188 188 (a, b) == p.splitext(), then a + b == p.
189 189 """
190 190 filename, ext = os.path.splitext(self)
191 191 return self.__class__(filename), ext
192 192
193 193 def stripext(self):
194 194 """ p.stripext() -> Remove one file extension from the path.
195 195
196 196 For example, path('/home/guido/python.tar.gz').stripext()
197 197 returns path('/home/guido/python.tar').
198 198 """
199 199 return self.splitext()[0]
200 200
201 201 if hasattr(os.path, 'splitunc'):
202 202 def splitunc(self):
203 203 unc, rest = os.path.splitunc(self)
204 204 return self.__class__(unc), rest
205 205
206 206 def _get_uncshare(self):
207 207 unc, r = os.path.splitunc(self)
208 208 return self.__class__(unc)
209 209
210 210 uncshare = property(
211 211 _get_uncshare, None, None,
212 212 """ The UNC mount point for this path.
213 213 This is empty for paths on local drives. """)
214 214
215 215 def joinpath(self, *args):
216 216 """ Join two or more path components, adding a separator
217 217 character (os.sep) if needed. Returns a new path
218 218 object.
219 219 """
220 220 return self.__class__(os.path.join(self, *args))
221 221
222 222 def splitall(self):
223 223 r""" Return a list of the path components in this path.
224 224
225 225 The first item in the list will be a path. Its value will be
226 226 either os.curdir, os.pardir, empty, or the root directory of
227 227 this path (for example, '/' or 'C:\\'). The other items in
228 228 the list will be strings.
229 229
230 230 path.path.joinpath(*result) will yield the original path.
231 231 """
232 232 parts = []
233 233 loc = self
234 234 while loc != os.curdir and loc != os.pardir:
235 235 prev = loc
236 236 loc, child = prev.splitpath()
237 237 if loc == prev:
238 238 break
239 239 parts.append(child)
240 240 parts.append(loc)
241 241 parts.reverse()
242 242 return parts
243 243
244 244 def relpath(self):
245 245 """ Return this path as a relative path,
246 246 based from the current working directory.
247 247 """
248 cwd = self.__class__(os.getcwd())
248 cwd = self.__class__(os.getcwdu())
249 249 return cwd.relpathto(self)
250 250
251 251 def relpathto(self, dest):
252 252 """ Return a relative path from self to dest.
253 253
254 254 If there is no relative path from self to dest, for example if
255 255 they reside on different drives in Windows, then this returns
256 256 dest.abspath().
257 257 """
258 258 origin = self.abspath()
259 259 dest = self.__class__(dest).abspath()
260 260
261 261 orig_list = origin.normcase().splitall()
262 262 # Don't normcase dest! We want to preserve the case.
263 263 dest_list = dest.splitall()
264 264
265 265 if orig_list[0] != os.path.normcase(dest_list[0]):
266 266 # Can't get here from there.
267 267 return dest
268 268
269 269 # Find the location where the two paths start to differ.
270 270 i = 0
271 271 for start_seg, dest_seg in zip(orig_list, dest_list):
272 272 if start_seg != os.path.normcase(dest_seg):
273 273 break
274 274 i += 1
275 275
276 276 # Now i is the point where the two paths diverge.
277 277 # Need a certain number of "os.pardir"s to work up
278 278 # from the origin to the point of divergence.
279 279 segments = [os.pardir] * (len(orig_list) - i)
280 280 # Need to add the diverging part of dest_list.
281 281 segments += dest_list[i:]
282 282 if len(segments) == 0:
283 283 # If they happen to be identical, use os.curdir.
284 284 relpath = os.curdir
285 285 else:
286 286 relpath = os.path.join(*segments)
287 287 return self.__class__(relpath)
288 288
289 289 # --- Listing, searching, walking, and matching
290 290
291 291 def listdir(self, pattern=None):
292 292 """ D.listdir() -> List of items in this directory.
293 293
294 294 Use D.files() or D.dirs() instead if you want a listing
295 295 of just files or just subdirectories.
296 296
297 297 The elements of the list are path objects.
298 298
299 299 With the optional 'pattern' argument, this only lists
300 300 items whose names match the given pattern.
301 301 """
302 302 names = os.listdir(self)
303 303 if pattern is not None:
304 304 names = fnmatch.filter(names, pattern)
305 305 return [self / child for child in names]
306 306
307 307 def dirs(self, pattern=None):
308 308 """ D.dirs() -> List of this directory's subdirectories.
309 309
310 310 The elements of the list are path objects.
311 311 This does not walk recursively into subdirectories
312 312 (but see path.walkdirs).
313 313
314 314 With the optional 'pattern' argument, this only lists
315 315 directories whose names match the given pattern. For
316 316 example, d.dirs('build-*').
317 317 """
318 318 return [p for p in self.listdir(pattern) if p.isdir()]
319 319
320 320 def files(self, pattern=None):
321 321 """ D.files() -> List of the files in this directory.
322 322
323 323 The elements of the list are path objects.
324 324 This does not walk into subdirectories (see path.walkfiles).
325 325
326 326 With the optional 'pattern' argument, this only lists files
327 327 whose names match the given pattern. For example,
328 328 d.files('*.pyc').
329 329 """
330 330
331 331 return [p for p in self.listdir(pattern) if p.isfile()]
332 332
333 333 def walk(self, pattern=None, errors='strict'):
334 334 """ D.walk() -> iterator over files and subdirs, recursively.
335 335
336 336 The iterator yields path objects naming each child item of
337 337 this directory and its descendants. This requires that
338 338 D.isdir().
339 339
340 340 This performs a depth-first traversal of the directory tree.
341 341 Each directory is returned just before all its children.
342 342
343 343 The errors= keyword argument controls behavior when an
344 344 error occurs. The default is 'strict', which causes an
345 345 exception. The other allowed values are 'warn', which
346 346 reports the error via warnings.warn(), and 'ignore'.
347 347 """
348 348 if errors not in ('strict', 'warn', 'ignore'):
349 349 raise ValueError("invalid errors parameter")
350 350
351 351 try:
352 352 childList = self.listdir()
353 353 except Exception:
354 354 if errors == 'ignore':
355 355 return
356 356 elif errors == 'warn':
357 357 warnings.warn(
358 358 "Unable to list directory '%s': %s"
359 359 % (self, sys.exc_info()[1]),
360 360 TreeWalkWarning)
361 361 return
362 362 else:
363 363 raise
364 364
365 365 for child in childList:
366 366 if pattern is None or child.fnmatch(pattern):
367 367 yield child
368 368 try:
369 369 isdir = child.isdir()
370 370 except Exception:
371 371 if errors == 'ignore':
372 372 isdir = False
373 373 elif errors == 'warn':
374 374 warnings.warn(
375 375 "Unable to access '%s': %s"
376 376 % (child, sys.exc_info()[1]),
377 377 TreeWalkWarning)
378 378 isdir = False
379 379 else:
380 380 raise
381 381
382 382 if isdir:
383 383 for item in child.walk(pattern, errors):
384 384 yield item
385 385
386 386 def walkdirs(self, pattern=None, errors='strict'):
387 387 """ D.walkdirs() -> iterator over subdirs, recursively.
388 388
389 389 With the optional 'pattern' argument, this yields only
390 390 directories whose names match the given pattern. For
391 391 example, mydir.walkdirs('*test') yields only directories
392 392 with names ending in 'test'.
393 393
394 394 The errors= keyword argument controls behavior when an
395 395 error occurs. The default is 'strict', which causes an
396 396 exception. The other allowed values are 'warn', which
397 397 reports the error via warnings.warn(), and 'ignore'.
398 398 """
399 399 if errors not in ('strict', 'warn', 'ignore'):
400 400 raise ValueError("invalid errors parameter")
401 401
402 402 try:
403 403 dirs = self.dirs()
404 404 except Exception:
405 405 if errors == 'ignore':
406 406 return
407 407 elif errors == 'warn':
408 408 warnings.warn(
409 409 "Unable to list directory '%s': %s"
410 410 % (self, sys.exc_info()[1]),
411 411 TreeWalkWarning)
412 412 return
413 413 else:
414 414 raise
415 415
416 416 for child in dirs:
417 417 if pattern is None or child.fnmatch(pattern):
418 418 yield child
419 419 for subsubdir in child.walkdirs(pattern, errors):
420 420 yield subsubdir
421 421
422 422 def walkfiles(self, pattern=None, errors='strict'):
423 423 """ D.walkfiles() -> iterator over files in D, recursively.
424 424
425 425 The optional argument, pattern, limits the results to files
426 426 with names that match the pattern. For example,
427 427 mydir.walkfiles('*.tmp') yields only files with the .tmp
428 428 extension.
429 429 """
430 430 if errors not in ('strict', 'warn', 'ignore'):
431 431 raise ValueError("invalid errors parameter")
432 432
433 433 try:
434 434 childList = self.listdir()
435 435 except Exception:
436 436 if errors == 'ignore':
437 437 return
438 438 elif errors == 'warn':
439 439 warnings.warn(
440 440 "Unable to list directory '%s': %s"
441 441 % (self, sys.exc_info()[1]),
442 442 TreeWalkWarning)
443 443 return
444 444 else:
445 445 raise
446 446
447 447 for child in childList:
448 448 try:
449 449 isfile = child.isfile()
450 450 isdir = not isfile and child.isdir()
451 451 except:
452 452 if errors == 'ignore':
453 453 continue
454 454 elif errors == 'warn':
455 455 warnings.warn(
456 456 "Unable to access '%s': %s"
457 457 % (self, sys.exc_info()[1]),
458 458 TreeWalkWarning)
459 459 continue
460 460 else:
461 461 raise
462 462
463 463 if isfile:
464 464 if pattern is None or child.fnmatch(pattern):
465 465 yield child
466 466 elif isdir:
467 467 for f in child.walkfiles(pattern, errors):
468 468 yield f
469 469
470 470 def fnmatch(self, pattern):
471 471 """ Return True if self.name matches the given pattern.
472 472
473 473 pattern - A filename pattern with wildcards,
474 474 for example '*.py'.
475 475 """
476 476 return fnmatch.fnmatch(self.name, pattern)
477 477
478 478 def glob(self, pattern):
479 479 """ Return a list of path objects that match the pattern.
480 480
481 481 pattern - a path relative to this directory, with wildcards.
482 482
483 483 For example, path('/users').glob('*/bin/*') returns a list
484 484 of all the files users have in their bin directories.
485 485 """
486 486 cls = self.__class__
487 487 return [cls(s) for s in glob.glob(unicode(self / pattern))]
488 488
489 489
490 490 # --- Reading or writing an entire file at once.
491 491
492 492 def open(self, mode='r'):
493 493 """ Open this file. Return a file object. """
494 494 return open(self, mode)
495 495
496 496 def bytes(self):
497 497 """ Open this file, read all bytes, return them as a string. """
498 498 f = self.open('rb')
499 499 try:
500 500 return f.read()
501 501 finally:
502 502 f.close()
503 503
504 504 def write_bytes(self, bytes, append=False):
505 505 """ Open this file and write the given bytes to it.
506 506
507 507 Default behavior is to overwrite any existing file.
508 508 Call p.write_bytes(bytes, append=True) to append instead.
509 509 """
510 510 if append:
511 511 mode = 'ab'
512 512 else:
513 513 mode = 'wb'
514 514 f = self.open(mode)
515 515 try:
516 516 f.write(bytes)
517 517 finally:
518 518 f.close()
519 519
520 520 def text(self, encoding=None, errors='strict'):
521 521 r""" Open this file, read it in, return the content as a string.
522 522
523 523 This uses 'U' mode in Python 2.3 and later, so '\r\n' and '\r'
524 524 are automatically translated to '\n'.
525 525
526 526 Optional arguments:
527 527
528 528 encoding - The Unicode encoding (or character set) of
529 529 the file. If present, the content of the file is
530 530 decoded and returned as a unicode object; otherwise
531 531 it is returned as an 8-bit str.
532 532 errors - How to handle Unicode errors; see help(str.decode)
533 533 for the options. Default is 'strict'.
534 534 """
535 535 if encoding is None:
536 536 # 8-bit
537 537 f = self.open('U')
538 538 try:
539 539 return f.read()
540 540 finally:
541 541 f.close()
542 542 else:
543 543 # Unicode
544 544 f = codecs.open(self, 'r', encoding, errors)
545 545 # (Note - Can't use 'U' mode here, since codecs.open
546 546 # doesn't support 'U' mode, even in Python 2.3.)
547 547 try:
548 548 t = f.read()
549 549 finally:
550 550 f.close()
551 551 return (t.replace(u'\r\n', u'\n')
552 552 .replace(u'\r\x85', u'\n')
553 553 .replace(u'\r', u'\n')
554 554 .replace(u'\x85', u'\n')
555 555 .replace(u'\u2028', u'\n'))
556 556
557 557 def write_text(self, text, encoding=None, errors='strict', linesep=os.linesep, append=False):
558 558 r""" Write the given text to this file.
559 559
560 560 The default behavior is to overwrite any existing file;
561 561 to append instead, use the 'append=True' keyword argument.
562 562
563 563 There are two differences between path.write_text() and
564 564 path.write_bytes(): newline handling and Unicode handling.
565 565 See below.
566 566
567 567 Parameters:
568 568
569 569 - text - str/unicode - The text to be written.
570 570
571 571 - encoding - str - The Unicode encoding that will be used.
572 572 This is ignored if 'text' isn't a Unicode string.
573 573
574 574 - errors - str - How to handle Unicode encoding errors.
575 575 Default is 'strict'. See help(unicode.encode) for the
576 576 options. This is ignored if 'text' isn't a Unicode
577 577 string.
578 578
579 579 - linesep - keyword argument - str/unicode - The sequence of
580 580 characters to be used to mark end-of-line. The default is
581 581 os.linesep. You can also specify None; this means to
582 582 leave all newlines as they are in 'text'.
583 583
584 584 - append - keyword argument - bool - Specifies what to do if
585 585 the file already exists (True: append to the end of it;
586 586 False: overwrite it.) The default is False.
587 587
588 588
589 589 --- Newline handling.
590 590
591 591 write_text() converts all standard end-of-line sequences
592 592 ('\n', '\r', and '\r\n') to your platform's default end-of-line
593 593 sequence (see os.linesep; on Windows, for example, the
594 594 end-of-line marker is '\r\n').
595 595
596 596 If you don't like your platform's default, you can override it
597 597 using the 'linesep=' keyword argument. If you specifically want
598 598 write_text() to preserve the newlines as-is, use 'linesep=None'.
599 599
600 600 This applies to Unicode text the same as to 8-bit text, except
601 601 there are three additional standard Unicode end-of-line sequences:
602 602 u'\x85', u'\r\x85', and u'\u2028'.
603 603
604 604 (This is slightly different from when you open a file for
605 605 writing with fopen(filename, "w") in C or file(filename, 'w')
606 606 in Python.)
607 607
608 608
609 609 --- Unicode
610 610
611 611 If 'text' isn't Unicode, then apart from newline handling, the
612 612 bytes are written verbatim to the file. The 'encoding' and
613 613 'errors' arguments are not used and must be omitted.
614 614
615 615 If 'text' is Unicode, it is first converted to bytes using the
616 616 specified 'encoding' (or the default encoding if 'encoding'
617 617 isn't specified). The 'errors' argument applies only to this
618 618 conversion.
619 619
620 620 """
621 621 if isinstance(text, unicode):
622 622 if linesep is not None:
623 623 # Convert all standard end-of-line sequences to
624 624 # ordinary newline characters.
625 625 text = (text.replace(u'\r\n', u'\n')
626 626 .replace(u'\r\x85', u'\n')
627 627 .replace(u'\r', u'\n')
628 628 .replace(u'\x85', u'\n')
629 629 .replace(u'\u2028', u'\n'))
630 630 text = text.replace(u'\n', linesep)
631 631 if encoding is None:
632 632 encoding = sys.getdefaultencoding()
633 633 bytes = text.encode(encoding, errors)
634 634 else:
635 635 # It is an error to specify an encoding if 'text' is
636 636 # an 8-bit string.
637 637 assert encoding is None
638 638
639 639 if linesep is not None:
640 640 text = (text.replace('\r\n', '\n')
641 641 .replace('\r', '\n'))
642 642 bytes = text.replace('\n', linesep)
643 643
644 644 self.write_bytes(bytes, append)
645 645
646 646 def lines(self, encoding=None, errors='strict', retain=True):
647 647 r""" Open this file, read all lines, return them in a list.
648 648
649 649 Optional arguments:
650 650 encoding - The Unicode encoding (or character set) of
651 651 the file. The default is None, meaning the content
652 652 of the file is read as 8-bit characters and returned
653 653 as a list of (non-Unicode) str objects.
654 654 errors - How to handle Unicode errors; see help(str.decode)
655 655 for the options. Default is 'strict'
656 656 retain - If true, retain newline characters; but all newline
657 657 character combinations ('\r', '\n', '\r\n') are
658 658 translated to '\n'. If false, newline characters are
659 659 stripped off. Default is True.
660 660
661 661 This uses 'U' mode in Python 2.3 and later.
662 662 """
663 663 if encoding is None and retain:
664 664 f = self.open('U')
665 665 try:
666 666 return f.readlines()
667 667 finally:
668 668 f.close()
669 669 else:
670 670 return self.text(encoding, errors).splitlines(retain)
671 671
672 672 def write_lines(self, lines, encoding=None, errors='strict',
673 673 linesep=os.linesep, append=False):
674 674 r""" Write the given lines of text to this file.
675 675
676 676 By default this overwrites any existing file at this path.
677 677
678 678 This puts a platform-specific newline sequence on every line.
679 679 See 'linesep' below.
680 680
681 681 lines - A list of strings.
682 682
683 683 encoding - A Unicode encoding to use. This applies only if
684 684 'lines' contains any Unicode strings.
685 685
686 686 errors - How to handle errors in Unicode encoding. This
687 687 also applies only to Unicode strings.
688 688
689 689 linesep - The desired line-ending. This line-ending is
690 690 applied to every line. If a line already has any
691 691 standard line ending ('\r', '\n', '\r\n', u'\x85',
692 692 u'\r\x85', u'\u2028'), that will be stripped off and
693 693 this will be used instead. The default is os.linesep,
694 694 which is platform-dependent ('\r\n' on Windows, '\n' on
695 695 Unix, etc.) Specify None to write the lines as-is,
696 696 like file.writelines().
697 697
698 698 Use the keyword argument append=True to append lines to the
699 699 file. The default is to overwrite the file. Warning:
700 700 When you use this with Unicode data, if the encoding of the
701 701 existing data in the file is different from the encoding
702 702 you specify with the encoding= parameter, the result is
703 703 mixed-encoding data, which can really confuse someone trying
704 704 to read the file later.
705 705 """
706 706 if append:
707 707 mode = 'ab'
708 708 else:
709 709 mode = 'wb'
710 710 f = self.open(mode)
711 711 try:
712 712 for line in lines:
713 713 isUnicode = isinstance(line, unicode)
714 714 if linesep is not None:
715 715 # Strip off any existing line-end and add the
716 716 # specified linesep string.
717 717 if isUnicode:
718 718 if line[-2:] in (u'\r\n', u'\x0d\x85'):
719 719 line = line[:-2]
720 720 elif line[-1:] in (u'\r', u'\n',
721 721 u'\x85', u'\u2028'):
722 722 line = line[:-1]
723 723 else:
724 724 if line[-2:] == '\r\n':
725 725 line = line[:-2]
726 726 elif line[-1:] in ('\r', '\n'):
727 727 line = line[:-1]
728 728 line += linesep
729 729 if isUnicode:
730 730 if encoding is None:
731 731 encoding = sys.getdefaultencoding()
732 732 line = line.encode(encoding, errors)
733 733 f.write(line)
734 734 finally:
735 735 f.close()
736 736
737 737 def read_md5(self):
738 738 """ Calculate the md5 hash for this file.
739 739
740 740 This reads through the entire file.
741 741 """
742 742 f = self.open('rb')
743 743 try:
744 744 m = md5()
745 745 while True:
746 746 d = f.read(8192)
747 747 if not d:
748 748 break
749 749 m.update(d)
750 750 finally:
751 751 f.close()
752 752 return m.digest()
753 753
754 754 # --- Methods for querying the filesystem.
755 755
756 756 exists = os.path.exists
757 757 isdir = os.path.isdir
758 758 isfile = os.path.isfile
759 759 islink = os.path.islink
760 760 ismount = os.path.ismount
761 761
762 762 if hasattr(os.path, 'samefile'):
763 763 samefile = os.path.samefile
764 764
765 765 getatime = os.path.getatime
766 766 atime = property(
767 767 getatime, None, None,
768 768 """ Last access time of the file. """)
769 769
770 770 getmtime = os.path.getmtime
771 771 mtime = property(
772 772 getmtime, None, None,
773 773 """ Last-modified time of the file. """)
774 774
775 775 if hasattr(os.path, 'getctime'):
776 776 getctime = os.path.getctime
777 777 ctime = property(
778 778 getctime, None, None,
779 779 """ Creation time of the file. """)
780 780
781 781 getsize = os.path.getsize
782 782 size = property(
783 783 getsize, None, None,
784 784 """ Size of the file, in bytes. """)
785 785
786 786 if hasattr(os, 'access'):
787 787 def access(self, mode):
788 788 """ Return true if current user has access to this path.
789 789
790 790 mode - One of the constants os.F_OK, os.R_OK, os.W_OK, os.X_OK
791 791 """
792 792 return os.access(self, mode)
793 793
794 794 def stat(self):
795 795 """ Perform a stat() system call on this path. """
796 796 return os.stat(self)
797 797
798 798 def lstat(self):
799 799 """ Like path.stat(), but do not follow symbolic links. """
800 800 return os.lstat(self)
801 801
802 802 def get_owner(self):
803 803 r""" Return the name of the owner of this file or directory.
804 804
805 805 This follows symbolic links.
806 806
807 807 On Windows, this returns a name of the form ur'DOMAIN\User Name'.
808 808 On Windows, a group can own a file or directory.
809 809 """
810 810 if os.name == 'nt':
811 811 if win32security is None:
812 812 raise Exception("path.owner requires win32all to be installed")
813 813 desc = win32security.GetFileSecurity(
814 814 self, win32security.OWNER_SECURITY_INFORMATION)
815 815 sid = desc.GetSecurityDescriptorOwner()
816 816 account, domain, typecode = win32security.LookupAccountSid(None, sid)
817 817 return domain + u'\\' + account
818 818 else:
819 819 if pwd is None:
820 820 raise NotImplementedError("path.owner is not implemented on this platform.")
821 821 st = self.stat()
822 822 return pwd.getpwuid(st.st_uid).pw_name
823 823
824 824 owner = property(
825 825 get_owner, None, None,
826 826 """ Name of the owner of this file or directory. """)
827 827
828 828 if hasattr(os, 'statvfs'):
829 829 def statvfs(self):
830 830 """ Perform a statvfs() system call on this path. """
831 831 return os.statvfs(self)
832 832
833 833 if hasattr(os, 'pathconf'):
834 834 def pathconf(self, name):
835 835 return os.pathconf(self, name)
836 836
837 837
838 838 # --- Modifying operations on files and directories
839 839
840 840 def utime(self, times):
841 841 """ Set the access and modified times of this file. """
842 842 os.utime(self, times)
843 843
844 844 def chmod(self, mode):
845 845 os.chmod(self, mode)
846 846
847 847 if hasattr(os, 'chown'):
848 848 def chown(self, uid, gid):
849 849 os.chown(self, uid, gid)
850 850
851 851 def rename(self, new):
852 852 os.rename(self, new)
853 853
854 854 def renames(self, new):
855 855 os.renames(self, new)
856 856
857 857
858 858 # --- Create/delete operations on directories
859 859
860 860 def mkdir(self, mode=0777):
861 861 os.mkdir(self, mode)
862 862
863 863 def makedirs(self, mode=0777):
864 864 os.makedirs(self, mode)
865 865
866 866 def rmdir(self):
867 867 os.rmdir(self)
868 868
869 869 def removedirs(self):
870 870 os.removedirs(self)
871 871
872 872
873 873 # --- Modifying operations on files
874 874
875 875 def touch(self):
876 876 """ Set the access/modified times of this file to the current time.
877 877 Create the file if it does not exist.
878 878 """
879 879 fd = os.open(self, os.O_WRONLY | os.O_CREAT, 0666)
880 880 os.close(fd)
881 881 os.utime(self, None)
882 882
883 883 def remove(self):
884 884 os.remove(self)
885 885
886 886 def unlink(self):
887 887 os.unlink(self)
888 888
889 889
890 890 # --- Links
891 891
892 892 if hasattr(os, 'link'):
893 893 def link(self, newpath):
894 894 """ Create a hard link at 'newpath', pointing to this file. """
895 895 os.link(self, newpath)
896 896
897 897 if hasattr(os, 'symlink'):
898 898 def symlink(self, newlink):
899 899 """ Create a symbolic link at 'newlink', pointing here. """
900 900 os.symlink(self, newlink)
901 901
902 902 if hasattr(os, 'readlink'):
903 903 def readlink(self):
904 904 """ Return the path to which this symbolic link points.
905 905
906 906 The result may be an absolute or a relative path.
907 907 """
908 908 return self.__class__(os.readlink(self))
909 909
910 910 def readlinkabs(self):
911 911 """ Return the path to which this symbolic link points.
912 912
913 913 The result is always an absolute path.
914 914 """
915 915 p = self.readlink()
916 916 if p.isabs():
917 917 return p
918 918 else:
919 919 return (self.parent / p).abspath()
920 920
921 921
922 922 # --- High-level functions from shutil
923 923
924 924 copyfile = shutil.copyfile
925 925 copymode = shutil.copymode
926 926 copystat = shutil.copystat
927 927 copy = shutil.copy
928 928 copy2 = shutil.copy2
929 929 copytree = shutil.copytree
930 930 if hasattr(shutil, 'move'):
931 931 move = shutil.move
932 932 rmtree = shutil.rmtree
933 933
934 934
935 935 # --- Special stuff from os
936 936
937 937 if hasattr(os, 'chroot'):
938 938 def chroot(self):
939 939 os.chroot(self)
940 940
941 941 if hasattr(os, 'startfile'):
942 942 def startfile(self):
943 943 os.startfile(self)
944 944
@@ -1,140 +1,140 b''
1 1 # -*- coding: utf-8 -*-
2 2 """ IPython extension: add %rehashdir magic
3 3
4 4 Usage:
5 5
6 6 %rehashdir c:/bin c:/tools
7 7 - Add all executables under c:/bin and c:/tools to alias table, in
8 8 order to make them directly executable from any directory.
9 9
10 10 This also serves as an example on how to extend ipython
11 11 with new magic functions.
12 12
13 13 Unlike rest of ipython, this requires Python 2.4 (optional
14 14 extensions are allowed to do that).
15 15
16 16 """
17 17
18 18 from IPython.core import ipapi
19 19 ip = ipapi.get()
20 20
21 21
22 22 import os,re,fnmatch,sys
23 23
24 24 def selflaunch(ip,line):
25 25 """ Launch python script with 'this' interpreter
26 26
27 27 e.g. d:\foo\ipykit.exe a.py
28 28
29 29 """
30 30
31 31 tup = line.split(None,1)
32 32 if len(tup) == 1:
33 33 print "Launching nested ipython session"
34 34 os.system(sys.executable)
35 35 return
36 36
37 37 cmd = sys.executable + ' ' + tup[1]
38 38 print ">",cmd
39 39 os.system(cmd)
40 40
41 41 class PyLauncher:
42 42 """ Invoke selflanucher on the specified script
43 43
44 44 This is mostly useful for associating with scripts using::
45 45 _ip.define_alias('foo',PyLauncher('foo_script.py'))
46 46
47 47 """
48 48 def __init__(self,script):
49 49 self.script = os.path.abspath(script)
50 50 def __call__(self, ip, line):
51 51 if self.script.endswith('.ipy'):
52 52 ip.runlines(open(self.script).read())
53 53 else:
54 54 # first word is the script/alias name itself, strip it
55 55 tup = line.split(None,1)
56 56 if len(tup) == 2:
57 57 tail = ' ' + tup[1]
58 58 else:
59 59 tail = ''
60 60
61 61 selflaunch(ip,"py " + self.script + tail)
62 62 def __repr__(self):
63 63 return 'PyLauncher("%s")' % self.script
64 64
65 65 def rehashdir_f(self,arg):
66 66 """ Add executables in all specified dirs to alias table
67 67
68 68 Usage:
69 69
70 70 %rehashdir c:/bin;c:/tools
71 71 - Add all executables under c:/bin and c:/tools to alias table, in
72 72 order to make them directly executable from any directory.
73 73
74 74 Without arguments, add all executables in current directory.
75 75
76 76 """
77 77
78 78 # most of the code copied from Magic.magic_rehashx
79 79
80 80 def isjunk(fname):
81 81 junk = ['*~']
82 82 for j in junk:
83 83 if fnmatch.fnmatch(fname, j):
84 84 return True
85 85 return False
86 86
87 87 created = []
88 88 if not arg:
89 89 arg = '.'
90 90 path = map(os.path.abspath,arg.split(';'))
91 91 alias_table = self.shell.alias_manager.alias_table
92 92
93 93 if os.name == 'posix':
94 94 isexec = lambda fname:os.path.isfile(fname) and \
95 95 os.access(fname,os.X_OK)
96 96 else:
97 97
98 98 try:
99 99 winext = os.environ['pathext'].replace(';','|').replace('.','')
100 100 except KeyError:
101 101 winext = 'exe|com|bat|py'
102 102 if 'py' not in winext:
103 103 winext += '|py'
104 104
105 105 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
106 106 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
107 savedir = os.getcwd()
107 savedir = os.getcwdu()
108 108 try:
109 109 # write the whole loop for posix/Windows so we don't have an if in
110 110 # the innermost part
111 111 if os.name == 'posix':
112 112 for pdir in path:
113 113 os.chdir(pdir)
114 114 for ff in os.listdir(pdir):
115 115 if isexec(ff) and not isjunk(ff):
116 116 # each entry in the alias table must be (N,name),
117 117 # where N is the number of positional arguments of the
118 118 # alias.
119 119 src,tgt = os.path.splitext(ff)[0], os.path.abspath(ff)
120 120 created.append(src)
121 121 alias_table[src] = (0,tgt)
122 122 else:
123 123 for pdir in path:
124 124 os.chdir(pdir)
125 125 for ff in os.listdir(pdir):
126 126 if isexec(ff) and not isjunk(ff):
127 127 src, tgt = execre.sub(r'\1',ff), os.path.abspath(ff)
128 128 src = src.lower()
129 129 created.append(src)
130 130 alias_table[src] = (0,tgt)
131 131 # Make sure the alias table doesn't contain keywords or builtins
132 132 self.shell.alias_table_validate()
133 133 # Call again init_auto_alias() so we get 'rm -i' and other
134 134 # modified aliases since %rehashx will probably clobber them
135 135 # self.shell.init_auto_alias()
136 136 finally:
137 137 os.chdir(savedir)
138 138 return created
139 139
140 140 ip.define_magic("rehashdir",rehashdir_f)
@@ -1,242 +1,242 b''
1 1 from IPython.core import ipapi
2 2 ip = ipapi.get()
3 3
4 4 import win32api
5 5 import win32ui
6 6 import win32console
7 7 import dde
8 8 import os
9 9 import scitedirector
10 10
11 11 # test to write.
12 12
13 13 def set_hook(synchronize_with_editor):
14 14 """Set the synchronize with editor hook with a callable object.
15 15
16 16 The callable object will be called with the following arguments when
17 17 IPython wants to synchronize with you favorite editor:
18 18
19 19 - ip: a running IPython instance.
20 20
21 21 - filename: the path of the file the editor is supposed to display.
22 22
23 23 - lineno : the line number of the line the editor is supposed to
24 24 highlight.
25 25
26 26 - columnno : the column number of the character the editor is supposed
27 27 to highlight.
28 28 """
29 29 ip.set_hook("synchronize_with_editor", synchronize_with_editor)
30 30
31 31
32 32 def find_filename(filename):
33 33 """Return the filename to synchronize with based on """
34 34 filename = os.path.splitext(filename)
35 35 if filename[1] == ".pyc":
36 36 filename = (filename[0], ".py")
37 37 filename = "".join(filename)
38 38
39 39 if not os.path.isabs(filename):
40 filename = os.path.join(os.getcwd(), filename)
40 filename = os.path.join(os.getcwdu(), filename)
41 41
42 42 if os.path.isfile(filename):
43 43 return filename
44 44
45 45 return ""
46 46
47 47
48 48 def run_command(path, command, arguments, asynchronous = True):
49 49 """Run a shell command and return the exit code of the command"""
50 50 # This is a thin wrapper around os.system that:
51 51 # - Let you run command asynchronously.
52 52 # - Accept spaces in command path.
53 53 # - Dont throw exception if the command don't exist.
54 54 line = ''
55 55 if asynchronous:
56 56 line += 'start '
57 57
58 58 try:
59 59 line += win32api.GetShortPathName(os.path.join(path, command) + ".exe") + " "
60 60 except:
61 61 print 'could not find: "%s"' % (os.path.join(path, command) + ".exe")
62 62 return -1
63 63
64 64 line += arguments
65 65 r = os.system(line)
66 66 return r
67 67
68 68
69 69 def sleep(milliseconds):
70 70 """Wait some milliseconds."""
71 71 # This is used to make sure the editor did its job before we reset the focus on the console.
72 72 win32api.Sleep(milliseconds)
73 73
74 74
75 75 def restore_console_focus():
76 76 """Restore the focus to the IPython console."""
77 77 h = win32console.GetConsoleWindow()
78 78 console_window = win32ui.CreateWindowFromHandle(h)
79 79 console_window.SetForegroundWindow()
80 80
81 81
82 82 # This is the most simple example of hook:
83 83 class GVimHook:
84 84 def __init__(self, path, wakeup_duration):
85 85 self.path = path
86 86 self.wakeup_duration = wakeup_duration
87 87
88 88 def __call__(self, ip, filename, lineno, columnno):
89 89 filename = find_filename(filename)
90 90
91 91 if not filename:
92 92 return
93 93
94 94 run_command(self.path, 'gvim', '--remote-silent +%d "%s"' % (lineno, filename))
95 95
96 96 sleep(self.wakeup_duration)
97 97
98 98 restore_console_focus()
99 99
100 100
101 101 def gvim(path = r"C:\Program Files\vim\vim71", wakeup_duration = 100):
102 102 synchronize_with_editor = GVimHook(path, wakeup_duration)
103 103 set_hook(synchronize_with_editor)
104 104
105 105
106 106 class EmacsHook:
107 107 def __init__(self, path, wakeup_duration, start_duration):
108 108 self.path = path
109 109 self.wakeup_duration = wakeup_duration
110 110 self.start_duration = start_duration
111 111
112 112 def __call__(self, ip, filename, lineno, columnno):
113 113 filename = find_filename(filename)
114 114
115 115 if not filename:
116 116 return
117 117
118 118 r = run_command(self.path, "emacsclient", '-n +%d:%d "%s" 2>nul' % (lineno, columnno, filename), False)
119 119 if r != 0:
120 120 run_command(self.path, 'runemacs', '--quick -f server-start +%d:%d "%s"' % (lineno, columnno, filename))
121 121 sleep(self.start_duration)
122 122 else:
123 123 sleep(self.wakeup_duration)
124 124
125 125 restore_console_focus()
126 126
127 127
128 128 def emacs(path = r"C:\Program Files\emacs\bin", wakeup_duration = 100, start_duration = 2000):
129 129 synchronize_with_editor = EmacsHook(path, wakeup_duration, start_duration)
130 130 set_hook(synchronize_with_editor)
131 131
132 132
133 133 class SciteHook:
134 134 def __init__(self, path, wakeup_duration, start_duration):
135 135 self.path = path
136 136 self.wakeup_duration = wakeup_duration
137 137 self.start_duration = start_duration
138 138
139 139 def __call__(self, ip, filename, lineno, columnno):
140 140 filename = find_filename(filename)
141 141
142 142 if not filename:
143 143 return
144 144
145 145 scites = scitedirector.findWindows()
146 146 if not scites:
147 147 run_command(self.path, "scite", '"-open:%s" -goto:%d' % (filename.replace("\\", "/"), lineno))
148 148
149 149 sleep(self.start_duration)
150 150 restore_console_focus()
151 151 else:
152 152 scite = scites[0]
153 153 scitedirector.sendCommand(scite, 'open:%s' % filename.replace("\\", "/"))
154 154 scitedirector.sendCommand(scite, "goto:%d" % lineno)
155 155
156 156
157 157 def scite(path = r"C:\Program Files\SciTE Source Code Editor", wakeup_duration = 100, start_duration = 500):
158 158 synchronize_with_editor = SciteHook(path, wakeup_duration, start_duration)
159 159 set_hook(synchronize_with_editor)
160 160
161 161
162 162 class NodePadPlusPlusHook:
163 163 def __init__(self, path, wakeup_duration):
164 164 self.path = path
165 165 self.wakeup_duration = wakeup_duration
166 166
167 167 def __call__(self, ip, filename, lineno, columnno):
168 168 filename = find_filename(filename)
169 169
170 170 if not filename:
171 171 return
172 172
173 173 run_command(self.path, "notepad++", '"%s" -n%d' % (filename, lineno))
174 174
175 175 sleep(self.wakeup_duration)
176 176
177 177 restore_console_focus()
178 178
179 179
180 180 def notepadplusplus(path = r"C:\Program Files\Notepad++", wakeup_duration = 100):
181 181 synchronize_with_editor = NodePadPlusPlusHook(path, wakeup_duration)
182 182 set_hook(synchronize_with_editor)
183 183
184 184
185 185 class PsPadHook:
186 186 def __init__(self, path, wakeup_duration):
187 187 self.path = path
188 188 self.wakeup_duration = wakeup_duration
189 189
190 190 def __call__(self, ip, filename, lineno, columnno):
191 191 filename = find_filename(filename)
192 192
193 193 if not filename:
194 194 return
195 195
196 196 run_command(self.path, "pspad", '"%s" -%d' % (filename, lineno))
197 197
198 198 sleep(self.wakeup_duration)
199 199
200 200 restore_console_focus()
201 201
202 202
203 203 def pspad(path = r"C:\Program Files\PSPad editor", wakeup_duration = 100):
204 204 synchronize_with_editor = PsPadHook(path, wakeup_duration)
205 205 set_hook(synchronize_with_editor)
206 206
207 207
208 208 # This is an example of DDE hook:
209 209 class UltraEditHook:
210 210 def __init__(self, path, wakeup_duration, start_duration):
211 211 self.path = path
212 212 self.wakeup_duration = wakeup_duration
213 213 self.start_duration = start_duration
214 214
215 215 def __call__(self, ip, filename, lineno, columnno):
216 216 filename = find_filename(filename)
217 217
218 218 if not filename:
219 219 return
220 220
221 221 server = dde.CreateServer()
222 222 server.Create("myddeserver")
223 223 conversation = dde.CreateConversation(server)
224 224 try:
225 225 conversation.ConnectTo("uedit32", "System")
226 226 conversation.Exec(r'[open("%s/%d"])' % (filename, lineno))
227 227
228 228 sleep(self.wakeup_duration)
229 229 except:
230 230 run_command(self.path, 'uedit32', '"%s/%d"' % (filename, lineno))
231 231
232 232 sleep(self.start_duration)
233 233
234 234 server.Shutdown()
235 235
236 236 restore_console_focus()
237 237
238 238
239 239 def ultraedit(path = r"C:\Program Files\IDM Computer Solutions\UltraEdit-32", wakeup_duration = 10, start_duration = 2000):
240 240 synchronize_with_editor = UltraEditHook(path, wakeup_duration, start_duration)
241 241 set_hook(synchronize_with_editor)
242 242 No newline at end of file
@@ -1,43 +1,43 b''
1 1 #!/usr/bin/env python
2 2
3 3 from IPython.core import ipapi
4 4 ip = ipapi.get()
5 5
6 6 import os, subprocess
7 7
8 8 workdir = None
9 9 def workdir_f(ip,line):
10 10 """ Exceute commands residing in cwd elsewhere
11 11
12 12 Example::
13 13
14 14 workdir /myfiles
15 15 cd bin
16 16 workdir myscript.py
17 17
18 18 executes myscript.py (stored in bin, but not in path) in /myfiles
19 19 """
20 20 global workdir
21 21 dummy,cmd = line.split(None,1)
22 22 if os.path.isdir(cmd):
23 23 workdir = os.path.abspath(cmd)
24 24 print "Set workdir",workdir
25 25 elif workdir is None:
26 26 print "Please set workdir first by doing e.g. 'workdir q:/'"
27 27 else:
28 28 sp = cmd.split(None,1)
29 29 if len(sp) == 1:
30 30 head, tail = cmd, ''
31 31 else:
32 32 head, tail = sp
33 33 if os.path.isfile(head):
34 34 cmd = os.path.abspath(head) + ' ' + tail
35 35 print "Execute command '" + cmd+ "' in",workdir
36 olddir = os.getcwd()
36 olddir = os.getcwdu()
37 37 os.chdir(workdir)
38 38 try:
39 39 os.system(cmd)
40 40 finally:
41 41 os.chdir(olddir)
42 42
43 43 ip.define_alias("workdir",workdir_f)
@@ -1,242 +1,242 b''
1 1 """ Preliminary "job control" extensions for IPython
2 2
3 3 requires python 2.4 (or separate 'subprocess' module
4 4
5 5 This provides 2 features, launching background jobs and killing foreground jobs from another IPython instance.
6 6
7 7 Launching background jobs:
8 8
9 9 Usage:
10 10
11 11 [ipython]|2> import jobctrl
12 12 [ipython]|3> &ls
13 13 <3> <jobctrl.IpyPopen object at 0x00D87FD0>
14 14 [ipython]|4> _3.go
15 15 -----------> _3.go()
16 16 ChangeLog
17 17 IPython
18 18 MANIFEST.in
19 19 README
20 20 README_Windows.txt
21 21
22 22 ...
23 23
24 24 Killing foreground tasks:
25 25
26 26 Launch IPython instance, run a blocking command:
27 27
28 28 [Q:/ipython]|1> import jobctrl
29 29 [Q:/ipython]|2> cat
30 30
31 31 Now launch a new IPython prompt and kill the process:
32 32
33 33 IPython 0.8.3.svn.r2919 [on Py 2.5]
34 34 [Q:/ipython]|1> import jobctrl
35 35 [Q:/ipython]|2> %tasks
36 36 6020: 'cat ' (Q:\ipython)
37 37 [Q:/ipython]|3> %kill
38 38 SUCCESS: The process with PID 6020 has been terminated.
39 39 [Q:/ipython]|4>
40 40
41 41 (you don't need to specify PID for %kill if only one task is running)
42 42 """
43 43
44 44 from subprocess import *
45 45 import os,shlex,sys,time
46 46 import threading,Queue
47 47
48 48 from IPython.core import ipapi
49 49 from IPython.core.error import TryNext
50 50 from IPython.utils.text import make_quoted_expr
51 51
52 52 if os.name == 'nt':
53 53 def kill_process(pid):
54 54 os.system('taskkill /F /PID %d' % pid)
55 55 else:
56 56 def kill_process(pid):
57 57 os.system('kill -9 %d' % pid)
58 58
59 59
60 60
61 61 class IpyPopen(Popen):
62 62 def go(self):
63 63 print self.communicate()[0]
64 64 def __repr__(self):
65 65 return '<IPython job "%s" PID=%d>' % (self.line, self.pid)
66 66
67 67 def kill(self):
68 68 kill_process(self.pid)
69 69
70 70 def startjob(job):
71 71 p = IpyPopen(shlex.split(job), stdout=PIPE, shell = False)
72 72 p.line = job
73 73 return p
74 74
75 75 class AsyncJobQ(threading.Thread):
76 76 def __init__(self):
77 77 threading.Thread.__init__(self)
78 78 self.q = Queue.Queue()
79 79 self.output = []
80 80 self.stop = False
81 81 def run(self):
82 82 while 1:
83 83 cmd,cwd = self.q.get()
84 84 if self.stop:
85 85 self.output.append("** Discarding: '%s' - %s" % (cmd,cwd))
86 86 continue
87 87 self.output.append("** Task started: '%s' - %s" % (cmd,cwd))
88 88
89 89 p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT, cwd = cwd)
90 90 out = p.stdout.read()
91 91 self.output.append("** Task complete: '%s'\n" % cmd)
92 92 self.output.append(out)
93 93
94 94 def add(self,cmd):
95 self.q.put_nowait((cmd, os.getcwd()))
95 self.q.put_nowait((cmd, os.getcwdu()))
96 96
97 97 def dumpoutput(self):
98 98 while self.output:
99 99 item = self.output.pop(0)
100 100 print item
101 101
102 102 _jobq = None
103 103
104 104 def jobqueue_f(self, line):
105 105
106 106 global _jobq
107 107 if not _jobq:
108 108 print "Starting jobqueue - do '&some_long_lasting_system_command' to enqueue"
109 109 _jobq = AsyncJobQ()
110 110 _jobq.setDaemon(True)
111 111 _jobq.start()
112 112 ip.jobq = _jobq.add
113 113 return
114 114 if line.strip() == 'stop':
115 115 print "Stopping and clearing jobqueue, %jobqueue start to start again"
116 116 _jobq.stop = True
117 117 return
118 118 if line.strip() == 'start':
119 119 _jobq.stop = False
120 120 return
121 121
122 122 def jobctrl_prefilter_f(self,line):
123 123 if line.startswith('&'):
124 124 pre,fn,rest = self.split_user_input(line[1:])
125 125
126 126 line = ip.expand_aliases(fn,rest)
127 127 if not _jobq:
128 128 return 'get_ipython().startjob(%s)' % make_quoted_expr(line)
129 129 return 'get_ipython().jobq(%s)' % make_quoted_expr(line)
130 130
131 131 raise TryNext
132 132
133 133 def jobq_output_hook(self):
134 134 if not _jobq:
135 135 return
136 136 _jobq.dumpoutput()
137 137
138 138
139 139
140 140 def job_list(ip):
141 141 keys = ip.db.keys('tasks/*')
142 142 ents = [ip.db[k] for k in keys]
143 143 return ents
144 144
145 145 def magic_tasks(self,line):
146 146 """ Show a list of tasks.
147 147
148 148 A 'task' is a process that has been started in IPython when 'jobctrl' extension is enabled.
149 149 Tasks can be killed with %kill.
150 150
151 151 '%tasks clear' clears the task list (from stale tasks)
152 152 """
153 153 ip = self.getapi()
154 154 if line.strip() == 'clear':
155 155 for k in ip.db.keys('tasks/*'):
156 156 print "Clearing",ip.db[k]
157 157 del ip.db[k]
158 158 return
159 159
160 160 ents = job_list(ip)
161 161 if not ents:
162 162 print "No tasks running"
163 163 for pid,cmd,cwd,t in ents:
164 164 dur = int(time.time()-t)
165 165 print "%d: '%s' (%s) %d:%02d" % (pid,cmd,cwd, dur / 60,dur%60)
166 166
167 167 def magic_kill(self,line):
168 168 """ Kill a task
169 169
170 170 Without args, either kill one task (if only one running) or show list (if many)
171 171 With arg, assume it's the process id.
172 172
173 173 %kill is typically (much) more powerful than trying to terminate a process with ctrl+C.
174 174 """
175 175 ip = self.getapi()
176 176 jobs = job_list(ip)
177 177
178 178 if not line.strip():
179 179 if len(jobs) == 1:
180 180 kill_process(jobs[0][0])
181 181 else:
182 182 magic_tasks(self,line)
183 183 return
184 184
185 185 try:
186 186 pid = int(line)
187 187 kill_process(pid)
188 188 except ValueError:
189 189 magic_tasks(self,line)
190 190
191 191 if sys.platform == 'win32':
192 192 shell_internal_commands = 'break chcp cls copy ctty date del erase dir md mkdir path prompt rd rmdir start time type ver vol'.split()
193 193 PopenExc = WindowsError
194 194 else:
195 195 # todo linux commands
196 196 shell_internal_commands = []
197 197 PopenExc = OSError
198 198
199 199
200 200 def jobctrl_shellcmd(ip,cmd):
201 201 """ os.system replacement that stores process info to db['tasks/t1234'] """
202 202 cmd = cmd.strip()
203 203 cmdname = cmd.split(None,1)[0]
204 204 if cmdname in shell_internal_commands or '|' in cmd or '>' in cmd or '<' in cmd:
205 205 use_shell = True
206 206 else:
207 207 use_shell = False
208 208
209 209 jobentry = None
210 210 try:
211 211 try:
212 212 p = Popen(cmd,shell = use_shell)
213 213 except PopenExc :
214 214 if use_shell:
215 215 # try with os.system
216 216 os.system(cmd)
217 217 return
218 218 else:
219 219 # have to go via shell, sucks
220 220 p = Popen(cmd,shell = True)
221 221
222 222 jobentry = 'tasks/t' + str(p.pid)
223 ip.db[jobentry] = (p.pid,cmd,os.getcwd(),time.time())
223 ip.db[jobentry] = (p.pid,cmd,os.getcwdu(),time.time())
224 224 p.communicate()
225 225
226 226 finally:
227 227 if jobentry:
228 228 del ip.db[jobentry]
229 229
230 230
231 231 def install():
232 232 global ip
233 233 ip = ipapi.get()
234 234 # needed to make startjob visible as _ip.startjob('blah')
235 235 ip.startjob = startjob
236 236 ip.set_hook('input_prefilter', jobctrl_prefilter_f)
237 237 ip.set_hook('shell_hook', jobctrl_shellcmd)
238 238 ip.define_magic('kill',magic_kill)
239 239 ip.define_magic('tasks',magic_tasks)
240 240 ip.define_magic('jobqueue',jobqueue_f)
241 241 ip.set_hook('pre_prompt_hook', jobq_output_hook)
242 242 install()
@@ -1,443 +1,443 b''
1 1 # -*- coding: utf-8 -*-
2 2 """IPython Test Suite Runner.
3 3
4 4 This module provides a main entry point to a user script to test IPython
5 5 itself from the command line. There are two ways of running this script:
6 6
7 7 1. With the syntax `iptest all`. This runs our entire test suite by
8 8 calling this script (with different arguments) recursively. This
9 9 causes modules and package to be tested in different processes, using nose
10 10 or trial where appropriate.
11 11 2. With the regular nose syntax, like `iptest -vvs IPython`. In this form
12 12 the script simply calls nose, but with special command line flags and
13 13 plugins loaded.
14 14
15 15 """
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Copyright (C) 2009 The IPython Development Team
19 19 #
20 20 # Distributed under the terms of the BSD License. The full license is in
21 21 # the file COPYING, distributed as part of this software.
22 22 #-----------------------------------------------------------------------------
23 23
24 24 #-----------------------------------------------------------------------------
25 25 # Imports
26 26 #-----------------------------------------------------------------------------
27 27
28 28 # Stdlib
29 29 import os
30 30 import os.path as path
31 31 import signal
32 32 import sys
33 33 import subprocess
34 34 import tempfile
35 35 import time
36 36 import warnings
37 37
38 38 # Note: monkeypatch!
39 39 # We need to monkeypatch a small problem in nose itself first, before importing
40 40 # it for actual use. This should get into nose upstream, but its release cycle
41 41 # is slow and we need it for our parametric tests to work correctly.
42 42 from IPython.testing import nosepatch
43 43 # Now, proceed to import nose itself
44 44 import nose.plugins.builtin
45 45 from nose.core import TestProgram
46 46
47 47 # Our own imports
48 48 from IPython.utils.path import get_ipython_module_path
49 49 from IPython.utils.process import find_cmd, pycmd2argv
50 50 from IPython.utils.sysinfo import sys_info
51 51
52 52 from IPython.testing import globalipapp
53 53 from IPython.testing.plugin.ipdoctest import IPythonDoctest
54 54 from IPython.external.decorators import KnownFailure
55 55
56 56 pjoin = path.join
57 57
58 58
59 59 #-----------------------------------------------------------------------------
60 60 # Globals
61 61 #-----------------------------------------------------------------------------
62 62
63 63
64 64 #-----------------------------------------------------------------------------
65 65 # Warnings control
66 66 #-----------------------------------------------------------------------------
67 67
68 68 # Twisted generates annoying warnings with Python 2.6, as will do other code
69 69 # that imports 'sets' as of today
70 70 warnings.filterwarnings('ignore', 'the sets module is deprecated',
71 71 DeprecationWarning )
72 72
73 73 # This one also comes from Twisted
74 74 warnings.filterwarnings('ignore', 'the sha module is deprecated',
75 75 DeprecationWarning)
76 76
77 77 # Wx on Fedora11 spits these out
78 78 warnings.filterwarnings('ignore', 'wxPython/wxWidgets release number mismatch',
79 79 UserWarning)
80 80
81 81 #-----------------------------------------------------------------------------
82 82 # Logic for skipping doctests
83 83 #-----------------------------------------------------------------------------
84 84
85 85 def test_for(mod, min_version=None):
86 86 """Test to see if mod is importable."""
87 87 try:
88 88 __import__(mod)
89 89 except (ImportError, RuntimeError):
90 90 # GTK reports Runtime error if it can't be initialized even if it's
91 91 # importable.
92 92 return False
93 93 else:
94 94 if min_version:
95 95 return sys.modules[mod].__version__ >= min_version
96 96 else:
97 97 return True
98 98
99 99 # Global dict where we can store information on what we have and what we don't
100 100 # have available at test run time
101 101 have = {}
102 102
103 103 have['curses'] = test_for('_curses')
104 104 have['matplotlib'] = test_for('matplotlib')
105 105 have['pexpect'] = test_for('pexpect')
106 106 have['pymongo'] = test_for('pymongo')
107 107 have['wx'] = test_for('wx')
108 108 have['wx.aui'] = test_for('wx.aui')
109 109 if os.name == 'nt':
110 110 have['zmq'] = test_for('zmq', '2.1.7')
111 111 else:
112 112 have['zmq'] = test_for('zmq', '2.1.4')
113 113 have['qt'] = test_for('IPython.external.qt')
114 114
115 115 #-----------------------------------------------------------------------------
116 116 # Functions and classes
117 117 #-----------------------------------------------------------------------------
118 118
119 119 def report():
120 120 """Return a string with a summary report of test-related variables."""
121 121
122 122 out = [ sys_info(), '\n']
123 123
124 124 avail = []
125 125 not_avail = []
126 126
127 127 for k, is_avail in have.items():
128 128 if is_avail:
129 129 avail.append(k)
130 130 else:
131 131 not_avail.append(k)
132 132
133 133 if avail:
134 134 out.append('\nTools and libraries available at test time:\n')
135 135 avail.sort()
136 136 out.append(' ' + ' '.join(avail)+'\n')
137 137
138 138 if not_avail:
139 139 out.append('\nTools and libraries NOT available at test time:\n')
140 140 not_avail.sort()
141 141 out.append(' ' + ' '.join(not_avail)+'\n')
142 142
143 143 return ''.join(out)
144 144
145 145
146 146 def make_exclude():
147 147 """Make patterns of modules and packages to exclude from testing.
148 148
149 149 For the IPythonDoctest plugin, we need to exclude certain patterns that
150 150 cause testing problems. We should strive to minimize the number of
151 151 skipped modules, since this means untested code.
152 152
153 153 These modules and packages will NOT get scanned by nose at all for tests.
154 154 """
155 155 # Simple utility to make IPython paths more readably, we need a lot of
156 156 # these below
157 157 ipjoin = lambda *paths: pjoin('IPython', *paths)
158 158
159 159 exclusions = [ipjoin('external'),
160 160 pjoin('IPython_doctest_plugin'),
161 161 ipjoin('quarantine'),
162 162 ipjoin('deathrow'),
163 163 ipjoin('testing', 'attic'),
164 164 # This guy is probably attic material
165 165 ipjoin('testing', 'mkdoctests'),
166 166 # Testing inputhook will need a lot of thought, to figure out
167 167 # how to have tests that don't lock up with the gui event
168 168 # loops in the picture
169 169 ipjoin('lib', 'inputhook'),
170 170 # Config files aren't really importable stand-alone
171 171 ipjoin('config', 'default'),
172 172 ipjoin('config', 'profile'),
173 173 ]
174 174
175 175 if not have['wx']:
176 176 exclusions.append(ipjoin('lib', 'inputhookwx'))
177 177
178 178 # We do this unconditionally, so that the test suite doesn't import
179 179 # gtk, changing the default encoding and masking some unicode bugs.
180 180 exclusions.append(ipjoin('lib', 'inputhookgtk'))
181 181
182 182 # These have to be skipped on win32 because the use echo, rm, cd, etc.
183 183 # See ticket https://github.com/ipython/ipython/issues/87
184 184 if sys.platform == 'win32':
185 185 exclusions.append(ipjoin('testing', 'plugin', 'test_exampleip'))
186 186 exclusions.append(ipjoin('testing', 'plugin', 'dtexample'))
187 187
188 188 if not have['pexpect']:
189 189 exclusions.extend([ipjoin('scripts', 'irunner'),
190 190 ipjoin('lib', 'irunner'),
191 191 ipjoin('lib', 'tests', 'test_irunner')])
192 192
193 193 if not have['zmq']:
194 194 exclusions.append(ipjoin('zmq'))
195 195 exclusions.append(ipjoin('frontend', 'qt'))
196 196 exclusions.append(ipjoin('parallel'))
197 197 elif not have['qt']:
198 198 exclusions.append(ipjoin('frontend', 'qt'))
199 199
200 200 if not have['pymongo']:
201 201 exclusions.append(ipjoin('parallel', 'controller', 'mongodb'))
202 202 exclusions.append(ipjoin('parallel', 'tests', 'test_mongodb'))
203 203
204 204 if not have['matplotlib']:
205 205 exclusions.extend([ipjoin('lib', 'pylabtools'),
206 206 ipjoin('lib', 'tests', 'test_pylabtools')])
207 207
208 208 # This is needed for the reg-exp to match on win32 in the ipdoctest plugin.
209 209 if sys.platform == 'win32':
210 210 exclusions = [s.replace('\\','\\\\') for s in exclusions]
211 211
212 212 return exclusions
213 213
214 214
215 215 class IPTester(object):
216 216 """Call that calls iptest or trial in a subprocess.
217 217 """
218 218 #: string, name of test runner that will be called
219 219 runner = None
220 220 #: list, parameters for test runner
221 221 params = None
222 222 #: list, arguments of system call to be made to call test runner
223 223 call_args = None
224 224 #: list, process ids of subprocesses we start (for cleanup)
225 225 pids = None
226 226
227 227 def __init__(self, runner='iptest', params=None):
228 228 """Create new test runner."""
229 229 p = os.path
230 230 if runner == 'iptest':
231 231 iptest_app = get_ipython_module_path('IPython.testing.iptest')
232 232 self.runner = pycmd2argv(iptest_app) + sys.argv[1:]
233 233 else:
234 234 raise Exception('Not a valid test runner: %s' % repr(runner))
235 235 if params is None:
236 236 params = []
237 237 if isinstance(params, str):
238 238 params = [params]
239 239 self.params = params
240 240
241 241 # Assemble call
242 242 self.call_args = self.runner+self.params
243 243
244 244 # Store pids of anything we start to clean up on deletion, if possible
245 245 # (on posix only, since win32 has no os.kill)
246 246 self.pids = []
247 247
248 248 if sys.platform == 'win32':
249 249 def _run_cmd(self):
250 250 # On Windows, use os.system instead of subprocess.call, because I
251 251 # was having problems with subprocess and I just don't know enough
252 252 # about win32 to debug this reliably. Os.system may be the 'old
253 253 # fashioned' way to do it, but it works just fine. If someone
254 254 # later can clean this up that's fine, as long as the tests run
255 255 # reliably in win32.
256 256 # What types of problems are you having. They may be related to
257 257 # running Python in unboffered mode. BG.
258 258 return os.system(' '.join(self.call_args))
259 259 else:
260 260 def _run_cmd(self):
261 261 # print >> sys.stderr, '*** CMD:', ' '.join(self.call_args) # dbg
262 262 subp = subprocess.Popen(self.call_args)
263 263 self.pids.append(subp.pid)
264 264 # If this fails, the pid will be left in self.pids and cleaned up
265 265 # later, but if the wait call succeeds, then we can clear the
266 266 # stored pid.
267 267 retcode = subp.wait()
268 268 self.pids.pop()
269 269 return retcode
270 270
271 271 def run(self):
272 272 """Run the stored commands"""
273 273 try:
274 274 return self._run_cmd()
275 275 except:
276 276 import traceback
277 277 traceback.print_exc()
278 278 return 1 # signal failure
279 279
280 280 def __del__(self):
281 281 """Cleanup on exit by killing any leftover processes."""
282 282
283 283 if not hasattr(os, 'kill'):
284 284 return
285 285
286 286 for pid in self.pids:
287 287 try:
288 288 print 'Cleaning stale PID:', pid
289 289 os.kill(pid, signal.SIGKILL)
290 290 except OSError:
291 291 # This is just a best effort, if we fail or the process was
292 292 # really gone, ignore it.
293 293 pass
294 294
295 295
296 296 def make_runners():
297 297 """Define the top-level packages that need to be tested.
298 298 """
299 299
300 300 # Packages to be tested via nose, that only depend on the stdlib
301 301 nose_pkg_names = ['config', 'core', 'extensions', 'frontend', 'lib',
302 302 'scripts', 'testing', 'utils' ]
303 303
304 304 if have['zmq']:
305 305 nose_pkg_names.append('parallel')
306 306
307 307 # For debugging this code, only load quick stuff
308 308 #nose_pkg_names = ['core', 'extensions'] # dbg
309 309
310 310 # Make fully qualified package names prepending 'IPython.' to our name lists
311 311 nose_packages = ['IPython.%s' % m for m in nose_pkg_names ]
312 312
313 313 # Make runners
314 314 runners = [ (v, IPTester('iptest', params=v)) for v in nose_packages ]
315 315
316 316 return runners
317 317
318 318
319 319 def run_iptest():
320 320 """Run the IPython test suite using nose.
321 321
322 322 This function is called when this script is **not** called with the form
323 323 `iptest all`. It simply calls nose with appropriate command line flags
324 324 and accepts all of the standard nose arguments.
325 325 """
326 326
327 327 warnings.filterwarnings('ignore',
328 328 'This will be removed soon. Use IPython.testing.util instead')
329 329
330 330 argv = sys.argv + [ '--detailed-errors', # extra info in tracebacks
331 331
332 332 # Loading ipdoctest causes problems with Twisted, but
333 333 # our test suite runner now separates things and runs
334 334 # all Twisted tests with trial.
335 335 '--with-ipdoctest',
336 336 '--ipdoctest-tests','--ipdoctest-extension=txt',
337 337
338 338 # We add --exe because of setuptools' imbecility (it
339 339 # blindly does chmod +x on ALL files). Nose does the
340 340 # right thing and it tries to avoid executables,
341 341 # setuptools unfortunately forces our hand here. This
342 342 # has been discussed on the distutils list and the
343 343 # setuptools devs refuse to fix this problem!
344 344 '--exe',
345 345 ]
346 346
347 347 if nose.__version__ >= '0.11':
348 348 # I don't fully understand why we need this one, but depending on what
349 349 # directory the test suite is run from, if we don't give it, 0 tests
350 350 # get run. Specifically, if the test suite is run from the source dir
351 351 # with an argument (like 'iptest.py IPython.core', 0 tests are run,
352 352 # even if the same call done in this directory works fine). It appears
353 353 # that if the requested package is in the current dir, nose bails early
354 354 # by default. Since it's otherwise harmless, leave it in by default
355 355 # for nose >= 0.11, though unfortunately nose 0.10 doesn't support it.
356 356 argv.append('--traverse-namespace')
357 357
358 358 # Construct list of plugins, omitting the existing doctest plugin, which
359 359 # ours replaces (and extends).
360 360 plugins = [IPythonDoctest(make_exclude()), KnownFailure()]
361 361 for p in nose.plugins.builtin.plugins:
362 362 plug = p()
363 363 if plug.name == 'doctest':
364 364 continue
365 365 plugins.append(plug)
366 366
367 367 # We need a global ipython running in this process
368 368 globalipapp.start_ipython()
369 369 # Now nose can run
370 370 TestProgram(argv=argv, plugins=plugins)
371 371
372 372
373 373 def run_iptestall():
374 374 """Run the entire IPython test suite by calling nose and trial.
375 375
376 376 This function constructs :class:`IPTester` instances for all IPython
377 377 modules and package and then runs each of them. This causes the modules
378 378 and packages of IPython to be tested each in their own subprocess using
379 379 nose or twisted.trial appropriately.
380 380 """
381 381
382 382 runners = make_runners()
383 383
384 384 # Run the test runners in a temporary dir so we can nuke it when finished
385 385 # to clean up any junk files left over by accident. This also makes it
386 386 # robust against being run in non-writeable directories by mistake, as the
387 387 # temp dir will always be user-writeable.
388 curdir = os.getcwd()
388 curdir = os.getcwdu()
389 389 testdir = tempfile.gettempdir()
390 390 os.chdir(testdir)
391 391
392 392 # Run all test runners, tracking execution time
393 393 failed = []
394 394 t_start = time.time()
395 395 try:
396 396 for (name, runner) in runners:
397 397 print '*'*70
398 398 print 'IPython test group:',name
399 399 res = runner.run()
400 400 if res:
401 401 failed.append( (name, runner) )
402 402 finally:
403 403 os.chdir(curdir)
404 404 t_end = time.time()
405 405 t_tests = t_end - t_start
406 406 nrunners = len(runners)
407 407 nfail = len(failed)
408 408 # summarize results
409 409 print
410 410 print '*'*70
411 411 print 'Test suite completed for system with the following information:'
412 412 print report()
413 413 print 'Ran %s test groups in %.3fs' % (nrunners, t_tests)
414 414 print
415 415 print 'Status:'
416 416 if not failed:
417 417 print 'OK'
418 418 else:
419 419 # If anything went wrong, point out what command to rerun manually to
420 420 # see the actual errors and individual summary
421 421 print 'ERROR - %s out of %s test groups failed.' % (nfail, nrunners)
422 422 for name, failed_runner in failed:
423 423 print '-'*40
424 424 print 'Runner failed:',name
425 425 print 'You may wish to rerun this one individually, with:'
426 426 print ' '.join(failed_runner.call_args)
427 427 print
428 428 # Ensure that our exit code indicates failure
429 429 sys.exit(1)
430 430
431 431
432 432 def main():
433 433 for arg in sys.argv[1:]:
434 434 if arg.startswith('IPython'):
435 435 # This is in-process
436 436 run_iptest()
437 437 else:
438 438 # This starts subprocesses
439 439 run_iptestall()
440 440
441 441
442 442 if __name__ == '__main__':
443 443 main()
@@ -1,793 +1,793 b''
1 1 """Nose Plugin that supports IPython doctests.
2 2
3 3 Limitations:
4 4
5 5 - When generating examples for use as doctests, make sure that you have
6 6 pretty-printing OFF. This can be done either by starting ipython with the
7 7 flag '--nopprint', by setting pprint to 0 in your ipythonrc file, or by
8 8 interactively disabling it with %Pprint. This is required so that IPython
9 9 output matches that of normal Python, which is used by doctest for internal
10 10 execution.
11 11
12 12 - Do not rely on specific prompt numbers for results (such as using
13 13 '_34==True', for example). For IPython tests run via an external process the
14 14 prompt numbers may be different, and IPython tests run as normal python code
15 15 won't even have these special _NN variables set at all.
16 16 """
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Module imports
20 20
21 21 # From the standard library
22 22 import __builtin__
23 23 import commands
24 24 import doctest
25 25 import inspect
26 26 import logging
27 27 import os
28 28 import re
29 29 import sys
30 30 import traceback
31 31 import unittest
32 32
33 33 from inspect import getmodule
34 34 from StringIO import StringIO
35 35
36 36 # We are overriding the default doctest runner, so we need to import a few
37 37 # things from doctest directly
38 38 from doctest import (REPORTING_FLAGS, REPORT_ONLY_FIRST_FAILURE,
39 39 _unittest_reportflags, DocTestRunner,
40 40 _extract_future_flags, pdb, _OutputRedirectingPdb,
41 41 _exception_traceback,
42 42 linecache)
43 43
44 44 # Third-party modules
45 45 import nose.core
46 46
47 47 from nose.plugins import doctests, Plugin
48 48 from nose.util import anyp, getpackage, test_address, resolve_name, tolist
49 49
50 50 #-----------------------------------------------------------------------------
51 51 # Module globals and other constants
52 52 #-----------------------------------------------------------------------------
53 53
54 54 log = logging.getLogger(__name__)
55 55
56 56
57 57 #-----------------------------------------------------------------------------
58 58 # Classes and functions
59 59 #-----------------------------------------------------------------------------
60 60
61 61 def is_extension_module(filename):
62 62 """Return whether the given filename is an extension module.
63 63
64 64 This simply checks that the extension is either .so or .pyd.
65 65 """
66 66 return os.path.splitext(filename)[1].lower() in ('.so','.pyd')
67 67
68 68
69 69 class DocTestSkip(object):
70 70 """Object wrapper for doctests to be skipped."""
71 71
72 72 ds_skip = """Doctest to skip.
73 73 >>> 1 #doctest: +SKIP
74 74 """
75 75
76 76 def __init__(self,obj):
77 77 self.obj = obj
78 78
79 79 def __getattribute__(self,key):
80 80 if key == '__doc__':
81 81 return DocTestSkip.ds_skip
82 82 else:
83 83 return getattr(object.__getattribute__(self,'obj'),key)
84 84
85 85 # Modified version of the one in the stdlib, that fixes a python bug (doctests
86 86 # not found in extension modules, http://bugs.python.org/issue3158)
87 87 class DocTestFinder(doctest.DocTestFinder):
88 88
89 89 def _from_module(self, module, object):
90 90 """
91 91 Return true if the given object is defined in the given
92 92 module.
93 93 """
94 94 if module is None:
95 95 return True
96 96 elif inspect.isfunction(object):
97 97 return module.__dict__ is object.func_globals
98 98 elif inspect.isbuiltin(object):
99 99 return module.__name__ == object.__module__
100 100 elif inspect.isclass(object):
101 101 return module.__name__ == object.__module__
102 102 elif inspect.ismethod(object):
103 103 # This one may be a bug in cython that fails to correctly set the
104 104 # __module__ attribute of methods, but since the same error is easy
105 105 # to make by extension code writers, having this safety in place
106 106 # isn't such a bad idea
107 107 return module.__name__ == object.im_class.__module__
108 108 elif inspect.getmodule(object) is not None:
109 109 return module is inspect.getmodule(object)
110 110 elif hasattr(object, '__module__'):
111 111 return module.__name__ == object.__module__
112 112 elif isinstance(object, property):
113 113 return True # [XX] no way not be sure.
114 114 else:
115 115 raise ValueError("object must be a class or function")
116 116
117 117 def _find(self, tests, obj, name, module, source_lines, globs, seen):
118 118 """
119 119 Find tests for the given object and any contained objects, and
120 120 add them to `tests`.
121 121 """
122 122 #print '_find for:', obj, name, module # dbg
123 123 if hasattr(obj,"skip_doctest"):
124 124 #print 'SKIPPING DOCTEST FOR:',obj # dbg
125 125 obj = DocTestSkip(obj)
126 126
127 127 doctest.DocTestFinder._find(self,tests, obj, name, module,
128 128 source_lines, globs, seen)
129 129
130 130 # Below we re-run pieces of the above method with manual modifications,
131 131 # because the original code is buggy and fails to correctly identify
132 132 # doctests in extension modules.
133 133
134 134 # Local shorthands
135 135 from inspect import isroutine, isclass, ismodule
136 136
137 137 # Look for tests in a module's contained objects.
138 138 if inspect.ismodule(obj) and self._recurse:
139 139 for valname, val in obj.__dict__.items():
140 140 valname1 = '%s.%s' % (name, valname)
141 141 if ( (isroutine(val) or isclass(val))
142 142 and self._from_module(module, val) ):
143 143
144 144 self._find(tests, val, valname1, module, source_lines,
145 145 globs, seen)
146 146
147 147 # Look for tests in a class's contained objects.
148 148 if inspect.isclass(obj) and self._recurse:
149 149 #print 'RECURSE into class:',obj # dbg
150 150 for valname, val in obj.__dict__.items():
151 151 # Special handling for staticmethod/classmethod.
152 152 if isinstance(val, staticmethod):
153 153 val = getattr(obj, valname)
154 154 if isinstance(val, classmethod):
155 155 val = getattr(obj, valname).im_func
156 156
157 157 # Recurse to methods, properties, and nested classes.
158 158 if ((inspect.isfunction(val) or inspect.isclass(val) or
159 159 inspect.ismethod(val) or
160 160 isinstance(val, property)) and
161 161 self._from_module(module, val)):
162 162 valname = '%s.%s' % (name, valname)
163 163 self._find(tests, val, valname, module, source_lines,
164 164 globs, seen)
165 165
166 166
167 167 class IPDoctestOutputChecker(doctest.OutputChecker):
168 168 """Second-chance checker with support for random tests.
169 169
170 170 If the default comparison doesn't pass, this checker looks in the expected
171 171 output string for flags that tell us to ignore the output.
172 172 """
173 173
174 174 random_re = re.compile(r'#\s*random\s+')
175 175
176 176 def check_output(self, want, got, optionflags):
177 177 """Check output, accepting special markers embedded in the output.
178 178
179 179 If the output didn't pass the default validation but the special string
180 180 '#random' is included, we accept it."""
181 181
182 182 # Let the original tester verify first, in case people have valid tests
183 183 # that happen to have a comment saying '#random' embedded in.
184 184 ret = doctest.OutputChecker.check_output(self, want, got,
185 185 optionflags)
186 186 if not ret and self.random_re.search(want):
187 187 #print >> sys.stderr, 'RANDOM OK:',want # dbg
188 188 return True
189 189
190 190 return ret
191 191
192 192
193 193 class DocTestCase(doctests.DocTestCase):
194 194 """Proxy for DocTestCase: provides an address() method that
195 195 returns the correct address for the doctest case. Otherwise
196 196 acts as a proxy to the test case. To provide hints for address(),
197 197 an obj may also be passed -- this will be used as the test object
198 198 for purposes of determining the test address, if it is provided.
199 199 """
200 200
201 201 # Note: this method was taken from numpy's nosetester module.
202 202
203 203 # Subclass nose.plugins.doctests.DocTestCase to work around a bug in
204 204 # its constructor that blocks non-default arguments from being passed
205 205 # down into doctest.DocTestCase
206 206
207 207 def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
208 208 checker=None, obj=None, result_var='_'):
209 209 self._result_var = result_var
210 210 doctests.DocTestCase.__init__(self, test,
211 211 optionflags=optionflags,
212 212 setUp=setUp, tearDown=tearDown,
213 213 checker=checker)
214 214 # Now we must actually copy the original constructor from the stdlib
215 215 # doctest class, because we can't call it directly and a bug in nose
216 216 # means it never gets passed the right arguments.
217 217
218 218 self._dt_optionflags = optionflags
219 219 self._dt_checker = checker
220 220 self._dt_test = test
221 221 self._dt_test_globs_ori = test.globs
222 222 self._dt_setUp = setUp
223 223 self._dt_tearDown = tearDown
224 224
225 225 # XXX - store this runner once in the object!
226 226 runner = IPDocTestRunner(optionflags=optionflags,
227 227 checker=checker, verbose=False)
228 228 self._dt_runner = runner
229 229
230 230
231 231 # Each doctest should remember the directory it was loaded from, so
232 232 # things like %run work without too many contortions
233 233 self._ori_dir = os.path.dirname(test.filename)
234 234
235 235 # Modified runTest from the default stdlib
236 236 def runTest(self):
237 237 test = self._dt_test
238 238 runner = self._dt_runner
239 239
240 240 old = sys.stdout
241 241 new = StringIO()
242 242 optionflags = self._dt_optionflags
243 243
244 244 if not (optionflags & REPORTING_FLAGS):
245 245 # The option flags don't include any reporting flags,
246 246 # so add the default reporting flags
247 247 optionflags |= _unittest_reportflags
248 248
249 249 try:
250 250 # Save our current directory and switch out to the one where the
251 251 # test was originally created, in case another doctest did a
252 252 # directory change. We'll restore this in the finally clause.
253 curdir = os.getcwd()
253 curdir = os.getcwdu()
254 254 #print 'runTest in dir:', self._ori_dir # dbg
255 255 os.chdir(self._ori_dir)
256 256
257 257 runner.DIVIDER = "-"*70
258 258 failures, tries = runner.run(test,out=new.write,
259 259 clear_globs=False)
260 260 finally:
261 261 sys.stdout = old
262 262 os.chdir(curdir)
263 263
264 264 if failures:
265 265 raise self.failureException(self.format_failure(new.getvalue()))
266 266
267 267 def setUp(self):
268 268 """Modified test setup that syncs with ipython namespace"""
269 269 #print "setUp test", self._dt_test.examples # dbg
270 270 if isinstance(self._dt_test.examples[0],IPExample):
271 271 # for IPython examples *only*, we swap the globals with the ipython
272 272 # namespace, after updating it with the globals (which doctest
273 273 # fills with the necessary info from the module being tested).
274 274 _ip.user_ns.update(self._dt_test.globs)
275 275 self._dt_test.globs = _ip.user_ns
276 276 # IPython must protect the _ key in the namespace (it can't exist)
277 277 # so that Python's doctest code sets it naturally, so we enable
278 278 # this feature of our testing namespace.
279 279 _ip.user_ns.protect_underscore = True
280 280
281 281 super(DocTestCase, self).setUp()
282 282
283 283 def tearDown(self):
284 284
285 285 # Undo the test.globs reassignment we made, so that the parent class
286 286 # teardown doesn't destroy the ipython namespace
287 287 if isinstance(self._dt_test.examples[0],IPExample):
288 288 self._dt_test.globs = self._dt_test_globs_ori
289 289 # Restore the behavior of the '_' key in the user namespace to
290 290 # normal after each doctest, so that unittests behave normally
291 291 _ip.user_ns.protect_underscore = False
292 292
293 293 # XXX - fperez: I am not sure if this is truly a bug in nose 0.11, but
294 294 # it does look like one to me: its tearDown method tries to run
295 295 #
296 296 # delattr(__builtin__, self._result_var)
297 297 #
298 298 # without checking that the attribute really is there; it implicitly
299 299 # assumes it should have been set via displayhook. But if the
300 300 # displayhook was never called, this doesn't necessarily happen. I
301 301 # haven't been able to find a little self-contained example outside of
302 302 # ipython that would show the problem so I can report it to the nose
303 303 # team, but it does happen a lot in our code.
304 304 #
305 305 # So here, we just protect as narrowly as possible by trapping an
306 306 # attribute error whose message would be the name of self._result_var,
307 307 # and letting any other error propagate.
308 308 try:
309 309 super(DocTestCase, self).tearDown()
310 310 except AttributeError, exc:
311 311 if exc.args[0] != self._result_var:
312 312 raise
313 313
314 314
315 315 # A simple subclassing of the original with a different class name, so we can
316 316 # distinguish and treat differently IPython examples from pure python ones.
317 317 class IPExample(doctest.Example): pass
318 318
319 319
320 320 class IPExternalExample(doctest.Example):
321 321 """Doctest examples to be run in an external process."""
322 322
323 323 def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
324 324 options=None):
325 325 # Parent constructor
326 326 doctest.Example.__init__(self,source,want,exc_msg,lineno,indent,options)
327 327
328 328 # An EXTRA newline is needed to prevent pexpect hangs
329 329 self.source += '\n'
330 330
331 331
332 332 class IPDocTestParser(doctest.DocTestParser):
333 333 """
334 334 A class used to parse strings containing doctest examples.
335 335
336 336 Note: This is a version modified to properly recognize IPython input and
337 337 convert any IPython examples into valid Python ones.
338 338 """
339 339 # This regular expression is used to find doctest examples in a
340 340 # string. It defines three groups: `source` is the source code
341 341 # (including leading indentation and prompts); `indent` is the
342 342 # indentation of the first (PS1) line of the source code; and
343 343 # `want` is the expected output (including leading indentation).
344 344
345 345 # Classic Python prompts or default IPython ones
346 346 _PS1_PY = r'>>>'
347 347 _PS2_PY = r'\.\.\.'
348 348
349 349 _PS1_IP = r'In\ \[\d+\]:'
350 350 _PS2_IP = r'\ \ \ \.\.\.+:'
351 351
352 352 _RE_TPL = r'''
353 353 # Source consists of a PS1 line followed by zero or more PS2 lines.
354 354 (?P<source>
355 355 (?:^(?P<indent> [ ]*) (?P<ps1> %s) .*) # PS1 line
356 356 (?:\n [ ]* (?P<ps2> %s) .*)*) # PS2 lines
357 357 \n? # a newline
358 358 # Want consists of any non-blank lines that do not start with PS1.
359 359 (?P<want> (?:(?![ ]*$) # Not a blank line
360 360 (?![ ]*%s) # Not a line starting with PS1
361 361 (?![ ]*%s) # Not a line starting with PS2
362 362 .*$\n? # But any other line
363 363 )*)
364 364 '''
365 365
366 366 _EXAMPLE_RE_PY = re.compile( _RE_TPL % (_PS1_PY,_PS2_PY,_PS1_PY,_PS2_PY),
367 367 re.MULTILINE | re.VERBOSE)
368 368
369 369 _EXAMPLE_RE_IP = re.compile( _RE_TPL % (_PS1_IP,_PS2_IP,_PS1_IP,_PS2_IP),
370 370 re.MULTILINE | re.VERBOSE)
371 371
372 372 # Mark a test as being fully random. In this case, we simply append the
373 373 # random marker ('#random') to each individual example's output. This way
374 374 # we don't need to modify any other code.
375 375 _RANDOM_TEST = re.compile(r'#\s*all-random\s+')
376 376
377 377 # Mark tests to be executed in an external process - currently unsupported.
378 378 _EXTERNAL_IP = re.compile(r'#\s*ipdoctest:\s*EXTERNAL')
379 379
380 380 def ip2py(self,source):
381 381 """Convert input IPython source into valid Python."""
382 382 out = []
383 383 newline = out.append
384 384 #print 'IPSRC:\n',source,'\n###' # dbg
385 385 # The input source must be first stripped of all bracketing whitespace
386 386 # and turned into lines, so it looks to the parser like regular user
387 387 # input
388 388 for lnum,line in enumerate(source.strip().splitlines()):
389 389 newline(_ip.prefilter(line,lnum>0))
390 390 newline('') # ensure a closing newline, needed by doctest
391 391 #print "PYSRC:", '\n'.join(out) # dbg
392 392 return '\n'.join(out)
393 393
394 394 def parse(self, string, name='<string>'):
395 395 """
396 396 Divide the given string into examples and intervening text,
397 397 and return them as a list of alternating Examples and strings.
398 398 Line numbers for the Examples are 0-based. The optional
399 399 argument `name` is a name identifying this string, and is only
400 400 used for error messages.
401 401 """
402 402
403 403 #print 'Parse string:\n',string # dbg
404 404
405 405 string = string.expandtabs()
406 406 # If all lines begin with the same indentation, then strip it.
407 407 min_indent = self._min_indent(string)
408 408 if min_indent > 0:
409 409 string = '\n'.join([l[min_indent:] for l in string.split('\n')])
410 410
411 411 output = []
412 412 charno, lineno = 0, 0
413 413
414 414 # We make 'all random' tests by adding the '# random' mark to every
415 415 # block of output in the test.
416 416 if self._RANDOM_TEST.search(string):
417 417 random_marker = '\n# random'
418 418 else:
419 419 random_marker = ''
420 420
421 421 # Whether to convert the input from ipython to python syntax
422 422 ip2py = False
423 423 # Find all doctest examples in the string. First, try them as Python
424 424 # examples, then as IPython ones
425 425 terms = list(self._EXAMPLE_RE_PY.finditer(string))
426 426 if terms:
427 427 # Normal Python example
428 428 #print '-'*70 # dbg
429 429 #print 'PyExample, Source:\n',string # dbg
430 430 #print '-'*70 # dbg
431 431 Example = doctest.Example
432 432 else:
433 433 # It's an ipython example. Note that IPExamples are run
434 434 # in-process, so their syntax must be turned into valid python.
435 435 # IPExternalExamples are run out-of-process (via pexpect) so they
436 436 # don't need any filtering (a real ipython will be executing them).
437 437 terms = list(self._EXAMPLE_RE_IP.finditer(string))
438 438 if self._EXTERNAL_IP.search(string):
439 439 #print '-'*70 # dbg
440 440 #print 'IPExternalExample, Source:\n',string # dbg
441 441 #print '-'*70 # dbg
442 442 Example = IPExternalExample
443 443 else:
444 444 #print '-'*70 # dbg
445 445 #print 'IPExample, Source:\n',string # dbg
446 446 #print '-'*70 # dbg
447 447 Example = IPExample
448 448 ip2py = True
449 449
450 450 for m in terms:
451 451 # Add the pre-example text to `output`.
452 452 output.append(string[charno:m.start()])
453 453 # Update lineno (lines before this example)
454 454 lineno += string.count('\n', charno, m.start())
455 455 # Extract info from the regexp match.
456 456 (source, options, want, exc_msg) = \
457 457 self._parse_example(m, name, lineno,ip2py)
458 458
459 459 # Append the random-output marker (it defaults to empty in most
460 460 # cases, it's only non-empty for 'all-random' tests):
461 461 want += random_marker
462 462
463 463 if Example is IPExternalExample:
464 464 options[doctest.NORMALIZE_WHITESPACE] = True
465 465 want += '\n'
466 466
467 467 # Create an Example, and add it to the list.
468 468 if not self._IS_BLANK_OR_COMMENT(source):
469 469 output.append(Example(source, want, exc_msg,
470 470 lineno=lineno,
471 471 indent=min_indent+len(m.group('indent')),
472 472 options=options))
473 473 # Update lineno (lines inside this example)
474 474 lineno += string.count('\n', m.start(), m.end())
475 475 # Update charno.
476 476 charno = m.end()
477 477 # Add any remaining post-example text to `output`.
478 478 output.append(string[charno:])
479 479 return output
480 480
481 481 def _parse_example(self, m, name, lineno,ip2py=False):
482 482 """
483 483 Given a regular expression match from `_EXAMPLE_RE` (`m`),
484 484 return a pair `(source, want)`, where `source` is the matched
485 485 example's source code (with prompts and indentation stripped);
486 486 and `want` is the example's expected output (with indentation
487 487 stripped).
488 488
489 489 `name` is the string's name, and `lineno` is the line number
490 490 where the example starts; both are used for error messages.
491 491
492 492 Optional:
493 493 `ip2py`: if true, filter the input via IPython to convert the syntax
494 494 into valid python.
495 495 """
496 496
497 497 # Get the example's indentation level.
498 498 indent = len(m.group('indent'))
499 499
500 500 # Divide source into lines; check that they're properly
501 501 # indented; and then strip their indentation & prompts.
502 502 source_lines = m.group('source').split('\n')
503 503
504 504 # We're using variable-length input prompts
505 505 ps1 = m.group('ps1')
506 506 ps2 = m.group('ps2')
507 507 ps1_len = len(ps1)
508 508
509 509 self._check_prompt_blank(source_lines, indent, name, lineno,ps1_len)
510 510 if ps2:
511 511 self._check_prefix(source_lines[1:], ' '*indent + ps2, name, lineno)
512 512
513 513 source = '\n'.join([sl[indent+ps1_len+1:] for sl in source_lines])
514 514
515 515 if ip2py:
516 516 # Convert source input from IPython into valid Python syntax
517 517 source = self.ip2py(source)
518 518
519 519 # Divide want into lines; check that it's properly indented; and
520 520 # then strip the indentation. Spaces before the last newline should
521 521 # be preserved, so plain rstrip() isn't good enough.
522 522 want = m.group('want')
523 523 want_lines = want.split('\n')
524 524 if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
525 525 del want_lines[-1] # forget final newline & spaces after it
526 526 self._check_prefix(want_lines, ' '*indent, name,
527 527 lineno + len(source_lines))
528 528
529 529 # Remove ipython output prompt that might be present in the first line
530 530 want_lines[0] = re.sub(r'Out\[\d+\]: \s*?\n?','',want_lines[0])
531 531
532 532 want = '\n'.join([wl[indent:] for wl in want_lines])
533 533
534 534 # If `want` contains a traceback message, then extract it.
535 535 m = self._EXCEPTION_RE.match(want)
536 536 if m:
537 537 exc_msg = m.group('msg')
538 538 else:
539 539 exc_msg = None
540 540
541 541 # Extract options from the source.
542 542 options = self._find_options(source, name, lineno)
543 543
544 544 return source, options, want, exc_msg
545 545
546 546 def _check_prompt_blank(self, lines, indent, name, lineno, ps1_len):
547 547 """
548 548 Given the lines of a source string (including prompts and
549 549 leading indentation), check to make sure that every prompt is
550 550 followed by a space character. If any line is not followed by
551 551 a space character, then raise ValueError.
552 552
553 553 Note: IPython-modified version which takes the input prompt length as a
554 554 parameter, so that prompts of variable length can be dealt with.
555 555 """
556 556 space_idx = indent+ps1_len
557 557 min_len = space_idx+1
558 558 for i, line in enumerate(lines):
559 559 if len(line) >= min_len and line[space_idx] != ' ':
560 560 raise ValueError('line %r of the docstring for %s '
561 561 'lacks blank after %s: %r' %
562 562 (lineno+i+1, name,
563 563 line[indent:space_idx], line))
564 564
565 565
566 566 SKIP = doctest.register_optionflag('SKIP')
567 567
568 568
569 569 class IPDocTestRunner(doctest.DocTestRunner,object):
570 570 """Test runner that synchronizes the IPython namespace with test globals.
571 571 """
572 572
573 573 def run(self, test, compileflags=None, out=None, clear_globs=True):
574 574
575 575 # Hack: ipython needs access to the execution context of the example,
576 576 # so that it can propagate user variables loaded by %run into
577 577 # test.globs. We put them here into our modified %run as a function
578 578 # attribute. Our new %run will then only make the namespace update
579 579 # when called (rather than unconconditionally updating test.globs here
580 580 # for all examples, most of which won't be calling %run anyway).
581 581 #_ip._ipdoctest_test_globs = test.globs
582 582 #_ip._ipdoctest_test_filename = test.filename
583 583
584 584 test.globs.update(_ip.user_ns)
585 585
586 586 return super(IPDocTestRunner,self).run(test,
587 587 compileflags,out,clear_globs)
588 588
589 589
590 590 class DocFileCase(doctest.DocFileCase):
591 591 """Overrides to provide filename
592 592 """
593 593 def address(self):
594 594 return (self._dt_test.filename, None, None)
595 595
596 596
597 597 class ExtensionDoctest(doctests.Doctest):
598 598 """Nose Plugin that supports doctests in extension modules.
599 599 """
600 600 name = 'extdoctest' # call nosetests with --with-extdoctest
601 601 enabled = True
602 602
603 603 def __init__(self,exclude_patterns=None):
604 604 """Create a new ExtensionDoctest plugin.
605 605
606 606 Parameters
607 607 ----------
608 608
609 609 exclude_patterns : sequence of strings, optional
610 610 These patterns are compiled as regular expressions, subsequently used
611 611 to exclude any filename which matches them from inclusion in the test
612 612 suite (using pattern.search(), NOT pattern.match() ).
613 613 """
614 614
615 615 if exclude_patterns is None:
616 616 exclude_patterns = []
617 617 self.exclude_patterns = map(re.compile,exclude_patterns)
618 618 doctests.Doctest.__init__(self)
619 619
620 620 def options(self, parser, env=os.environ):
621 621 Plugin.options(self, parser, env)
622 622 parser.add_option('--doctest-tests', action='store_true',
623 623 dest='doctest_tests',
624 624 default=env.get('NOSE_DOCTEST_TESTS',True),
625 625 help="Also look for doctests in test modules. "
626 626 "Note that classes, methods and functions should "
627 627 "have either doctests or non-doctest tests, "
628 628 "not both. [NOSE_DOCTEST_TESTS]")
629 629 parser.add_option('--doctest-extension', action="append",
630 630 dest="doctestExtension",
631 631 help="Also look for doctests in files with "
632 632 "this extension [NOSE_DOCTEST_EXTENSION]")
633 633 # Set the default as a list, if given in env; otherwise
634 634 # an additional value set on the command line will cause
635 635 # an error.
636 636 env_setting = env.get('NOSE_DOCTEST_EXTENSION')
637 637 if env_setting is not None:
638 638 parser.set_defaults(doctestExtension=tolist(env_setting))
639 639
640 640
641 641 def configure(self, options, config):
642 642 Plugin.configure(self, options, config)
643 643 self.doctest_tests = options.doctest_tests
644 644 self.extension = tolist(options.doctestExtension)
645 645
646 646 self.parser = doctest.DocTestParser()
647 647 self.finder = DocTestFinder()
648 648 self.checker = IPDoctestOutputChecker()
649 649 self.globs = None
650 650 self.extraglobs = None
651 651
652 652
653 653 def loadTestsFromExtensionModule(self,filename):
654 654 bpath,mod = os.path.split(filename)
655 655 modname = os.path.splitext(mod)[0]
656 656 try:
657 657 sys.path.append(bpath)
658 658 module = __import__(modname)
659 659 tests = list(self.loadTestsFromModule(module))
660 660 finally:
661 661 sys.path.pop()
662 662 return tests
663 663
664 664 # NOTE: the method below is almost a copy of the original one in nose, with
665 665 # a few modifications to control output checking.
666 666
667 667 def loadTestsFromModule(self, module):
668 668 #print '*** ipdoctest - lTM',module # dbg
669 669
670 670 if not self.matches(module.__name__):
671 671 log.debug("Doctest doesn't want module %s", module)
672 672 return
673 673
674 674 tests = self.finder.find(module,globs=self.globs,
675 675 extraglobs=self.extraglobs)
676 676 if not tests:
677 677 return
678 678
679 679 # always use whitespace and ellipsis options
680 680 optionflags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
681 681
682 682 tests.sort()
683 683 module_file = module.__file__
684 684 if module_file[-4:] in ('.pyc', '.pyo'):
685 685 module_file = module_file[:-1]
686 686 for test in tests:
687 687 if not test.examples:
688 688 continue
689 689 if not test.filename:
690 690 test.filename = module_file
691 691
692 692 yield DocTestCase(test,
693 693 optionflags=optionflags,
694 694 checker=self.checker)
695 695
696 696
697 697 def loadTestsFromFile(self, filename):
698 698 #print "ipdoctest - from file", filename # dbg
699 699 if is_extension_module(filename):
700 700 for t in self.loadTestsFromExtensionModule(filename):
701 701 yield t
702 702 else:
703 703 if self.extension and anyp(filename.endswith, self.extension):
704 704 name = os.path.basename(filename)
705 705 dh = open(filename)
706 706 try:
707 707 doc = dh.read()
708 708 finally:
709 709 dh.close()
710 710 test = self.parser.get_doctest(
711 711 doc, globs={'__file__': filename}, name=name,
712 712 filename=filename, lineno=0)
713 713 if test.examples:
714 714 #print 'FileCase:',test.examples # dbg
715 715 yield DocFileCase(test)
716 716 else:
717 717 yield False # no tests to load
718 718
719 719 def wantFile(self,filename):
720 720 """Return whether the given filename should be scanned for tests.
721 721
722 722 Modified version that accepts extension modules as valid containers for
723 723 doctests.
724 724 """
725 725 #print '*** ipdoctest- wantFile:',filename # dbg
726 726
727 727 for pat in self.exclude_patterns:
728 728 if pat.search(filename):
729 729 # print '###>>> SKIP:',filename # dbg
730 730 return False
731 731
732 732 if is_extension_module(filename):
733 733 return True
734 734 else:
735 735 return doctests.Doctest.wantFile(self,filename)
736 736
737 737
738 738 class IPythonDoctest(ExtensionDoctest):
739 739 """Nose Plugin that supports doctests in extension modules.
740 740 """
741 741 name = 'ipdoctest' # call nosetests with --with-ipdoctest
742 742 enabled = True
743 743
744 744 def makeTest(self, obj, parent):
745 745 """Look for doctests in the given object, which will be a
746 746 function, method or class.
747 747 """
748 748 #print 'Plugin analyzing:', obj, parent # dbg
749 749 # always use whitespace and ellipsis options
750 750 optionflags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
751 751
752 752 doctests = self.finder.find(obj, module=getmodule(parent))
753 753 if doctests:
754 754 for test in doctests:
755 755 if len(test.examples) == 0:
756 756 continue
757 757
758 758 yield DocTestCase(test, obj=obj,
759 759 optionflags=optionflags,
760 760 checker=self.checker)
761 761
762 762 def options(self, parser, env=os.environ):
763 763 #print "Options for nose plugin:", self.name # dbg
764 764 Plugin.options(self, parser, env)
765 765 parser.add_option('--ipdoctest-tests', action='store_true',
766 766 dest='ipdoctest_tests',
767 767 default=env.get('NOSE_IPDOCTEST_TESTS',True),
768 768 help="Also look for doctests in test modules. "
769 769 "Note that classes, methods and functions should "
770 770 "have either doctests or non-doctest tests, "
771 771 "not both. [NOSE_IPDOCTEST_TESTS]")
772 772 parser.add_option('--ipdoctest-extension', action="append",
773 773 dest="ipdoctest_extension",
774 774 help="Also look for doctests in files with "
775 775 "this extension [NOSE_IPDOCTEST_EXTENSION]")
776 776 # Set the default as a list, if given in env; otherwise
777 777 # an additional value set on the command line will cause
778 778 # an error.
779 779 env_setting = env.get('NOSE_IPDOCTEST_EXTENSION')
780 780 if env_setting is not None:
781 781 parser.set_defaults(ipdoctest_extension=tolist(env_setting))
782 782
783 783 def configure(self, options, config):
784 784 #print "Configuring nose plugin:", self.name # dbg
785 785 Plugin.configure(self, options, config)
786 786 self.doctest_tests = options.ipdoctest_tests
787 787 self.extension = tolist(options.ipdoctest_extension)
788 788
789 789 self.parser = IPDocTestParser()
790 790 self.finder = DocTestFinder(parser=self.parser)
791 791 self.checker = IPDoctestOutputChecker()
792 792 self.globs = None
793 793 self.extraglobs = None
@@ -1,147 +1,147 b''
1 1 """Windows-specific implementation of process utilities.
2 2
3 3 This file is only meant to be imported by process.py, not by end-users.
4 4 """
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2010 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16 from __future__ import print_function
17 17
18 18 # stdlib
19 19 import os
20 20 import sys
21 21
22 22 from subprocess import STDOUT
23 23
24 24 # our own imports
25 25 from ._process_common import read_no_interrupt, process_handler
26 26
27 27 #-----------------------------------------------------------------------------
28 28 # Function definitions
29 29 #-----------------------------------------------------------------------------
30 30
31 31 class AvoidUNCPath(object):
32 32 """A context manager to protect command execution from UNC paths.
33 33
34 34 In the Win32 API, commands can't be invoked with the cwd being a UNC path.
35 35 This context manager temporarily changes directory to the 'C:' drive on
36 36 entering, and restores the original working directory on exit.
37 37
38 38 The context manager returns the starting working directory *if* it made a
39 39 change and None otherwise, so that users can apply the necessary adjustment
40 40 to their system calls in the event of a change.
41 41
42 42 Example
43 43 -------
44 44 ::
45 45 cmd = 'dir'
46 46 with AvoidUNCPath() as path:
47 47 if path is not None:
48 48 cmd = '"pushd %s &&"%s' % (path, cmd)
49 49 os.system(cmd)
50 50 """
51 51 def __enter__(self):
52 self.path = os.getcwd()
52 self.path = os.getcwdu()
53 53 self.is_unc_path = self.path.startswith(r"\\")
54 54 if self.is_unc_path:
55 55 # change to c drive (as cmd.exe cannot handle UNC addresses)
56 56 os.chdir("C:")
57 57 return self.path
58 58 else:
59 59 # We return None to signal that there was no change in the working
60 60 # directory
61 61 return None
62 62
63 63 def __exit__(self, exc_type, exc_value, traceback):
64 64 if self.is_unc_path:
65 65 os.chdir(self.path)
66 66
67 67
68 68 def _find_cmd(cmd):
69 69 """Find the full path to a .bat or .exe using the win32api module."""
70 70 try:
71 71 from win32api import SearchPath
72 72 except ImportError:
73 73 raise ImportError('you need to have pywin32 installed for this to work')
74 74 else:
75 75 PATH = os.environ['PATH']
76 76 extensions = ['.exe', '.com', '.bat', '.py']
77 77 path = None
78 78 for ext in extensions:
79 79 try:
80 80 path = SearchPath(PATH, cmd + ext)[0]
81 81 except:
82 82 pass
83 83 if path is None:
84 84 raise OSError("command %r not found" % cmd)
85 85 else:
86 86 return path
87 87
88 88
89 89 def _system_body(p):
90 90 """Callback for _system."""
91 91 enc = sys.stdin.encoding or sys.getdefaultencoding()
92 92 for line in read_no_interrupt(p.stdout).splitlines():
93 93 line = line.decode(enc, 'replace')
94 94 print(line, file=sys.stdout)
95 95 for line in read_no_interrupt(p.stderr).splitlines():
96 96 line = line.decode(enc, 'replace')
97 97 print(line, file=sys.stderr)
98 98
99 99 # Wait to finish for returncode
100 100 return p.wait()
101 101
102 102
103 103 def system(cmd):
104 104 """Win32 version of os.system() that works with network shares.
105 105
106 106 Note that this implementation returns None, as meant for use in IPython.
107 107
108 108 Parameters
109 109 ----------
110 110 cmd : str
111 111 A command to be executed in the system shell.
112 112
113 113 Returns
114 114 -------
115 115 None : we explicitly do NOT return the subprocess status code, as this
116 116 utility is meant to be used extensively in IPython, where any return value
117 117 would trigger :func:`sys.displayhook` calls.
118 118 """
119 119 with AvoidUNCPath() as path:
120 120 if path is not None:
121 121 cmd = '"pushd %s &&"%s' % (path, cmd)
122 122 return process_handler(cmd, _system_body)
123 123
124 124
125 125 def getoutput(cmd):
126 126 """Return standard output of executing cmd in a shell.
127 127
128 128 Accepts the same arguments as os.system().
129 129
130 130 Parameters
131 131 ----------
132 132 cmd : str
133 133 A command to be executed in the system shell.
134 134
135 135 Returns
136 136 -------
137 137 stdout : str
138 138 """
139 139
140 140 with AvoidUNCPath() as path:
141 141 if path is not None:
142 142 cmd = '"pushd %s &&"%s' % (path, cmd)
143 143 out = process_handler(cmd, lambda p: p.communicate()[0], STDOUT)
144 144
145 145 if out is None:
146 146 out = ''
147 147 return out
@@ -1,146 +1,146 b''
1 1 # encoding: utf-8
2 2 """
3 3 Utilities for working with external processes.
4 4 """
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2008-2009 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16 from __future__ import print_function
17 17
18 18 # Stdlib
19 19 import os
20 20 import sys
21 21 import shlex
22 22
23 23 # Our own
24 24 if sys.platform == 'win32':
25 25 from ._process_win32 import _find_cmd, system, getoutput, AvoidUNCPath
26 26 else:
27 27 from ._process_posix import _find_cmd, system, getoutput
28 28
29 29 from ._process_common import getoutputerror
30 30
31 31 #-----------------------------------------------------------------------------
32 32 # Code
33 33 #-----------------------------------------------------------------------------
34 34
35 35
36 36 class FindCmdError(Exception):
37 37 pass
38 38
39 39
40 40 def find_cmd(cmd):
41 41 """Find absolute path to executable cmd in a cross platform manner.
42 42
43 43 This function tries to determine the full path to a command line program
44 44 using `which` on Unix/Linux/OS X and `win32api` on Windows. Most of the
45 45 time it will use the version that is first on the users `PATH`. If
46 46 cmd is `python` return `sys.executable`.
47 47
48 48 Warning, don't use this to find IPython command line programs as there
49 49 is a risk you will find the wrong one. Instead find those using the
50 50 following code and looking for the application itself::
51 51
52 52 from IPython.utils.path import get_ipython_module_path
53 53 from IPython.utils.process import pycmd2argv
54 54 argv = pycmd2argv(get_ipython_module_path('IPython.frontend.terminal.ipapp'))
55 55
56 56 Parameters
57 57 ----------
58 58 cmd : str
59 59 The command line program to look for.
60 60 """
61 61 if cmd == 'python':
62 62 return os.path.abspath(sys.executable)
63 63 try:
64 64 path = _find_cmd(cmd).rstrip()
65 65 except OSError:
66 66 raise FindCmdError('command could not be found: %s' % cmd)
67 67 # which returns empty if not found
68 68 if path == '':
69 69 raise FindCmdError('command could not be found: %s' % cmd)
70 70 return os.path.abspath(path)
71 71
72 72
73 73 def pycmd2argv(cmd):
74 74 r"""Take the path of a python command and return a list (argv-style).
75 75
76 76 This only works on Python based command line programs and will find the
77 77 location of the ``python`` executable using ``sys.executable`` to make
78 78 sure the right version is used.
79 79
80 80 For a given path ``cmd``, this returns [cmd] if cmd's extension is .exe,
81 81 .com or .bat, and [, cmd] otherwise.
82 82
83 83 Parameters
84 84 ----------
85 85 cmd : string
86 86 The path of the command.
87 87
88 88 Returns
89 89 -------
90 90 argv-style list.
91 91 """
92 92 ext = os.path.splitext(cmd)[1]
93 93 if ext in ['.exe', '.com', '.bat']:
94 94 return [cmd]
95 95 else:
96 96 if sys.platform == 'win32':
97 97 # The -u option here turns on unbuffered output, which is required
98 98 # on Win32 to prevent wierd conflict and problems with Twisted.
99 99 # Also, use sys.executable to make sure we are picking up the
100 100 # right python exe.
101 101 return [sys.executable, '-u', cmd]
102 102 else:
103 103 return [sys.executable, cmd]
104 104
105 105
106 106 def arg_split(s, posix=False):
107 107 """Split a command line's arguments in a shell-like manner.
108 108
109 109 This is a modified version of the standard library's shlex.split()
110 110 function, but with a default of posix=False for splitting, so that quotes
111 111 in inputs are respected."""
112 112
113 113 # Unfortunately, python's shlex module is buggy with unicode input:
114 114 # http://bugs.python.org/issue1170
115 115 # At least encoding the input when it's unicode seems to help, but there
116 116 # may be more problems lurking. Apparently this is fixed in python3.
117 117 is_unicode = False
118 118 if isinstance(s, unicode):
119 119 is_unicode = True
120 120 s = s.encode('utf-8')
121 121 lex = shlex.shlex(s, posix=posix)
122 122 lex.whitespace_split = True
123 123 tokens = list(lex)
124 124 if is_unicode:
125 125 # Convert the tokens back to unicode.
126 126 tokens = [x.decode('utf-8') for x in tokens]
127 127 return tokens
128 128
129 129
130 130 def abbrev_cwd():
131 131 """ Return abbreviated version of cwd, e.g. d:mydir """
132 cwd = os.getcwd().replace('\\','/')
132 cwd = os.getcwdu().replace('\\','/')
133 133 drivepart = ''
134 134 tail = cwd
135 135 if sys.platform == 'win32':
136 136 if len(cwd) < 4:
137 137 return cwd
138 138 drivepart,tail = os.path.splitdrive(cwd)
139 139
140 140
141 141 parts = tail.split('/')
142 142 if len(parts) > 2:
143 143 tail = '/'.join(parts[-2:])
144 144
145 145 return (drivepart + (
146 146 cwd == '/' and '/' or tail))
@@ -1,162 +1,162 b''
1 1 # encoding: utf-8
2 2 """
3 3 Utilities for working with terminals.
4 4
5 5 Authors:
6 6
7 7 * Brian E. Granger
8 8 * Fernando Perez
9 9 * Alexander Belchenko (e-mail: bialix AT ukr.net)
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2009 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 import os
24 24 import struct
25 25 import sys
26 26 import warnings
27 27
28 28 #-----------------------------------------------------------------------------
29 29 # Code
30 30 #-----------------------------------------------------------------------------
31 31
32 32 # This variable is part of the expected API of the module:
33 33 ignore_termtitle = True
34 34
35 35
36 36 def _term_clear():
37 37 pass
38 38
39 39
40 40 if os.name == 'posix':
41 41 def _term_clear():
42 42 os.system('clear')
43 43
44 44
45 45 if sys.platform == 'win32':
46 46 def _term_clear():
47 47 os.system('cls')
48 48
49 49
50 50 def term_clear():
51 51 _term_clear()
52 52
53 53
54 54 def toggle_set_term_title(val):
55 55 """Control whether set_term_title is active or not.
56 56
57 57 set_term_title() allows writing to the console titlebar. In embedded
58 58 widgets this can cause problems, so this call can be used to toggle it on
59 59 or off as needed.
60 60
61 61 The default state of the module is for the function to be disabled.
62 62
63 63 Parameters
64 64 ----------
65 65 val : bool
66 66 If True, set_term_title() actually writes to the terminal (using the
67 67 appropriate platform-specific module). If False, it is a no-op.
68 68 """
69 69 global ignore_termtitle
70 70 ignore_termtitle = not(val)
71 71
72 72
73 73 def _set_term_title(*args,**kw):
74 74 """Dummy no-op."""
75 75 pass
76 76
77 77
78 78 def _set_term_title_xterm(title):
79 79 """ Change virtual terminal title in xterm-workalikes """
80 80 sys.stdout.write('\033]0;%s\007' % title)
81 81
82 82 if os.name == 'posix':
83 83 TERM = os.environ.get('TERM','')
84 84 if (TERM == 'xterm') or (TERM == 'xterm-color'):
85 85 _set_term_title = _set_term_title_xterm
86 86
87 87
88 88 if sys.platform == 'win32':
89 89 try:
90 90 import ctypes
91 91
92 92 SetConsoleTitleW = ctypes.windll.kernel32.SetConsoleTitleW
93 93 SetConsoleTitleW.argtypes = [ctypes.c_wchar_p]
94 94
95 95 def _set_term_title(title):
96 96 """Set terminal title using ctypes to access the Win32 APIs."""
97 97 SetConsoleTitleW(title)
98 98 except ImportError:
99 99 def _set_term_title(title):
100 100 """Set terminal title using the 'title' command."""
101 101 global ignore_termtitle
102 102
103 103 try:
104 104 # Cannot be on network share when issuing system commands
105 curr = os.getcwd()
105 curr = os.getcwdu()
106 106 os.chdir("C:")
107 107 ret = os.system("title " + title)
108 108 finally:
109 109 os.chdir(curr)
110 110 if ret:
111 111 # non-zero return code signals error, don't try again
112 112 ignore_termtitle = True
113 113
114 114
115 115 def set_term_title(title):
116 116 """Set terminal title using the necessary platform-dependent calls."""
117 117 if ignore_termtitle:
118 118 return
119 119 _set_term_title(title)
120 120
121 121
122 122 def freeze_term_title():
123 123 warnings.warn("This function is deprecated, use toggle_set_term_title()")
124 124 global ignore_termtitle
125 125 ignore_termtitle = True
126 126
127 127
128 128 def get_terminal_size(defaultx=80, defaulty=25):
129 129 return defaultx, defaulty
130 130
131 131
132 132 if sys.platform == 'win32':
133 133 def get_terminal_size(defaultx=80, defaulty=25):
134 134 """Return size of current terminal console.
135 135
136 136 This function try to determine actual size of current working
137 137 console window and return tuple (sizex, sizey) if success,
138 138 or default size (defaultx, defaulty) otherwise.
139 139
140 140 Dependencies: ctypes should be installed.
141 141
142 142 Author: Alexander Belchenko (e-mail: bialix AT ukr.net)
143 143 """
144 144 try:
145 145 import ctypes
146 146 except ImportError:
147 147 return defaultx, defaulty
148 148
149 149 h = ctypes.windll.kernel32.GetStdHandle(-11)
150 150 csbi = ctypes.create_string_buffer(22)
151 151 res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)
152 152
153 153 if res:
154 154 (bufx, bufy, curx, cury, wattr,
155 155 left, top, right, bottom, maxx, maxy) = struct.unpack(
156 156 "hhhhHhhhhhh", csbi.raw)
157 157 sizex = right - left + 1
158 158 sizey = bottom - top + 1
159 159 return (sizex, sizey)
160 160 else:
161 161 return (defaultx, defaulty)
162 162
@@ -1,78 +1,78 b''
1 1 #!/usr/bin/env python
2 2 """Script to build documentation using Sphinx.
3 3 """
4 4
5 5 import fileinput,os,sys
6 6
7 7 def oscmd(c):
8 8 os.system(c)
9 9
10 10 # html manual.
11 11 oscmd('sphinx-build -d build/doctrees source build/html')
12 12
13 13 if sys.platform != 'win32':
14 14 # LaTeX format.
15 15 oscmd('sphinx-build -b latex -d build/doctrees source build/latex')
16 16
17 17 # Produce pdf.
18 topdir = os.getcwd()
18 topdir = os.getcwdu()
19 19 os.chdir('build/latex')
20 20
21 21 # Change chapter style to section style: allows chapters to start on
22 22 # the current page. Works much better for the short chapters we have.
23 23 # This must go in the class file rather than the preamble, so we modify
24 24 # manual.cls at runtime.
25 25 chapter_cmds=r'''
26 26 % Local changes.
27 27 \renewcommand\chapter{
28 28 \thispagestyle{plain}
29 29 \global\@topnum\z@
30 30 \@afterindentfalse
31 31 \secdef\@chapter\@schapter
32 32 }
33 33 \def\@makechapterhead#1{
34 34 \vspace*{10\p@}
35 35 {\raggedright \reset@font \Huge \bfseries \thechapter \quad #1}
36 36 \par\nobreak
37 37 \hrulefill
38 38 \par\nobreak
39 39 \vspace*{10\p@}
40 40 }
41 41 \def\@makeschapterhead#1{
42 42 \vspace*{10\p@}
43 43 {\raggedright \reset@font \Huge \bfseries #1}
44 44 \par\nobreak
45 45 \hrulefill
46 46 \par\nobreak
47 47 \vspace*{10\p@}
48 48 }
49 49 '''
50 50 # manual.cls in Sphinx <= 0.6.7 became sphinxmanual.cls for 1.x
51 51 manualcls = 'sphinxmanual.cls'
52 52 if not os.path.exists(manualcls):
53 53 manualcls = 'manual.cls'
54 54
55 55 unmodified=True
56 56 for line in fileinput.FileInput(manualcls, inplace=True):
57 57 if 'Support for module synopsis' in line and unmodified:
58 58 line=chapter_cmds+line
59 59 elif 'makechapterhead' in line:
60 60 # Already have altered manual.cls: don't need to again.
61 61 unmodified=False
62 62 print line,
63 63
64 64 # Copying the makefile produced by sphinx...
65 65 oscmd('pdflatex ipython.tex')
66 66 oscmd('pdflatex ipython.tex')
67 67 oscmd('pdflatex ipython.tex')
68 68 oscmd('makeindex -s python.ist ipython.idx')
69 69 oscmd('makeindex -s python.ist modipython.idx')
70 70 oscmd('pdflatex ipython.tex')
71 71 oscmd('pdflatex ipython.tex')
72 72
73 73 # Create a manual/ directory with final html/pdf output
74 74 os.chdir(topdir)
75 75 oscmd('rm -rf manual')
76 76 oscmd('mkdir manual')
77 77 oscmd('cp -r build/html/*.html build/html/_static manual/')
78 78 oscmd('cp build/latex/ipython.pdf manual/')
@@ -1,80 +1,80 b''
1 1 #!/usr/bin/env python
2 2 """Parallel word frequency counter.
3 3
4 4 This only works for a local cluster, because the filenames are local paths.
5 5 """
6 6
7 7
8 8 import os
9 9 import time
10 10 import urllib
11 11
12 12 from itertools import repeat
13 13
14 14 from wordfreq import print_wordfreq, wordfreq
15 15
16 16 from IPython.parallel import Client, Reference
17 17
18 18 davinci_url = "http://www.gutenberg.org/cache/epub/5000/pg5000.txt"
19 19
20 20 def pwordfreq(view, fnames):
21 21 """Parallel word frequency counter.
22 22
23 23 view - An IPython DirectView
24 24 fnames - The filenames containing the split data.
25 25 """
26 26 assert len(fnames) == len(view.targets)
27 27 view.scatter('fname', fnames, flatten=True)
28 28 ar = view.apply(wordfreq, Reference('fname'))
29 29 freqs_list = ar.get()
30 30 word_set = set()
31 31 for f in freqs_list:
32 32 word_set.update(f.keys())
33 33 freqs = dict(zip(word_set, repeat(0)))
34 34 for f in freqs_list:
35 35 for word, count in f.iteritems():
36 36 freqs[word] += count
37 37 return freqs
38 38
39 39 if __name__ == '__main__':
40 40 # Create a Client and View
41 41 rc = Client()
42 42
43 43 view = rc[:]
44 44
45 45 if not os.path.exists('davinci.txt'):
46 46 # download from project gutenberg
47 47 print "Downloading Da Vinci's notebooks from Project Gutenberg"
48 48 urllib.urlretrieve(davinci_url, 'davinci.txt')
49 49
50 50 # Run the serial version
51 51 print "Serial word frequency count:"
52 52 text = open('davinci.txt').read()
53 53 tic = time.time()
54 54 freqs = wordfreq(text)
55 55 toc = time.time()
56 56 print_wordfreq(freqs, 10)
57 57 print "Took %.3f s to calcluate"%(toc-tic)
58 58
59 59
60 60 # The parallel version
61 61 print "\nParallel word frequency count:"
62 62 # split the davinci.txt into one file per engine:
63 63 lines = text.splitlines()
64 64 nlines = len(lines)
65 65 n = len(rc)
66 66 block = nlines/n
67 67 for i in range(n):
68 68 chunk = lines[i*block:i*(block+1)]
69 69 with open('davinci%i.txt'%i, 'w') as f:
70 70 f.write('\n'.join(chunk))
71 71
72 cwd = os.path.abspath(os.getcwd())
72 cwd = os.path.abspath(os.getcwdu())
73 73 fnames = [ os.path.join(cwd, 'davinci%i.txt'%i) for i in range(n)]
74 74 tic = time.time()
75 75 pfreqs = pwordfreq(view,fnames)
76 76 toc = time.time()
77 77 print_wordfreq(freqs)
78 78 print "Took %.3f s to calcluate on %i engines"%(toc-tic, len(view.targets))
79 79 # cleanup split files
80 80 map(os.remove, fnames)
@@ -1,132 +1,132 b''
1 1 #!/usr/bin/env python
2 2 """Script to commit the doc build outputs into the github-pages repo.
3 3
4 4 Use:
5 5
6 6 gh-pages.py [tag]
7 7
8 8 If no tag is given, the current output of 'git describe' is used. If given,
9 9 that is how the resulting directory will be named.
10 10
11 11 In practice, you should use either actual clean tags from a current build or
12 12 something like 'current' as a stable URL for the most current version of the """
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17 import os
18 18 import re
19 19 import shutil
20 20 import sys
21 21 from os import chdir as cd
22 22 from os.path import join as pjoin
23 23
24 24 from subprocess import Popen, PIPE, CalledProcessError, check_call
25 25
26 26 #-----------------------------------------------------------------------------
27 27 # Globals
28 28 #-----------------------------------------------------------------------------
29 29
30 30 pages_dir = 'gh-pages'
31 31 html_dir = 'build/html'
32 32 pdf_dir = 'build/latex'
33 33 pages_repo = 'git@github.com:ipython/ipython-doc.git'
34 34
35 35 #-----------------------------------------------------------------------------
36 36 # Functions
37 37 #-----------------------------------------------------------------------------
38 38 def sh(cmd):
39 39 """Execute command in a subshell, return status code."""
40 40 return check_call(cmd, shell=True)
41 41
42 42
43 43 def sh2(cmd):
44 44 """Execute command in a subshell, return stdout.
45 45
46 46 Stderr is unbuffered from the subshell.x"""
47 47 p = Popen(cmd, stdout=PIPE, shell=True)
48 48 out = p.communicate()[0]
49 49 retcode = p.returncode
50 50 if retcode:
51 51 raise CalledProcessError(retcode, cmd)
52 52 else:
53 53 return out.rstrip()
54 54
55 55
56 56 def sh3(cmd):
57 57 """Execute command in a subshell, return stdout, stderr
58 58
59 59 If anything appears in stderr, print it out to sys.stderr"""
60 60 p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True)
61 61 out, err = p.communicate()
62 62 retcode = p.returncode
63 63 if retcode:
64 64 raise CalledProcessError(retcode, cmd)
65 65 else:
66 66 return out.rstrip(), err.rstrip()
67 67
68 68
69 69 def init_repo(path):
70 70 """clone the gh-pages repo if we haven't already."""
71 71 sh("git clone %s %s"%(pages_repo, path))
72 here = os.getcwd()
72 here = os.getcwdu()
73 73 cd(path)
74 74 sh('git checkout gh-pages')
75 75 cd(here)
76 76
77 77 #-----------------------------------------------------------------------------
78 78 # Script starts
79 79 #-----------------------------------------------------------------------------
80 80 if __name__ == '__main__':
81 81 # The tag can be given as a positional argument
82 82 try:
83 83 tag = sys.argv[1]
84 84 except IndexError:
85 85 try:
86 86 tag = sh2('git describe')
87 87 except CalledProcessError:
88 88 tag = "dev" # Fallback
89 89
90 startdir = os.getcwd()
90 startdir = os.getcwdu()
91 91 if not os.path.exists(pages_dir):
92 92 # init the repo
93 93 init_repo(pages_dir)
94 94 else:
95 95 # ensure up-to-date before operating
96 96 cd(pages_dir)
97 97 sh('git checkout gh-pages')
98 98 sh('git pull')
99 99 cd(startdir)
100 100
101 101 dest = pjoin(pages_dir, tag)
102 102
103 103 # don't `make html` here, because gh-pages already depends on html in Makefile
104 104 # sh('make html')
105 105
106 106 # This is pretty unforgiving: we unconditionally nuke the destination
107 107 # directory, and then copy the html tree in there
108 108 shutil.rmtree(dest, ignore_errors=True)
109 109 shutil.copytree(html_dir, dest)
110 110 shutil.copy(pjoin(pdf_dir, 'ipython.pdf'), pjoin(dest, 'ipython.pdf'))
111 111
112 112 try:
113 113 cd(pages_dir)
114 114 status = sh2('git status | head -1')
115 115 branch = re.match('\# On branch (.*)$', status).group(1)
116 116 if branch != 'gh-pages':
117 117 e = 'On %r, git branch is %r, MUST be "gh-pages"' % (pages_dir,
118 118 branch)
119 119 raise RuntimeError(e)
120 120
121 121 sh('git add %s' % tag)
122 122 sh('git commit -m"Updated doc release: %s"' % tag)
123 123 print
124 124 print 'Most recent 3 commits:'
125 125 sys.stdout.flush()
126 126 sh('git --no-pager log --oneline HEAD~3..')
127 127 finally:
128 128 cd(startdir)
129 129
130 130 print
131 131 print 'Now verify the build in: %r' % dest
132 132 print "If everything looks good, 'git push'"
@@ -1,151 +1,151 b''
1 1 #!/usr/bin/env python
2 2 ''' Checkout gitwash repo into directory and do search replace on name '''
3 3
4 4 import os
5 5 from os.path import join as pjoin
6 6 import shutil
7 7 import sys
8 8 import re
9 9 import glob
10 10 import fnmatch
11 11 import tempfile
12 12 from subprocess import call
13 13
14 14
15 15 verbose = False
16 16
17 17
18 18 def clone_repo(url, branch):
19 cwd = os.getcwd()
19 cwd = os.getcwdu()
20 20 tmpdir = tempfile.mkdtemp()
21 21 try:
22 22 cmd = 'git clone %s %s' % (url, tmpdir)
23 23 call(cmd, shell=True)
24 24 os.chdir(tmpdir)
25 25 cmd = 'git checkout %s' % branch
26 26 call(cmd, shell=True)
27 27 except:
28 28 shutil.rmtree(tmpdir)
29 29 raise
30 30 finally:
31 31 os.chdir(cwd)
32 32 return tmpdir
33 33
34 34
35 35 def cp_files(in_path, globs, out_path):
36 36 try:
37 37 os.makedirs(out_path)
38 38 except OSError:
39 39 pass
40 40 out_fnames = []
41 41 for in_glob in globs:
42 42 in_glob_path = pjoin(in_path, in_glob)
43 43 for in_fname in glob.glob(in_glob_path):
44 44 out_fname = in_fname.replace(in_path, out_path)
45 45 pth, _ = os.path.split(out_fname)
46 46 if not os.path.isdir(pth):
47 47 os.makedirs(pth)
48 48 shutil.copyfile(in_fname, out_fname)
49 49 out_fnames.append(out_fname)
50 50 return out_fnames
51 51
52 52
53 53 def filename_search_replace(sr_pairs, filename, backup=False):
54 54 ''' Search and replace for expressions in files
55 55
56 56 '''
57 57 in_txt = open(filename, 'rt').read(-1)
58 58 out_txt = in_txt[:]
59 59 for in_exp, out_exp in sr_pairs:
60 60 in_exp = re.compile(in_exp)
61 61 out_txt = in_exp.sub(out_exp, out_txt)
62 62 if in_txt == out_txt:
63 63 return False
64 64 open(filename, 'wt').write(out_txt)
65 65 if backup:
66 66 open(filename + '.bak', 'wt').write(in_txt)
67 67 return True
68 68
69 69
70 70 def copy_replace(replace_pairs,
71 71 out_path,
72 72 repo_url,
73 73 repo_branch = 'master',
74 74 cp_globs=('*',),
75 75 rep_globs=('*',),
76 76 renames = ()):
77 77 repo_path = clone_repo(repo_url, repo_branch)
78 78 try:
79 79 out_fnames = cp_files(repo_path, cp_globs, out_path)
80 80 finally:
81 81 shutil.rmtree(repo_path)
82 82 renames = [(re.compile(in_exp), out_exp) for in_exp, out_exp in renames]
83 83 fnames = []
84 84 for rep_glob in rep_globs:
85 85 fnames += fnmatch.filter(out_fnames, rep_glob)
86 86 if verbose:
87 87 print '\n'.join(fnames)
88 88 for fname in fnames:
89 89 filename_search_replace(replace_pairs, fname, False)
90 90 for in_exp, out_exp in renames:
91 91 new_fname, n = in_exp.subn(out_exp, fname)
92 92 if n:
93 93 os.rename(fname, new_fname)
94 94 break
95 95
96 96
97 97 USAGE = ''' <output_directory> <project_name>
98 98
99 99 If not set with options, the repository name is the same as the <project
100 100 name>
101 101
102 102 If not set with options, the main github user is the same as the
103 103 repository name.'''
104 104
105 105
106 106 GITWASH_CENTRAL = 'git://github.com/matthew-brett/gitwash.git'
107 107 GITWASH_BRANCH = 'master'
108 108
109 109
110 110 if __name__ == '__main__':
111 111 from optparse import OptionParser
112 112 parser = OptionParser()
113 113 parser.set_usage(parser.get_usage().strip() + USAGE)
114 114 parser.add_option("--repo-name", dest="repo_name",
115 115 help="repository name - e.g. nitime",
116 116 metavar="REPO_NAME")
117 117 parser.add_option("--github-user", dest="main_gh_user",
118 118 help="github username for main repo - e.g fperez",
119 119 metavar="MAIN_GH_USER")
120 120 parser.add_option("--gitwash-url", dest="gitwash_url",
121 121 help="URL to gitwash repository - default %s"
122 122 % GITWASH_CENTRAL,
123 123 default=GITWASH_CENTRAL,
124 124 metavar="GITWASH_URL")
125 125 parser.add_option("--gitwash-branch", dest="gitwash_branch",
126 126 help="branch in gitwash repository - default %s"
127 127 % GITWASH_BRANCH,
128 128 default=GITWASH_BRANCH,
129 129 metavar="GITWASH_BRANCH")
130 130 parser.add_option("--source-suffix", dest="source_suffix",
131 131 help="suffix of ReST source files - default '.rst'",
132 132 default='.rst',
133 133 metavar="SOURCE_SUFFIX")
134 134 (options, args) = parser.parse_args()
135 135 if len(args) < 2:
136 136 parser.print_help()
137 137 sys.exit()
138 138 out_path, project_name = args
139 139 if options.repo_name is None:
140 140 options.repo_name = project_name
141 141 if options.main_gh_user is None:
142 142 options.main_gh_user = options.repo_name
143 143 copy_replace((('PROJECTNAME', project_name),
144 144 ('REPONAME', options.repo_name),
145 145 ('MAIN_GH_USER', options.main_gh_user)),
146 146 out_path,
147 147 options.gitwash_url,
148 148 options.gitwash_branch,
149 149 cp_globs=(pjoin('gitwash', '*'),),
150 150 rep_globs=('*.rst',),
151 151 renames=(('\.rst$', options.source_suffix),))
@@ -1,25 +1,25 b''
1 1 #!/usr/bin/env python
2 2 """Simple script to create a tarball with proper git info.
3 3 """
4 4
5 5 import commands
6 6 import os
7 7 import sys
8 8 import shutil
9 9
10 10 from toollib import *
11 11
12 12 tag = commands.getoutput('git describe --tags')
13 13 base_name = 'ipython-%s' % tag
14 14 tar_name = '%s.tgz' % base_name
15 15
16 16 # git archive is weird: Even if I give it a specific path, it still won't
17 17 # archive the whole tree. It seems the only way to get the whole tree is to cd
18 18 # to the top of the tree. There are long threads (since 2007) on the git list
19 19 # about this and it still doesn't work in a sensible way...
20 20
21 start_dir = os.getcwd()
21 start_dir = os.getcwdu()
22 22 cd('..')
23 23 git_tpl = 'git archive --format=tar --prefix={0}/ HEAD | gzip > {1}'
24 24 sh(git_tpl.format(base_name, tar_name))
25 25 sh('mv {0} tools/'.format(tar_name))
General Comments 0
You need to be logged in to leave comments. Login now