Show More
@@ -0,0 +1,109 b'' | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | """ | |||
|
3 | Color schemes for exception handling code in IPython. | |||
|
4 | ||||
|
5 | $Id: Prompts.py 638 2005-07-18 03:01:41Z fperez $""" | |||
|
6 | ||||
|
7 | #***************************************************************************** | |||
|
8 | # Copyright (C) 2005 Fernando Perez <fperez@colorado.edu> | |||
|
9 | # | |||
|
10 | # Distributed under the terms of the BSD License. The full license is in | |||
|
11 | # the file COPYING, distributed as part of this software. | |||
|
12 | #***************************************************************************** | |||
|
13 | ||||
|
14 | from IPython import Release | |||
|
15 | __author__ = '%s <%s>' % Release.authors['Fernando'] | |||
|
16 | __license__ = Release.license | |||
|
17 | __version__ = Release.version | |||
|
18 | ||||
|
19 | #**************************************************************************** | |||
|
20 | # Required modules | |||
|
21 | from IPython.ColorANSI import ColorSchemeTable, TermColors, ColorScheme | |||
|
22 | ||||
|
23 | ExceptionColors = ColorSchemeTable() | |||
|
24 | ||||
|
25 | # Populate it with color schemes | |||
|
26 | C = TermColors # shorthand and local lookup | |||
|
27 | ExceptionColors.add_scheme(ColorScheme( | |||
|
28 | 'NoColor', | |||
|
29 | # The color to be used for the top line | |||
|
30 | topline = C.NoColor, | |||
|
31 | ||||
|
32 | # The colors to be used in the traceback | |||
|
33 | filename = C.NoColor, | |||
|
34 | lineno = C.NoColor, | |||
|
35 | name = C.NoColor, | |||
|
36 | vName = C.NoColor, | |||
|
37 | val = C.NoColor, | |||
|
38 | em = C.NoColor, | |||
|
39 | ||||
|
40 | # Emphasized colors for the last frame of the traceback | |||
|
41 | normalEm = C.NoColor, | |||
|
42 | filenameEm = C.NoColor, | |||
|
43 | linenoEm = C.NoColor, | |||
|
44 | nameEm = C.NoColor, | |||
|
45 | valEm = C.NoColor, | |||
|
46 | ||||
|
47 | # Colors for printing the exception | |||
|
48 | excName = C.NoColor, | |||
|
49 | line = C.NoColor, | |||
|
50 | caret = C.NoColor, | |||
|
51 | Normal = C.NoColor | |||
|
52 | )) | |||
|
53 | ||||
|
54 | # make some schemes as instances so we can copy them for modification easily | |||
|
55 | ExceptionColors.add_scheme(ColorScheme( | |||
|
56 | 'Linux', | |||
|
57 | # The color to be used for the top line | |||
|
58 | topline = C.LightRed, | |||
|
59 | ||||
|
60 | # The colors to be used in the traceback | |||
|
61 | filename = C.Green, | |||
|
62 | lineno = C.Green, | |||
|
63 | name = C.Purple, | |||
|
64 | vName = C.Cyan, | |||
|
65 | val = C.Green, | |||
|
66 | em = C.LightCyan, | |||
|
67 | ||||
|
68 | # Emphasized colors for the last frame of the traceback | |||
|
69 | normalEm = C.LightCyan, | |||
|
70 | filenameEm = C.LightGreen, | |||
|
71 | linenoEm = C.LightGreen, | |||
|
72 | nameEm = C.LightPurple, | |||
|
73 | valEm = C.LightBlue, | |||
|
74 | ||||
|
75 | # Colors for printing the exception | |||
|
76 | excName = C.LightRed, | |||
|
77 | line = C.Yellow, | |||
|
78 | caret = C.White, | |||
|
79 | Normal = C.Normal | |||
|
80 | )) | |||
|
81 | ||||
|
82 | # For light backgrounds, swap dark/light colors | |||
|
83 | ExceptionColors.add_scheme(ColorScheme( | |||
|
84 | 'LightBG', | |||
|
85 | # The color to be used for the top line | |||
|
86 | topline = C.Red, | |||
|
87 | ||||
|
88 | # The colors to be used in the traceback | |||
|
89 | filename = C.LightGreen, | |||
|
90 | lineno = C.LightGreen, | |||
|
91 | name = C.LightPurple, | |||
|
92 | vName = C.Cyan, | |||
|
93 | val = C.LightGreen, | |||
|
94 | em = C.Cyan, | |||
|
95 | ||||
|
96 | # Emphasized colors for the last frame of the traceback | |||
|
97 | normalEm = C.Cyan, | |||
|
98 | filenameEm = C.Green, | |||
|
99 | linenoEm = C.Green, | |||
|
100 | nameEm = C.Purple, | |||
|
101 | valEm = C.Blue, | |||
|
102 | ||||
|
103 | # Colors for printing the exception | |||
|
104 | excName = C.Red, | |||
|
105 | #line = C.Brown, # brown often is displayed as yellow | |||
|
106 | line = C.Red, | |||
|
107 | caret = C.Normal, | |||
|
108 | Normal = C.Normal | |||
|
109 | )) |
@@ -1,7 +1,7 b'' | |||||
1 | # -*- coding: utf-8 -*- |
|
1 | # -*- coding: utf-8 -*- | |
2 | """Tools for coloring text in ANSI terminals. |
|
2 | """Tools for coloring text in ANSI terminals. | |
3 |
|
3 | |||
4 |
$Id: ColorANSI.py |
|
4 | $Id: ColorANSI.py 951 2005-12-25 00:57:24Z fperez $""" | |
5 |
|
5 | |||
6 | #***************************************************************************** |
|
6 | #***************************************************************************** | |
7 | # Copyright (C) 2002-2004 Fernando Perez. <fperez@colorado.edu> |
|
7 | # Copyright (C) 2002-2004 Fernando Perez. <fperez@colorado.edu> | |
@@ -17,7 +17,6 b' __license__ = Release.license' | |||||
17 | __all__ = ['TermColors','InputTermColors','ColorScheme','ColorSchemeTable'] |
|
17 | __all__ = ['TermColors','InputTermColors','ColorScheme','ColorSchemeTable'] | |
18 |
|
18 | |||
19 | import os |
|
19 | import os | |
20 | from UserDict import UserDict |
|
|||
21 |
|
20 | |||
22 | from IPython.Struct import Struct |
|
21 | from IPython.Struct import Struct | |
23 |
|
22 | |||
@@ -94,8 +93,14 b' class ColorScheme:' | |||||
94 | self.colors = Struct(**colormap) |
|
93 | self.colors = Struct(**colormap) | |
95 | else: |
|
94 | else: | |
96 | self.colors = Struct(colordict) |
|
95 | self.colors = Struct(colordict) | |
|
96 | ||||
|
97 | def copy(self,name=None): | |||
|
98 | """Return a full copy of the object, optionally renaming it.""" | |||
|
99 | if name is None: | |||
|
100 | name = self.name | |||
|
101 | return ColorScheme(name,self.colors.__dict__) | |||
97 |
|
102 | |||
98 |
class ColorSchemeTable( |
|
103 | class ColorSchemeTable(dict): | |
99 | """General class to handle tables of color schemes. |
|
104 | """General class to handle tables of color schemes. | |
100 |
|
105 | |||
101 | It's basically a dict of color schemes with a couple of shorthand |
|
106 | It's basically a dict of color schemes with a couple of shorthand | |
@@ -112,17 +117,21 b' class ColorSchemeTable(UserDict):' | |||||
112 | the default active scheme. |
|
117 | the default active scheme. | |
113 | """ |
|
118 | """ | |
114 |
|
119 | |||
115 | UserDict.__init__(self) |
|
120 | # create object attributes to be set later | |
116 | if scheme_list is None: |
|
121 | self.active_scheme_name = '' | |
117 |
|
|
122 | self.active_colors = None | |
118 | self.active_colors = None |
|
123 | ||
119 |
|
|
124 | if scheme_list: | |
120 | if default_scheme == '': |
|
125 | if default_scheme == '': | |
121 | raise ValueError,'you must specify the default color scheme' |
|
126 | raise ValueError,'you must specify the default color scheme' | |
122 | for scheme in scheme_list: |
|
127 | for scheme in scheme_list: | |
123 | self.add_scheme(scheme) |
|
128 | self.add_scheme(scheme) | |
124 | self.set_active_scheme(default_scheme) |
|
129 | self.set_active_scheme(default_scheme) | |
125 |
|
130 | |||
|
131 | def copy(self): | |||
|
132 | """Return full copy of object""" | |||
|
133 | return ColorSchemeTable(self.values(),self.active_scheme_name) | |||
|
134 | ||||
126 | def add_scheme(self,new_scheme): |
|
135 | def add_scheme(self,new_scheme): | |
127 | """Add a new color scheme to the table.""" |
|
136 | """Add a new color scheme to the table.""" | |
128 | if not isinstance(new_scheme,ColorScheme): |
|
137 | if not isinstance(new_scheme,ColorScheme): | |
@@ -135,20 +144,20 b' class ColorSchemeTable(UserDict):' | |||||
135 | Names are by default compared in a case-insensitive way, but this can |
|
144 | Names are by default compared in a case-insensitive way, but this can | |
136 | be changed by setting the parameter case_sensitive to true.""" |
|
145 | be changed by setting the parameter case_sensitive to true.""" | |
137 |
|
146 | |||
138 |
scheme_ |
|
147 | scheme_names = self.keys() | |
139 | if case_sensitive: |
|
148 | if case_sensitive: | |
140 |
valid_schemes = scheme_ |
|
149 | valid_schemes = scheme_names | |
141 | scheme_test = scheme |
|
150 | scheme_test = scheme | |
142 | else: |
|
151 | else: | |
143 |
valid_schemes = [s.lower() for s in scheme_ |
|
152 | valid_schemes = [s.lower() for s in scheme_names] | |
144 | scheme_test = scheme.lower() |
|
153 | scheme_test = scheme.lower() | |
145 | try: |
|
154 | try: | |
146 | scheme_idx = valid_schemes.index(scheme_test) |
|
155 | scheme_idx = valid_schemes.index(scheme_test) | |
147 | except ValueError: |
|
156 | except ValueError: | |
148 | raise ValueError,'Unrecognized color scheme: ' + scheme + \ |
|
157 | raise ValueError,'Unrecognized color scheme: ' + scheme + \ | |
149 |
'\nValid schemes: '+str(scheme_ |
|
158 | '\nValid schemes: '+str(scheme_names).replace("'', ",'') | |
150 | else: |
|
159 | else: | |
151 |
active = scheme_ |
|
160 | active = scheme_names[scheme_idx] | |
152 | self.active_scheme_name = active |
|
161 | self.active_scheme_name = active | |
153 | self.active_colors = self[active].colors |
|
162 | self.active_colors = self[active].colors | |
154 | # Now allow using '' as an index for the current active scheme |
|
163 | # Now allow using '' as an index for the current active scheme |
@@ -1,7 +1,7 b'' | |||||
1 | # -*- coding: utf-8 -*- |
|
1 | # -*- coding: utf-8 -*- | |
2 | """sys.excepthook for IPython itself, leaves a detailed report on disk. |
|
2 | """sys.excepthook for IPython itself, leaves a detailed report on disk. | |
3 |
|
3 | |||
4 |
$Id: CrashHandler.py |
|
4 | $Id: CrashHandler.py 951 2005-12-25 00:57:24Z fperez $""" | |
5 |
|
5 | |||
6 | #***************************************************************************** |
|
6 | #***************************************************************************** | |
7 | # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu> |
|
7 | # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu> | |
@@ -23,10 +23,10 b' import os,sys' | |||||
23 | from pprint import pprint,pformat |
|
23 | from pprint import pprint,pformat | |
24 |
|
24 | |||
25 | # Homebrewed |
|
25 | # Homebrewed | |
26 | from IPython.genutils import * |
|
|||
27 | from IPython.Itpl import Itpl,itpl,printpl |
|
26 | from IPython.Itpl import Itpl,itpl,printpl | |
|
27 | from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names | |||
28 | from IPython import ultraTB |
|
28 | from IPython import ultraTB | |
29 | from IPython.ultraTB import ColorScheme,ColorSchemeTable # too long names |
|
29 | from IPython.genutils import * | |
30 |
|
30 | |||
31 | #**************************************************************************** |
|
31 | #**************************************************************************** | |
32 | class CrashHandler: |
|
32 | class CrashHandler: |
@@ -15,39 +15,250 b' details on the PSF (Python Software Foundation) standard license, see:' | |||||
15 |
|
15 | |||
16 | http://www.python.org/2.2.3/license.html |
|
16 | http://www.python.org/2.2.3/license.html | |
17 |
|
17 | |||
18 |
$Id: Debugger.py |
|
18 | $Id: Debugger.py 951 2005-12-25 00:57:24Z fperez $""" | |
19 |
|
19 | |||
20 | from IPython import Release |
|
20 | from IPython import Release | |
21 | __author__ = '%s <%s>' % Release.authors['Fernando'] |
|
21 | __author__ = '%s <%s>' % Release.authors['Fernando'] | |
22 | __license__ = 'Python' |
|
22 | __license__ = 'Python' | |
23 |
|
23 | |||
24 | import pdb,bdb,cmd,os,sys |
|
24 | import pdb,bdb,cmd,os,sys,linecache | |
|
25 | from IPython import PyColorize, ColorANSI | |||
|
26 | from IPython.genutils import Term | |||
|
27 | from IPython.excolors import ExceptionColors | |||
|
28 | ||||
|
29 | def _file_lines(fname): | |||
|
30 | """Return the contents of a named file as a list of lines. | |||
|
31 | ||||
|
32 | This function never raises an IOError exception: if the file can't be | |||
|
33 | read, it simply returns an empty list.""" | |||
|
34 | ||||
|
35 | try: | |||
|
36 | outfile = open(fname) | |||
|
37 | except IOError: | |||
|
38 | return [] | |||
|
39 | else: | |||
|
40 | out = outfile.readlines() | |||
|
41 | outfile.close() | |||
|
42 | return out | |||
|
43 | ||||
25 |
|
44 | |||
26 | class Pdb(pdb.Pdb): |
|
45 | class Pdb(pdb.Pdb): | |
27 | """Modified Pdb class, does not load readline.""" |
|
46 | """Modified Pdb class, does not load readline.""" | |
28 | def __init__(self): |
|
47 | def __init__(self,color_scheme='NoColor'): | |
29 | bdb.Bdb.__init__(self) |
|
48 | bdb.Bdb.__init__(self) | |
30 | cmd.Cmd.__init__(self,completekey=None) # don't load readline |
|
49 | cmd.Cmd.__init__(self,completekey=None) # don't load readline | |
31 |
self.prompt = ' |
|
50 | self.prompt = 'ipdb> ' # The default prompt is '(Pdb)' | |
32 | self.aliases = {} |
|
51 | self.aliases = {} | |
33 |
|
52 | |||
34 | # Read $HOME/.pdbrc and ./.pdbrc |
|
53 | # Read $HOME/.pdbrc and ./.pdbrc | |
35 | self.rcLines = [] |
|
|||
36 | if os.environ.has_key('HOME'): |
|
|||
37 | envHome = os.environ['HOME'] |
|
|||
38 | try: |
|
|||
39 | rcFile = open(os.path.join(envHome, ".pdbrc")) |
|
|||
40 | except IOError: |
|
|||
41 | pass |
|
|||
42 | else: |
|
|||
43 | for line in rcFile.readlines(): |
|
|||
44 | self.rcLines.append(line) |
|
|||
45 | rcFile.close() |
|
|||
46 | try: |
|
54 | try: | |
47 | rcFile = open(".pdbrc") |
|
55 | self.rcLines = _file_lines(os.path.join(os.environ['HOME'], | |
48 | except IOError: |
|
56 | ".pdbrc")) | |
|
57 | except KeyError: | |||
|
58 | self.rcLines = [] | |||
|
59 | self.rcLines.extend(_file_lines(".pdbrc")) | |||
|
60 | ||||
|
61 | # Create color table: we copy the default one from the traceback | |||
|
62 | # module and add a few attributes needed for debugging | |||
|
63 | self.color_scheme_table = ExceptionColors.copy() | |||
|
64 | ||||
|
65 | # shorthands | |||
|
66 | C = ColorANSI.TermColors | |||
|
67 | cst = self.color_scheme_table | |||
|
68 | ||||
|
69 | cst['NoColor'].colors.breakpoint_enabled = C.NoColor | |||
|
70 | cst['NoColor'].colors.breakpoint_disabled = C.NoColor | |||
|
71 | ||||
|
72 | cst['Linux'].colors.breakpoint_enabled = C.LightRed | |||
|
73 | cst['Linux'].colors.breakpoint_disabled = C.Red | |||
|
74 | ||||
|
75 | cst['LightBG'].colors.breakpoint_enabled = C.LightRed | |||
|
76 | cst['LightBG'].colors.breakpoint_disabled = C.Red | |||
|
77 | ||||
|
78 | self.set_colors(color_scheme) | |||
|
79 | ||||
|
80 | def set_colors(self, scheme): | |||
|
81 | """Shorthand access to the color table scheme selector method.""" | |||
|
82 | self.color_scheme_table.set_active_scheme(scheme) | |||
|
83 | ||||
|
84 | ||||
|
85 | def interaction(self, frame, traceback): | |||
|
86 | __IPYTHON__.set_completer_frame(frame) | |||
|
87 | pdb.Pdb.interaction(self, frame, traceback) | |||
|
88 | ||||
|
89 | ||||
|
90 | def do_up(self, arg): | |||
|
91 | pdb.Pdb.do_up(self, arg) | |||
|
92 | __IPYTHON__.set_completer_frame(self.curframe) | |||
|
93 | do_u = do_up | |||
|
94 | ||||
|
95 | ||||
|
96 | def do_down(self, arg): | |||
|
97 | pdb.Pdb.do_down(self, arg) | |||
|
98 | __IPYTHON__.set_completer_frame(self.curframe) | |||
|
99 | do_d = do_down | |||
|
100 | ||||
|
101 | ||||
|
102 | def postloop(self): | |||
|
103 | __IPYTHON__.set_completer_frame(None) | |||
|
104 | ||||
|
105 | ||||
|
106 | def print_stack_trace(self): | |||
|
107 | try: | |||
|
108 | for frame_lineno in self.stack: | |||
|
109 | self.print_stack_entry(frame_lineno, context = 5) | |||
|
110 | except KeyboardInterrupt: | |||
49 | pass |
|
111 | pass | |
|
112 | ||||
|
113 | ||||
|
114 | def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ', | |||
|
115 | context = 3): | |||
|
116 | frame, lineno = frame_lineno | |||
|
117 | print >>Term.cout, self.format_stack_entry(frame_lineno, '', context) | |||
|
118 | ||||
|
119 | ||||
|
120 | def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3): | |||
|
121 | import linecache, repr | |||
|
122 | ||||
|
123 | ret = "" | |||
|
124 | ||||
|
125 | Colors = self.color_scheme_table.active_colors | |||
|
126 | ColorsNormal = Colors.Normal | |||
|
127 | tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal) | |||
|
128 | tpl_call = 'in %s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal) | |||
|
129 | tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) | |||
|
130 | tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, | |||
|
131 | ColorsNormal) | |||
|
132 | ||||
|
133 | frame, lineno = frame_lineno | |||
|
134 | ||||
|
135 | return_value = '' | |||
|
136 | if '__return__' in frame.f_locals: | |||
|
137 | rv = frame.f_locals['__return__'] | |||
|
138 | #return_value += '->' | |||
|
139 | return_value += repr.repr(rv) + '\n' | |||
|
140 | ret += return_value | |||
|
141 | ||||
|
142 | #s = filename + '(' + `lineno` + ')' | |||
|
143 | filename = self.canonic(frame.f_code.co_filename) | |||
|
144 | link = tpl_link % filename | |||
|
145 | ||||
|
146 | if frame.f_code.co_name: | |||
|
147 | func = frame.f_code.co_name | |||
|
148 | else: | |||
|
149 | func = "<lambda>" | |||
|
150 | ||||
|
151 | call = '' | |||
|
152 | if func != '?': | |||
|
153 | if '__args__' in frame.f_locals: | |||
|
154 | args = repr.repr(frame.f_locals['__args__']) | |||
|
155 | else: | |||
|
156 | args = '()' | |||
|
157 | call = tpl_call % (func, args) | |||
|
158 | ||||
|
159 | level = '%s %s\n' % (link, call) | |||
|
160 | ret += level | |||
|
161 | ||||
|
162 | start = lineno - 1 - context//2 | |||
|
163 | lines = linecache.getlines(filename) | |||
|
164 | start = max(start, 0) | |||
|
165 | start = min(start, len(lines) - context) | |||
|
166 | lines = lines[start : start + context] | |||
|
167 | ||||
|
168 | for i in range(len(lines)): | |||
|
169 | line = lines[i] | |||
|
170 | if start + 1 + i == lineno: | |||
|
171 | ret += self.__format_line(tpl_line_em, filename, start + 1 + i, line, arrow = True) | |||
|
172 | else: | |||
|
173 | ret += self.__format_line(tpl_line, filename, start + 1 + i, line, arrow = False) | |||
|
174 | ||||
|
175 | return ret | |||
|
176 | ||||
|
177 | ||||
|
178 | def __format_line(self, tpl_line, filename, lineno, line, arrow = False): | |||
|
179 | bp_mark = "" | |||
|
180 | bp_mark_color = "" | |||
|
181 | ||||
|
182 | bp = None | |||
|
183 | if lineno in self.get_file_breaks(filename): | |||
|
184 | bps = self.get_breaks(filename, lineno) | |||
|
185 | bp = bps[-1] | |||
|
186 | ||||
|
187 | if bp: | |||
|
188 | Colors = self.color_scheme_table.active_colors | |||
|
189 | bp_mark = str(bp.number) | |||
|
190 | bp_mark_color = Colors.breakpoint_enabled | |||
|
191 | if not bp.enabled: | |||
|
192 | bp_mark_color = Colors.breakpoint_disabled | |||
|
193 | ||||
|
194 | numbers_width = 7 | |||
|
195 | if arrow: | |||
|
196 | # This is the line with the error | |||
|
197 | pad = numbers_width - len(str(lineno)) - len(bp_mark) | |||
|
198 | if pad >= 3: | |||
|
199 | marker = '-'*(pad-3) + '-> ' | |||
|
200 | elif pad == 2: | |||
|
201 | marker = '> ' | |||
|
202 | elif pad == 1: | |||
|
203 | marker = '>' | |||
|
204 | else: | |||
|
205 | marker = '' | |||
|
206 | num = '%s%s' % (marker, str(lineno)) | |||
|
207 | line = tpl_line % (bp_mark_color + bp_mark, num, line) | |||
|
208 | else: | |||
|
209 | num = '%*s' % (numbers_width - len(bp_mark), str(lineno)) | |||
|
210 | line = tpl_line % (bp_mark_color + bp_mark, num, line) | |||
|
211 | ||||
|
212 | return line | |||
|
213 | ||||
|
214 | ||||
|
215 | def do_list(self, arg): | |||
|
216 | self.lastcmd = 'list' | |||
|
217 | last = None | |||
|
218 | if arg: | |||
|
219 | try: | |||
|
220 | x = eval(arg, {}, {}) | |||
|
221 | if type(x) == type(()): | |||
|
222 | first, last = x | |||
|
223 | first = int(first) | |||
|
224 | last = int(last) | |||
|
225 | if last < first: | |||
|
226 | # Assume it's a count | |||
|
227 | last = first + last | |||
|
228 | else: | |||
|
229 | first = max(1, int(x) - 5) | |||
|
230 | except: | |||
|
231 | print '*** Error in argument:', `arg` | |||
|
232 | return | |||
|
233 | elif self.lineno is None: | |||
|
234 | first = max(1, self.curframe.f_lineno - 5) | |||
50 | else: |
|
235 | else: | |
51 | for line in rcFile.readlines(): |
|
236 | first = self.lineno + 1 | |
52 | self.rcLines.append(line) |
|
237 | if last is None: | |
53 | rcFile.close() |
|
238 | last = first + 10 | |
|
239 | filename = self.curframe.f_code.co_filename | |||
|
240 | try: | |||
|
241 | Colors = self.color_scheme_table.active_colors | |||
|
242 | ColorsNormal = Colors.Normal | |||
|
243 | tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) | |||
|
244 | tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal) | |||
|
245 | src = [] | |||
|
246 | for lineno in range(first, last+1): | |||
|
247 | line = linecache.getline(filename, lineno) | |||
|
248 | if not line: | |||
|
249 | break | |||
|
250 | ||||
|
251 | if lineno == self.curframe.f_lineno: | |||
|
252 | line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True) | |||
|
253 | else: | |||
|
254 | line = self.__format_line(tpl_line, filename, lineno, line, arrow = False) | |||
|
255 | ||||
|
256 | src.append(line) | |||
|
257 | self.lineno = lineno | |||
|
258 | ||||
|
259 | print >>Term.cout, ''.join(src) | |||
|
260 | ||||
|
261 | except KeyboardInterrupt: | |||
|
262 | pass | |||
|
263 | ||||
|
264 | do_l = do_list |
@@ -1,7 +1,7 b'' | |||||
1 | # -*- coding: utf-8 -*- |
|
1 | # -*- coding: utf-8 -*- | |
2 | """Magic functions for InteractiveShell. |
|
2 | """Magic functions for InteractiveShell. | |
3 |
|
3 | |||
4 |
$Id: Magic.py 9 |
|
4 | $Id: Magic.py 951 2005-12-25 00:57:24Z 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 | |
@@ -22,13 +22,16 b' __license__ = Release.license' | |||||
22 | # Python standard modules |
|
22 | # Python standard modules | |
23 | import __builtin__ |
|
23 | import __builtin__ | |
24 | import os,sys,inspect,pydoc,re,tempfile,pdb,bdb,time |
|
24 | import os,sys,inspect,pydoc,re,tempfile,pdb,bdb,time | |
|
25 | import Debugger | |||
|
26 | from getopt import getopt | |||
|
27 | from pprint import pprint, pformat | |||
|
28 | from cStringIO import StringIO | |||
|
29 | ||||
|
30 | # profile isn't bundled by default in Debian for license reasons | |||
25 | try: |
|
31 | try: | |
26 | import profile,pstats |
|
32 | import profile,pstats | |
27 | except ImportError: |
|
33 | except ImportError: | |
28 | profile = pstats = None |
|
34 | profile = pstats = None | |
29 | from getopt import getopt |
|
|||
30 | from pprint import pprint, pformat |
|
|||
31 | from cStringIO import StringIO |
|
|||
32 |
|
35 | |||
33 | # Homebrewed |
|
36 | # Homebrewed | |
34 | from IPython.Struct import Struct |
|
37 | from IPython.Struct import Struct | |
@@ -1371,7 +1374,7 b' Currently the magic system has the following functions:\\n"""' | |||||
1371 | stats = self.magic_prun('',0,opts,arg_lst,prog_ns) |
|
1374 | stats = self.magic_prun('',0,opts,arg_lst,prog_ns) | |
1372 | else: |
|
1375 | else: | |
1373 | if opts.has_key('d'): |
|
1376 | if opts.has_key('d'): | |
1374 |
deb = |
|
1377 | deb = Debugger.Pdb(self.shell.rc.colors) | |
1375 | # reset Breakpoint state, which is moronically kept |
|
1378 | # reset Breakpoint state, which is moronically kept | |
1376 | # in a class |
|
1379 | # in a class | |
1377 | bdb.Breakpoint.next = 1 |
|
1380 | bdb.Breakpoint.next = 1 | |
@@ -1397,8 +1400,15 b' Currently the magic system has the following functions:\\n"""' | |||||
1397 | deb.do_break('%s:%s' % (filename,bp)) |
|
1400 | deb.do_break('%s:%s' % (filename,bp)) | |
1398 | # Start file run |
|
1401 | # Start file run | |
1399 | print "NOTE: Enter 'c' at the", |
|
1402 | print "NOTE: Enter 'c' at the", | |
1400 |
print " |
|
1403 | print "ipdb> prompt to start your script." | |
1401 | deb.run('execfile("%s")' % filename,prog_ns) |
|
1404 | try: | |
|
1405 | deb.run('execfile("%s")' % filename,prog_ns) | |||
|
1406 | except: | |||
|
1407 | etype, value, tb = sys.exc_info() | |||
|
1408 | # Skip three frames in the traceback: the %run one, | |||
|
1409 | # one inside bdb.py, and the command-line typed by the | |||
|
1410 | # user (run by exec in pdb itself). | |||
|
1411 | self.shell.InteractiveTB(etype,value,tb,tb_offset=3) | |||
1402 | else: |
|
1412 | else: | |
1403 | if runner is None: |
|
1413 | if runner is None: | |
1404 | runner = self.shell.safe_execfile |
|
1414 | runner = self.shell.safe_execfile |
@@ -2,7 +2,7 b'' | |||||
2 | """ |
|
2 | """ | |
3 | Classes for handling input/output prompts. |
|
3 | Classes for handling input/output prompts. | |
4 |
|
4 | |||
5 |
$Id: Prompts.py |
|
5 | $Id: Prompts.py 951 2005-12-25 00:57:24Z 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> | |
@@ -49,6 +49,7 b' PromptColors.add_scheme(ColorANSI.ColorScheme(' | |||||
49 |
|
49 | |||
50 | normal = Colors.NoColor # color off (usu. Colors.Normal) |
|
50 | normal = Colors.NoColor # color off (usu. Colors.Normal) | |
51 | )) |
|
51 | )) | |
|
52 | ||||
52 | # make some schemes as instances so we can copy them for modification easily: |
|
53 | # make some schemes as instances so we can copy them for modification easily: | |
53 | __PColLinux = ColorANSI.ColorScheme( |
|
54 | __PColLinux = ColorANSI.ColorScheme( | |
54 | 'Linux', |
|
55 | 'Linux', | |
@@ -64,8 +65,9 b' __PColLinux = ColorANSI.ColorScheme(' | |||||
64 | ) |
|
65 | ) | |
65 | # Don't forget to enter it into the table! |
|
66 | # Don't forget to enter it into the table! | |
66 | PromptColors.add_scheme(__PColLinux) |
|
67 | PromptColors.add_scheme(__PColLinux) | |
|
68 | ||||
67 | # Slightly modified Linux for light backgrounds |
|
69 | # Slightly modified Linux for light backgrounds | |
68 | __PColLightBG = ColorANSI.ColorScheme('LightBG',**__PColLinux.colors.dict().copy()) |
|
70 | __PColLightBG = __PColLinux.copy('LightBG') | |
69 |
|
71 | |||
70 | __PColLightBG.colors.update( |
|
72 | __PColLightBG.colors.update( | |
71 | in_prompt = InputColors.Blue, |
|
73 | in_prompt = InputColors.Blue, |
@@ -1,7 +1,7 b'' | |||||
1 | # -*- coding: utf-8 -*- |
|
1 | # -*- coding: utf-8 -*- | |
2 | """Release data for the IPython project. |
|
2 | """Release data for the IPython project. | |
3 |
|
3 | |||
4 |
$Id: Release.py |
|
4 | $Id: Release.py 951 2005-12-25 00:57:24Z fperez $""" | |
5 |
|
5 | |||
6 | #***************************************************************************** |
|
6 | #***************************************************************************** | |
7 | # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu> |
|
7 | # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu> | |
@@ -24,7 +24,7 b" name = 'ipython'" | |||||
24 |
|
24 | |||
25 | version = '0.6.16.svn' |
|
25 | version = '0.6.16.svn' | |
26 |
|
26 | |||
27 |
revision = '$Revision: |
|
27 | revision = '$Revision: 951 $' | |
28 |
|
28 | |||
29 | description = "An enhanced interactive Python shell." |
|
29 | description = "An enhanced interactive Python shell." | |
30 |
|
30 | |||
@@ -69,6 +69,8 b" authors = {'Fernando' : ('Fernando Perez','fperez@colorado.edu')," | |||||
69 |
|
69 | |||
70 | url = 'http://ipython.scipy.org' |
|
70 | url = 'http://ipython.scipy.org' | |
71 |
|
71 | |||
|
72 | download_url = 'http://ipython.scipy.org/dist' | |||
|
73 | ||||
72 | platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME'] |
|
74 | platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME'] | |
73 |
|
75 | |||
74 | keywords = ['Interactive','Interpreter','Shell'] |
|
76 | keywords = ['Interactive','Interpreter','Shell'] |
@@ -6,7 +6,7 b' 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 9 |
|
9 | $Id: iplib.py 951 2005-12-25 00:57:24Z fperez $ | |
10 | """ |
|
10 | """ | |
11 |
|
11 | |||
12 | #***************************************************************************** |
|
12 | #***************************************************************************** | |
@@ -54,7 +54,7 b' from codeop import CommandCompiler' | |||||
54 | # IPython's own modules |
|
54 | # IPython's own modules | |
55 | import IPython |
|
55 | import IPython | |
56 | from IPython import OInspect,PyColorize,ultraTB |
|
56 | from IPython import OInspect,PyColorize,ultraTB | |
57 |
from IPython. |
|
57 | from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names | |
58 | from IPython.Logger import Logger |
|
58 | from IPython.Logger import Logger | |
59 | from IPython.Magic import Magic,magic2python,shlex_split |
|
59 | from IPython.Magic import Magic,magic2python,shlex_split | |
60 | from IPython.usage import cmd_line_usage,interactive_usage |
|
60 | from IPython.usage import cmd_line_usage,interactive_usage | |
@@ -969,6 +969,14 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):' | |||||
969 | outcomps = comps.keys() |
|
969 | outcomps = comps.keys() | |
970 | outcomps.sort() |
|
970 | outcomps.sort() | |
971 | return outcomps |
|
971 | return outcomps | |
|
972 | ||||
|
973 | def set_completer_frame(self, frame): | |||
|
974 | if frame: | |||
|
975 | ns = frame.f_globals.copy() | |||
|
976 | ns.update(frame.f_locals) | |||
|
977 | self.Completer.namespace = ns | |||
|
978 | else: | |||
|
979 | self.Completer.namespace = self.user_ns | |||
972 |
|
980 | |||
973 | def post_config_initialization(self): |
|
981 | def post_config_initialization(self): | |
974 | """Post configuration init method |
|
982 | """Post configuration init method | |
@@ -1441,7 +1449,7 b' want to merge them back into the new files.""" % locals()' | |||||
1441 | self.write(banner) |
|
1449 | self.write(banner) | |
1442 |
|
1450 | |||
1443 | more = 0 |
|
1451 | more = 0 | |
1444 |
|
1452 | |||
1445 | # Mark activity in the builtins |
|
1453 | # Mark activity in the builtins | |
1446 | __builtin__.__dict__['__IPYTHON__active'] += 1 |
|
1454 | __builtin__.__dict__['__IPYTHON__active'] += 1 | |
1447 |
|
1455 |
@@ -60,7 +60,7 b' 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 |
|
63 | $Id: ultraTB.py 951 2005-12-25 00:57:24Z fperez $""" | |
64 |
|
64 | |||
65 | #***************************************************************************** |
|
65 | #***************************************************************************** | |
66 | # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu> |
|
66 | # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu> | |
@@ -85,8 +85,8 b' from UserDict import UserDict' | |||||
85 | from IPython import Debugger |
|
85 | from IPython import Debugger | |
86 |
|
86 | |||
87 | from IPython.Struct import Struct |
|
87 | from IPython.Struct import Struct | |
88 | from IPython.ColorANSI import * |
|
|||
89 | from IPython.genutils import Term,uniq_stable,error,info |
|
88 | from IPython.genutils import Term,uniq_stable,error,info | |
|
89 | from IPython.excolors import ExceptionColors | |||
90 |
|
90 | |||
91 | #--------------------------------------------------------------------------- |
|
91 | #--------------------------------------------------------------------------- | |
92 | # Code begins |
|
92 | # Code begins | |
@@ -99,131 +99,42 b' def inspect_error():' | |||||
99 | error('Internal Python error in the inspect module.\n' |
|
99 | error('Internal Python error in the inspect module.\n' | |
100 | 'Below is the traceback from this internal error.\n') |
|
100 | 'Below is the traceback from this internal error.\n') | |
101 |
|
101 | |||
102 | # Make a global variable out of the color scheme table used for coloring |
|
|||
103 | # exception tracebacks. This allows user code to add new schemes at runtime. |
|
|||
104 | ExceptionColors = ColorSchemeTable() |
|
|||
105 |
|
||||
106 | # Populate it with color schemes |
|
|||
107 | C = TermColors # shorthand and local lookup |
|
|||
108 | ExceptionColors.add_scheme(ColorScheme( |
|
|||
109 | 'NoColor', |
|
|||
110 | # The color to be used for the top line |
|
|||
111 | topline = C.NoColor, |
|
|||
112 |
|
||||
113 | # The colors to be used in the traceback |
|
|||
114 | filename = C.NoColor, |
|
|||
115 | lineno = C.NoColor, |
|
|||
116 | name = C.NoColor, |
|
|||
117 | vName = C.NoColor, |
|
|||
118 | val = C.NoColor, |
|
|||
119 | em = C.NoColor, |
|
|||
120 |
|
||||
121 | # Emphasized colors for the last frame of the traceback |
|
|||
122 | normalEm = C.NoColor, |
|
|||
123 | filenameEm = C.NoColor, |
|
|||
124 | linenoEm = C.NoColor, |
|
|||
125 | nameEm = C.NoColor, |
|
|||
126 | valEm = C.NoColor, |
|
|||
127 |
|
||||
128 | # Colors for printing the exception |
|
|||
129 | excName = C.NoColor, |
|
|||
130 | line = C.NoColor, |
|
|||
131 | caret = C.NoColor, |
|
|||
132 | Normal = C.NoColor |
|
|||
133 | )) |
|
|||
134 |
|
||||
135 | # make some schemes as instances so we can copy them for modification easily |
|
|||
136 | ExceptionColors.add_scheme(ColorScheme( |
|
|||
137 | 'Linux', |
|
|||
138 | # The color to be used for the top line |
|
|||
139 | topline = C.LightRed, |
|
|||
140 |
|
||||
141 | # The colors to be used in the traceback |
|
|||
142 | filename = C.Green, |
|
|||
143 | lineno = C.Green, |
|
|||
144 | name = C.Purple, |
|
|||
145 | vName = C.Cyan, |
|
|||
146 | val = C.Green, |
|
|||
147 | em = C.LightCyan, |
|
|||
148 |
|
||||
149 | # Emphasized colors for the last frame of the traceback |
|
|||
150 | normalEm = C.LightCyan, |
|
|||
151 | filenameEm = C.LightGreen, |
|
|||
152 | linenoEm = C.LightGreen, |
|
|||
153 | nameEm = C.LightPurple, |
|
|||
154 | valEm = C.LightBlue, |
|
|||
155 |
|
||||
156 | # Colors for printing the exception |
|
|||
157 | excName = C.LightRed, |
|
|||
158 | line = C.Yellow, |
|
|||
159 | caret = C.White, |
|
|||
160 | Normal = C.Normal |
|
|||
161 | )) |
|
|||
162 |
|
||||
163 | # For light backgrounds, swap dark/light colors |
|
|||
164 | ExceptionColors.add_scheme(ColorScheme( |
|
|||
165 | 'LightBG', |
|
|||
166 | # The color to be used for the top line |
|
|||
167 | topline = C.Red, |
|
|||
168 |
|
||||
169 | # The colors to be used in the traceback |
|
|||
170 | filename = C.LightGreen, |
|
|||
171 | lineno = C.LightGreen, |
|
|||
172 | name = C.LightPurple, |
|
|||
173 | vName = C.Cyan, |
|
|||
174 | val = C.LightGreen, |
|
|||
175 | em = C.Cyan, |
|
|||
176 |
|
||||
177 | # Emphasized colors for the last frame of the traceback |
|
|||
178 | normalEm = C.Cyan, |
|
|||
179 | filenameEm = C.Green, |
|
|||
180 | linenoEm = C.Green, |
|
|||
181 | nameEm = C.Purple, |
|
|||
182 | valEm = C.Blue, |
|
|||
183 |
|
||||
184 | # Colors for printing the exception |
|
|||
185 | excName = C.Red, |
|
|||
186 | #line = C.Brown, # brown often is displayed as yellow |
|
|||
187 | line = C.Red, |
|
|||
188 | caret = C.Normal, |
|
|||
189 | Normal = C.Normal |
|
|||
190 | )) |
|
|||
191 |
|
||||
192 | class TBTools: |
|
102 | class TBTools: | |
193 | """Basic tools used by all traceback printer classes.""" |
|
103 | """Basic tools used by all traceback printer classes.""" | |
194 |
|
104 | |||
195 |
def __init__(self,color_scheme = 'NoColor',call_pdb= |
|
105 | def __init__(self,color_scheme = 'NoColor',call_pdb=False): | |
196 | # Whether to call the interactive pdb debugger after printing |
|
106 | # Whether to call the interactive pdb debugger after printing | |
197 | # tracebacks or not |
|
107 | # tracebacks or not | |
198 | self.call_pdb = call_pdb |
|
108 | self.call_pdb = call_pdb | |
199 | if call_pdb: |
|
|||
200 | self.pdb = Debugger.Pdb() |
|
|||
201 | else: |
|
|||
202 | self.pdb = None |
|
|||
203 |
|
109 | |||
204 | # Create color table |
|
110 | # Create color table | |
205 |
self. |
|
111 | self.color_scheme_table = ExceptionColors | |
206 |
|
112 | |||
207 | self.set_colors(color_scheme) |
|
113 | self.set_colors(color_scheme) | |
208 | self.old_scheme = color_scheme # save initial value for toggles |
|
114 | self.old_scheme = color_scheme # save initial value for toggles | |
209 |
|
115 | |||
|
116 | if call_pdb: | |||
|
117 | self.pdb = Debugger.Pdb(self.color_scheme_table.active_scheme_name) | |||
|
118 | else: | |||
|
119 | self.pdb = None | |||
|
120 | ||||
210 | def set_colors(self,*args,**kw): |
|
121 | def set_colors(self,*args,**kw): | |
211 | """Shorthand access to the color table scheme selector method.""" |
|
122 | """Shorthand access to the color table scheme selector method.""" | |
212 |
|
123 | |||
213 |
self. |
|
124 | self.color_scheme_table.set_active_scheme(*args,**kw) | |
214 | # for convenience, set Colors to the active scheme |
|
125 | # for convenience, set Colors to the active scheme | |
215 |
self.Colors = self. |
|
126 | self.Colors = self.color_scheme_table.active_colors | |
216 |
|
127 | |||
217 | def color_toggle(self): |
|
128 | def color_toggle(self): | |
218 | """Toggle between the currently active color scheme and NoColor.""" |
|
129 | """Toggle between the currently active color scheme and NoColor.""" | |
219 |
|
130 | |||
220 |
if self. |
|
131 | if self.color_scheme_table.active_scheme_name == 'NoColor': | |
221 |
self. |
|
132 | self.color_scheme_table.set_active_scheme(self.old_scheme) | |
222 |
self.Colors = self. |
|
133 | self.Colors = self.color_scheme_table.active_colors | |
223 | else: |
|
134 | else: | |
224 |
self.old_scheme = self. |
|
135 | self.old_scheme = self.color_scheme_table.active_scheme_name | |
225 |
self. |
|
136 | self.color_scheme_table.set_active_scheme('NoColor') | |
226 |
self.Colors = self. |
|
137 | self.Colors = self.color_scheme_table.active_colors | |
227 |
|
138 | |||
228 | #--------------------------------------------------------------------------- |
|
139 | #--------------------------------------------------------------------------- | |
229 | class ListTB(TBTools): |
|
140 | class ListTB(TBTools): | |
@@ -660,14 +571,21 b' class VerboseTB(TBTools):' | |||||
660 |
|
571 | |||
661 | if self.call_pdb: |
|
572 | if self.call_pdb: | |
662 | if self.pdb is None: |
|
573 | if self.pdb is None: | |
663 |
self.pdb = Debugger.Pdb( |
|
574 | self.pdb = Debugger.Pdb( | |
664 | # the system displayhook may have changed, restore the original for pdb |
|
575 | self.color_scheme_table.active_scheme_name) | |
|
576 | # the system displayhook may have changed, restore the original | |||
|
577 | # for pdb | |||
665 | dhook = sys.displayhook |
|
578 | dhook = sys.displayhook | |
666 | sys.displayhook = sys.__displayhook__ |
|
579 | sys.displayhook = sys.__displayhook__ | |
667 | self.pdb.reset() |
|
580 | self.pdb.reset() | |
|
581 | # Find the right frame so we don't pop up inside ipython itself | |||
|
582 | etb = self.tb | |||
668 | while self.tb.tb_next is not None: |
|
583 | while self.tb.tb_next is not None: | |
669 | self.tb = self.tb.tb_next |
|
584 | self.tb = self.tb.tb_next | |
670 | try: |
|
585 | try: | |
|
586 | if etb and etb.tb_next: | |||
|
587 | etb = etb.tb_next | |||
|
588 | self.pdb.botframe = etb.tb_frame | |||
671 | self.pdb.interaction(self.tb.tb_frame, self.tb) |
|
589 | self.pdb.interaction(self.tb.tb_frame, self.tb) | |
672 | except: |
|
590 | except: | |
673 | print '*** ERROR ***' |
|
591 | print '*** ERROR ***' | |
@@ -801,7 +719,7 b' class AutoFormattedTB(FormattedTB):' | |||||
801 | print >> out, self.text(etype, evalue, etb) |
|
719 | print >> out, self.text(etype, evalue, etb) | |
802 | self.tb_offset = tb_offset |
|
720 | self.tb_offset = tb_offset | |
803 | else: |
|
721 | else: | |
804 | print >> out, self.text() |
|
722 | print >> out, self.text(etype, evalue, etb) | |
805 | self.debugger() |
|
723 | self.debugger() | |
806 |
|
724 | |||
807 | def text(self,etype=None,value=None,tb=None,context=5,mode=None): |
|
725 | def text(self,etype=None,value=None,tb=None,context=5,mode=None): |
@@ -1,3 +1,19 b'' | |||||
|
1 | 2005-12-24 Fernando Perez <Fernando.Perez@colorado.edu> | |||
|
2 | ||||
|
3 | * setup.py: added download_url to setup(). This registers the | |||
|
4 | download address at PyPI, which is not only useful to humans | |||
|
5 | browsing the site, but is also picked up by setuptools (the Eggs | |||
|
6 | machinery). Thanks to Ville and R. Kern for the info/discussion | |||
|
7 | on this. | |||
|
8 | ||||
|
9 | 2005-12-23 Fernando Perez <Fernando.Perez@colorado.edu> | |||
|
10 | ||||
|
11 | * IPython/Debugger.py (Pdb.__init__): Major pdb mode enhancements. | |||
|
12 | This brings a lot of nice functionality to the pdb mode, which now | |||
|
13 | has tab-completion, syntax highlighting, and better stack handling | |||
|
14 | than before. Many thanks to Vivian De Smedt | |||
|
15 | <vivian-AT-vdesmedt.com> for the original patches. | |||
|
16 | ||||
1 | 2005-12-08 Fernando Perez <Fernando.Perez@colorado.edu> |
|
17 | 2005-12-08 Fernando Perez <Fernando.Perez@colorado.edu> | |
2 |
|
18 | |||
3 | * IPython/Shell.py (IPShellGTK.mainloop): fix mainloop() calling |
|
19 | * IPython/Shell.py (IPShellGTK.mainloop): fix mainloop() calling | |
@@ -11,7 +27,7 b'' | |||||
11 | Fix bug where a naked 'alias' call in the ipythonrc file would |
|
27 | Fix bug where a naked 'alias' call in the ipythonrc file would | |
12 | cause a crash. Bug reported by Jorgen Stenarson. |
|
28 | cause a crash. Bug reported by Jorgen Stenarson. | |
13 |
|
29 | |||
14 | 2005-11-15 <Fernando.Perez@colorado.edu> |
|
30 | 2005-11-15 Fernando Perez <Fernando.Perez@colorado.edu> | |
15 |
|
31 | |||
16 | * IPython/ipmaker.py (make_IPython): cleanups which should improve |
|
32 | * IPython/ipmaker.py (make_IPython): cleanups which should improve | |
17 | startup time. |
|
33 | startup time. | |
@@ -26,13 +42,13 b'' | |||||
26 | searches. Users can still select either mode at runtime on a |
|
42 | searches. Users can still select either mode at runtime on a | |
27 | per-search basis. |
|
43 | per-search basis. | |
28 |
|
44 | |||
29 | 2005-11-13 <Fernando.Perez@colorado.edu> |
|
45 | 2005-11-13 Fernando Perez <Fernando.Perez@colorado.edu> | |
30 |
|
46 | |||
31 | * IPython/wildcard.py (NameSpace.__init__): fix resolution of |
|
47 | * IPython/wildcard.py (NameSpace.__init__): fix resolution of | |
32 | attributes in wildcard searches for subclasses. Modified version |
|
48 | attributes in wildcard searches for subclasses. Modified version | |
33 | of a patch by Jorgen. |
|
49 | of a patch by Jorgen. | |
34 |
|
50 | |||
35 | 2005-11-12 <Fernando.Perez@colorado.edu> |
|
51 | 2005-11-12 Fernando Perez <Fernando.Perez@colorado.edu> | |
36 |
|
52 | |||
37 | * IPython/iplib.py (embed_mainloop): Fix handling of globals for |
|
53 | * IPython/iplib.py (embed_mainloop): Fix handling of globals for | |
38 | embedded instances. I added a user_global_ns attribute to the |
|
54 | embedded instances. I added a user_global_ns attribute to the |
@@ -133,6 +133,7 b' setup(name = name,' | |||||
133 | author = authors['Fernando'][0], |
|
133 | author = authors['Fernando'][0], | |
134 | author_email = authors['Fernando'][1], |
|
134 | author_email = authors['Fernando'][1], | |
135 | url = url, |
|
135 | url = url, | |
|
136 | download_url = download_url, | |||
136 | license = license, |
|
137 | license = license, | |
137 | platforms = platforms, |
|
138 | platforms = platforms, | |
138 | keywords = keywords, |
|
139 | keywords = keywords, |
General Comments 0
You need to be logged in to leave comments.
Login now