##// END OF EJS Templates
- thread-safety fixes...
fperez -
r69:942f15ec
parent child
Show More
@@ -0,0 +1,23
1 """Support for interactive macros in IPython"""
2
3 #*****************************************************************************
4 # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu>
5 #
6 # Distributed under the terms of the BSD License. The full license is in
7 # the file COPYING, distributed as part of this software.
8 #*****************************************************************************
9
10 class Macro:
11 """Simple class to store the value of macros as strings.
12
13 This allows us to later exec them by checking when something is an
14 instance of this class."""
15
16 def __init__(self,data):
17
18 # store the macro value, as a single string which can be evaluated by
19 # runlines()
20 self.value = ''.join(data).rstrip()+'\n'
21
22 def __str__(self):
23 return self.value
@@ -1,7 +1,7
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3
3
4 $Id: Magic.py 974 2005-12-29 19:48:33Z fperez $"""
4 $Id: Magic.py 975 2005-12-29 23:50:22Z fperez $"""
5
5
6 #*****************************************************************************
6 #*****************************************************************************
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
@@ -47,6 +47,7 from IPython.FakeModule import FakeModule
47 from IPython.Itpl import Itpl, itpl, printpl,itplns
47 from IPython.Itpl import Itpl, itpl, printpl,itplns
48 from IPython.PyColorize import Parser
48 from IPython.PyColorize import Parser
49 from IPython.Struct import Struct
49 from IPython.Struct import Struct
50 from IPython.macro import Macro
50 from IPython.genutils import *
51 from IPython.genutils import *
51
52
52 #***************************************************************************
53 #***************************************************************************
@@ -56,18 +57,6 def on_off(tag):
56 return ['OFF','ON'][tag]
57 return ['OFF','ON'][tag]
57
58
58
59
59 #****************************************************************************
60 # Utility classes
61 class Macro(list):
62 """Simple class to store the value of macros as strings.
63
64 This allows us to later exec them by checking when something is an
65 instance of this class."""
66
67 def __init__(self,data):
68 list.__init__(self,data)
69 self.value = ''.join(data)
70
71 #***************************************************************************
60 #***************************************************************************
72 # Main class implementing Magic functionality
61 # Main class implementing Magic functionality
73 class Magic:
62 class Magic:
@@ -224,13 +213,12 license. To use profiling, please install"python2.3-profiler" from non-free.""")
224
213
225 return {'found':found, 'obj':obj, 'namespace':ospace,
214 return {'found':found, 'obj':obj, 'namespace':ospace,
226 'ismagic':ismagic, 'isalias':isalias}
215 'ismagic':ismagic, 'isalias':isalias}
227
216
228 def arg_err(self,func):
217 def arg_err(self,func):
229 """Print docstring if incorrect arguments were passed"""
218 """Print docstring if incorrect arguments were passed"""
230 print 'Error in arguments:'
219 print 'Error in arguments:'
231 print OInspect.getdoc(func)
220 print OInspect.getdoc(func)
232
221
233
234 def format_latex(self,strng):
222 def format_latex(self,strng):
235 """Format a string for latex inclusion."""
223 """Format a string for latex inclusion."""
236
224
@@ -845,7 +833,15 Currently the magic system has the following functions:\n"""
845 get_vars = lambda i: self.shell.user_ns[i]
833 get_vars = lambda i: self.shell.user_ns[i]
846 type_name = lambda v: type(v).__name__
834 type_name = lambda v: type(v).__name__
847 varlist = map(get_vars,varnames)
835 varlist = map(get_vars,varnames)
848 typelist = map(type_name,varlist)
836
837 typelist = []
838 for vv in varlist:
839 tt = type_name(vv)
840 if tt=='instance':
841 typelist.append(str(vv.__class__))
842 else:
843 typelist.append(tt)
844
849 # column labels and # of spaces as separator
845 # column labels and # of spaces as separator
850 varlabel = 'Variable'
846 varlabel = 'Variable'
851 typelabel = 'Type'
847 typelabel = 'Type'
@@ -881,7 +877,7 Currently the magic system has the following functions:\n"""
881 else:
877 else:
882 print '(%s Mb)' % (vbytes/Mb,)
878 print '(%s Mb)' % (vbytes/Mb,)
883 else:
879 else:
884 vstr = str(var)
880 vstr = str(var).replace('\n','\\n')
885 if len(vstr) < 50:
881 if len(vstr) < 50:
886 print vstr
882 print vstr
887 else:
883 else:
@@ -1593,7 +1589,7 Currently the magic system has the following functions:\n"""
1593 self.shell.user_ns.update({name:macro})
1589 self.shell.user_ns.update({name:macro})
1594 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1590 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1595 print 'Macro contents:'
1591 print 'Macro contents:'
1596 print macro
1592 print macro,
1597
1593
1598 def magic_save(self,parameter_s = ''):
1594 def magic_save(self,parameter_s = ''):
1599 """Save a set of lines to a given filename.
1595 """Save a set of lines to a given filename.
@@ -2,7 +2,7
2 """
2 """
3 Classes for handling input/output prompts.
3 Classes for handling input/output prompts.
4
4
5 $Id: Prompts.py 966 2005-12-29 08:34:07Z fperez $"""
5 $Id: Prompts.py 975 2005-12-29 23:50:22Z fperez $"""
6
6
7 #*****************************************************************************
7 #*****************************************************************************
8 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
@@ -26,11 +26,11 import time
26 from pprint import pprint,pformat
26 from pprint import pprint,pformat
27
27
28 # IPython's own
28 # IPython's own
29 from IPython.genutils import *
30 from IPython.Struct import Struct
31 from IPython.Magic import Macro
32 from IPython.Itpl import ItplNS
33 from IPython import ColorANSI
29 from IPython import ColorANSI
30 from IPython.Itpl import ItplNS
31 from IPython.Struct import Struct
32 from IPython.macro import Macro
33 from IPython.genutils import *
34
34
35 #****************************************************************************
35 #****************************************************************************
36 #Color schemes for Prompts.
36 #Color schemes for Prompts.
@@ -6,7 +6,7 Requires Python 2.1 or newer.
6
6
7 This file contains all the classes and helper functions specific to IPython.
7 This file contains all the classes and helper functions specific to IPython.
8
8
9 $Id: iplib.py 968 2005-12-29 17:15:38Z fperez $
9 $Id: iplib.py 975 2005-12-29 23:50:22Z fperez $
10 """
10 """
11
11
12 #*****************************************************************************
12 #*****************************************************************************
@@ -78,6 +78,10 from IPython.genutils import *
78 # overwrites it (like wx.py.PyShell does)
78 # overwrites it (like wx.py.PyShell does)
79 raw_input_original = raw_input
79 raw_input_original = raw_input
80
80
81 # compiled regexps for autoindent management
82 ini_spaces_re = re.compile(r'^(\s+)')
83 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
84
81 #****************************************************************************
85 #****************************************************************************
82 # Some utility function definitions
86 # Some utility function definitions
83
87
@@ -1171,10 +1175,8 want to merge them back into the new files.""" % locals()
1171 of what was there before (because Python's parser always uses
1175 of what was there before (because Python's parser always uses
1172 "<string>" when reading from a string).
1176 "<string>" when reading from a string).
1173 """
1177 """
1174 type, value, sys.last_traceback = sys.exc_info()
1178 etype, value, last_traceback = sys.exc_info()
1175 sys.last_type = type
1179 if filename and etype is SyntaxError:
1176 sys.last_value = value
1177 if filename and type is SyntaxError:
1178 # Work hard to stuff the correct filename in the exception
1180 # Work hard to stuff the correct filename in the exception
1179 try:
1181 try:
1180 msg, (dummy_filename, lineno, offset, line) = value
1182 msg, (dummy_filename, lineno, offset, line) = value
@@ -1189,7 +1191,7 want to merge them back into the new files.""" % locals()
1189 except:
1191 except:
1190 # If that failed, assume SyntaxError is a string
1192 # If that failed, assume SyntaxError is a string
1191 value = msg, (filename, lineno, offset, line)
1193 value = msg, (filename, lineno, offset, line)
1192 self.SyntaxTB(type,value,[])
1194 self.SyntaxTB(etype,value,[])
1193
1195
1194 def debugger(self):
1196 def debugger(self):
1195 """Call the pdb debugger."""
1197 """Call the pdb debugger."""
@@ -1210,9 +1212,6 want to merge them back into the new files.""" % locals()
1210 if type is SyntaxError:
1212 if type is SyntaxError:
1211 self.showsyntaxerror(filename)
1213 self.showsyntaxerror(filename)
1212 else:
1214 else:
1213 sys.last_type = type
1214 sys.last_value = value
1215 sys.last_traceback = tb
1216 self.InteractiveTB()
1215 self.InteractiveTB()
1217 if self.InteractiveTB.call_pdb and self.has_readline:
1216 if self.InteractiveTB.call_pdb and self.has_readline:
1218 # pdb mucks up readline, fix it back
1217 # pdb mucks up readline, fix it back
@@ -1220,7 +1219,10 want to merge them back into the new files.""" % locals()
1220
1219
1221 def update_cache(self, line):
1220 def update_cache(self, line):
1222 """puts line into cache"""
1221 """puts line into cache"""
1223 self.inputcache.insert(0, line) # This copies the cache every time ... :-(
1222 return # dbg
1223
1224 # This copies the cache every time ... :-(
1225 self.inputcache.insert(0, line)
1224 if len(self.inputcache) >= self.CACHELENGTH:
1226 if len(self.inputcache) >= self.CACHELENGTH:
1225 self.inputcache.pop() # This doesn't :-)
1227 self.inputcache.pop() # This doesn't :-)
1226
1228
@@ -1319,10 +1321,6 want to merge them back into the new files.""" % locals()
1319 # Mark activity in the builtins
1321 # Mark activity in the builtins
1320 __builtin__.__dict__['__IPYTHON__active'] += 1
1322 __builtin__.__dict__['__IPYTHON__active'] += 1
1321
1323
1322 # compiled regexps for autoindent management
1323 ini_spaces_re = re.compile(r'^(\s+)')
1324 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
1325
1326 # exit_now is set by a call to %Exit or %Quit
1324 # exit_now is set by a call to %Exit or %Quit
1327 while not self.exit_now:
1325 while not self.exit_now:
1328 try:
1326 try:
@@ -1343,26 +1341,6 want to merge them back into the new files.""" % locals()
1343 self.exit()
1341 self.exit()
1344 else:
1342 else:
1345 more = self.push(line)
1343 more = self.push(line)
1346 # Auto-indent management
1347 if self.autoindent:
1348 if line:
1349 ini_spaces = ini_spaces_re.match(line)
1350 if ini_spaces:
1351 nspaces = ini_spaces.end()
1352 else:
1353 nspaces = 0
1354 self.indent_current_nsp = nspaces
1355
1356 if line[-1] == ':':
1357 self.indent_current_nsp += 4
1358 elif dedent_re.match(line):
1359 self.indent_current_nsp -= 4
1360 else:
1361 self.indent_current_nsp = 0
1362
1363 # indent_current is the actual string to be inserted
1364 # by the readline hooks for indentation
1365 self.indent_current = ' '* self.indent_current_nsp
1366
1344
1367 if (self.SyntaxTB.last_syntax_error and
1345 if (self.SyntaxTB.last_syntax_error and
1368 self.rc.autoedit_syntax):
1346 self.rc.autoedit_syntax):
@@ -1445,6 +1423,28 want to merge them back into the new files.""" % locals()
1445 except:
1423 except:
1446 self.showtraceback()
1424 self.showtraceback()
1447
1425
1426 def autoindent_update(self,line):
1427 """Keep track of the indent level."""
1428 if self.autoindent:
1429 if line:
1430 ini_spaces = ini_spaces_re.match(line)
1431 if ini_spaces:
1432 nspaces = ini_spaces.end()
1433 else:
1434 nspaces = 0
1435 self.indent_current_nsp = nspaces
1436
1437 if line[-1] == ':':
1438 self.indent_current_nsp += 4
1439 elif dedent_re.match(line):
1440 self.indent_current_nsp -= 4
1441 else:
1442 self.indent_current_nsp = 0
1443
1444 # indent_current is the actual string to be inserted
1445 # by the readline hooks for indentation
1446 self.indent_current = ' '* self.indent_current_nsp
1447
1448 def runlines(self,lines):
1448 def runlines(self,lines):
1449 """Run a string of one or more lines of source.
1449 """Run a string of one or more lines of source.
1450
1450
@@ -1462,8 +1462,11 want to merge them back into the new files.""" % locals()
1462 # skip blank lines so we don't mess up the prompt counter, but do
1462 # skip blank lines so we don't mess up the prompt counter, but do
1463 # NOT skip even a blank line if we are in a code block (more is
1463 # NOT skip even a blank line if we are in a code block (more is
1464 # true)
1464 # true)
1465 #print 'rl line:<%s>' % line # dbg
1465 if line or more:
1466 if line or more:
1466 more = self.push((self.prefilter(line,more)))
1467 #print 'doit' # dbg
1468 newline = self.prefilter(line,more)
1469 more = self.push(newline)
1467 # IPython's runsource returns None if there was an error
1470 # IPython's runsource returns None if there was an error
1468 # compiling the code. This allows us to stop processing right
1471 # compiling the code. This allows us to stop processing right
1469 # away, so the user gets the error message at the right place.
1472 # away, so the user gets the error message at the right place.
@@ -1716,6 +1719,8 want to merge them back into the new files.""" % locals()
1716 # Let's try to find if the input line is a magic fn
1719 # Let's try to find if the input line is a magic fn
1717 oinfo = None
1720 oinfo = None
1718 if hasattr(self,'magic_'+iFun):
1721 if hasattr(self,'magic_'+iFun):
1722 # WARNING: _ofind uses getattr(), so it can consume generators and
1723 # cause other side effects.
1719 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1724 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1720 if oinfo['ismagic']:
1725 if oinfo['ismagic']:
1721 # Be careful not to call magics when a variable assignment is
1726 # Be careful not to call magics when a variable assignment is
@@ -60,7 +60,7 You can implement other color schemes easily, the syntax is fairly
60 self-explanatory. Please send back new schemes you develop to the author for
60 self-explanatory. Please send back new schemes you develop to the author for
61 possible inclusion in future releases.
61 possible inclusion in future releases.
62
62
63 $Id: ultraTB.py 965 2005-12-28 23:23:09Z fperez $"""
63 $Id: ultraTB.py 975 2005-12-29 23:50:22Z fperez $"""
64
64
65 #*****************************************************************************
65 #*****************************************************************************
66 # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu>
66 # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu>
@@ -225,12 +225,12 class ListTB(TBTools):
225 """Format the exception part of a traceback.
225 """Format the exception part of a traceback.
226
226
227 The arguments are the exception type and value such as given by
227 The arguments are the exception type and value such as given by
228 sys.last_type and sys.last_value. The return value is a list of
228 sys.exc_info()[:2]. The return value is a list of strings, each ending
229 strings, each ending in a newline. Normally, the list contains a
229 in a newline. Normally, the list contains a single string; however,
230 single string; however, for SyntaxError exceptions, it contains
230 for SyntaxError exceptions, it contains several lines that (when
231 several lines that (when printed) display detailed information
231 printed) display detailed information about where the syntax error
232 about where the syntax error occurred. The message indicating
232 occurred. The message indicating which exception occurred is the
233 which exception occurred is the always last string in the list.
233 always last string in the list.
234
234
235 Also lifted nearly verbatim from traceback.py
235 Also lifted nearly verbatim from traceback.py
236 """
236 """
@@ -1,8 +1,26
1 2005-12-29 Fernando Perez <Fernando.Perez@colorado.edu>
1 2005-12-29 Fernando Perez <Fernando.Perez@colorado.edu>
2
2
3 * IPython/iplib.py (showtraceback): remove use of the
4 sys.last_{type/value/traceback} structures, which are non
5 thread-safe.
6
7 * IPython/macro.py (Macro.__init__): moved macros to a standalone
8 file. Now that they'll be more likely to be used with the
9 persistance system (%store), I want to make sure their module path
10 doesn't change in the future, so that we don't break things for
11 users' persisted data.
12
13 * IPython/iplib.py (autoindent_update): move indentation
14 management into the _text_ processing loop, not the keyboard
15 interactive one. This is necessary to correctly process non-typed
16 multiline input (such as macros).
17
3 * IPython/Magic.py (Magic.format_latex): patch by Stefan van der
18 * IPython/Magic.py (Magic.format_latex): patch by Stefan van der
4 Walt <stefan-AT-sun.ac.za> to fix latex formatting of docstrings,
19 Walt <stefan-AT-sun.ac.za> to fix latex formatting of docstrings,
5 which was producing problems in the resulting manual.
20 which was producing problems in the resulting manual.
21 (magic_whos): improve reporting of instances (show their class,
22 instead of simply printing 'instance' which isn't terribly
23 informative).
6
24
7 * IPython/genutils.py (shell): commit Jorgen Stenarson's patch
25 * IPython/genutils.py (shell): commit Jorgen Stenarson's patch
8 (minor mods) to support network shares under win32.
26 (minor mods) to support network shares under win32.
General Comments 0
You need to be logged in to leave comments. Login now