Show More
@@ -1,7 +1,7 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """Magic functions for InteractiveShell. |
|
3 | 3 | |
|
4 |
$Id: Magic.py 22 |
|
|
4 | $Id: Magic.py 2221 2007-04-06 02:58:37Z fperez $""" | |
|
5 | 5 | |
|
6 | 6 | #***************************************************************************** |
|
7 | 7 | # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and |
@@ -932,7 +932,10 b' Currently the magic system has the following functions:\\n"""' | |||
|
932 | 932 | |
|
933 | 933 | varlist = self.magic_who_ls(parameter_s) |
|
934 | 934 | if not varlist: |
|
935 | print 'Interactive namespace is empty.' | |
|
935 | if parameter_s: | |
|
936 | print 'No variables match your requested type.' | |
|
937 | else: | |
|
938 | print 'Interactive namespace is empty.' | |
|
936 | 939 | return |
|
937 | 940 | |
|
938 | 941 | # if we have variables, move on... |
@@ -962,7 +965,10 b' Currently the magic system has the following functions:\\n"""' | |||
|
962 | 965 | |
|
963 | 966 | varnames = self.magic_who_ls(parameter_s) |
|
964 | 967 | if not varnames: |
|
965 | print 'Interactive namespace is empty.' | |
|
968 | if parameter_s: | |
|
969 | print 'No variables match your requested type.' | |
|
970 | else: | |
|
971 | print 'Interactive namespace is empty.' | |
|
966 | 972 | return |
|
967 | 973 | |
|
968 | 974 | # if we have variables, move on... |
@@ -1,7 +1,7 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """Release data for the IPython project. |
|
3 | 3 | |
|
4 |
$Id: Release.py 221 |
|
|
4 | $Id: Release.py 2221 2007-04-06 02:58:37Z fperez $""" | |
|
5 | 5 | |
|
6 | 6 | #***************************************************************************** |
|
7 | 7 | # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu> |
@@ -25,7 +25,7 b" name = 'ipython'" | |||
|
25 | 25 | revision = '2191' |
|
26 | 26 | |
|
27 | 27 | #version = '0.7.4.svn.r' + revision.rstrip('M') |
|
28 |
version = '0. |
|
|
28 | version = '0.8.0' | |
|
29 | 29 | |
|
30 | 30 | description = "An enhanced interactive Python shell." |
|
31 | 31 |
@@ -4,7 +4,7 b'' | |||
|
4 | 4 | All the matplotlib support code was co-developed with John Hunter, |
|
5 | 5 | matplotlib's author. |
|
6 | 6 | |
|
7 |
$Id: Shell.py 221 |
|
|
7 | $Id: Shell.py 2221 2007-04-06 02:58:37Z fperez $""" | |
|
8 | 8 | |
|
9 | 9 | #***************************************************************************** |
|
10 | 10 | # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu> |
@@ -25,6 +25,7 b' import Queue' | |||
|
25 | 25 | import inspect |
|
26 | 26 | import os |
|
27 | 27 | import sys |
|
28 | import thread | |
|
28 | 29 | import threading |
|
29 | 30 | import time |
|
30 | 31 | |
@@ -36,7 +37,6 b' try:' | |||
|
36 | 37 | except ImportError: |
|
37 | 38 | HAS_CTYPES = False |
|
38 | 39 | |
|
39 | ||
|
40 | 40 | # IPython imports |
|
41 | 41 | import IPython |
|
42 | 42 | from IPython import ultraTB |
@@ -54,7 +54,7 b' KBINT = False' | |||
|
54 | 54 | USE_TK = False |
|
55 | 55 | |
|
56 | 56 | # ID for the main thread, used for cross-thread exceptions |
|
57 |
MAIN_THREAD_ID = |
|
|
57 | MAIN_THREAD_ID = thread.get_ident() | |
|
58 | 58 | |
|
59 | 59 | # Tag when runcode() is active, for exception handling |
|
60 | 60 | CODE_RUN = None |
@@ -203,7 +203,7 b' class IPShellEmbed:' | |||
|
203 | 203 | # Set global subsystems (display,completions) to our values |
|
204 | 204 | sys.displayhook = self.sys_displayhook_embed |
|
205 | 205 | if self.IP.has_readline: |
|
206 |
self.IP. |
|
|
206 | self.IP.set_completer() | |
|
207 | 207 | |
|
208 | 208 | if self.banner and header: |
|
209 | 209 | format = '%s\n%s\n' |
@@ -312,18 +312,6 b' else:' | |||
|
312 | 312 | KBINT = True |
|
313 | 313 | |
|
314 | 314 | |
|
315 | def _set_main_thread_id(): | |
|
316 | """Ugly hack to find the main thread's ID. | |
|
317 | """ | |
|
318 | global MAIN_THREAD_ID | |
|
319 | for tid, tobj in threading._active.items(): | |
|
320 | # There must be a better way to do this than looking at the str() for | |
|
321 | # each thread object... | |
|
322 | if 'MainThread' in str(tobj): | |
|
323 | #print 'main tid:',tid # dbg | |
|
324 | MAIN_THREAD_ID = tid | |
|
325 | break | |
|
326 | ||
|
327 | 315 | class MTInteractiveShell(InteractiveShell): |
|
328 | 316 | """Simple multi-threaded shell.""" |
|
329 | 317 | |
@@ -351,6 +339,9 b' class MTInteractiveShell(InteractiveShell):' | |||
|
351 | 339 | # A queue to hold the code to be executed. A scalar variable is NOT |
|
352 | 340 | # enough, because uses like macros cause reentrancy. |
|
353 | 341 | self.code_queue = Queue.Queue() |
|
342 | ||
|
343 | # Track once we properly install our special sigint handler | |
|
344 | self._sigint_handler_not_ready = True | |
|
354 | 345 | |
|
355 | 346 | # Stuff to do at closing time |
|
356 | 347 | self._kill = False |
@@ -406,7 +397,6 b' class MTInteractiveShell(InteractiveShell):' | |||
|
406 | 397 | |
|
407 | 398 | Multithreaded wrapper around IPython's runcode().""" |
|
408 | 399 | |
|
409 | ||
|
410 | 400 | global CODE_RUN |
|
411 | 401 | |
|
412 | 402 | # Exceptions need to be raised differently depending on which thread is |
@@ -423,14 +413,18 b' class MTInteractiveShell(InteractiveShell):' | |||
|
423 | 413 | tokill() |
|
424 | 414 | print >>Term.cout, 'Done.' |
|
425 | 415 | |
|
426 |
# Install sigint handler. It feels stupid to |
|
|
427 | # pass | |
|
428 | try: | |
|
429 |
|
|
|
430 | except SystemError: | |
|
431 | # This happens under Windows, which seems to have all sorts | |
|
432 | # of problems with signal handling. Oh well... | |
|
433 | pass | |
|
416 | # Install sigint handler. It feels stupid to test this on every single | |
|
417 | # pass. At least we keep track of having done it before... We use a | |
|
418 | # negative variable so we don't have to call 'not' every time | |
|
419 | if self._sigint_handler_not_ready: | |
|
420 | # Try only once... | |
|
421 | self._sigint_handler_not_ready = False | |
|
422 | try: | |
|
423 | signal(SIGINT,sigint_handler) | |
|
424 | except SystemError: | |
|
425 | # This happens under Windows, which seems to have all sorts | |
|
426 | # of problems with signal handling. Oh well... | |
|
427 | pass | |
|
434 | 428 | |
|
435 | 429 | # Flush queue of pending code by calling the run methood of the parent |
|
436 | 430 | # class with all items which may be in the queue. |
@@ -681,10 +675,6 b' class IPThread(threading.Thread):' | |||
|
681 | 675 | self.IP.mainloop(self._banner) |
|
682 | 676 | self.IP.kill() |
|
683 | 677 | |
|
684 | def start(self): | |
|
685 | threading.Thread.start(self) | |
|
686 | _set_main_thread_id() | |
|
687 | ||
|
688 | 678 | class IPShellGTK(IPThread): |
|
689 | 679 | """Run a gtk mainloop() in a separate thread. |
|
690 | 680 | |
@@ -855,7 +845,6 b' class IPShellWX(IPThread):' | |||
|
855 | 845 | self.agent.StartWork() |
|
856 | 846 | return True |
|
857 | 847 | |
|
858 | _set_main_thread_id() | |
|
859 | 848 | self.app = App(redirect=False) |
|
860 | 849 | self.wx_mainloop(self.app) |
|
861 | 850 | self.join() |
@@ -1001,8 +990,8 b' class IPShellQt4(IPThread):' | |||
|
1001 | 990 | return result |
|
1002 | 991 | |
|
1003 | 992 | |
|
1004 | # A set of matplotlib public IPython shell classes, for single-threaded | |
|
1005 |
# |
|
|
993 | # A set of matplotlib public IPython shell classes, for single-threaded (Tk* | |
|
994 | # and FLTK*) and multithreaded (GTK*, WX* and Qt*) backends to use. | |
|
1006 | 995 | def _load_pylab(user_ns): |
|
1007 | 996 | """Allow users to disable pulling all of pylab into the top-level |
|
1008 | 997 | namespace. |
@@ -6,7 +6,7 b' Requires Python 2.3 or newer.' | |||
|
6 | 6 | |
|
7 | 7 | This file contains all the classes and helper functions specific to IPython. |
|
8 | 8 | |
|
9 |
$Id: iplib.py 22 |
|
|
9 | $Id: iplib.py 2221 2007-04-06 02:58:37Z fperez $ | |
|
10 | 10 | """ |
|
11 | 11 | |
|
12 | 12 | #***************************************************************************** |
@@ -882,6 +882,10 b' class InteractiveShell(object,Magic):' | |||
|
882 | 882 | self.Completer.__class__) |
|
883 | 883 | self.Completer.matchers.insert(pos,newcomp) |
|
884 | 884 | |
|
885 | def set_completer(self): | |
|
886 | """reset readline's completer to be our own.""" | |
|
887 | self.readline.set_completer(self.Completer.complete) | |
|
888 | ||
|
885 | 889 | def _get_call_pdb(self): |
|
886 | 890 | return self._call_pdb |
|
887 | 891 | |
@@ -1311,7 +1315,7 b' want to merge them back into the new files.""" % locals()' | |||
|
1311 | 1315 | self.readline = readline |
|
1312 | 1316 | # save this in sys so embedded copies can restore it properly |
|
1313 | 1317 | sys.ipcompleter = self.Completer.complete |
|
1314 |
|
|
|
1318 | self.set_completer() | |
|
1315 | 1319 | |
|
1316 | 1320 | # Configure readline according to user's prefs |
|
1317 | 1321 | for rlcommand in self.rc.readline_parse_and_bind: |
@@ -1488,7 +1492,7 b' want to merge them back into the new files.""" % locals()' | |||
|
1488 | 1492 | self.InteractiveTB(etype,value,tb,tb_offset=tb_offset) |
|
1489 | 1493 | if self.InteractiveTB.call_pdb and self.has_readline: |
|
1490 | 1494 | # pdb mucks up readline, fix it back |
|
1491 |
self. |
|
|
1495 | self.set_completer() | |
|
1492 | 1496 | |
|
1493 | 1497 | def mainloop(self,banner=None): |
|
1494 | 1498 | """Creates the local namespace and starts the mainloop. |
@@ -1979,14 +1983,17 b' want to merge them back into the new files.""" % locals()' | |||
|
1979 | 1983 | continuation in a sequence of inputs. |
|
1980 | 1984 | """ |
|
1981 | 1985 | |
|
1986 | # Code run by the user may have modified the readline completer state. | |
|
1987 | # We must ensure that our completer is back in place. | |
|
1988 | self.set_completer() | |
|
1989 | ||
|
1982 | 1990 | try: |
|
1983 | 1991 | line = raw_input_original(prompt).decode(sys.stdin.encoding) |
|
1984 | #line = raw_input_original(prompt) | |
|
1985 | 1992 | except ValueError: |
|
1986 |
warn("\n********\nYou or a %run:ed script called sys.stdin.close() |
|
|
1993 | warn("\n********\nYou or a %run:ed script called sys.stdin.close()" | |
|
1994 | " or sys.stdout.close()!\nExiting IPython!") | |
|
1987 | 1995 | self.exit_now = True |
|
1988 | 1996 | return "" |
|
1989 | ||
|
1990 | 1997 | |
|
1991 | 1998 | # Try to be reasonably smart about not re-indenting pasted input more |
|
1992 | 1999 | # than necessary. We do this by trimming out the auto-indent initial |
@@ -2174,14 +2181,9 b' want to merge them back into the new files.""" % locals()' | |||
|
2174 | 2181 | # It also allows users to assign to either alias or magic names true |
|
2175 | 2182 | # python variables (the magic/alias systems always take second seat to |
|
2176 | 2183 | # true python code). |
|
2177 | # | |
|
2178 | # We also go to direct execution if there's a binary operator in there, | |
|
2179 | # so users get the regular exception. Note that '-' is NOT included, | |
|
2180 | # since it is also a unary operator ('+' can also be used as unary, but | |
|
2181 | # in practice it rarely is). | |
|
2182 | if theRest and theRest[0] in '!=()<>+*/%^&|': | |
|
2184 | if theRest and theRest[0] in '!=()': | |
|
2183 | 2185 | return self.handle_normal(line,continue_prompt) |
|
2184 | ||
|
2186 | ||
|
2185 | 2187 | if oinfo is None: |
|
2186 | 2188 | # let's try to ensure that _oinfo is ONLY called when autocall is |
|
2187 | 2189 | # on. Since it has inevitable potential side effects, at least |
@@ -1,3 +1,25 b'' | |||
|
1 | 2007-04-05 Fernando Perez <Fernando.Perez@colorado.edu> | |
|
2 | ||
|
3 | * IPython/Shell.py (MAIN_THREAD_ID): get rid of my stupid hack to | |
|
4 | find the main thread id and use the proper API call. Thanks to | |
|
5 | Stefan for the fix. | |
|
6 | ||
|
7 | * test/test_prefilter.py (esc_handler_tests): udpate one of Dan's | |
|
8 | unit tests to reflect fixed ticket #52, and add more tests sent by | |
|
9 | him. | |
|
10 | ||
|
11 | * IPython/iplib.py (raw_input): restore the readline completer | |
|
12 | state on every input, in case third-party code messed it up. | |
|
13 | (_prefilter): revert recent addition of early-escape checks which | |
|
14 | prevent many valid alias calls from working. | |
|
15 | ||
|
16 | * IPython/Shell.py (MTInteractiveShell.runcode): add a tracking | |
|
17 | flag for sigint handler so we don't run a full signal() call on | |
|
18 | each runcode access. | |
|
19 | ||
|
20 | * IPython/Magic.py (magic_whos): small improvement to diagnostic | |
|
21 | message. | |
|
22 | ||
|
1 | 23 | 2007-04-04 Fernando Perez <Fernando.Perez@colorado.edu> |
|
2 | 24 | |
|
3 | 25 | * IPython/Shell.py (sigint_handler): I *THINK* I finally got |
@@ -145,8 +145,15 b' esc_handler_tests = [' | |||
|
145 | 145 | ( '?thing', handle_help, ), |
|
146 | 146 | ( 'thing?', handle_help ), # '?' can trail... |
|
147 | 147 | ( 'thing!', handle_normal), # but only '?' can trail |
|
148 | ( '!thing?', handle_help), # trailing '?' wins if more than one | |
|
149 | 148 | ( ' ?thing', handle_help), # ignore leading whitespace |
|
149 | # Trailing qmark combos. Odd special cases abound | |
|
150 | ( '!thing?', handle_shell_escape), # trailing '?' loses to shell esc | |
|
151 | ( '!thing ?', handle_shell_escape), | |
|
152 | ( '!!thing?', handle_shell_escape), | |
|
153 | ( '%cmd?', handle_help), | |
|
154 | ( '/cmd?', handle_help), | |
|
155 | ( ';cmd?', handle_help), | |
|
156 | ( ',cmd?', handle_help), | |
|
150 | 157 | ( '!ls', handle_shell_escape ), |
|
151 | 158 | ( '%magic', handle_magic), |
|
152 | 159 | # Possibly, add test for /,; once those are unhooked from %autocall |
General Comments 0
You need to be logged in to leave comments.
Login now