##// END OF EJS Templates
IPython/Extensions/astyle.py: Do a relative import of ipipe, so that...
walter.doerwald -
Show More
@@ -1,401 +1,401 b''
1 """
1 """
2 ``astyle`` provides classes for adding style (foreground and background color;
2 ``astyle`` provides classes for adding style (foreground and background color;
3 bold; blink; etc.) to terminal and curses output.
3 bold; blink; etc.) to terminal and curses output.
4 """
4 """
5
5
6
6
7 import sys, os
7 import sys, os
8
8
9 try:
9 try:
10 import curses
10 import curses
11 except ImportError:
11 except ImportError:
12 curses = None
12 curses = None
13
13
14
14
15 COLOR_BLACK = 0
15 COLOR_BLACK = 0
16 COLOR_RED = 1
16 COLOR_RED = 1
17 COLOR_GREEN = 2
17 COLOR_GREEN = 2
18 COLOR_YELLOW = 3
18 COLOR_YELLOW = 3
19 COLOR_BLUE = 4
19 COLOR_BLUE = 4
20 COLOR_MAGENTA = 5
20 COLOR_MAGENTA = 5
21 COLOR_CYAN = 6
21 COLOR_CYAN = 6
22 COLOR_WHITE = 7
22 COLOR_WHITE = 7
23
23
24 A_BLINK = 1<<0 # Blinking text
24 A_BLINK = 1<<0 # Blinking text
25 A_BOLD = 1<<1 # Extra bright or bold text
25 A_BOLD = 1<<1 # Extra bright or bold text
26 A_DIM = 1<<2 # Half bright text
26 A_DIM = 1<<2 # Half bright text
27 A_REVERSE = 1<<3 # Reverse-video text
27 A_REVERSE = 1<<3 # Reverse-video text
28 A_STANDOUT = 1<<4 # The best highlighting mode available
28 A_STANDOUT = 1<<4 # The best highlighting mode available
29 A_UNDERLINE = 1<<5 # Underlined text
29 A_UNDERLINE = 1<<5 # Underlined text
30
30
31
31
32 class Style(object):
32 class Style(object):
33 """
33 """
34 Store foreground color, background color and attribute (bold, underlined
34 Store foreground color, background color and attribute (bold, underlined
35 etc.).
35 etc.).
36 """
36 """
37 __slots__ = ("fg", "bg", "attrs")
37 __slots__ = ("fg", "bg", "attrs")
38
38
39 COLORNAMES = {
39 COLORNAMES = {
40 "black": COLOR_BLACK,
40 "black": COLOR_BLACK,
41 "red": COLOR_RED,
41 "red": COLOR_RED,
42 "green": COLOR_GREEN,
42 "green": COLOR_GREEN,
43 "yellow": COLOR_YELLOW,
43 "yellow": COLOR_YELLOW,
44 "blue": COLOR_BLUE,
44 "blue": COLOR_BLUE,
45 "magenta": COLOR_MAGENTA,
45 "magenta": COLOR_MAGENTA,
46 "cyan": COLOR_CYAN,
46 "cyan": COLOR_CYAN,
47 "white": COLOR_WHITE,
47 "white": COLOR_WHITE,
48 }
48 }
49 ATTRNAMES = {
49 ATTRNAMES = {
50 "blink": A_BLINK,
50 "blink": A_BLINK,
51 "bold": A_BOLD,
51 "bold": A_BOLD,
52 "dim": A_DIM,
52 "dim": A_DIM,
53 "reverse": A_REVERSE,
53 "reverse": A_REVERSE,
54 "standout": A_STANDOUT,
54 "standout": A_STANDOUT,
55 "underline": A_UNDERLINE,
55 "underline": A_UNDERLINE,
56 }
56 }
57
57
58 def __init__(self, fg, bg, attrs=0):
58 def __init__(self, fg, bg, attrs=0):
59 """
59 """
60 Create a ``Style`` object with ``fg`` as the foreground color,
60 Create a ``Style`` object with ``fg`` as the foreground color,
61 ``bg`` as the background color and ``attrs`` as the attributes.
61 ``bg`` as the background color and ``attrs`` as the attributes.
62
62
63 Examples:
63 Examples:
64
64
65 >>> Style(COLOR_RED, COLOR_BLACK)
65 >>> Style(COLOR_RED, COLOR_BLACK)
66 >>> Style(COLOR_YELLOW, COLOR_BLUE, A_BOLD|A_UNDERLINE)
66 >>> Style(COLOR_YELLOW, COLOR_BLUE, A_BOLD|A_UNDERLINE)
67 """
67 """
68 self.fg = fg
68 self.fg = fg
69 self.bg = bg
69 self.bg = bg
70 self.attrs = attrs
70 self.attrs = attrs
71
71
72 def __call__(self, *args):
72 def __call__(self, *args):
73 text = Text()
73 text = Text()
74 for arg in args:
74 for arg in args:
75 if isinstance(arg, Text):
75 if isinstance(arg, Text):
76 text.extend(arg)
76 text.extend(arg)
77 else:
77 else:
78 text.append((self, arg))
78 text.append((self, arg))
79 return text
79 return text
80
80
81 def __eq__(self, other):
81 def __eq__(self, other):
82 return self.fg == other.fg and self.bg == other.bg and self.attrs == other.attrs
82 return self.fg == other.fg and self.bg == other.bg and self.attrs == other.attrs
83
83
84 def __neq__(self, other):
84 def __neq__(self, other):
85 return self.fg != other.fg or self.bg != other.bg or self.attrs != other.attrs
85 return self.fg != other.fg or self.bg != other.bg or self.attrs != other.attrs
86
86
87 def __repr__(self):
87 def __repr__(self):
88 color2name = ("black", "red", "green", "yellow", "blue", "magenta", "cyan", "white")
88 color2name = ("black", "red", "green", "yellow", "blue", "magenta", "cyan", "white")
89 attrs2name = ("blink", "bold", "dim", "reverse", "standout", "underline")
89 attrs2name = ("blink", "bold", "dim", "reverse", "standout", "underline")
90
90
91 return "<%s fg=%s bg=%s attrs=%s>" % (
91 return "<%s fg=%s bg=%s attrs=%s>" % (
92 self.__class__.__name__, color2name[self.fg], color2name[self.bg],
92 self.__class__.__name__, color2name[self.fg], color2name[self.bg],
93 "|".join([attrs2name[b] for b in xrange(6) if self.attrs&(1<<b)]) or 0)
93 "|".join([attrs2name[b] for b in xrange(6) if self.attrs&(1<<b)]) or 0)
94
94
95 def fromstr(cls, value):
95 def fromstr(cls, value):
96 """
96 """
97 Create a ``Style`` object from a string. The format looks like this:
97 Create a ``Style`` object from a string. The format looks like this:
98 ``"red:black:bold|blink"``.
98 ``"red:black:bold|blink"``.
99 """
99 """
100 # defaults
100 # defaults
101 fg = COLOR_WHITE
101 fg = COLOR_WHITE
102 bg = COLOR_BLACK
102 bg = COLOR_BLACK
103 attrs = 0
103 attrs = 0
104
104
105 parts = value.split(":")
105 parts = value.split(":")
106 if len(parts) > 0:
106 if len(parts) > 0:
107 fg = cls.COLORNAMES[parts[0].lower()]
107 fg = cls.COLORNAMES[parts[0].lower()]
108 if len(parts) > 1:
108 if len(parts) > 1:
109 bg = cls.COLORNAMES[parts[1].lower()]
109 bg = cls.COLORNAMES[parts[1].lower()]
110 if len(parts) > 2:
110 if len(parts) > 2:
111 for strattr in parts[2].split("|"):
111 for strattr in parts[2].split("|"):
112 attrs |= cls.ATTRNAMES[strattr.lower()]
112 attrs |= cls.ATTRNAMES[strattr.lower()]
113 return cls(fg, bg, attrs)
113 return cls(fg, bg, attrs)
114 fromstr = classmethod(fromstr)
114 fromstr = classmethod(fromstr)
115
115
116 def fromenv(cls, name, default):
116 def fromenv(cls, name, default):
117 """
117 """
118 Create a ``Style`` from an environment variable named ``name``
118 Create a ``Style`` from an environment variable named ``name``
119 (using ``default`` if the environment variable doesn't exist).
119 (using ``default`` if the environment variable doesn't exist).
120 """
120 """
121 return cls.fromstr(os.environ.get(name, default))
121 return cls.fromstr(os.environ.get(name, default))
122 fromenv = classmethod(fromenv)
122 fromenv = classmethod(fromenv)
123
123
124
124
125 def switchstyle(s1, s2):
125 def switchstyle(s1, s2):
126 """
126 """
127 Return the ANSI escape sequence needed to switch from style ``s1`` to
127 Return the ANSI escape sequence needed to switch from style ``s1`` to
128 style ``s2``.
128 style ``s2``.
129 """
129 """
130 attrmask = (A_BLINK|A_BOLD|A_UNDERLINE|A_REVERSE)
130 attrmask = (A_BLINK|A_BOLD|A_UNDERLINE|A_REVERSE)
131 a1 = s1.attrs & attrmask
131 a1 = s1.attrs & attrmask
132 a2 = s2.attrs & attrmask
132 a2 = s2.attrs & attrmask
133
133
134 args = []
134 args = []
135 if s1 != s2:
135 if s1 != s2:
136 # do we have to get rid of the bold/underline/blink bit?
136 # do we have to get rid of the bold/underline/blink bit?
137 # (can only be done by a reset)
137 # (can only be done by a reset)
138 # use reset when our target color is the default color
138 # use reset when our target color is the default color
139 # (this is shorter than 37;40)
139 # (this is shorter than 37;40)
140 if (a1 & ~a2 or s2==style_default):
140 if (a1 & ~a2 or s2==style_default):
141 args.append("0")
141 args.append("0")
142 s1 = style_default
142 s1 = style_default
143 a1 = 0
143 a1 = 0
144
144
145 # now we know that old and new color have the same boldness,
145 # now we know that old and new color have the same boldness,
146 # or the new color is bold and the old isn't,
146 # or the new color is bold and the old isn't,
147 # i.e. we only might have to switch bold on, not off
147 # i.e. we only might have to switch bold on, not off
148 if not (a1 & A_BOLD) and (a2 & A_BOLD):
148 if not (a1 & A_BOLD) and (a2 & A_BOLD):
149 args.append("1")
149 args.append("1")
150
150
151 # Fix underline
151 # Fix underline
152 if not (a1 & A_UNDERLINE) and (a2 & A_UNDERLINE):
152 if not (a1 & A_UNDERLINE) and (a2 & A_UNDERLINE):
153 args.append("4")
153 args.append("4")
154
154
155 # Fix blink
155 # Fix blink
156 if not (a1 & A_BLINK) and (a2 & A_BLINK):
156 if not (a1 & A_BLINK) and (a2 & A_BLINK):
157 args.append("5")
157 args.append("5")
158
158
159 # Fix reverse
159 # Fix reverse
160 if not (a1 & A_REVERSE) and (a2 & A_REVERSE):
160 if not (a1 & A_REVERSE) and (a2 & A_REVERSE):
161 args.append("7")
161 args.append("7")
162
162
163 # Fix foreground color
163 # Fix foreground color
164 if s1.fg != s2.fg:
164 if s1.fg != s2.fg:
165 args.append("3%d" % s2.fg)
165 args.append("3%d" % s2.fg)
166
166
167 # Finally fix the background color
167 # Finally fix the background color
168 if s1.bg != s2.bg:
168 if s1.bg != s2.bg:
169 args.append("4%d" % s2.bg)
169 args.append("4%d" % s2.bg)
170
170
171 if args:
171 if args:
172 return "\033[%sm" % ";".join(args)
172 return "\033[%sm" % ";".join(args)
173 return ""
173 return ""
174
174
175
175
176 class Text(list):
176 class Text(list):
177 """
177 """
178 A colored string. A ``Text`` object is a sequence, the sequence
178 A colored string. A ``Text`` object is a sequence, the sequence
179 items will be ``(style, string)`` tuples.
179 items will be ``(style, string)`` tuples.
180 """
180 """
181
181
182 def __init__(self, *args):
182 def __init__(self, *args):
183 list.__init__(self)
183 list.__init__(self)
184 self.append(*args)
184 self.append(*args)
185
185
186 def __repr__(self):
186 def __repr__(self):
187 return "%s.%s(%s)" % (
187 return "%s.%s(%s)" % (
188 self.__class__.__module__, self.__class__.__name__,
188 self.__class__.__module__, self.__class__.__name__,
189 list.__repr__(self)[1:-1])
189 list.__repr__(self)[1:-1])
190
190
191 def append(self, *args):
191 def append(self, *args):
192 for arg in args:
192 for arg in args:
193 if isinstance(arg, Text):
193 if isinstance(arg, Text):
194 self.extend(arg)
194 self.extend(arg)
195 elif isinstance(arg, tuple): # must be (style, string)
195 elif isinstance(arg, tuple): # must be (style, string)
196 list.append(self, arg)
196 list.append(self, arg)
197 elif isinstance(arg, unicode):
197 elif isinstance(arg, unicode):
198 list.append(self, (style_default, arg))
198 list.append(self, (style_default, arg))
199 else:
199 else:
200 list.append(self, (style_default, str(arg)))
200 list.append(self, (style_default, str(arg)))
201
201
202 def insert(self, index, *args):
202 def insert(self, index, *args):
203 self[index:index] = Text(*args)
203 self[index:index] = Text(*args)
204
204
205 def __add__(self, other):
205 def __add__(self, other):
206 new = Text()
206 new = Text()
207 new.append(self)
207 new.append(self)
208 new.append(other)
208 new.append(other)
209 return new
209 return new
210
210
211 def __iadd__(self, other):
211 def __iadd__(self, other):
212 self.append(other)
212 self.append(other)
213 return self
213 return self
214
214
215 def format(self, styled=True):
215 def format(self, styled=True):
216 """
216 """
217 This generator yields the strings that will make up the final
217 This generator yields the strings that will make up the final
218 colorized string.
218 colorized string.
219 """
219 """
220 if styled:
220 if styled:
221 oldstyle = style_default
221 oldstyle = style_default
222 for (style, string) in self:
222 for (style, string) in self:
223 if not isinstance(style, (int, long)):
223 if not isinstance(style, (int, long)):
224 switch = switchstyle(oldstyle, style)
224 switch = switchstyle(oldstyle, style)
225 if switch:
225 if switch:
226 yield switch
226 yield switch
227 if string:
227 if string:
228 yield string
228 yield string
229 oldstyle = style
229 oldstyle = style
230 switch = switchstyle(oldstyle, style_default)
230 switch = switchstyle(oldstyle, style_default)
231 if switch:
231 if switch:
232 yield switch
232 yield switch
233 else:
233 else:
234 for (style, string) in self:
234 for (style, string) in self:
235 if not isinstance(style, (int, long)):
235 if not isinstance(style, (int, long)):
236 yield string
236 yield string
237
237
238 def string(self, styled=True):
238 def string(self, styled=True):
239 """
239 """
240 Return the resulting string (with escape sequences, if ``styled``
240 Return the resulting string (with escape sequences, if ``styled``
241 is true).
241 is true).
242 """
242 """
243 return "".join(self.format(styled))
243 return "".join(self.format(styled))
244
244
245 def __str__(self):
245 def __str__(self):
246 """
246 """
247 Return ``self`` as a string (without ANSI escape sequences).
247 Return ``self`` as a string (without ANSI escape sequences).
248 """
248 """
249 return self.string(False)
249 return self.string(False)
250
250
251 def write(self, stream, styled=True):
251 def write(self, stream, styled=True):
252 """
252 """
253 Write ``self`` to the output stream ``stream`` (with escape sequences,
253 Write ``self`` to the output stream ``stream`` (with escape sequences,
254 if ``styled`` is true).
254 if ``styled`` is true).
255 """
255 """
256 for part in self.format(styled):
256 for part in self.format(styled):
257 stream.write(part)
257 stream.write(part)
258
258
259
259
260 try:
260 try:
261 from IPython.Extensions import ipipe
261 import ipipe
262 except ImportError:
262 except ImportError:
263 pass
263 pass
264 else:
264 else:
265 def xrepr_astyle_text(self, mode="default"):
265 def xrepr_astyle_text(self, mode="default"):
266 yield (-1, True)
266 yield (-1, True)
267 for info in self:
267 for info in self:
268 yield info
268 yield info
269 try:
269 try:
270 ipipe.xrepr.when_type(Text)(xrepr_astyle_text)
270 ipipe.xrepr.when_type(Text)(xrepr_astyle_text)
271 except Exception:
271 except Exception:
272 pass
272 pass
273
273
274
274
275 def streamstyle(stream, styled=None):
275 def streamstyle(stream, styled=None):
276 """
276 """
277 If ``styled`` is ``None``, return whether ``stream`` refers to a terminal.
277 If ``styled`` is ``None``, return whether ``stream`` refers to a terminal.
278 If this can't be determined (either because ``stream`` doesn't refer to a
278 If this can't be determined (either because ``stream`` doesn't refer to a
279 real OS file, or because you're on Windows) return ``False``. If ``styled``
279 real OS file, or because you're on Windows) return ``False``. If ``styled``
280 is not ``None`` ``styled`` will be returned unchanged.
280 is not ``None`` ``styled`` will be returned unchanged.
281 """
281 """
282 if styled is None:
282 if styled is None:
283 try:
283 try:
284 styled = os.isatty(stream.fileno())
284 styled = os.isatty(stream.fileno())
285 except (KeyboardInterrupt, SystemExit):
285 except (KeyboardInterrupt, SystemExit):
286 raise
286 raise
287 except Exception:
287 except Exception:
288 styled = False
288 styled = False
289 return styled
289 return styled
290
290
291
291
292 def write(stream, styled, *texts):
292 def write(stream, styled, *texts):
293 """
293 """
294 Write ``texts`` to ``stream``.
294 Write ``texts`` to ``stream``.
295 """
295 """
296 text = Text(*texts)
296 text = Text(*texts)
297 text.write(stream, streamstyle(stream, styled))
297 text.write(stream, streamstyle(stream, styled))
298
298
299
299
300 def writeln(stream, styled, *texts):
300 def writeln(stream, styled, *texts):
301 """
301 """
302 Write ``texts`` to ``stream`` and finish with a line feed.
302 Write ``texts`` to ``stream`` and finish with a line feed.
303 """
303 """
304 write(stream, styled, *texts)
304 write(stream, styled, *texts)
305 stream.write("\n")
305 stream.write("\n")
306
306
307
307
308 class Stream(object):
308 class Stream(object):
309 """
309 """
310 Stream wrapper that adds color output.
310 Stream wrapper that adds color output.
311 """
311 """
312 def __init__(self, stream, styled=None):
312 def __init__(self, stream, styled=None):
313 self.stream = stream
313 self.stream = stream
314 self.styled = streamstyle(stream, styled)
314 self.styled = streamstyle(stream, styled)
315
315
316 def write(self, *texts):
316 def write(self, *texts):
317 write(self.stream, self.styled, *texts)
317 write(self.stream, self.styled, *texts)
318
318
319 def writeln(self, *texts):
319 def writeln(self, *texts):
320 writeln(self.stream, self.styled, *texts)
320 writeln(self.stream, self.styled, *texts)
321
321
322 def __getattr__(self, name):
322 def __getattr__(self, name):
323 return getattr(self.stream, name)
323 return getattr(self.stream, name)
324
324
325
325
326 class stdout(object):
326 class stdout(object):
327 """
327 """
328 Stream wrapper for ``sys.stdout`` that adds color output.
328 Stream wrapper for ``sys.stdout`` that adds color output.
329 """
329 """
330 def write(self, *texts):
330 def write(self, *texts):
331 write(sys.stdout, None, *texts)
331 write(sys.stdout, None, *texts)
332
332
333 def writeln(self, *texts):
333 def writeln(self, *texts):
334 writeln(sys.stdout, None, *texts)
334 writeln(sys.stdout, None, *texts)
335
335
336 def __getattr__(self, name):
336 def __getattr__(self, name):
337 return getattr(sys.stdout, name)
337 return getattr(sys.stdout, name)
338 stdout = stdout()
338 stdout = stdout()
339
339
340
340
341 class stderr(object):
341 class stderr(object):
342 """
342 """
343 Stream wrapper for ``sys.stderr`` that adds color output.
343 Stream wrapper for ``sys.stderr`` that adds color output.
344 """
344 """
345 def write(self, *texts):
345 def write(self, *texts):
346 write(sys.stderr, None, *texts)
346 write(sys.stderr, None, *texts)
347
347
348 def writeln(self, *texts):
348 def writeln(self, *texts):
349 writeln(sys.stderr, None, *texts)
349 writeln(sys.stderr, None, *texts)
350
350
351 def __getattr__(self, name):
351 def __getattr__(self, name):
352 return getattr(sys.stdout, name)
352 return getattr(sys.stdout, name)
353 stderr = stderr()
353 stderr = stderr()
354
354
355
355
356 if curses is not None:
356 if curses is not None:
357 # This is probably just range(8)
357 # This is probably just range(8)
358 COLOR2CURSES = [
358 COLOR2CURSES = [
359 COLOR_BLACK,
359 COLOR_BLACK,
360 COLOR_RED,
360 COLOR_RED,
361 COLOR_GREEN,
361 COLOR_GREEN,
362 COLOR_YELLOW,
362 COLOR_YELLOW,
363 COLOR_BLUE,
363 COLOR_BLUE,
364 COLOR_MAGENTA,
364 COLOR_MAGENTA,
365 COLOR_CYAN,
365 COLOR_CYAN,
366 COLOR_WHITE,
366 COLOR_WHITE,
367 ]
367 ]
368
368
369 A2CURSES = {
369 A2CURSES = {
370 A_BLINK: curses.A_BLINK,
370 A_BLINK: curses.A_BLINK,
371 A_BOLD: curses.A_BOLD,
371 A_BOLD: curses.A_BOLD,
372 A_DIM: curses.A_DIM,
372 A_DIM: curses.A_DIM,
373 A_REVERSE: curses.A_REVERSE,
373 A_REVERSE: curses.A_REVERSE,
374 A_STANDOUT: curses.A_STANDOUT,
374 A_STANDOUT: curses.A_STANDOUT,
375 A_UNDERLINE: curses.A_UNDERLINE,
375 A_UNDERLINE: curses.A_UNDERLINE,
376 }
376 }
377
377
378
378
379 # default style
379 # default style
380 style_default = Style.fromstr("white:black")
380 style_default = Style.fromstr("white:black")
381
381
382 # Styles for datatypes
382 # Styles for datatypes
383 style_type_none = Style.fromstr("magenta:black")
383 style_type_none = Style.fromstr("magenta:black")
384 style_type_bool = Style.fromstr("magenta:black")
384 style_type_bool = Style.fromstr("magenta:black")
385 style_type_number = Style.fromstr("yellow:black")
385 style_type_number = Style.fromstr("yellow:black")
386 style_type_datetime = Style.fromstr("magenta:black")
386 style_type_datetime = Style.fromstr("magenta:black")
387 style_type_type = Style.fromstr("cyan:black")
387 style_type_type = Style.fromstr("cyan:black")
388
388
389 # Style for URLs and file/directory names
389 # Style for URLs and file/directory names
390 style_url = Style.fromstr("green:black")
390 style_url = Style.fromstr("green:black")
391 style_dir = Style.fromstr("cyan:black")
391 style_dir = Style.fromstr("cyan:black")
392 style_file = Style.fromstr("green:black")
392 style_file = Style.fromstr("green:black")
393
393
394 # Style for ellipsis (when an output has been shortened
394 # Style for ellipsis (when an output has been shortened
395 style_ellisis = Style.fromstr("red:black")
395 style_ellisis = Style.fromstr("red:black")
396
396
397 # Style for displaying exceptions
397 # Style for displaying exceptions
398 style_error = Style.fromstr("red:black")
398 style_error = Style.fromstr("red:black")
399
399
400 # Style for displaying non-existing attributes
400 # Style for displaying non-existing attributes
401 style_nodata = Style.fromstr("red:black")
401 style_nodata = Style.fromstr("red:black")
@@ -1,1667 +1,1667 b''
1 # -*- coding: iso-8859-1 -*-
1 # -*- coding: iso-8859-1 -*-
2
2
3 import curses, fcntl, signal, struct, tty, textwrap, inspect
3 import curses, fcntl, signal, struct, tty, textwrap, inspect
4
4
5 import astyle, ipipe
5 import astyle, ipipe
6
6
7
7
8 # Python 2.3 compatibility
8 # Python 2.3 compatibility
9 try:
9 try:
10 set
10 set
11 except NameError:
11 except NameError:
12 import sets
12 import sets
13 set = sets.Set
13 set = sets.Set
14
14
15 # Python 2.3 compatibility
15 # Python 2.3 compatibility
16 try:
16 try:
17 sorted
17 sorted
18 except NameError:
18 except NameError:
19 from ipipe import sorted
19 from ipipe import sorted
20
20
21
21
22 class UnassignedKeyError(Exception):
22 class UnassignedKeyError(Exception):
23 """
23 """
24 Exception that is used for reporting unassigned keys.
24 Exception that is used for reporting unassigned keys.
25 """
25 """
26
26
27
27
28 class UnknownCommandError(Exception):
28 class UnknownCommandError(Exception):
29 """
29 """
30 Exception that is used for reporting unknown commands (this should never
30 Exception that is used for reporting unknown commands (this should never
31 happen).
31 happen).
32 """
32 """
33
33
34
34
35 class CommandError(Exception):
35 class CommandError(Exception):
36 """
36 """
37 Exception that is used for reporting that a command can't be executed.
37 Exception that is used for reporting that a command can't be executed.
38 """
38 """
39
39
40
40
41 class Keymap(dict):
41 class Keymap(dict):
42 """
42 """
43 Stores mapping of keys to commands.
43 Stores mapping of keys to commands.
44 """
44 """
45 def __init__(self):
45 def __init__(self):
46 self._keymap = {}
46 self._keymap = {}
47
47
48 def __setitem__(self, key, command):
48 def __setitem__(self, key, command):
49 if isinstance(key, str):
49 if isinstance(key, str):
50 for c in key:
50 for c in key:
51 dict.__setitem__(self, ord(c), command)
51 dict.__setitem__(self, ord(c), command)
52 else:
52 else:
53 dict.__setitem__(self, key, command)
53 dict.__setitem__(self, key, command)
54
54
55 def __getitem__(self, key):
55 def __getitem__(self, key):
56 if isinstance(key, str):
56 if isinstance(key, str):
57 key = ord(key)
57 key = ord(key)
58 return dict.__getitem__(self, key)
58 return dict.__getitem__(self, key)
59
59
60 def __detitem__(self, key):
60 def __detitem__(self, key):
61 if isinstance(key, str):
61 if isinstance(key, str):
62 key = ord(key)
62 key = ord(key)
63 dict.__detitem__(self, key)
63 dict.__detitem__(self, key)
64
64
65 def register(self, command, *keys):
65 def register(self, command, *keys):
66 for key in keys:
66 for key in keys:
67 self[key] = command
67 self[key] = command
68
68
69 def get(self, key, default=None):
69 def get(self, key, default=None):
70 if isinstance(key, str):
70 if isinstance(key, str):
71 key = ord(key)
71 key = ord(key)
72 return dict.get(self, key, default)
72 return dict.get(self, key, default)
73
73
74 def findkey(self, command, default=ipipe.noitem):
74 def findkey(self, command, default=ipipe.noitem):
75 for (key, commandcandidate) in self.iteritems():
75 for (key, commandcandidate) in self.iteritems():
76 if commandcandidate == command:
76 if commandcandidate == command:
77 return key
77 return key
78 if default is ipipe.noitem:
78 if default is ipipe.noitem:
79 raise KeyError(command)
79 raise KeyError(command)
80 return default
80 return default
81
81
82
82
83 class _BrowserCachedItem(object):
83 class _BrowserCachedItem(object):
84 # This is used internally by ``ibrowse`` to store a item together with its
84 # This is used internally by ``ibrowse`` to store a item together with its
85 # marked status.
85 # marked status.
86 __slots__ = ("item", "marked")
86 __slots__ = ("item", "marked")
87
87
88 def __init__(self, item):
88 def __init__(self, item):
89 self.item = item
89 self.item = item
90 self.marked = False
90 self.marked = False
91
91
92
92
93 class _BrowserHelp(object):
93 class _BrowserHelp(object):
94 style_header = astyle.Style.fromstr("yellow:black:bold")
94 style_header = astyle.Style.fromstr("yellow:black:bold")
95 # This is used internally by ``ibrowse`` for displaying the help screen.
95 # This is used internally by ``ibrowse`` for displaying the help screen.
96 def __init__(self, browser):
96 def __init__(self, browser):
97 self.browser = browser
97 self.browser = browser
98
98
99 def __xrepr__(self, mode):
99 def __xrepr__(self, mode):
100 yield (-1, True)
100 yield (-1, True)
101 if mode == "header" or mode == "footer":
101 if mode == "header" or mode == "footer":
102 yield (astyle.style_default, "ibrowse help screen")
102 yield (astyle.style_default, "ibrowse help screen")
103 else:
103 else:
104 yield (astyle.style_default, repr(self))
104 yield (astyle.style_default, repr(self))
105
105
106 def __iter__(self):
106 def __iter__(self):
107 # Get reverse key mapping
107 # Get reverse key mapping
108 allkeys = {}
108 allkeys = {}
109 for (key, cmd) in self.browser.keymap.iteritems():
109 for (key, cmd) in self.browser.keymap.iteritems():
110 allkeys.setdefault(cmd, []).append(key)
110 allkeys.setdefault(cmd, []).append(key)
111
111
112 fields = ("key", "description")
112 fields = ("key", "description")
113
113
114 commands = []
114 commands = []
115 for name in dir(self.browser):
115 for name in dir(self.browser):
116 if name.startswith("cmd_"):
116 if name.startswith("cmd_"):
117 command = getattr(self.browser, name)
117 command = getattr(self.browser, name)
118 commands.append((inspect.getsourcelines(command)[-1], name[4:], command))
118 commands.append((inspect.getsourcelines(command)[-1], name[4:], command))
119 commands.sort()
119 commands.sort()
120 commands = [(c[1], c[2]) for c in commands]
120 commands = [(c[1], c[2]) for c in commands]
121 for (i, (name, command)) in enumerate(commands):
121 for (i, (name, command)) in enumerate(commands):
122 if i:
122 if i:
123 yield ipipe.Fields(fields, key="", description="")
123 yield ipipe.Fields(fields, key="", description="")
124
124
125 description = command.__doc__
125 description = command.__doc__
126 if description is None:
126 if description is None:
127 lines = []
127 lines = []
128 else:
128 else:
129 lines = [l.strip() for l in description.splitlines() if l.strip()]
129 lines = [l.strip() for l in description.splitlines() if l.strip()]
130 description = "\n".join(lines)
130 description = "\n".join(lines)
131 lines = textwrap.wrap(description, 60)
131 lines = textwrap.wrap(description, 60)
132 keys = allkeys.get(name, [])
132 keys = allkeys.get(name, [])
133
133
134 yield ipipe.Fields(fields, key="", description=astyle.Text((self.style_header, name)))
134 yield ipipe.Fields(fields, key="", description=astyle.Text((self.style_header, name)))
135 for i in xrange(max(len(keys), len(lines))):
135 for i in xrange(max(len(keys), len(lines))):
136 try:
136 try:
137 key = self.browser.keylabel(keys[i])
137 key = self.browser.keylabel(keys[i])
138 except IndexError:
138 except IndexError:
139 key = ""
139 key = ""
140 try:
140 try:
141 line = lines[i]
141 line = lines[i]
142 except IndexError:
142 except IndexError:
143 line = ""
143 line = ""
144 yield ipipe.Fields(fields, key=key, description=line)
144 yield ipipe.Fields(fields, key=key, description=line)
145
145
146
146
147 class _BrowserLevel(object):
147 class _BrowserLevel(object):
148 # This is used internally to store the state (iterator, fetch items,
148 # This is used internally to store the state (iterator, fetch items,
149 # position of cursor and screen, etc.) of one browser level
149 # position of cursor and screen, etc.) of one browser level
150 # An ``ibrowse`` object keeps multiple ``_BrowserLevel`` objects in
150 # An ``ibrowse`` object keeps multiple ``_BrowserLevel`` objects in
151 # a stack.
151 # a stack.
152 def __init__(self, browser, input, iterator, mainsizey, *attrs):
152 def __init__(self, browser, input, iterator, mainsizey, *attrs):
153 self.browser = browser
153 self.browser = browser
154 self.input = input
154 self.input = input
155 self.header = [x for x in ipipe.xrepr(input, "header") if not isinstance(x[0], int)]
155 self.header = [x for x in ipipe.xrepr(input, "header") if not isinstance(x[0], int)]
156 # iterator for the input
156 # iterator for the input
157 self.iterator = iterator
157 self.iterator = iterator
158
158
159 # is the iterator exhausted?
159 # is the iterator exhausted?
160 self.exhausted = False
160 self.exhausted = False
161
161
162 # attributes to be display (autodetected if empty)
162 # attributes to be display (autodetected if empty)
163 self.attrs = attrs
163 self.attrs = attrs
164
164
165 # fetched items (+ marked flag)
165 # fetched items (+ marked flag)
166 self.items = ipipe.deque()
166 self.items = ipipe.deque()
167
167
168 # Number of marked objects
168 # Number of marked objects
169 self.marked = 0
169 self.marked = 0
170
170
171 # Vertical cursor position
171 # Vertical cursor position
172 self.cury = 0
172 self.cury = 0
173
173
174 # Horizontal cursor position
174 # Horizontal cursor position
175 self.curx = 0
175 self.curx = 0
176
176
177 # Index of first data column
177 # Index of first data column
178 self.datastartx = 0
178 self.datastartx = 0
179
179
180 # Index of first data line
180 # Index of first data line
181 self.datastarty = 0
181 self.datastarty = 0
182
182
183 # height of the data display area
183 # height of the data display area
184 self.mainsizey = mainsizey
184 self.mainsizey = mainsizey
185
185
186 # width of the data display area (changes when scrolling)
186 # width of the data display area (changes when scrolling)
187 self.mainsizex = 0
187 self.mainsizex = 0
188
188
189 # Size of row number (changes when scrolling)
189 # Size of row number (changes when scrolling)
190 self.numbersizex = 0
190 self.numbersizex = 0
191
191
192 # Attributes to display (in this order)
192 # Attributes to display (in this order)
193 self.displayattrs = []
193 self.displayattrs = []
194
194
195 # index and attribute under the cursor
195 # index and attribute under the cursor
196 self.displayattr = (None, ipipe.noitem)
196 self.displayattr = (None, ipipe.noitem)
197
197
198 # Maps attributes to column widths
198 # Maps attributes to column widths
199 self.colwidths = {}
199 self.colwidths = {}
200
200
201 # Set of hidden attributes
201 # Set of hidden attributes
202 self.hiddenattrs = set()
202 self.hiddenattrs = set()
203
203
204 # This takes care of all the caches etc.
204 # This takes care of all the caches etc.
205 self.moveto(0, 0, refresh=True)
205 self.moveto(0, 0, refresh=True)
206
206
207 def fetch(self, count):
207 def fetch(self, count):
208 # Try to fill ``self.items`` with at least ``count`` objects.
208 # Try to fill ``self.items`` with at least ``count`` objects.
209 have = len(self.items)
209 have = len(self.items)
210 while not self.exhausted and have < count:
210 while not self.exhausted and have < count:
211 try:
211 try:
212 item = self.iterator.next()
212 item = self.iterator.next()
213 except StopIteration:
213 except StopIteration:
214 self.exhausted = True
214 self.exhausted = True
215 break
215 break
216 except (KeyboardInterrupt, SystemExit):
216 except (KeyboardInterrupt, SystemExit):
217 raise
217 raise
218 except Exception, exc:
218 except Exception, exc:
219 have += 1
219 have += 1
220 self.items.append(_BrowserCachedItem(exc))
220 self.items.append(_BrowserCachedItem(exc))
221 self.exhausted = True
221 self.exhausted = True
222 break
222 break
223 else:
223 else:
224 have += 1
224 have += 1
225 self.items.append(_BrowserCachedItem(item))
225 self.items.append(_BrowserCachedItem(item))
226
226
227 def calcdisplayattrs(self):
227 def calcdisplayattrs(self):
228 # Calculate which attributes are available from the objects that are
228 # Calculate which attributes are available from the objects that are
229 # currently visible on screen (and store it in ``self.displayattrs``)
229 # currently visible on screen (and store it in ``self.displayattrs``)
230
230
231 attrs = set()
231 attrs = set()
232 self.displayattrs = []
232 self.displayattrs = []
233 if self.attrs:
233 if self.attrs:
234 # If the browser object specifies a fixed list of attributes,
234 # If the browser object specifies a fixed list of attributes,
235 # simply use it (removing hidden attributes).
235 # simply use it (removing hidden attributes).
236 for attr in self.attrs:
236 for attr in self.attrs:
237 attr = ipipe.upgradexattr(attr)
237 attr = ipipe.upgradexattr(attr)
238 if attr not in attrs and attr not in self.hiddenattrs:
238 if attr not in attrs and attr not in self.hiddenattrs:
239 self.displayattrs.append(attr)
239 self.displayattrs.append(attr)
240 attrs.add(attr)
240 attrs.add(attr)
241 else:
241 else:
242 endy = min(self.datastarty+self.mainsizey, len(self.items))
242 endy = min(self.datastarty+self.mainsizey, len(self.items))
243 for i in xrange(self.datastarty, endy):
243 for i in xrange(self.datastarty, endy):
244 for attr in ipipe.xattrs(self.items[i].item, "default"):
244 for attr in ipipe.xattrs(self.items[i].item, "default"):
245 if attr not in attrs and attr not in self.hiddenattrs:
245 if attr not in attrs and attr not in self.hiddenattrs:
246 self.displayattrs.append(attr)
246 self.displayattrs.append(attr)
247 attrs.add(attr)
247 attrs.add(attr)
248
248
249 def getrow(self, i):
249 def getrow(self, i):
250 # Return a dictionary with the attributes for the object
250 # Return a dictionary with the attributes for the object
251 # ``self.items[i]``. Attribute names are taken from
251 # ``self.items[i]``. Attribute names are taken from
252 # ``self.displayattrs`` so ``calcdisplayattrs()`` must have been
252 # ``self.displayattrs`` so ``calcdisplayattrs()`` must have been
253 # called before.
253 # called before.
254 row = {}
254 row = {}
255 item = self.items[i].item
255 item = self.items[i].item
256 for attr in self.displayattrs:
256 for attr in self.displayattrs:
257 try:
257 try:
258 value = attr.value(item)
258 value = attr.value(item)
259 except (KeyboardInterrupt, SystemExit):
259 except (KeyboardInterrupt, SystemExit):
260 raise
260 raise
261 except Exception, exc:
261 except Exception, exc:
262 value = exc
262 value = exc
263 # only store attribute if it exists (or we got an exception)
263 # only store attribute if it exists (or we got an exception)
264 if value is not ipipe.noitem:
264 if value is not ipipe.noitem:
265 # remember alignment, length and colored text
265 # remember alignment, length and colored text
266 row[attr] = ipipe.xformat(value, "cell", self.browser.maxattrlength)
266 row[attr] = ipipe.xformat(value, "cell", self.browser.maxattrlength)
267 return row
267 return row
268
268
269 def calcwidths(self):
269 def calcwidths(self):
270 # Recalculate the displayed fields and their widths.
270 # Recalculate the displayed fields and their widths.
271 # ``calcdisplayattrs()'' must have been called and the cache
271 # ``calcdisplayattrs()'' must have been called and the cache
272 # for attributes of the objects on screen (``self.displayrows``)
272 # for attributes of the objects on screen (``self.displayrows``)
273 # must have been filled. This sets ``self.colwidths`` which maps
273 # must have been filled. This sets ``self.colwidths`` which maps
274 # attribute descriptors to widths.
274 # attribute descriptors to widths.
275 self.colwidths = {}
275 self.colwidths = {}
276 for row in self.displayrows:
276 for row in self.displayrows:
277 for attr in self.displayattrs:
277 for attr in self.displayattrs:
278 try:
278 try:
279 length = row[attr][1]
279 length = row[attr][1]
280 except KeyError:
280 except KeyError:
281 length = 0
281 length = 0
282 # always add attribute to colwidths, even if it doesn't exist
282 # always add attribute to colwidths, even if it doesn't exist
283 if attr not in self.colwidths:
283 if attr not in self.colwidths:
284 self.colwidths[attr] = len(attr.name())
284 self.colwidths[attr] = len(attr.name())
285 newwidth = max(self.colwidths[attr], length)
285 newwidth = max(self.colwidths[attr], length)
286 self.colwidths[attr] = newwidth
286 self.colwidths[attr] = newwidth
287
287
288 # How many characters do we need to paint the largest item number?
288 # How many characters do we need to paint the largest item number?
289 self.numbersizex = len(str(self.datastarty+self.mainsizey-1))
289 self.numbersizex = len(str(self.datastarty+self.mainsizey-1))
290 # How must space have we got to display data?
290 # How must space have we got to display data?
291 self.mainsizex = self.browser.scrsizex-self.numbersizex-3
291 self.mainsizex = self.browser.scrsizex-self.numbersizex-3
292 # width of all columns
292 # width of all columns
293 self.datasizex = sum(self.colwidths.itervalues()) + len(self.colwidths)
293 self.datasizex = sum(self.colwidths.itervalues()) + len(self.colwidths)
294
294
295 def calcdisplayattr(self):
295 def calcdisplayattr(self):
296 # Find out which attribute the cursor is on and store this
296 # Find out which attribute the cursor is on and store this
297 # information in ``self.displayattr``.
297 # information in ``self.displayattr``.
298 pos = 0
298 pos = 0
299 for (i, attr) in enumerate(self.displayattrs):
299 for (i, attr) in enumerate(self.displayattrs):
300 if pos+self.colwidths[attr] >= self.curx:
300 if pos+self.colwidths[attr] >= self.curx:
301 self.displayattr = (i, attr)
301 self.displayattr = (i, attr)
302 break
302 break
303 pos += self.colwidths[attr]+1
303 pos += self.colwidths[attr]+1
304 else:
304 else:
305 self.displayattr = (None, ipipe.noitem)
305 self.displayattr = (None, ipipe.noitem)
306
306
307 def moveto(self, x, y, refresh=False):
307 def moveto(self, x, y, refresh=False):
308 # Move the cursor to the position ``(x,y)`` (in data coordinates,
308 # Move the cursor to the position ``(x,y)`` (in data coordinates,
309 # not in screen coordinates). If ``refresh`` is true, all cached
309 # not in screen coordinates). If ``refresh`` is true, all cached
310 # values will be recalculated (e.g. because the list has been
310 # values will be recalculated (e.g. because the list has been
311 # resorted, so screen positions etc. are no longer valid).
311 # resorted, so screen positions etc. are no longer valid).
312 olddatastarty = self.datastarty
312 olddatastarty = self.datastarty
313 oldx = self.curx
313 oldx = self.curx
314 oldy = self.cury
314 oldy = self.cury
315 x = int(x+0.5)
315 x = int(x+0.5)
316 y = int(y+0.5)
316 y = int(y+0.5)
317 newx = x # remember where we wanted to move
317 newx = x # remember where we wanted to move
318 newy = y # remember where we wanted to move
318 newy = y # remember where we wanted to move
319
319
320 scrollbordery = min(self.browser.scrollbordery, self.mainsizey//2)
320 scrollbordery = min(self.browser.scrollbordery, self.mainsizey//2)
321 scrollborderx = min(self.browser.scrollborderx, self.mainsizex//2)
321 scrollborderx = min(self.browser.scrollborderx, self.mainsizex//2)
322
322
323 # Make sure that the cursor didn't leave the main area vertically
323 # Make sure that the cursor didn't leave the main area vertically
324 if y < 0:
324 if y < 0:
325 y = 0
325 y = 0
326 # try to get enough items to fill the screen
326 # try to get enough items to fill the screen
327 self.fetch(max(y+scrollbordery+1, self.mainsizey))
327 self.fetch(max(y+scrollbordery+1, self.mainsizey))
328 if y >= len(self.items):
328 if y >= len(self.items):
329 y = max(0, len(self.items)-1)
329 y = max(0, len(self.items)-1)
330
330
331 # Make sure that the cursor stays on screen vertically
331 # Make sure that the cursor stays on screen vertically
332 if y < self.datastarty+scrollbordery:
332 if y < self.datastarty+scrollbordery:
333 self.datastarty = max(0, y-scrollbordery)
333 self.datastarty = max(0, y-scrollbordery)
334 elif y >= self.datastarty+self.mainsizey-scrollbordery:
334 elif y >= self.datastarty+self.mainsizey-scrollbordery:
335 self.datastarty = max(0, min(y-self.mainsizey+scrollbordery+1,
335 self.datastarty = max(0, min(y-self.mainsizey+scrollbordery+1,
336 len(self.items)-self.mainsizey))
336 len(self.items)-self.mainsizey))
337
337
338 if refresh: # Do we need to refresh the complete display?
338 if refresh: # Do we need to refresh the complete display?
339 self.calcdisplayattrs()
339 self.calcdisplayattrs()
340 endy = min(self.datastarty+self.mainsizey, len(self.items))
340 endy = min(self.datastarty+self.mainsizey, len(self.items))
341 self.displayrows = map(self.getrow, xrange(self.datastarty, endy))
341 self.displayrows = map(self.getrow, xrange(self.datastarty, endy))
342 self.calcwidths()
342 self.calcwidths()
343 # Did we scroll vertically => update displayrows
343 # Did we scroll vertically => update displayrows
344 # and various other attributes
344 # and various other attributes
345 elif self.datastarty != olddatastarty:
345 elif self.datastarty != olddatastarty:
346 # Recalculate which attributes we have to display
346 # Recalculate which attributes we have to display
347 olddisplayattrs = self.displayattrs
347 olddisplayattrs = self.displayattrs
348 self.calcdisplayattrs()
348 self.calcdisplayattrs()
349 # If there are new attributes, recreate the cache
349 # If there are new attributes, recreate the cache
350 if self.displayattrs != olddisplayattrs:
350 if self.displayattrs != olddisplayattrs:
351 endy = min(self.datastarty+self.mainsizey, len(self.items))
351 endy = min(self.datastarty+self.mainsizey, len(self.items))
352 self.displayrows = map(self.getrow, xrange(self.datastarty, endy))
352 self.displayrows = map(self.getrow, xrange(self.datastarty, endy))
353 elif self.datastarty<olddatastarty: # we did scroll up
353 elif self.datastarty<olddatastarty: # we did scroll up
354 # drop rows from the end
354 # drop rows from the end
355 del self.displayrows[self.datastarty-olddatastarty:]
355 del self.displayrows[self.datastarty-olddatastarty:]
356 # fetch new items
356 # fetch new items
357 for i in xrange(min(olddatastarty, self.datastarty+self.mainsizey)-1,
357 for i in xrange(min(olddatastarty, self.datastarty+self.mainsizey)-1,
358 self.datastarty-1, -1):
358 self.datastarty-1, -1):
359 try:
359 try:
360 row = self.getrow(i)
360 row = self.getrow(i)
361 except IndexError:
361 except IndexError:
362 # we didn't have enough objects to fill the screen
362 # we didn't have enough objects to fill the screen
363 break
363 break
364 self.displayrows.insert(0, row)
364 self.displayrows.insert(0, row)
365 else: # we did scroll down
365 else: # we did scroll down
366 # drop rows from the start
366 # drop rows from the start
367 del self.displayrows[:self.datastarty-olddatastarty]
367 del self.displayrows[:self.datastarty-olddatastarty]
368 # fetch new items
368 # fetch new items
369 for i in xrange(max(olddatastarty+self.mainsizey, self.datastarty),
369 for i in xrange(max(olddatastarty+self.mainsizey, self.datastarty),
370 self.datastarty+self.mainsizey):
370 self.datastarty+self.mainsizey):
371 try:
371 try:
372 row = self.getrow(i)
372 row = self.getrow(i)
373 except IndexError:
373 except IndexError:
374 # we didn't have enough objects to fill the screen
374 # we didn't have enough objects to fill the screen
375 break
375 break
376 self.displayrows.append(row)
376 self.displayrows.append(row)
377 self.calcwidths()
377 self.calcwidths()
378
378
379 # Make sure that the cursor didn't leave the data area horizontally
379 # Make sure that the cursor didn't leave the data area horizontally
380 if x < 0:
380 if x < 0:
381 x = 0
381 x = 0
382 elif x >= self.datasizex:
382 elif x >= self.datasizex:
383 x = max(0, self.datasizex-1)
383 x = max(0, self.datasizex-1)
384
384
385 # Make sure that the cursor stays on screen horizontally
385 # Make sure that the cursor stays on screen horizontally
386 if x < self.datastartx+scrollborderx:
386 if x < self.datastartx+scrollborderx:
387 self.datastartx = max(0, x-scrollborderx)
387 self.datastartx = max(0, x-scrollborderx)
388 elif x >= self.datastartx+self.mainsizex-scrollborderx:
388 elif x >= self.datastartx+self.mainsizex-scrollborderx:
389 self.datastartx = max(0, min(x-self.mainsizex+scrollborderx+1,
389 self.datastartx = max(0, min(x-self.mainsizex+scrollborderx+1,
390 self.datasizex-self.mainsizex))
390 self.datasizex-self.mainsizex))
391
391
392 if x == oldx and y == oldy and (x != newx or y != newy): # couldn't move
392 if x == oldx and y == oldy and (x != newx or y != newy): # couldn't move
393 self.browser.beep()
393 self.browser.beep()
394 else:
394 else:
395 self.curx = x
395 self.curx = x
396 self.cury = y
396 self.cury = y
397 self.calcdisplayattr()
397 self.calcdisplayattr()
398
398
399 def sort(self, key, reverse=False):
399 def sort(self, key, reverse=False):
400 """
400 """
401 Sort the currently list of items using the key function ``key``. If
401 Sort the currently list of items using the key function ``key``. If
402 ``reverse`` is true the sort order is reversed.
402 ``reverse`` is true the sort order is reversed.
403 """
403 """
404 curitem = self.items[self.cury] # Remember where the cursor is now
404 curitem = self.items[self.cury] # Remember where the cursor is now
405
405
406 # Sort items
406 # Sort items
407 def realkey(item):
407 def realkey(item):
408 return key(item.item)
408 return key(item.item)
409 self.items = ipipe.deque(sorted(self.items, key=realkey, reverse=reverse))
409 self.items = ipipe.deque(sorted(self.items, key=realkey, reverse=reverse))
410
410
411 # Find out where the object under the cursor went
411 # Find out where the object under the cursor went
412 cury = self.cury
412 cury = self.cury
413 for (i, item) in enumerate(self.items):
413 for (i, item) in enumerate(self.items):
414 if item is curitem:
414 if item is curitem:
415 cury = i
415 cury = i
416 break
416 break
417
417
418 self.moveto(self.curx, cury, refresh=True)
418 self.moveto(self.curx, cury, refresh=True)
419
419
420
420
421 class _CommandInput(object):
421 class _CommandInput(object):
422 keymap = Keymap()
422 keymap = Keymap()
423 keymap.register("left", curses.KEY_LEFT)
423 keymap.register("left", curses.KEY_LEFT)
424 keymap.register("right", curses.KEY_RIGHT)
424 keymap.register("right", curses.KEY_RIGHT)
425 keymap.register("home", curses.KEY_HOME, "\x01") # Ctrl-A
425 keymap.register("home", curses.KEY_HOME, "\x01") # Ctrl-A
426 keymap.register("end", curses.KEY_END, "\x05") # Ctrl-E
426 keymap.register("end", curses.KEY_END, "\x05") # Ctrl-E
427 # FIXME: What's happening here?
427 # FIXME: What's happening here?
428 keymap.register("backspace", curses.KEY_BACKSPACE, "\x08\x7f")
428 keymap.register("backspace", curses.KEY_BACKSPACE, "\x08\x7f")
429 keymap.register("delete", curses.KEY_DC)
429 keymap.register("delete", curses.KEY_DC)
430 keymap.register("delend", 0x0b) # Ctrl-K
430 keymap.register("delend", 0x0b) # Ctrl-K
431 keymap.register("execute", "\r\n")
431 keymap.register("execute", "\r\n")
432 keymap.register("up", curses.KEY_UP)
432 keymap.register("up", curses.KEY_UP)
433 keymap.register("down", curses.KEY_DOWN)
433 keymap.register("down", curses.KEY_DOWN)
434 keymap.register("incsearchup", curses.KEY_PPAGE)
434 keymap.register("incsearchup", curses.KEY_PPAGE)
435 keymap.register("incsearchdown", curses.KEY_NPAGE)
435 keymap.register("incsearchdown", curses.KEY_NPAGE)
436 keymap.register("exit", "\x18"), # Ctrl-X
436 keymap.register("exit", "\x18"), # Ctrl-X
437
437
438 def __init__(self, prompt):
438 def __init__(self, prompt):
439 self.prompt = prompt
439 self.prompt = prompt
440 self.history = []
440 self.history = []
441 self.maxhistory = 100
441 self.maxhistory = 100
442 self.input = ""
442 self.input = ""
443 self.curx = 0
443 self.curx = 0
444 self.cury = -1 # blank line
444 self.cury = -1 # blank line
445
445
446 def start(self):
446 def start(self):
447 self.input = ""
447 self.input = ""
448 self.curx = 0
448 self.curx = 0
449 self.cury = -1 # blank line
449 self.cury = -1 # blank line
450
450
451 def handlekey(self, browser, key):
451 def handlekey(self, browser, key):
452 cmdname = self.keymap.get(key, None)
452 cmdname = self.keymap.get(key, None)
453 if cmdname is not None:
453 if cmdname is not None:
454 cmdfunc = getattr(self, "cmd_%s" % cmdname, None)
454 cmdfunc = getattr(self, "cmd_%s" % cmdname, None)
455 if cmdfunc is not None:
455 if cmdfunc is not None:
456 return cmdfunc(browser)
456 return cmdfunc(browser)
457 curses.beep()
457 curses.beep()
458 elif key != -1:
458 elif key != -1:
459 try:
459 try:
460 char = chr(key)
460 char = chr(key)
461 except ValueError:
461 except ValueError:
462 curses.beep()
462 curses.beep()
463 else:
463 else:
464 return self.handlechar(browser, char)
464 return self.handlechar(browser, char)
465
465
466 def handlechar(self, browser, char):
466 def handlechar(self, browser, char):
467 self.input = self.input[:self.curx] + char + self.input[self.curx:]
467 self.input = self.input[:self.curx] + char + self.input[self.curx:]
468 self.curx += 1
468 self.curx += 1
469 return True
469 return True
470
470
471 def dohistory(self):
471 def dohistory(self):
472 self.history.insert(0, self.input)
472 self.history.insert(0, self.input)
473 del self.history[:-self.maxhistory]
473 del self.history[:-self.maxhistory]
474
474
475 def cmd_backspace(self, browser):
475 def cmd_backspace(self, browser):
476 if self.curx:
476 if self.curx:
477 self.input = self.input[:self.curx-1] + self.input[self.curx:]
477 self.input = self.input[:self.curx-1] + self.input[self.curx:]
478 self.curx -= 1
478 self.curx -= 1
479 return True
479 return True
480 else:
480 else:
481 curses.beep()
481 curses.beep()
482
482
483 def cmd_delete(self, browser):
483 def cmd_delete(self, browser):
484 if self.curx<len(self.input):
484 if self.curx<len(self.input):
485 self.input = self.input[:self.curx] + self.input[self.curx+1:]
485 self.input = self.input[:self.curx] + self.input[self.curx+1:]
486 return True
486 return True
487 else:
487 else:
488 curses.beep()
488 curses.beep()
489
489
490 def cmd_delend(self, browser):
490 def cmd_delend(self, browser):
491 if self.curx<len(self.input):
491 if self.curx<len(self.input):
492 self.input = self.input[:self.curx]
492 self.input = self.input[:self.curx]
493 return True
493 return True
494
494
495 def cmd_left(self, browser):
495 def cmd_left(self, browser):
496 if self.curx:
496 if self.curx:
497 self.curx -= 1
497 self.curx -= 1
498 return True
498 return True
499 else:
499 else:
500 curses.beep()
500 curses.beep()
501
501
502 def cmd_right(self, browser):
502 def cmd_right(self, browser):
503 if self.curx < len(self.input):
503 if self.curx < len(self.input):
504 self.curx += 1
504 self.curx += 1
505 return True
505 return True
506 else:
506 else:
507 curses.beep()
507 curses.beep()
508
508
509 def cmd_home(self, browser):
509 def cmd_home(self, browser):
510 if self.curx:
510 if self.curx:
511 self.curx = 0
511 self.curx = 0
512 return True
512 return True
513 else:
513 else:
514 curses.beep()
514 curses.beep()
515
515
516 def cmd_end(self, browser):
516 def cmd_end(self, browser):
517 if self.curx < len(self.input):
517 if self.curx < len(self.input):
518 self.curx = len(self.input)
518 self.curx = len(self.input)
519 return True
519 return True
520 else:
520 else:
521 curses.beep()
521 curses.beep()
522
522
523 def cmd_up(self, browser):
523 def cmd_up(self, browser):
524 if self.cury < len(self.history)-1:
524 if self.cury < len(self.history)-1:
525 self.cury += 1
525 self.cury += 1
526 self.input = self.history[self.cury]
526 self.input = self.history[self.cury]
527 self.curx = len(self.input)
527 self.curx = len(self.input)
528 return True
528 return True
529 else:
529 else:
530 curses.beep()
530 curses.beep()
531
531
532 def cmd_down(self, browser):
532 def cmd_down(self, browser):
533 if self.cury >= 0:
533 if self.cury >= 0:
534 self.cury -= 1
534 self.cury -= 1
535 if self.cury>=0:
535 if self.cury>=0:
536 self.input = self.history[self.cury]
536 self.input = self.history[self.cury]
537 else:
537 else:
538 self.input = ""
538 self.input = ""
539 self.curx = len(self.input)
539 self.curx = len(self.input)
540 return True
540 return True
541 else:
541 else:
542 curses.beep()
542 curses.beep()
543
543
544 def cmd_incsearchup(self, browser):
544 def cmd_incsearchup(self, browser):
545 prefix = self.input[:self.curx]
545 prefix = self.input[:self.curx]
546 cury = self.cury
546 cury = self.cury
547 while True:
547 while True:
548 cury += 1
548 cury += 1
549 if cury >= len(self.history):
549 if cury >= len(self.history):
550 break
550 break
551 if self.history[cury].startswith(prefix):
551 if self.history[cury].startswith(prefix):
552 self.input = self.history[cury]
552 self.input = self.history[cury]
553 self.cury = cury
553 self.cury = cury
554 return True
554 return True
555 curses.beep()
555 curses.beep()
556
556
557 def cmd_incsearchdown(self, browser):
557 def cmd_incsearchdown(self, browser):
558 prefix = self.input[:self.curx]
558 prefix = self.input[:self.curx]
559 cury = self.cury
559 cury = self.cury
560 while True:
560 while True:
561 cury -= 1
561 cury -= 1
562 if cury <= 0:
562 if cury <= 0:
563 break
563 break
564 if self.history[cury].startswith(prefix):
564 if self.history[cury].startswith(prefix):
565 self.input = self.history[self.cury]
565 self.input = self.history[self.cury]
566 self.cury = cury
566 self.cury = cury
567 return True
567 return True
568 curses.beep()
568 curses.beep()
569
569
570 def cmd_exit(self, browser):
570 def cmd_exit(self, browser):
571 browser.mode = "default"
571 browser.mode = "default"
572 return True
572 return True
573
573
574 def cmd_execute(self, browser):
574 def cmd_execute(self, browser):
575 raise NotImplementedError
575 raise NotImplementedError
576
576
577
577
578 class _CommandGoto(_CommandInput):
578 class _CommandGoto(_CommandInput):
579 def __init__(self):
579 def __init__(self):
580 _CommandInput.__init__(self, "goto object #")
580 _CommandInput.__init__(self, "goto object #")
581
581
582 def handlechar(self, browser, char):
582 def handlechar(self, browser, char):
583 # Only accept digits
583 # Only accept digits
584 if not "0" <= char <= "9":
584 if not "0" <= char <= "9":
585 curses.beep()
585 curses.beep()
586 else:
586 else:
587 return _CommandInput.handlechar(self, browser, char)
587 return _CommandInput.handlechar(self, browser, char)
588
588
589 def cmd_execute(self, browser):
589 def cmd_execute(self, browser):
590 level = browser.levels[-1]
590 level = browser.levels[-1]
591 if self.input:
591 if self.input:
592 self.dohistory()
592 self.dohistory()
593 level.moveto(level.curx, int(self.input))
593 level.moveto(level.curx, int(self.input))
594 browser.mode = "default"
594 browser.mode = "default"
595 return True
595 return True
596
596
597
597
598 class _CommandFind(_CommandInput):
598 class _CommandFind(_CommandInput):
599 def __init__(self):
599 def __init__(self):
600 _CommandInput.__init__(self, "find expression")
600 _CommandInput.__init__(self, "find expression")
601
601
602 def cmd_execute(self, browser):
602 def cmd_execute(self, browser):
603 level = browser.levels[-1]
603 level = browser.levels[-1]
604 if self.input:
604 if self.input:
605 self.dohistory()
605 self.dohistory()
606 while True:
606 while True:
607 cury = level.cury
607 cury = level.cury
608 level.moveto(level.curx, cury+1)
608 level.moveto(level.curx, cury+1)
609 if cury == level.cury:
609 if cury == level.cury:
610 curses.beep()
610 curses.beep()
611 break # hit end
611 break # hit end
612 item = level.items[level.cury].item
612 item = level.items[level.cury].item
613 try:
613 try:
614 globals = ipipe.getglobals(None)
614 globals = ipipe.getglobals(None)
615 if eval(self.input, globals, ipipe.AttrNamespace(item)):
615 if eval(self.input, globals, ipipe.AttrNamespace(item)):
616 break # found something
616 break # found something
617 except (KeyboardInterrupt, SystemExit):
617 except (KeyboardInterrupt, SystemExit):
618 raise
618 raise
619 except Exception, exc:
619 except Exception, exc:
620 browser.report(exc)
620 browser.report(exc)
621 curses.beep()
621 curses.beep()
622 break # break on error
622 break # break on error
623 browser.mode = "default"
623 browser.mode = "default"
624 return True
624 return True
625
625
626
626
627 class _CommandFindBackwards(_CommandInput):
627 class _CommandFindBackwards(_CommandInput):
628 def __init__(self):
628 def __init__(self):
629 _CommandInput.__init__(self, "find backwards expression")
629 _CommandInput.__init__(self, "find backwards expression")
630
630
631 def cmd_execute(self, browser):
631 def cmd_execute(self, browser):
632 level = browser.levels[-1]
632 level = browser.levels[-1]
633 if self.input:
633 if self.input:
634 self.dohistory()
634 self.dohistory()
635 while level.cury:
635 while level.cury:
636 level.moveto(level.curx, level.cury-1)
636 level.moveto(level.curx, level.cury-1)
637 item = level.items[level.cury].item
637 item = level.items[level.cury].item
638 try:
638 try:
639 globals = ipipe.getglobals(None)
639 globals = ipipe.getglobals(None)
640 if eval(self.input, globals, ipipe.AttrNamespace(item)):
640 if eval(self.input, globals, ipipe.AttrNamespace(item)):
641 break # found something
641 break # found something
642 except (KeyboardInterrupt, SystemExit):
642 except (KeyboardInterrupt, SystemExit):
643 raise
643 raise
644 except Exception, exc:
644 except Exception, exc:
645 browser.report(exc)
645 browser.report(exc)
646 curses.beep()
646 curses.beep()
647 break # break on error
647 break # break on error
648 else:
648 else:
649 curses.beep()
649 curses.beep()
650 browser.mode = "default"
650 browser.mode = "default"
651 return True
651 return True
652
652
653
653
654 class ibrowse(ipipe.Display):
654 class ibrowse(ipipe.Display):
655 # Show this many lines from the previous screen when paging horizontally
655 # Show this many lines from the previous screen when paging horizontally
656 pageoverlapx = 1
656 pageoverlapx = 1
657
657
658 # Show this many lines from the previous screen when paging vertically
658 # Show this many lines from the previous screen when paging vertically
659 pageoverlapy = 1
659 pageoverlapy = 1
660
660
661 # Start scrolling when the cursor is less than this number of columns
661 # Start scrolling when the cursor is less than this number of columns
662 # away from the left or right screen edge
662 # away from the left or right screen edge
663 scrollborderx = 10
663 scrollborderx = 10
664
664
665 # Start scrolling when the cursor is less than this number of lines
665 # Start scrolling when the cursor is less than this number of lines
666 # away from the top or bottom screen edge
666 # away from the top or bottom screen edge
667 scrollbordery = 5
667 scrollbordery = 5
668
668
669 # Accelerate by this factor when scrolling horizontally
669 # Accelerate by this factor when scrolling horizontally
670 acceleratex = 1.05
670 acceleratex = 1.05
671
671
672 # Accelerate by this factor when scrolling vertically
672 # Accelerate by this factor when scrolling vertically
673 acceleratey = 1.05
673 acceleratey = 1.05
674
674
675 # The maximum horizontal scroll speed
675 # The maximum horizontal scroll speed
676 # (as a factor of the screen width (i.e. 0.5 == half a screen width)
676 # (as a factor of the screen width (i.e. 0.5 == half a screen width)
677 maxspeedx = 0.5
677 maxspeedx = 0.5
678
678
679 # The maximum vertical scroll speed
679 # The maximum vertical scroll speed
680 # (as a factor of the screen height (i.e. 0.5 == half a screen height)
680 # (as a factor of the screen height (i.e. 0.5 == half a screen height)
681 maxspeedy = 0.5
681 maxspeedy = 0.5
682
682
683 # The maximum number of header lines for browser level
683 # The maximum number of header lines for browser level
684 # if the nesting is deeper, only the innermost levels are displayed
684 # if the nesting is deeper, only the innermost levels are displayed
685 maxheaders = 5
685 maxheaders = 5
686
686
687 # The approximate maximum length of a column entry
687 # The approximate maximum length of a column entry
688 maxattrlength = 200
688 maxattrlength = 200
689
689
690 # Styles for various parts of the GUI
690 # Styles for various parts of the GUI
691 style_objheadertext = astyle.Style.fromstr("white:black:bold|reverse")
691 style_objheadertext = astyle.Style.fromstr("white:black:bold|reverse")
692 style_objheadernumber = astyle.Style.fromstr("white:blue:bold|reverse")
692 style_objheadernumber = astyle.Style.fromstr("white:blue:bold|reverse")
693 style_objheaderobject = astyle.Style.fromstr("white:black:reverse")
693 style_objheaderobject = astyle.Style.fromstr("white:black:reverse")
694 style_colheader = astyle.Style.fromstr("blue:white:reverse")
694 style_colheader = astyle.Style.fromstr("blue:white:reverse")
695 style_colheaderhere = astyle.Style.fromstr("green:black:bold|reverse")
695 style_colheaderhere = astyle.Style.fromstr("green:black:bold|reverse")
696 style_colheadersep = astyle.Style.fromstr("blue:black:reverse")
696 style_colheadersep = astyle.Style.fromstr("blue:black:reverse")
697 style_number = astyle.Style.fromstr("blue:white:reverse")
697 style_number = astyle.Style.fromstr("blue:white:reverse")
698 style_numberhere = astyle.Style.fromstr("green:black:bold|reverse")
698 style_numberhere = astyle.Style.fromstr("green:black:bold|reverse")
699 style_sep = astyle.Style.fromstr("blue:black")
699 style_sep = astyle.Style.fromstr("blue:black")
700 style_data = astyle.Style.fromstr("white:black")
700 style_data = astyle.Style.fromstr("white:black")
701 style_datapad = astyle.Style.fromstr("blue:black:bold")
701 style_datapad = astyle.Style.fromstr("blue:black:bold")
702 style_footer = astyle.Style.fromstr("black:white")
702 style_footer = astyle.Style.fromstr("black:white")
703 style_report = astyle.Style.fromstr("white:black")
703 style_report = astyle.Style.fromstr("white:black")
704
704
705 # Column separator in header
705 # Column separator in header
706 headersepchar = "|"
706 headersepchar = "|"
707
707
708 # Character for padding data cell entries
708 # Character for padding data cell entries
709 datapadchar = "."
709 datapadchar = "."
710
710
711 # Column separator in data area
711 # Column separator in data area
712 datasepchar = "|"
712 datasepchar = "|"
713
713
714 # Character to use for "empty" cell (i.e. for non-existing attributes)
714 # Character to use for "empty" cell (i.e. for non-existing attributes)
715 nodatachar = "-"
715 nodatachar = "-"
716
716
717 # Prompts for modes that require keyboard input
717 # Prompts for modes that require keyboard input
718 prompts = {
718 prompts = {
719 "goto": _CommandGoto(),
719 "goto": _CommandGoto(),
720 "find": _CommandFind(),
720 "find": _CommandFind(),
721 "findbackwards": _CommandFindBackwards()
721 "findbackwards": _CommandFindBackwards()
722 }
722 }
723
723
724 # Maps curses key codes to "function" names
724 # Maps curses key codes to "function" names
725 keymap = Keymap()
725 keymap = Keymap()
726 keymap.register("quit", "q")
726 keymap.register("quit", "q")
727 keymap.register("up", curses.KEY_UP)
727 keymap.register("up", curses.KEY_UP)
728 keymap.register("down", curses.KEY_DOWN)
728 keymap.register("down", curses.KEY_DOWN)
729 keymap.register("pageup", curses.KEY_PPAGE)
729 keymap.register("pageup", curses.KEY_PPAGE)
730 keymap.register("pagedown", curses.KEY_NPAGE)
730 keymap.register("pagedown", curses.KEY_NPAGE)
731 keymap.register("left", curses.KEY_LEFT)
731 keymap.register("left", curses.KEY_LEFT)
732 keymap.register("right", curses.KEY_RIGHT)
732 keymap.register("right", curses.KEY_RIGHT)
733 keymap.register("home", curses.KEY_HOME, "\x01")
733 keymap.register("home", curses.KEY_HOME, "\x01")
734 keymap.register("end", curses.KEY_END, "\x05")
734 keymap.register("end", curses.KEY_END, "\x05")
735 keymap.register("prevattr", "<\x1b")
735 keymap.register("prevattr", "<\x1b")
736 keymap.register("nextattr", ">\t")
736 keymap.register("nextattr", ">\t")
737 keymap.register("pick", "p")
737 keymap.register("pick", "p")
738 keymap.register("pickattr", "P")
738 keymap.register("pickattr", "P")
739 keymap.register("pickallattrs", "C")
739 keymap.register("pickallattrs", "C")
740 keymap.register("pickmarked", "m")
740 keymap.register("pickmarked", "m")
741 keymap.register("pickmarkedattr", "M")
741 keymap.register("pickmarkedattr", "M")
742 keymap.register("hideattr", "h")
742 keymap.register("hideattr", "h")
743 keymap.register("unhideattrs", "H")
743 keymap.register("unhideattrs", "H")
744 keymap.register("help", "?")
744 keymap.register("help", "?")
745 keymap.register("enter", "eenterdefault", "\r\n")
745 keymap.register("enter", "\r\n")
746 keymap.register("enterattr", "E")
746 keymap.register("enterattr", "E")
747 # FIXME: What's happening here?
747 # FIXME: What's happening here?
748 keymap.register("leave", curses.KEY_BACKSPACE, "x\x08\x7f")
748 keymap.register("leave", curses.KEY_BACKSPACE, "x\x08\x7f")
749 keymap.register("detail", "d")
749 keymap.register("detail", "d")
750 keymap.register("detailattr", "D")
750 keymap.register("detailattr", "D")
751 keymap.register("tooglemark", " ")
751 keymap.register("tooglemark", " ")
752 keymap.register("markrange", "r")
752 keymap.register("markrange", "r")
753 keymap.register("sortattrasc", "v")
753 keymap.register("sortattrasc", "v")
754 keymap.register("sortattrdesc", "V")
754 keymap.register("sortattrdesc", "V")
755 keymap.register("goto", "g")
755 keymap.register("goto", "g")
756 keymap.register("find", "f")
756 keymap.register("find", "f")
757 keymap.register("findbackwards", "b")
757 keymap.register("findbackwards", "b")
758
758
759 def __init__(self, *attrs):
759 def __init__(self, *attrs):
760 """
760 """
761 Create a new browser. If ``attrs`` is not empty, it is the list
761 Create a new browser. If ``attrs`` is not empty, it is the list
762 of attributes that will be displayed in the browser, otherwise
762 of attributes that will be displayed in the browser, otherwise
763 these will be determined by the objects on screen.
763 these will be determined by the objects on screen.
764 """
764 """
765 self.attrs = attrs
765 self.attrs = attrs
766
766
767 # Stack of browser levels
767 # Stack of browser levels
768 self.levels = []
768 self.levels = []
769 # how many colums to scroll (Changes when accelerating)
769 # how many colums to scroll (Changes when accelerating)
770 self.stepx = 1.
770 self.stepx = 1.
771
771
772 # how many rows to scroll (Changes when accelerating)
772 # how many rows to scroll (Changes when accelerating)
773 self.stepy = 1.
773 self.stepy = 1.
774
774
775 # Beep on the edges of the data area? (Will be set to ``False``
775 # Beep on the edges of the data area? (Will be set to ``False``
776 # once the cursor hits the edge of the screen, so we don't get
776 # once the cursor hits the edge of the screen, so we don't get
777 # multiple beeps).
777 # multiple beeps).
778 self._dobeep = True
778 self._dobeep = True
779
779
780 # Cache for registered ``curses`` colors and styles.
780 # Cache for registered ``curses`` colors and styles.
781 self._styles = {}
781 self._styles = {}
782 self._colors = {}
782 self._colors = {}
783 self._maxcolor = 1
783 self._maxcolor = 1
784
784
785 # How many header lines do we want to paint (the numbers of levels
785 # How many header lines do we want to paint (the numbers of levels
786 # we have, but with an upper bound)
786 # we have, but with an upper bound)
787 self._headerlines = 1
787 self._headerlines = 1
788
788
789 # Index of first header line
789 # Index of first header line
790 self._firstheaderline = 0
790 self._firstheaderline = 0
791
791
792 # curses window
792 # curses window
793 self.scr = None
793 self.scr = None
794 # report in the footer line (error, executed command etc.)
794 # report in the footer line (error, executed command etc.)
795 self._report = None
795 self._report = None
796
796
797 # value to be returned to the caller (set by commands)
797 # value to be returned to the caller (set by commands)
798 self.returnvalue = None
798 self.returnvalue = None
799
799
800 # The mode the browser is in
800 # The mode the browser is in
801 # e.g. normal browsing or entering an argument for a command
801 # e.g. normal browsing or entering an argument for a command
802 self.mode = "default"
802 self.mode = "default"
803
803
804 # set by the SIGWINCH signal handler
804 # set by the SIGWINCH signal handler
805 self.resized = False
805 self.resized = False
806
806
807 def nextstepx(self, step):
807 def nextstepx(self, step):
808 """
808 """
809 Accelerate horizontally.
809 Accelerate horizontally.
810 """
810 """
811 return max(1., min(step*self.acceleratex,
811 return max(1., min(step*self.acceleratex,
812 self.maxspeedx*self.levels[-1].mainsizex))
812 self.maxspeedx*self.levels[-1].mainsizex))
813
813
814 def nextstepy(self, step):
814 def nextstepy(self, step):
815 """
815 """
816 Accelerate vertically.
816 Accelerate vertically.
817 """
817 """
818 return max(1., min(step*self.acceleratey,
818 return max(1., min(step*self.acceleratey,
819 self.maxspeedy*self.levels[-1].mainsizey))
819 self.maxspeedy*self.levels[-1].mainsizey))
820
820
821 def getstyle(self, style):
821 def getstyle(self, style):
822 """
822 """
823 Register the ``style`` with ``curses`` or get it from the cache,
823 Register the ``style`` with ``curses`` or get it from the cache,
824 if it has been registered before.
824 if it has been registered before.
825 """
825 """
826 try:
826 try:
827 return self._styles[style.fg, style.bg, style.attrs]
827 return self._styles[style.fg, style.bg, style.attrs]
828 except KeyError:
828 except KeyError:
829 attrs = 0
829 attrs = 0
830 for b in astyle.A2CURSES:
830 for b in astyle.A2CURSES:
831 if style.attrs & b:
831 if style.attrs & b:
832 attrs |= astyle.A2CURSES[b]
832 attrs |= astyle.A2CURSES[b]
833 try:
833 try:
834 color = self._colors[style.fg, style.bg]
834 color = self._colors[style.fg, style.bg]
835 except KeyError:
835 except KeyError:
836 curses.init_pair(
836 curses.init_pair(
837 self._maxcolor,
837 self._maxcolor,
838 astyle.COLOR2CURSES[style.fg],
838 astyle.COLOR2CURSES[style.fg],
839 astyle.COLOR2CURSES[style.bg]
839 astyle.COLOR2CURSES[style.bg]
840 )
840 )
841 color = curses.color_pair(self._maxcolor)
841 color = curses.color_pair(self._maxcolor)
842 self._colors[style.fg, style.bg] = color
842 self._colors[style.fg, style.bg] = color
843 self._maxcolor += 1
843 self._maxcolor += 1
844 c = color | attrs
844 c = color | attrs
845 self._styles[style.fg, style.bg, style.attrs] = c
845 self._styles[style.fg, style.bg, style.attrs] = c
846 return c
846 return c
847
847
848 def addstr(self, y, x, begx, endx, text, style):
848 def addstr(self, y, x, begx, endx, text, style):
849 """
849 """
850 A version of ``curses.addstr()`` that can handle ``x`` coordinates
850 A version of ``curses.addstr()`` that can handle ``x`` coordinates
851 that are outside the screen.
851 that are outside the screen.
852 """
852 """
853 text2 = text[max(0, begx-x):max(0, endx-x)]
853 text2 = text[max(0, begx-x):max(0, endx-x)]
854 if text2:
854 if text2:
855 self.scr.addstr(y, max(x, begx), text2, self.getstyle(style))
855 self.scr.addstr(y, max(x, begx), text2, self.getstyle(style))
856 return len(text)
856 return len(text)
857
857
858 def addchr(self, y, x, begx, endx, c, l, style):
858 def addchr(self, y, x, begx, endx, c, l, style):
859 x0 = max(x, begx)
859 x0 = max(x, begx)
860 x1 = min(x+l, endx)
860 x1 = min(x+l, endx)
861 if x1>x0:
861 if x1>x0:
862 self.scr.addstr(y, x0, c*(x1-x0), self.getstyle(style))
862 self.scr.addstr(y, x0, c*(x1-x0), self.getstyle(style))
863 return l
863 return l
864
864
865 def _calcheaderlines(self, levels):
865 def _calcheaderlines(self, levels):
866 # Calculate how many headerlines do we have to display, if we have
866 # Calculate how many headerlines do we have to display, if we have
867 # ``levels`` browser levels
867 # ``levels`` browser levels
868 if levels is None:
868 if levels is None:
869 levels = len(self.levels)
869 levels = len(self.levels)
870 self._headerlines = min(self.maxheaders, levels)
870 self._headerlines = min(self.maxheaders, levels)
871 self._firstheaderline = levels-self._headerlines
871 self._firstheaderline = levels-self._headerlines
872
872
873 def getstylehere(self, style):
873 def getstylehere(self, style):
874 """
874 """
875 Return a style for displaying the original style ``style``
875 Return a style for displaying the original style ``style``
876 in the row the cursor is on.
876 in the row the cursor is on.
877 """
877 """
878 return astyle.Style(style.fg, astyle.COLOR_BLUE, style.attrs | astyle.A_BOLD)
878 return astyle.Style(style.fg, astyle.COLOR_BLUE, style.attrs | astyle.A_BOLD)
879
879
880 def report(self, msg):
880 def report(self, msg):
881 """
881 """
882 Store the message ``msg`` for display below the footer line. This
882 Store the message ``msg`` for display below the footer line. This
883 will be displayed as soon as the screen is redrawn.
883 will be displayed as soon as the screen is redrawn.
884 """
884 """
885 self._report = msg
885 self._report = msg
886
886
887 def enter(self, item, *attrs):
887 def enter(self, item, *attrs):
888 """
888 """
889 Enter the object ``item``. If ``attrs`` is specified, it will be used
889 Enter the object ``item``. If ``attrs`` is specified, it will be used
890 as a fixed list of attributes to display.
890 as a fixed list of attributes to display.
891 """
891 """
892 try:
892 try:
893 iterator = ipipe.xiter(item)
893 iterator = ipipe.xiter(item)
894 except (KeyboardInterrupt, SystemExit):
894 except (KeyboardInterrupt, SystemExit):
895 raise
895 raise
896 except Exception, exc:
896 except Exception, exc:
897 curses.beep()
897 curses.beep()
898 self.report(exc)
898 self.report(exc)
899 else:
899 else:
900 self._calcheaderlines(len(self.levels)+1)
900 self._calcheaderlines(len(self.levels)+1)
901 level = _BrowserLevel(
901 level = _BrowserLevel(
902 self,
902 self,
903 item,
903 item,
904 iterator,
904 iterator,
905 self.scrsizey-1-self._headerlines-2,
905 self.scrsizey-1-self._headerlines-2,
906 *attrs
906 *attrs
907 )
907 )
908 self.levels.append(level)
908 self.levels.append(level)
909
909
910 def startkeyboardinput(self, mode):
910 def startkeyboardinput(self, mode):
911 """
911 """
912 Enter mode ``mode``, which requires keyboard input.
912 Enter mode ``mode``, which requires keyboard input.
913 """
913 """
914 self.mode = mode
914 self.mode = mode
915 self.prompts[mode].start()
915 self.prompts[mode].start()
916
916
917 def keylabel(self, keycode):
917 def keylabel(self, keycode):
918 """
918 """
919 Return a pretty name for the ``curses`` key ``keycode`` (used in the
919 Return a pretty name for the ``curses`` key ``keycode`` (used in the
920 help screen and in reports about unassigned keys).
920 help screen and in reports about unassigned keys).
921 """
921 """
922 if keycode <= 0xff:
922 if keycode <= 0xff:
923 specialsnames = {
923 specialsnames = {
924 ord("\n"): "RETURN",
924 ord("\n"): "RETURN",
925 ord(" "): "SPACE",
925 ord(" "): "SPACE",
926 ord("\t"): "TAB",
926 ord("\t"): "TAB",
927 ord("\x7f"): "DELETE",
927 ord("\x7f"): "DELETE",
928 ord("\x08"): "BACKSPACE",
928 ord("\x08"): "BACKSPACE",
929 }
929 }
930 if keycode in specialsnames:
930 if keycode in specialsnames:
931 return specialsnames[keycode]
931 return specialsnames[keycode]
932 elif 0x00 < keycode < 0x20:
932 elif 0x00 < keycode < 0x20:
933 return "CTRL-%s" % chr(keycode + 64)
933 return "CTRL-%s" % chr(keycode + 64)
934 return repr(chr(keycode))
934 return repr(chr(keycode))
935 for name in dir(curses):
935 for name in dir(curses):
936 if name.startswith("KEY_") and getattr(curses, name) == keycode:
936 if name.startswith("KEY_") and getattr(curses, name) == keycode:
937 return name
937 return name
938 return str(keycode)
938 return str(keycode)
939
939
940 def beep(self, force=False):
940 def beep(self, force=False):
941 if force or self._dobeep:
941 if force or self._dobeep:
942 curses.beep()
942 curses.beep()
943 # don't beep again (as long as the same key is pressed)
943 # don't beep again (as long as the same key is pressed)
944 self._dobeep = False
944 self._dobeep = False
945
945
946 def cmd_up(self):
946 def cmd_up(self):
947 """
947 """
948 Move the cursor to the previous row.
948 Move the cursor to the previous row.
949 """
949 """
950 level = self.levels[-1]
950 level = self.levels[-1]
951 self.report("up")
951 self.report("up")
952 level.moveto(level.curx, level.cury-self.stepy)
952 level.moveto(level.curx, level.cury-self.stepy)
953
953
954 def cmd_down(self):
954 def cmd_down(self):
955 """
955 """
956 Move the cursor to the next row.
956 Move the cursor to the next row.
957 """
957 """
958 level = self.levels[-1]
958 level = self.levels[-1]
959 self.report("down")
959 self.report("down")
960 level.moveto(level.curx, level.cury+self.stepy)
960 level.moveto(level.curx, level.cury+self.stepy)
961
961
962 def cmd_pageup(self):
962 def cmd_pageup(self):
963 """
963 """
964 Move the cursor up one page.
964 Move the cursor up one page.
965 """
965 """
966 level = self.levels[-1]
966 level = self.levels[-1]
967 self.report("page up")
967 self.report("page up")
968 level.moveto(level.curx, level.cury-level.mainsizey+self.pageoverlapy)
968 level.moveto(level.curx, level.cury-level.mainsizey+self.pageoverlapy)
969
969
970 def cmd_pagedown(self):
970 def cmd_pagedown(self):
971 """
971 """
972 Move the cursor down one page.
972 Move the cursor down one page.
973 """
973 """
974 level = self.levels[-1]
974 level = self.levels[-1]
975 self.report("page down")
975 self.report("page down")
976 level.moveto(level.curx, level.cury+level.mainsizey-self.pageoverlapy)
976 level.moveto(level.curx, level.cury+level.mainsizey-self.pageoverlapy)
977
977
978 def cmd_left(self):
978 def cmd_left(self):
979 """
979 """
980 Move the cursor left.
980 Move the cursor left.
981 """
981 """
982 level = self.levels[-1]
982 level = self.levels[-1]
983 self.report("left")
983 self.report("left")
984 level.moveto(level.curx-self.stepx, level.cury)
984 level.moveto(level.curx-self.stepx, level.cury)
985
985
986 def cmd_right(self):
986 def cmd_right(self):
987 """
987 """
988 Move the cursor right.
988 Move the cursor right.
989 """
989 """
990 level = self.levels[-1]
990 level = self.levels[-1]
991 self.report("right")
991 self.report("right")
992 level.moveto(level.curx+self.stepx, level.cury)
992 level.moveto(level.curx+self.stepx, level.cury)
993
993
994 def cmd_home(self):
994 def cmd_home(self):
995 """
995 """
996 Move the cursor to the first column.
996 Move the cursor to the first column.
997 """
997 """
998 level = self.levels[-1]
998 level = self.levels[-1]
999 self.report("home")
999 self.report("home")
1000 level.moveto(0, level.cury)
1000 level.moveto(0, level.cury)
1001
1001
1002 def cmd_end(self):
1002 def cmd_end(self):
1003 """
1003 """
1004 Move the cursor to the last column.
1004 Move the cursor to the last column.
1005 """
1005 """
1006 level = self.levels[-1]
1006 level = self.levels[-1]
1007 self.report("end")
1007 self.report("end")
1008 level.moveto(level.datasizex+level.mainsizey-self.pageoverlapx, level.cury)
1008 level.moveto(level.datasizex+level.mainsizey-self.pageoverlapx, level.cury)
1009
1009
1010 def cmd_prevattr(self):
1010 def cmd_prevattr(self):
1011 """
1011 """
1012 Move the cursor one attribute column to the left.
1012 Move the cursor one attribute column to the left.
1013 """
1013 """
1014 level = self.levels[-1]
1014 level = self.levels[-1]
1015 if level.displayattr[0] is None or level.displayattr[0] == 0:
1015 if level.displayattr[0] is None or level.displayattr[0] == 0:
1016 self.beep()
1016 self.beep()
1017 else:
1017 else:
1018 self.report("prevattr")
1018 self.report("prevattr")
1019 pos = 0
1019 pos = 0
1020 for (i, attrname) in enumerate(level.displayattrs):
1020 for (i, attrname) in enumerate(level.displayattrs):
1021 if i == level.displayattr[0]-1:
1021 if i == level.displayattr[0]-1:
1022 break
1022 break
1023 pos += level.colwidths[attrname] + 1
1023 pos += level.colwidths[attrname] + 1
1024 level.moveto(pos, level.cury)
1024 level.moveto(pos, level.cury)
1025
1025
1026 def cmd_nextattr(self):
1026 def cmd_nextattr(self):
1027 """
1027 """
1028 Move the cursor one attribute column to the right.
1028 Move the cursor one attribute column to the right.
1029 """
1029 """
1030 level = self.levels[-1]
1030 level = self.levels[-1]
1031 if level.displayattr[0] is None or level.displayattr[0] == len(level.displayattrs)-1:
1031 if level.displayattr[0] is None or level.displayattr[0] == len(level.displayattrs)-1:
1032 self.beep()
1032 self.beep()
1033 else:
1033 else:
1034 self.report("nextattr")
1034 self.report("nextattr")
1035 pos = 0
1035 pos = 0
1036 for (i, attrname) in enumerate(level.displayattrs):
1036 for (i, attrname) in enumerate(level.displayattrs):
1037 if i == level.displayattr[0]+1:
1037 if i == level.displayattr[0]+1:
1038 break
1038 break
1039 pos += level.colwidths[attrname] + 1
1039 pos += level.colwidths[attrname] + 1
1040 level.moveto(pos, level.cury)
1040 level.moveto(pos, level.cury)
1041
1041
1042 def cmd_pick(self):
1042 def cmd_pick(self):
1043 """
1043 """
1044 'Pick' the object under the cursor (i.e. the row the cursor is on).
1044 'Pick' the object under the cursor (i.e. the row the cursor is on).
1045 This leaves the browser and returns the picked object to the caller.
1045 This leaves the browser and returns the picked object to the caller.
1046 (In IPython this object will be available as the ``_`` variable.)
1046 (In IPython this object will be available as the ``_`` variable.)
1047 """
1047 """
1048 level = self.levels[-1]
1048 level = self.levels[-1]
1049 self.returnvalue = level.items[level.cury].item
1049 self.returnvalue = level.items[level.cury].item
1050 return True
1050 return True
1051
1051
1052 def cmd_pickattr(self):
1052 def cmd_pickattr(self):
1053 """
1053 """
1054 'Pick' the attribute under the cursor (i.e. the row/column the
1054 'Pick' the attribute under the cursor (i.e. the row/column the
1055 cursor is on).
1055 cursor is on).
1056 """
1056 """
1057 level = self.levels[-1]
1057 level = self.levels[-1]
1058 attr = level.displayattr[1]
1058 attr = level.displayattr[1]
1059 if attr is ipipe.noitem:
1059 if attr is ipipe.noitem:
1060 curses.beep()
1060 curses.beep()
1061 self.report(CommandError("no column under cursor"))
1061 self.report(CommandError("no column under cursor"))
1062 return
1062 return
1063 value = attr.value(level.items[level.cury].item)
1063 value = attr.value(level.items[level.cury].item)
1064 if value is ipipe.noitem:
1064 if value is ipipe.noitem:
1065 curses.beep()
1065 curses.beep()
1066 self.report(AttributeError(attr.name()))
1066 self.report(AttributeError(attr.name()))
1067 else:
1067 else:
1068 self.returnvalue = value
1068 self.returnvalue = value
1069 return True
1069 return True
1070
1070
1071 def cmd_pickallattrs(self):
1071 def cmd_pickallattrs(self):
1072 """
1072 """
1073 Pick' the complete column under the cursor (i.e. the attribute under
1073 Pick' the complete column under the cursor (i.e. the attribute under
1074 the cursor) from all currently fetched objects. These attributes
1074 the cursor) from all currently fetched objects. These attributes
1075 will be returned as a list.
1075 will be returned as a list.
1076 """
1076 """
1077 level = self.levels[-1]
1077 level = self.levels[-1]
1078 attr = level.displayattr[1]
1078 attr = level.displayattr[1]
1079 if attr is ipipe.noitem:
1079 if attr is ipipe.noitem:
1080 curses.beep()
1080 curses.beep()
1081 self.report(CommandError("no column under cursor"))
1081 self.report(CommandError("no column under cursor"))
1082 return
1082 return
1083 result = []
1083 result = []
1084 for cache in level.items:
1084 for cache in level.items:
1085 value = attr.value(cache.item)
1085 value = attr.value(cache.item)
1086 if value is not ipipe.noitem:
1086 if value is not ipipe.noitem:
1087 result.append(value)
1087 result.append(value)
1088 self.returnvalue = result
1088 self.returnvalue = result
1089 return True
1089 return True
1090
1090
1091 def cmd_pickmarked(self):
1091 def cmd_pickmarked(self):
1092 """
1092 """
1093 'Pick' marked objects. Marked objects will be returned as a list.
1093 'Pick' marked objects. Marked objects will be returned as a list.
1094 """
1094 """
1095 level = self.levels[-1]
1095 level = self.levels[-1]
1096 self.returnvalue = [cache.item for cache in level.items if cache.marked]
1096 self.returnvalue = [cache.item for cache in level.items if cache.marked]
1097 return True
1097 return True
1098
1098
1099 def cmd_pickmarkedattr(self):
1099 def cmd_pickmarkedattr(self):
1100 """
1100 """
1101 'Pick' the attribute under the cursor from all marked objects
1101 'Pick' the attribute under the cursor from all marked objects
1102 (This returns a list).
1102 (This returns a list).
1103 """
1103 """
1104
1104
1105 level = self.levels[-1]
1105 level = self.levels[-1]
1106 attr = level.displayattr[1]
1106 attr = level.displayattr[1]
1107 if attr is ipipe.noitem:
1107 if attr is ipipe.noitem:
1108 curses.beep()
1108 curses.beep()
1109 self.report(CommandError("no column under cursor"))
1109 self.report(CommandError("no column under cursor"))
1110 return
1110 return
1111 result = []
1111 result = []
1112 for cache in level.items:
1112 for cache in level.items:
1113 if cache.marked:
1113 if cache.marked:
1114 value = attr.value(cache.item)
1114 value = attr.value(cache.item)
1115 if value is not ipipe.noitem:
1115 if value is not ipipe.noitem:
1116 result.append(value)
1116 result.append(value)
1117 self.returnvalue = result
1117 self.returnvalue = result
1118 return True
1118 return True
1119
1119
1120 def cmd_markrange(self):
1120 def cmd_markrange(self):
1121 """
1121 """
1122 Mark all objects from the last marked object before the current cursor
1122 Mark all objects from the last marked object before the current cursor
1123 position to the cursor position.
1123 position to the cursor position.
1124 """
1124 """
1125 level = self.levels[-1]
1125 level = self.levels[-1]
1126 self.report("markrange")
1126 self.report("markrange")
1127 start = None
1127 start = None
1128 if level.items:
1128 if level.items:
1129 for i in xrange(level.cury, -1, -1):
1129 for i in xrange(level.cury, -1, -1):
1130 if level.items[i].marked:
1130 if level.items[i].marked:
1131 start = i
1131 start = i
1132 break
1132 break
1133 if start is None:
1133 if start is None:
1134 self.report(CommandError("no mark before cursor"))
1134 self.report(CommandError("no mark before cursor"))
1135 curses.beep()
1135 curses.beep()
1136 else:
1136 else:
1137 for i in xrange(start, level.cury+1):
1137 for i in xrange(start, level.cury+1):
1138 cache = level.items[i]
1138 cache = level.items[i]
1139 if not cache.marked:
1139 if not cache.marked:
1140 cache.marked = True
1140 cache.marked = True
1141 level.marked += 1
1141 level.marked += 1
1142
1142
1143 def cmd_enter(self):
1143 def cmd_enter(self):
1144 """
1144 """
1145 Enter the object under the cursor. (what this mean depends on the object
1145 Enter the object under the cursor. (what this mean depends on the object
1146 itself (i.e. how it implements iteration). This opens a new browser 'level'.
1146 itself (i.e. how it implements iteration). This opens a new browser 'level'.
1147 """
1147 """
1148 level = self.levels[-1]
1148 level = self.levels[-1]
1149 try:
1149 try:
1150 item = level.items[level.cury].item
1150 item = level.items[level.cury].item
1151 except IndexError:
1151 except IndexError:
1152 self.report(CommandError("No object"))
1152 self.report(CommandError("No object"))
1153 curses.beep()
1153 curses.beep()
1154 else:
1154 else:
1155 self.report("entering object...")
1155 self.report("entering object...")
1156 self.enter(item)
1156 self.enter(item)
1157
1157
1158 def cmd_leave(self):
1158 def cmd_leave(self):
1159 """
1159 """
1160 Leave the current browser level and go back to the previous one.
1160 Leave the current browser level and go back to the previous one.
1161 """
1161 """
1162 self.report("leave")
1162 self.report("leave")
1163 if len(self.levels) > 1:
1163 if len(self.levels) > 1:
1164 self._calcheaderlines(len(self.levels)-1)
1164 self._calcheaderlines(len(self.levels)-1)
1165 self.levels.pop(-1)
1165 self.levels.pop(-1)
1166 else:
1166 else:
1167 self.report(CommandError("This is the last level"))
1167 self.report(CommandError("This is the last level"))
1168 curses.beep()
1168 curses.beep()
1169
1169
1170 def cmd_enterattr(self):
1170 def cmd_enterattr(self):
1171 """
1171 """
1172 Enter the attribute under the cursor.
1172 Enter the attribute under the cursor.
1173 """
1173 """
1174 level = self.levels[-1]
1174 level = self.levels[-1]
1175 attr = level.displayattr[1]
1175 attr = level.displayattr[1]
1176 if attr is ipipe.noitem:
1176 if attr is ipipe.noitem:
1177 curses.beep()
1177 curses.beep()
1178 self.report(CommandError("no column under cursor"))
1178 self.report(CommandError("no column under cursor"))
1179 return
1179 return
1180 try:
1180 try:
1181 item = level.items[level.cury].item
1181 item = level.items[level.cury].item
1182 except IndexError:
1182 except IndexError:
1183 self.report(CommandError("No object"))
1183 self.report(CommandError("No object"))
1184 curses.beep()
1184 curses.beep()
1185 else:
1185 else:
1186 value = attr.value(item)
1186 value = attr.value(item)
1187 name = attr.name()
1187 name = attr.name()
1188 if value is ipipe.noitem:
1188 if value is ipipe.noitem:
1189 self.report(AttributeError(name))
1189 self.report(AttributeError(name))
1190 else:
1190 else:
1191 self.report("entering object attribute %s..." % name)
1191 self.report("entering object attribute %s..." % name)
1192 self.enter(value)
1192 self.enter(value)
1193
1193
1194 def cmd_detail(self):
1194 def cmd_detail(self):
1195 """
1195 """
1196 Show a detail view of the object under the cursor. This shows the
1196 Show a detail view of the object under the cursor. This shows the
1197 name, type, doc string and value of the object attributes (and it
1197 name, type, doc string and value of the object attributes (and it
1198 might show more attributes than in the list view, depending on
1198 might show more attributes than in the list view, depending on
1199 the object).
1199 the object).
1200 """
1200 """
1201 level = self.levels[-1]
1201 level = self.levels[-1]
1202 try:
1202 try:
1203 item = level.items[level.cury].item
1203 item = level.items[level.cury].item
1204 except IndexError:
1204 except IndexError:
1205 self.report(CommandError("No object"))
1205 self.report(CommandError("No object"))
1206 curses.beep()
1206 curses.beep()
1207 else:
1207 else:
1208 self.report("entering detail view for object...")
1208 self.report("entering detail view for object...")
1209 attrs = [ipipe.AttributeDetail(item, attr) for attr in ipipe.xattrs(item, "detail")]
1209 attrs = [ipipe.AttributeDetail(item, attr) for attr in ipipe.xattrs(item, "detail")]
1210 self.enter(attrs)
1210 self.enter(attrs)
1211
1211
1212 def cmd_detailattr(self):
1212 def cmd_detailattr(self):
1213 """
1213 """
1214 Show a detail view of the attribute under the cursor.
1214 Show a detail view of the attribute under the cursor.
1215 """
1215 """
1216 level = self.levels[-1]
1216 level = self.levels[-1]
1217 attr = level.displayattr[1]
1217 attr = level.displayattr[1]
1218 if attr is ipipe.noitem:
1218 if attr is ipipe.noitem:
1219 curses.beep()
1219 curses.beep()
1220 self.report(CommandError("no attribute"))
1220 self.report(CommandError("no attribute"))
1221 return
1221 return
1222 try:
1222 try:
1223 item = level.items[level.cury].item
1223 item = level.items[level.cury].item
1224 except IndexError:
1224 except IndexError:
1225 self.report(CommandError("No object"))
1225 self.report(CommandError("No object"))
1226 curses.beep()
1226 curses.beep()
1227 else:
1227 else:
1228 try:
1228 try:
1229 item = attr.value(item)
1229 item = attr.value(item)
1230 except (KeyboardInterrupt, SystemExit):
1230 except (KeyboardInterrupt, SystemExit):
1231 raise
1231 raise
1232 except Exception, exc:
1232 except Exception, exc:
1233 self.report(exc)
1233 self.report(exc)
1234 else:
1234 else:
1235 self.report("entering detail view for attribute %s..." % attr.name())
1235 self.report("entering detail view for attribute %s..." % attr.name())
1236 attrs = [ipipe.AttributeDetail(item, attr) for attr in ipipe.xattrs(item, "detail")]
1236 attrs = [ipipe.AttributeDetail(item, attr) for attr in ipipe.xattrs(item, "detail")]
1237 self.enter(attrs)
1237 self.enter(attrs)
1238
1238
1239 def cmd_tooglemark(self):
1239 def cmd_tooglemark(self):
1240 """
1240 """
1241 Mark/unmark the object under the cursor. Marked objects have a '!'
1241 Mark/unmark the object under the cursor. Marked objects have a '!'
1242 after the row number).
1242 after the row number).
1243 """
1243 """
1244 level = self.levels[-1]
1244 level = self.levels[-1]
1245 self.report("toggle mark")
1245 self.report("toggle mark")
1246 try:
1246 try:
1247 item = level.items[level.cury]
1247 item = level.items[level.cury]
1248 except IndexError: # no items?
1248 except IndexError: # no items?
1249 pass
1249 pass
1250 else:
1250 else:
1251 if item.marked:
1251 if item.marked:
1252 item.marked = False
1252 item.marked = False
1253 level.marked -= 1
1253 level.marked -= 1
1254 else:
1254 else:
1255 item.marked = True
1255 item.marked = True
1256 level.marked += 1
1256 level.marked += 1
1257
1257
1258 def cmd_sortattrasc(self):
1258 def cmd_sortattrasc(self):
1259 """
1259 """
1260 Sort the objects (in ascending order) using the attribute under
1260 Sort the objects (in ascending order) using the attribute under
1261 the cursor as the sort key.
1261 the cursor as the sort key.
1262 """
1262 """
1263 level = self.levels[-1]
1263 level = self.levels[-1]
1264 attr = level.displayattr[1]
1264 attr = level.displayattr[1]
1265 if attr is ipipe.noitem:
1265 if attr is ipipe.noitem:
1266 curses.beep()
1266 curses.beep()
1267 self.report(CommandError("no column under cursor"))
1267 self.report(CommandError("no column under cursor"))
1268 return
1268 return
1269 self.report("sort by %s (ascending)" % attr.name())
1269 self.report("sort by %s (ascending)" % attr.name())
1270 def key(item):
1270 def key(item):
1271 try:
1271 try:
1272 return attr.value(item)
1272 return attr.value(item)
1273 except (KeyboardInterrupt, SystemExit):
1273 except (KeyboardInterrupt, SystemExit):
1274 raise
1274 raise
1275 except Exception:
1275 except Exception:
1276 return None
1276 return None
1277 level.sort(key)
1277 level.sort(key)
1278
1278
1279 def cmd_sortattrdesc(self):
1279 def cmd_sortattrdesc(self):
1280 """
1280 """
1281 Sort the objects (in descending order) using the attribute under
1281 Sort the objects (in descending order) using the attribute under
1282 the cursor as the sort key.
1282 the cursor as the sort key.
1283 """
1283 """
1284 level = self.levels[-1]
1284 level = self.levels[-1]
1285 attr = level.displayattr[1]
1285 attr = level.displayattr[1]
1286 if attr is ipipe.noitem:
1286 if attr is ipipe.noitem:
1287 curses.beep()
1287 curses.beep()
1288 self.report(CommandError("no column under cursor"))
1288 self.report(CommandError("no column under cursor"))
1289 return
1289 return
1290 self.report("sort by %s (descending)" % attr.name())
1290 self.report("sort by %s (descending)" % attr.name())
1291 def key(item):
1291 def key(item):
1292 try:
1292 try:
1293 return attr.value(item)
1293 return attr.value(item)
1294 except (KeyboardInterrupt, SystemExit):
1294 except (KeyboardInterrupt, SystemExit):
1295 raise
1295 raise
1296 except Exception:
1296 except Exception:
1297 return None
1297 return None
1298 level.sort(key, reverse=True)
1298 level.sort(key, reverse=True)
1299
1299
1300 def cmd_hideattr(self):
1300 def cmd_hideattr(self):
1301 """
1301 """
1302 Hide the attribute under the cursor.
1302 Hide the attribute under the cursor.
1303 """
1303 """
1304 level = self.levels[-1]
1304 level = self.levels[-1]
1305 if level.displayattr[0] is None:
1305 if level.displayattr[0] is None:
1306 self.beep()
1306 self.beep()
1307 else:
1307 else:
1308 self.report("hideattr")
1308 self.report("hideattr")
1309 level.hiddenattrs.add(level.displayattr[1])
1309 level.hiddenattrs.add(level.displayattr[1])
1310 level.moveto(level.curx, level.cury, refresh=True)
1310 level.moveto(level.curx, level.cury, refresh=True)
1311
1311
1312 def cmd_unhideattrs(self):
1312 def cmd_unhideattrs(self):
1313 """
1313 """
1314 Make all attributes visible again.
1314 Make all attributes visible again.
1315 """
1315 """
1316 level = self.levels[-1]
1316 level = self.levels[-1]
1317 self.report("unhideattrs")
1317 self.report("unhideattrs")
1318 level.hiddenattrs.clear()
1318 level.hiddenattrs.clear()
1319 level.moveto(level.curx, level.cury, refresh=True)
1319 level.moveto(level.curx, level.cury, refresh=True)
1320
1320
1321 def cmd_goto(self):
1321 def cmd_goto(self):
1322 """
1322 """
1323 Jump to a row. The row number can be entered at the
1323 Jump to a row. The row number can be entered at the
1324 bottom of the screen.
1324 bottom of the screen.
1325 """
1325 """
1326 self.startkeyboardinput("goto")
1326 self.startkeyboardinput("goto")
1327
1327
1328 def cmd_find(self):
1328 def cmd_find(self):
1329 """
1329 """
1330 Search forward for a row. The search condition can be entered at the
1330 Search forward for a row. The search condition can be entered at the
1331 bottom of the screen.
1331 bottom of the screen.
1332 """
1332 """
1333 self.startkeyboardinput("find")
1333 self.startkeyboardinput("find")
1334
1334
1335 def cmd_findbackwards(self):
1335 def cmd_findbackwards(self):
1336 """
1336 """
1337 Search backward for a row. The search condition can be entered at the
1337 Search backward for a row. The search condition can be entered at the
1338 bottom of the screen.
1338 bottom of the screen.
1339 """
1339 """
1340 self.startkeyboardinput("findbackwards")
1340 self.startkeyboardinput("findbackwards")
1341
1341
1342 def cmd_help(self):
1342 def cmd_help(self):
1343 """
1343 """
1344 Opens the help screen as a new browser level, describing keyboard
1344 Opens the help screen as a new browser level, describing keyboard
1345 shortcuts.
1345 shortcuts.
1346 """
1346 """
1347 for level in self.levels:
1347 for level in self.levels:
1348 if isinstance(level.input, _BrowserHelp):
1348 if isinstance(level.input, _BrowserHelp):
1349 curses.beep()
1349 curses.beep()
1350 self.report(CommandError("help already active"))
1350 self.report(CommandError("help already active"))
1351 return
1351 return
1352
1352
1353 self.enter(_BrowserHelp(self))
1353 self.enter(_BrowserHelp(self))
1354
1354
1355 def cmd_quit(self):
1355 def cmd_quit(self):
1356 """
1356 """
1357 Quit the browser and return to the IPython prompt.
1357 Quit the browser and return to the IPython prompt.
1358 """
1358 """
1359 self.returnvalue = None
1359 self.returnvalue = None
1360 return True
1360 return True
1361
1361
1362 def sigwinchhandler(self, signal, frame):
1362 def sigwinchhandler(self, signal, frame):
1363 self.resized = True
1363 self.resized = True
1364
1364
1365 def _dodisplay(self, scr):
1365 def _dodisplay(self, scr):
1366 """
1366 """
1367 This method is the workhorse of the browser. It handles screen
1367 This method is the workhorse of the browser. It handles screen
1368 drawing and the keyboard.
1368 drawing and the keyboard.
1369 """
1369 """
1370 self.scr = scr
1370 self.scr = scr
1371 curses.halfdelay(1)
1371 curses.halfdelay(1)
1372 footery = 2
1372 footery = 2
1373
1373
1374 keys = []
1374 keys = []
1375 for cmd in ("quit", "help"):
1375 for cmd in ("quit", "help"):
1376 key = self.keymap.findkey(cmd, None)
1376 key = self.keymap.findkey(cmd, None)
1377 if key is not None:
1377 if key is not None:
1378 keys.append("%s=%s" % (self.keylabel(key), cmd))
1378 keys.append("%s=%s" % (self.keylabel(key), cmd))
1379 helpmsg = " | %s" % " ".join(keys)
1379 helpmsg = " | %s" % " ".join(keys)
1380
1380
1381 scr.clear()
1381 scr.clear()
1382 msg = "Fetching first batch of objects..."
1382 msg = "Fetching first batch of objects..."
1383 (self.scrsizey, self.scrsizex) = scr.getmaxyx()
1383 (self.scrsizey, self.scrsizex) = scr.getmaxyx()
1384 scr.addstr(self.scrsizey//2, (self.scrsizex-len(msg))//2, msg)
1384 scr.addstr(self.scrsizey//2, (self.scrsizex-len(msg))//2, msg)
1385 scr.refresh()
1385 scr.refresh()
1386
1386
1387 lastc = -1
1387 lastc = -1
1388
1388
1389 self.levels = []
1389 self.levels = []
1390 # enter the first level
1390 # enter the first level
1391 self.enter(self.input, *self.attrs)
1391 self.enter(self.input, *self.attrs)
1392
1392
1393 self._calcheaderlines(None)
1393 self._calcheaderlines(None)
1394
1394
1395 while True:
1395 while True:
1396 level = self.levels[-1]
1396 level = self.levels[-1]
1397 (self.scrsizey, self.scrsizex) = scr.getmaxyx()
1397 (self.scrsizey, self.scrsizex) = scr.getmaxyx()
1398 level.mainsizey = self.scrsizey-1-self._headerlines-footery
1398 level.mainsizey = self.scrsizey-1-self._headerlines-footery
1399
1399
1400 # Paint object header
1400 # Paint object header
1401 for i in xrange(self._firstheaderline, self._firstheaderline+self._headerlines):
1401 for i in xrange(self._firstheaderline, self._firstheaderline+self._headerlines):
1402 lv = self.levels[i]
1402 lv = self.levels[i]
1403 posx = 0
1403 posx = 0
1404 posy = i-self._firstheaderline
1404 posy = i-self._firstheaderline
1405 endx = self.scrsizex
1405 endx = self.scrsizex
1406 if i: # not the first level
1406 if i: # not the first level
1407 msg = " (%d/%d" % (self.levels[i-1].cury, len(self.levels[i-1].items))
1407 msg = " (%d/%d" % (self.levels[i-1].cury, len(self.levels[i-1].items))
1408 if not self.levels[i-1].exhausted:
1408 if not self.levels[i-1].exhausted:
1409 msg += "+"
1409 msg += "+"
1410 msg += ") "
1410 msg += ") "
1411 endx -= len(msg)+1
1411 endx -= len(msg)+1
1412 posx += self.addstr(posy, posx, 0, endx, " ibrowse #%d: " % i, self.style_objheadertext)
1412 posx += self.addstr(posy, posx, 0, endx, " ibrowse #%d: " % i, self.style_objheadertext)
1413 for (style, text) in lv.header:
1413 for (style, text) in lv.header:
1414 posx += self.addstr(posy, posx, 0, endx, text, self.style_objheaderobject)
1414 posx += self.addstr(posy, posx, 0, endx, text, self.style_objheaderobject)
1415 if posx >= endx:
1415 if posx >= endx:
1416 break
1416 break
1417 if i:
1417 if i:
1418 posx += self.addstr(posy, posx, 0, self.scrsizex, msg, self.style_objheadernumber)
1418 posx += self.addstr(posy, posx, 0, self.scrsizex, msg, self.style_objheadernumber)
1419 posx += self.addchr(posy, posx, 0, self.scrsizex, " ", self.scrsizex-posx, self.style_objheadernumber)
1419 posx += self.addchr(posy, posx, 0, self.scrsizex, " ", self.scrsizex-posx, self.style_objheadernumber)
1420
1420
1421 if not level.items:
1421 if not level.items:
1422 self.addchr(self._headerlines, 0, 0, self.scrsizex, " ", self.scrsizex, self.style_colheader)
1422 self.addchr(self._headerlines, 0, 0, self.scrsizex, " ", self.scrsizex, self.style_colheader)
1423 self.addstr(self._headerlines+1, 0, 0, self.scrsizex, " <empty>", astyle.style_error)
1423 self.addstr(self._headerlines+1, 0, 0, self.scrsizex, " <empty>", astyle.style_error)
1424 scr.clrtobot()
1424 scr.clrtobot()
1425 else:
1425 else:
1426 # Paint column headers
1426 # Paint column headers
1427 scr.move(self._headerlines, 0)
1427 scr.move(self._headerlines, 0)
1428 scr.addstr(" %*s " % (level.numbersizex, "#"), self.getstyle(self.style_colheader))
1428 scr.addstr(" %*s " % (level.numbersizex, "#"), self.getstyle(self.style_colheader))
1429 scr.addstr(self.headersepchar, self.getstyle(self.style_colheadersep))
1429 scr.addstr(self.headersepchar, self.getstyle(self.style_colheadersep))
1430 begx = level.numbersizex+3
1430 begx = level.numbersizex+3
1431 posx = begx-level.datastartx
1431 posx = begx-level.datastartx
1432 for attr in level.displayattrs:
1432 for attr in level.displayattrs:
1433 attrname = attr.name()
1433 attrname = attr.name()
1434 cwidth = level.colwidths[attr]
1434 cwidth = level.colwidths[attr]
1435 header = attrname.ljust(cwidth)
1435 header = attrname.ljust(cwidth)
1436 if attr is level.displayattr[1]:
1436 if attr is level.displayattr[1]:
1437 style = self.style_colheaderhere
1437 style = self.style_colheaderhere
1438 else:
1438 else:
1439 style = self.style_colheader
1439 style = self.style_colheader
1440 posx += self.addstr(self._headerlines, posx, begx, self.scrsizex, header, style)
1440 posx += self.addstr(self._headerlines, posx, begx, self.scrsizex, header, style)
1441 posx += self.addstr(self._headerlines, posx, begx, self.scrsizex, self.headersepchar, self.style_colheadersep)
1441 posx += self.addstr(self._headerlines, posx, begx, self.scrsizex, self.headersepchar, self.style_colheadersep)
1442 if posx >= self.scrsizex:
1442 if posx >= self.scrsizex:
1443 break
1443 break
1444 else:
1444 else:
1445 scr.addstr(" "*(self.scrsizex-posx), self.getstyle(self.style_colheader))
1445 scr.addstr(" "*(self.scrsizex-posx), self.getstyle(self.style_colheader))
1446
1446
1447 # Paint rows
1447 # Paint rows
1448 posy = self._headerlines+1+level.datastarty
1448 posy = self._headerlines+1+level.datastarty
1449 for i in xrange(level.datastarty, min(level.datastarty+level.mainsizey, len(level.items))):
1449 for i in xrange(level.datastarty, min(level.datastarty+level.mainsizey, len(level.items))):
1450 cache = level.items[i]
1450 cache = level.items[i]
1451 if i == level.cury:
1451 if i == level.cury:
1452 style = self.style_numberhere
1452 style = self.style_numberhere
1453 else:
1453 else:
1454 style = self.style_number
1454 style = self.style_number
1455
1455
1456 posy = self._headerlines+1+i-level.datastarty
1456 posy = self._headerlines+1+i-level.datastarty
1457 posx = begx-level.datastartx
1457 posx = begx-level.datastartx
1458
1458
1459 scr.move(posy, 0)
1459 scr.move(posy, 0)
1460 scr.addstr(" %*d%s" % (level.numbersizex, i, " !"[cache.marked]), self.getstyle(style))
1460 scr.addstr(" %*d%s" % (level.numbersizex, i, " !"[cache.marked]), self.getstyle(style))
1461 scr.addstr(self.headersepchar, self.getstyle(self.style_sep))
1461 scr.addstr(self.headersepchar, self.getstyle(self.style_sep))
1462
1462
1463 for attrname in level.displayattrs:
1463 for attrname in level.displayattrs:
1464 cwidth = level.colwidths[attrname]
1464 cwidth = level.colwidths[attrname]
1465 try:
1465 try:
1466 (align, length, parts) = level.displayrows[i-level.datastarty][attrname]
1466 (align, length, parts) = level.displayrows[i-level.datastarty][attrname]
1467 except KeyError:
1467 except KeyError:
1468 align = 2
1468 align = 2
1469 style = astyle.style_nodata
1469 style = astyle.style_nodata
1470 if i == level.cury:
1470 if i == level.cury:
1471 style = self.getstylehere(style)
1471 style = self.getstylehere(style)
1472 padstyle = self.style_datapad
1472 padstyle = self.style_datapad
1473 sepstyle = self.style_sep
1473 sepstyle = self.style_sep
1474 if i == level.cury:
1474 if i == level.cury:
1475 padstyle = self.getstylehere(padstyle)
1475 padstyle = self.getstylehere(padstyle)
1476 sepstyle = self.getstylehere(sepstyle)
1476 sepstyle = self.getstylehere(sepstyle)
1477 if align == 2:
1477 if align == 2:
1478 posx += self.addchr(posy, posx, begx, self.scrsizex, self.nodatachar, cwidth, style)
1478 posx += self.addchr(posy, posx, begx, self.scrsizex, self.nodatachar, cwidth, style)
1479 else:
1479 else:
1480 if align == 1:
1480 if align == 1:
1481 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, cwidth-length, padstyle)
1481 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, cwidth-length, padstyle)
1482 elif align == 0:
1482 elif align == 0:
1483 pad1 = (cwidth-length)//2
1483 pad1 = (cwidth-length)//2
1484 pad2 = cwidth-length-len(pad1)
1484 pad2 = cwidth-length-len(pad1)
1485 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, pad1, padstyle)
1485 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, pad1, padstyle)
1486 for (style, text) in parts:
1486 for (style, text) in parts:
1487 if i == level.cury:
1487 if i == level.cury:
1488 style = self.getstylehere(style)
1488 style = self.getstylehere(style)
1489 posx += self.addstr(posy, posx, begx, self.scrsizex, text, style)
1489 posx += self.addstr(posy, posx, begx, self.scrsizex, text, style)
1490 if posx >= self.scrsizex:
1490 if posx >= self.scrsizex:
1491 break
1491 break
1492 if align == -1:
1492 if align == -1:
1493 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, cwidth-length, padstyle)
1493 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, cwidth-length, padstyle)
1494 elif align == 0:
1494 elif align == 0:
1495 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, pad2, padstyle)
1495 posx += self.addchr(posy, posx, begx, self.scrsizex, self.datapadchar, pad2, padstyle)
1496 posx += self.addstr(posy, posx, begx, self.scrsizex, self.datasepchar, sepstyle)
1496 posx += self.addstr(posy, posx, begx, self.scrsizex, self.datasepchar, sepstyle)
1497 else:
1497 else:
1498 scr.clrtoeol()
1498 scr.clrtoeol()
1499
1499
1500 # Add blank row headers for the rest of the screen
1500 # Add blank row headers for the rest of the screen
1501 for posy in xrange(posy+1, self.scrsizey-2):
1501 for posy in xrange(posy+1, self.scrsizey-2):
1502 scr.addstr(posy, 0, " " * (level.numbersizex+2), self.getstyle(self.style_colheader))
1502 scr.addstr(posy, 0, " " * (level.numbersizex+2), self.getstyle(self.style_colheader))
1503 scr.clrtoeol()
1503 scr.clrtoeol()
1504
1504
1505 posy = self.scrsizey-footery
1505 posy = self.scrsizey-footery
1506 # Display footer
1506 # Display footer
1507 scr.addstr(posy, 0, " "*self.scrsizex, self.getstyle(self.style_footer))
1507 scr.addstr(posy, 0, " "*self.scrsizex, self.getstyle(self.style_footer))
1508
1508
1509 if level.exhausted:
1509 if level.exhausted:
1510 flag = ""
1510 flag = ""
1511 else:
1511 else:
1512 flag = "+"
1512 flag = "+"
1513
1513
1514 endx = self.scrsizex-len(helpmsg)-1
1514 endx = self.scrsizex-len(helpmsg)-1
1515 scr.addstr(posy, endx, helpmsg, self.getstyle(self.style_footer))
1515 scr.addstr(posy, endx, helpmsg, self.getstyle(self.style_footer))
1516
1516
1517 posx = 0
1517 posx = 0
1518 msg = " %d%s objects (%d marked): " % (len(level.items), flag, level.marked)
1518 msg = " %d%s objects (%d marked): " % (len(level.items), flag, level.marked)
1519 posx += self.addstr(posy, posx, 0, endx, msg, self.style_footer)
1519 posx += self.addstr(posy, posx, 0, endx, msg, self.style_footer)
1520 try:
1520 try:
1521 item = level.items[level.cury].item
1521 item = level.items[level.cury].item
1522 except IndexError: # empty
1522 except IndexError: # empty
1523 pass
1523 pass
1524 else:
1524 else:
1525 for (nostyle, text) in ipipe.xrepr(item, "footer"):
1525 for (nostyle, text) in ipipe.xrepr(item, "footer"):
1526 if not isinstance(nostyle, int):
1526 if not isinstance(nostyle, int):
1527 posx += self.addstr(posy, posx, 0, endx, text, self.style_footer)
1527 posx += self.addstr(posy, posx, 0, endx, text, self.style_footer)
1528 if posx >= endx:
1528 if posx >= endx:
1529 break
1529 break
1530
1530
1531 attrstyle = [(astyle.style_default, "no attribute")]
1531 attrstyle = [(astyle.style_default, "no attribute")]
1532 attr = level.displayattr[1]
1532 attr = level.displayattr[1]
1533 if attr is not ipipe.noitem and not isinstance(attr, ipipe.SelfDescriptor):
1533 if attr is not ipipe.noitem and not isinstance(attr, ipipe.SelfDescriptor):
1534 posx += self.addstr(posy, posx, 0, endx, " | ", self.style_footer)
1534 posx += self.addstr(posy, posx, 0, endx, " | ", self.style_footer)
1535 posx += self.addstr(posy, posx, 0, endx, attr.name(), self.style_footer)
1535 posx += self.addstr(posy, posx, 0, endx, attr.name(), self.style_footer)
1536 posx += self.addstr(posy, posx, 0, endx, ": ", self.style_footer)
1536 posx += self.addstr(posy, posx, 0, endx, ": ", self.style_footer)
1537 try:
1537 try:
1538 value = attr.value(item)
1538 value = attr.value(item)
1539 except (SystemExit, KeyboardInterrupt):
1539 except (SystemExit, KeyboardInterrupt):
1540 raise
1540 raise
1541 except Exception, exc:
1541 except Exception, exc:
1542 value = exc
1542 value = exc
1543 if value is not ipipe.noitem:
1543 if value is not ipipe.noitem:
1544 attrstyle = ipipe.xrepr(value, "footer")
1544 attrstyle = ipipe.xrepr(value, "footer")
1545 for (nostyle, text) in attrstyle:
1545 for (nostyle, text) in attrstyle:
1546 if not isinstance(nostyle, int):
1546 if not isinstance(nostyle, int):
1547 posx += self.addstr(posy, posx, 0, endx, text, self.style_footer)
1547 posx += self.addstr(posy, posx, 0, endx, text, self.style_footer)
1548 if posx >= endx:
1548 if posx >= endx:
1549 break
1549 break
1550
1550
1551 try:
1551 try:
1552 # Display input prompt
1552 # Display input prompt
1553 if self.mode in self.prompts:
1553 if self.mode in self.prompts:
1554 history = self.prompts[self.mode]
1554 history = self.prompts[self.mode]
1555 posx = 0
1555 posx = 0
1556 posy = self.scrsizey-1
1556 posy = self.scrsizey-1
1557 posx += self.addstr(posy, posx, 0, endx, history.prompt, astyle.style_default)
1557 posx += self.addstr(posy, posx, 0, endx, history.prompt, astyle.style_default)
1558 posx += self.addstr(posy, posx, 0, endx, " [", astyle.style_default)
1558 posx += self.addstr(posy, posx, 0, endx, " [", astyle.style_default)
1559 if history.cury==-1:
1559 if history.cury==-1:
1560 text = "new"
1560 text = "new"
1561 else:
1561 else:
1562 text = str(history.cury+1)
1562 text = str(history.cury+1)
1563 posx += self.addstr(posy, posx, 0, endx, text, astyle.style_type_number)
1563 posx += self.addstr(posy, posx, 0, endx, text, astyle.style_type_number)
1564 if history.history:
1564 if history.history:
1565 posx += self.addstr(posy, posx, 0, endx, "/", astyle.style_default)
1565 posx += self.addstr(posy, posx, 0, endx, "/", astyle.style_default)
1566 posx += self.addstr(posy, posx, 0, endx, str(len(history.history)), astyle.style_type_number)
1566 posx += self.addstr(posy, posx, 0, endx, str(len(history.history)), astyle.style_type_number)
1567 posx += self.addstr(posy, posx, 0, endx, "]: ", astyle.style_default)
1567 posx += self.addstr(posy, posx, 0, endx, "]: ", astyle.style_default)
1568 inputstartx = posx
1568 inputstartx = posx
1569 posx += self.addstr(posy, posx, 0, endx, history.input, astyle.style_default)
1569 posx += self.addstr(posy, posx, 0, endx, history.input, astyle.style_default)
1570 # Display report
1570 # Display report
1571 else:
1571 else:
1572 if self._report is not None:
1572 if self._report is not None:
1573 if isinstance(self._report, Exception):
1573 if isinstance(self._report, Exception):
1574 style = self.getstyle(astyle.style_error)
1574 style = self.getstyle(astyle.style_error)
1575 if self._report.__class__.__module__ == "exceptions":
1575 if self._report.__class__.__module__ == "exceptions":
1576 msg = "%s: %s" % \
1576 msg = "%s: %s" % \
1577 (self._report.__class__.__name__, self._report)
1577 (self._report.__class__.__name__, self._report)
1578 else:
1578 else:
1579 msg = "%s.%s: %s" % \
1579 msg = "%s.%s: %s" % \
1580 (self._report.__class__.__module__,
1580 (self._report.__class__.__module__,
1581 self._report.__class__.__name__, self._report)
1581 self._report.__class__.__name__, self._report)
1582 else:
1582 else:
1583 style = self.getstyle(self.style_report)
1583 style = self.getstyle(self.style_report)
1584 msg = self._report
1584 msg = self._report
1585 scr.addstr(self.scrsizey-1, 0, msg[:self.scrsizex], style)
1585 scr.addstr(self.scrsizey-1, 0, msg[:self.scrsizex], style)
1586 self._report = None
1586 self._report = None
1587 else:
1587 else:
1588 scr.move(self.scrsizey-1, 0)
1588 scr.move(self.scrsizey-1, 0)
1589 except curses.error:
1589 except curses.error:
1590 # Protect against errors from writing to the last line
1590 # Protect against errors from writing to the last line
1591 pass
1591 pass
1592 scr.clrtoeol()
1592 scr.clrtoeol()
1593
1593
1594 # Position cursor
1594 # Position cursor
1595 if self.mode in self.prompts:
1595 if self.mode in self.prompts:
1596 history = self.prompts[self.mode]
1596 history = self.prompts[self.mode]
1597 scr.move(self.scrsizey-1, inputstartx+history.curx)
1597 scr.move(self.scrsizey-1, inputstartx+history.curx)
1598 else:
1598 else:
1599 scr.move(
1599 scr.move(
1600 1+self._headerlines+level.cury-level.datastarty,
1600 1+self._headerlines+level.cury-level.datastarty,
1601 level.numbersizex+3+level.curx-level.datastartx
1601 level.numbersizex+3+level.curx-level.datastartx
1602 )
1602 )
1603 scr.refresh()
1603 scr.refresh()
1604
1604
1605 # Check keyboard
1605 # Check keyboard
1606 while True:
1606 while True:
1607 c = scr.getch()
1607 c = scr.getch()
1608 if self.resized:
1608 if self.resized:
1609 size = fcntl.ioctl(0, tty.TIOCGWINSZ, "12345678")
1609 size = fcntl.ioctl(0, tty.TIOCGWINSZ, "12345678")
1610 size = struct.unpack("4H", size)
1610 size = struct.unpack("4H", size)
1611 oldsize = scr.getmaxyx()
1611 oldsize = scr.getmaxyx()
1612 scr.erase()
1612 scr.erase()
1613 curses.resize_term(size[0], size[1])
1613 curses.resize_term(size[0], size[1])
1614 newsize = scr.getmaxyx()
1614 newsize = scr.getmaxyx()
1615 scr.erase()
1615 scr.erase()
1616 for l in self.levels:
1616 for l in self.levels:
1617 l.mainsizey += newsize[0]-oldsize[0]
1617 l.mainsizey += newsize[0]-oldsize[0]
1618 l.moveto(l.curx, l.cury, refresh=True)
1618 l.moveto(l.curx, l.cury, refresh=True)
1619 scr.refresh()
1619 scr.refresh()
1620 self.resized = False
1620 self.resized = False
1621 break # Redisplay
1621 break # Redisplay
1622 if self.mode in self.prompts:
1622 if self.mode in self.prompts:
1623 if self.prompts[self.mode].handlekey(self, c):
1623 if self.prompts[self.mode].handlekey(self, c):
1624 break # Redisplay
1624 break # Redisplay
1625 else:
1625 else:
1626 # if no key is pressed slow down and beep again
1626 # if no key is pressed slow down and beep again
1627 if c == -1:
1627 if c == -1:
1628 self.stepx = 1.
1628 self.stepx = 1.
1629 self.stepy = 1.
1629 self.stepy = 1.
1630 self._dobeep = True
1630 self._dobeep = True
1631 else:
1631 else:
1632 # if a different key was pressed slow down and beep too
1632 # if a different key was pressed slow down and beep too
1633 if c != lastc:
1633 if c != lastc:
1634 lastc = c
1634 lastc = c
1635 self.stepx = 1.
1635 self.stepx = 1.
1636 self.stepy = 1.
1636 self.stepy = 1.
1637 self._dobeep = True
1637 self._dobeep = True
1638 cmdname = self.keymap.get(c, None)
1638 cmdname = self.keymap.get(c, None)
1639 if cmdname is None:
1639 if cmdname is None:
1640 self.report(
1640 self.report(
1641 UnassignedKeyError("Unassigned key %s" %
1641 UnassignedKeyError("Unassigned key %s" %
1642 self.keylabel(c)))
1642 self.keylabel(c)))
1643 else:
1643 else:
1644 cmdfunc = getattr(self, "cmd_%s" % cmdname, None)
1644 cmdfunc = getattr(self, "cmd_%s" % cmdname, None)
1645 if cmdfunc is None:
1645 if cmdfunc is None:
1646 self.report(
1646 self.report(
1647 UnknownCommandError("Unknown command %r" %
1647 UnknownCommandError("Unknown command %r" %
1648 (cmdname,)))
1648 (cmdname,)))
1649 elif cmdfunc():
1649 elif cmdfunc():
1650 returnvalue = self.returnvalue
1650 returnvalue = self.returnvalue
1651 self.returnvalue = None
1651 self.returnvalue = None
1652 return returnvalue
1652 return returnvalue
1653 self.stepx = self.nextstepx(self.stepx)
1653 self.stepx = self.nextstepx(self.stepx)
1654 self.stepy = self.nextstepy(self.stepy)
1654 self.stepy = self.nextstepy(self.stepy)
1655 curses.flushinp() # get rid of type ahead
1655 curses.flushinp() # get rid of type ahead
1656 break # Redisplay
1656 break # Redisplay
1657 self.scr = None
1657 self.scr = None
1658
1658
1659 def display(self):
1659 def display(self):
1660 if hasattr(curses, "resize_term"):
1660 if hasattr(curses, "resize_term"):
1661 oldhandler = signal.signal(signal.SIGWINCH, self.sigwinchhandler)
1661 oldhandler = signal.signal(signal.SIGWINCH, self.sigwinchhandler)
1662 try:
1662 try:
1663 return curses.wrapper(self._dodisplay)
1663 return curses.wrapper(self._dodisplay)
1664 finally:
1664 finally:
1665 signal.signal(signal.SIGWINCH, oldhandler)
1665 signal.signal(signal.SIGWINCH, oldhandler)
1666 else:
1666 else:
1667 return curses.wrapper(self._dodisplay)
1667 return curses.wrapper(self._dodisplay)
@@ -1,2121 +1,2121 b''
1 # -*- coding: iso-8859-1 -*-
1 # -*- coding: iso-8859-1 -*-
2
2
3 """
3 """
4 ``ipipe`` provides classes to be used in an interactive Python session. Doing a
4 ``ipipe`` provides classes to be used in an interactive Python session. Doing a
5 ``from ipipe import *`` is the preferred way to do this. The name of all
5 ``from ipipe import *`` is the preferred way to do this. The name of all
6 objects imported this way starts with ``i`` to minimize collisions.
6 objects imported this way starts with ``i`` to minimize collisions.
7
7
8 ``ipipe`` supports "pipeline expressions", which is something resembling Unix
8 ``ipipe`` supports "pipeline expressions", which is something resembling Unix
9 pipes. An example is:
9 pipes. An example is:
10
10
11 >>> ienv | isort("key.lower()")
11 >>> ienv | isort("key.lower()")
12
12
13 This gives a listing of all environment variables sorted by name.
13 This gives a listing of all environment variables sorted by name.
14
14
15
15
16 There are three types of objects in a pipeline expression:
16 There are three types of objects in a pipeline expression:
17
17
18 * ``Table``s: These objects produce items. Examples are ``ils`` (listing the
18 * ``Table``s: These objects produce items. Examples are ``ils`` (listing the
19 current directory, ``ienv`` (listing environment variables), ``ipwd`` (listing
19 current directory, ``ienv`` (listing environment variables), ``ipwd`` (listing
20 user accounts) and ``igrp`` (listing user groups). A ``Table`` must be the
20 user accounts) and ``igrp`` (listing user groups). A ``Table`` must be the
21 first object in a pipe expression.
21 first object in a pipe expression.
22
22
23 * ``Pipe``s: These objects sit in the middle of a pipe expression. They
23 * ``Pipe``s: These objects sit in the middle of a pipe expression. They
24 transform the input in some way (e.g. filtering or sorting it). Examples are:
24 transform the input in some way (e.g. filtering or sorting it). Examples are:
25 ``ifilter`` (which filters the input pipe), ``isort`` (which sorts the input
25 ``ifilter`` (which filters the input pipe), ``isort`` (which sorts the input
26 pipe) and ``ieval`` (which evaluates a function or expression for each object
26 pipe) and ``ieval`` (which evaluates a function or expression for each object
27 in the input pipe).
27 in the input pipe).
28
28
29 * ``Display``s: These objects can be put as the last object in a pipeline
29 * ``Display``s: These objects can be put as the last object in a pipeline
30 expression. There are responsible for displaying the result of the pipeline
30 expression. There are responsible for displaying the result of the pipeline
31 expression. If a pipeline expression doesn't end in a display object a default
31 expression. If a pipeline expression doesn't end in a display object a default
32 display objects will be used. One example is ``ibrowse`` which is a ``curses``
32 display objects will be used. One example is ``ibrowse`` which is a ``curses``
33 based browser.
33 based browser.
34
34
35
35
36 Adding support for pipeline expressions to your own objects can be done through
36 Adding support for pipeline expressions to your own objects can be done through
37 three extensions points (all of them optional):
37 three extensions points (all of them optional):
38
38
39 * An object that will be displayed as a row by a ``Display`` object should
39 * An object that will be displayed as a row by a ``Display`` object should
40 implement the method ``__xattrs__(self, mode)`` method or register an
40 implement the method ``__xattrs__(self, mode)`` method or register an
41 implementation of the generic function ``xattrs``. For more info see ``xattrs``.
41 implementation of the generic function ``xattrs``. For more info see ``xattrs``.
42
42
43 * When an object ``foo`` is displayed by a ``Display`` object, the generic
43 * When an object ``foo`` is displayed by a ``Display`` object, the generic
44 function ``xrepr`` is used.
44 function ``xrepr`` is used.
45
45
46 * Objects that can be iterated by ``Pipe``s must iterable. For special cases,
46 * Objects that can be iterated by ``Pipe``s must iterable. For special cases,
47 where iteration for display is different than the normal iteration a special
47 where iteration for display is different than the normal iteration a special
48 implementation can be registered with the generic function ``xiter``. This makes
48 implementation can be registered with the generic function ``xiter``. This makes
49 it possible to use dictionaries and modules in pipeline expressions, for example:
49 it possible to use dictionaries and modules in pipeline expressions, for example:
50
50
51 >>> import sys
51 >>> import sys
52 >>> sys | ifilter("isinstance(value, int)") | idump
52 >>> sys | ifilter("isinstance(value, int)") | idump
53 key |value
53 key |value
54 api_version| 1012
54 api_version| 1012
55 dllhandle | 503316480
55 dllhandle | 503316480
56 hexversion | 33817328
56 hexversion | 33817328
57 maxint |2147483647
57 maxint |2147483647
58 maxunicode | 65535
58 maxunicode | 65535
59 >>> sys.modules | ifilter("_.value is not None") | isort("_.key.lower()")
59 >>> sys.modules | ifilter("_.value is not None") | isort("_.key.lower()")
60 ...
60 ...
61
61
62 Note: The expression strings passed to ``ifilter()`` and ``isort()`` can
62 Note: The expression strings passed to ``ifilter()`` and ``isort()`` can
63 refer to the object to be filtered or sorted via the variable ``_`` and to any
63 refer to the object to be filtered or sorted via the variable ``_`` and to any
64 of the attributes of the object, i.e.:
64 of the attributes of the object, i.e.:
65
65
66 >>> sys.modules | ifilter("_.value is not None") | isort("_.key.lower()")
66 >>> sys.modules | ifilter("_.value is not None") | isort("_.key.lower()")
67
67
68 does the same as
68 does the same as
69
69
70 >>> sys.modules | ifilter("value is not None") | isort("key.lower()")
70 >>> sys.modules | ifilter("value is not None") | isort("key.lower()")
71
71
72 In addition to expression strings, it's possible to pass callables (taking
72 In addition to expression strings, it's possible to pass callables (taking
73 the object as an argument) to ``ifilter()``, ``isort()`` and ``ieval()``:
73 the object as an argument) to ``ifilter()``, ``isort()`` and ``ieval()``:
74
74
75 >>> sys | ifilter(lambda _:isinstance(_.value, int)) \
75 >>> sys | ifilter(lambda _:isinstance(_.value, int)) \
76 ... | ieval(lambda _: (_.key, hex(_.value))) | idump
76 ... | ieval(lambda _: (_.key, hex(_.value))) | idump
77 0 |1
77 0 |1
78 api_version|0x3f4
78 api_version|0x3f4
79 dllhandle |0x1e000000
79 dllhandle |0x1e000000
80 hexversion |0x20402f0
80 hexversion |0x20402f0
81 maxint |0x7fffffff
81 maxint |0x7fffffff
82 maxunicode |0xffff
82 maxunicode |0xffff
83 """
83 """
84
84
85 import sys, os, os.path, stat, glob, new, csv, datetime, types
85 import sys, os, os.path, stat, glob, new, csv, datetime, types
86 import itertools, mimetypes
86 import itertools, mimetypes
87
87
88 try: # Python 2.3 compatibility
88 try: # Python 2.3 compatibility
89 import collections
89 import collections
90 except ImportError:
90 except ImportError:
91 deque = list
91 deque = list
92 else:
92 else:
93 deque = collections.deque
93 deque = collections.deque
94
94
95 try: # Python 2.3 compatibility
95 try: # Python 2.3 compatibility
96 set
96 set
97 except NameError:
97 except NameError:
98 import sets
98 import sets
99 set = sets.Set
99 set = sets.Set
100
100
101 try: # Python 2.3 compatibility
101 try: # Python 2.3 compatibility
102 sorted
102 sorted
103 except NameError:
103 except NameError:
104 def sorted(iterator, key=None, reverse=False):
104 def sorted(iterator, key=None, reverse=False):
105 items = list(iterator)
105 items = list(iterator)
106 if key is not None:
106 if key is not None:
107 items.sort(lambda i1, i2: cmp(key(i1), key(i2)))
107 items.sort(lambda i1, i2: cmp(key(i1), key(i2)))
108 else:
108 else:
109 items.sort()
109 items.sort()
110 if reverse:
110 if reverse:
111 items.reverse()
111 items.reverse()
112 return items
112 return items
113
113
114 try:
114 try:
115 import pwd
115 import pwd
116 except ImportError:
116 except ImportError:
117 pwd = None
117 pwd = None
118
118
119 try:
119 try:
120 import grp
120 import grp
121 except ImportError:
121 except ImportError:
122 grp = None
122 grp = None
123
123
124 from IPython.external import simplegeneric
124 from IPython.external import simplegeneric
125
125
126 import path
126 import path
127 try:
127 try:
128 from IPython import genutils, ipapi
128 from IPython import genutils, ipapi
129 except ImportError:
129 except ImportError:
130 genutils = None
130 genutils = None
131 ipapi = None
131 ipapi = None
132
132
133 import astyle
133 import astyle
134
134
135
135
136 __all__ = [
136 __all__ = [
137 "ifile", "ils", "iglob", "iwalk", "ipwdentry", "ipwd", "igrpentry", "igrp",
137 "ifile", "ils", "iglob", "iwalk", "ipwdentry", "ipwd", "igrpentry", "igrp",
138 "icsv", "ix", "ichain", "isort", "ifilter", "ieval", "ienum", "ienv",
138 "icsv", "ix", "ichain", "isort", "ifilter", "ieval", "ienum", "ienv",
139 "idump", "iless"
139 "idump", "iless"
140 ]
140 ]
141
141
142
142
143 os.stat_float_times(True) # enable microseconds
143 os.stat_float_times(True) # enable microseconds
144
144
145
145
146 class AttrNamespace(object):
146 class AttrNamespace(object):
147 """
147 """
148 Helper class that is used for providing a namespace for evaluating
148 Helper class that is used for providing a namespace for evaluating
149 expressions containing attribute names of an object.
149 expressions containing attribute names of an object.
150 """
150 """
151 def __init__(self, wrapped):
151 def __init__(self, wrapped):
152 self.wrapped = wrapped
152 self.wrapped = wrapped
153
153
154 def __getitem__(self, name):
154 def __getitem__(self, name):
155 if name == "_":
155 if name == "_":
156 return self.wrapped
156 return self.wrapped
157 try:
157 try:
158 return getattr(self.wrapped, name)
158 return getattr(self.wrapped, name)
159 except AttributeError:
159 except AttributeError:
160 raise KeyError(name)
160 raise KeyError(name)
161
161
162 # Python 2.3 compatibility
162 # Python 2.3 compatibility
163 # use eval workaround to find out which names are used in the
163 # use eval workaround to find out which names are used in the
164 # eval string and put them into the locals. This works for most
164 # eval string and put them into the locals. This works for most
165 # normal uses case, bizarre ones like accessing the locals()
165 # normal uses case, bizarre ones like accessing the locals()
166 # will fail
166 # will fail
167 try:
167 try:
168 eval("_", None, AttrNamespace(None))
168 eval("_", None, AttrNamespace(None))
169 except TypeError:
169 except TypeError:
170 real_eval = eval
170 real_eval = eval
171 def eval(codestring, _globals, _locals):
171 def eval(codestring, _globals, _locals):
172 """
172 """
173 eval(source[, globals[, locals]]) -> value
173 eval(source[, globals[, locals]]) -> value
174
174
175 Evaluate the source in the context of globals and locals.
175 Evaluate the source in the context of globals and locals.
176 The source may be a string representing a Python expression
176 The source may be a string representing a Python expression
177 or a code object as returned by compile().
177 or a code object as returned by compile().
178 The globals must be a dictionary and locals can be any mappping.
178 The globals must be a dictionary and locals can be any mappping.
179
179
180 This function is a workaround for the shortcomings of
180 This function is a workaround for the shortcomings of
181 Python 2.3's eval.
181 Python 2.3's eval.
182 """
182 """
183
183
184 if isinstance(codestring, basestring):
184 if isinstance(codestring, basestring):
185 code = compile(codestring, "_eval", "eval")
185 code = compile(codestring, "_eval", "eval")
186 else:
186 else:
187 code = codestring
187 code = codestring
188 newlocals = {}
188 newlocals = {}
189 for name in code.co_names:
189 for name in code.co_names:
190 try:
190 try:
191 newlocals[name] = _locals[name]
191 newlocals[name] = _locals[name]
192 except KeyError:
192 except KeyError:
193 pass
193 pass
194 return real_eval(code, _globals, newlocals)
194 return real_eval(code, _globals, newlocals)
195
195
196
196
197 noitem = object()
197 noitem = object()
198
198
199 def item(iterator, index, default=noitem):
199 def item(iterator, index, default=noitem):
200 """
200 """
201 Return the ``index``th item from the iterator ``iterator``.
201 Return the ``index``th item from the iterator ``iterator``.
202 ``index`` must be an integer (negative integers are relative to the
202 ``index`` must be an integer (negative integers are relative to the
203 end (i.e. the last items produced by the iterator)).
203 end (i.e. the last items produced by the iterator)).
204
204
205 If ``default`` is given, this will be the default value when
205 If ``default`` is given, this will be the default value when
206 the iterator doesn't contain an item at this position. Otherwise an
206 the iterator doesn't contain an item at this position. Otherwise an
207 ``IndexError`` will be raised.
207 ``IndexError`` will be raised.
208
208
209 Note that using this function will partially or totally exhaust the
209 Note that using this function will partially or totally exhaust the
210 iterator.
210 iterator.
211 """
211 """
212 i = index
212 i = index
213 if i>=0:
213 if i>=0:
214 for item in iterator:
214 for item in iterator:
215 if not i:
215 if not i:
216 return item
216 return item
217 i -= 1
217 i -= 1
218 else:
218 else:
219 i = -index
219 i = -index
220 cache = deque()
220 cache = deque()
221 for item in iterator:
221 for item in iterator:
222 cache.append(item)
222 cache.append(item)
223 if len(cache)>i:
223 if len(cache)>i:
224 cache.popleft()
224 cache.popleft()
225 if len(cache)==i:
225 if len(cache)==i:
226 return cache.popleft()
226 return cache.popleft()
227 if default is noitem:
227 if default is noitem:
228 raise IndexError(index)
228 raise IndexError(index)
229 else:
229 else:
230 return default
230 return default
231
231
232
232
233 def getglobals(g):
233 def getglobals(g):
234 """
234 """
235 Return the global namespace that is used for expression strings in
235 Return the global namespace that is used for expression strings in
236 ``ifilter`` and others. This is ``g`` or (if ``g`` is ``None``) IPython's
236 ``ifilter`` and others. This is ``g`` or (if ``g`` is ``None``) IPython's
237 user namespace.
237 user namespace.
238 """
238 """
239 if g is None:
239 if g is None:
240 if ipapi is not None:
240 if ipapi is not None:
241 api = ipapi.get()
241 api = ipapi.get()
242 if api is not None:
242 if api is not None:
243 return api.user_ns
243 return api.user_ns
244 return globals()
244 return globals()
245 return g
245 return g
246
246
247
247
248 class Descriptor(object):
248 class Descriptor(object):
249 """
249 """
250 A ``Descriptor`` object is used for describing the attributes of objects.
250 A ``Descriptor`` object is used for describing the attributes of objects.
251 """
251 """
252 def __hash__(self):
252 def __hash__(self):
253 return hash(self.__class__) ^ hash(self.key())
253 return hash(self.__class__) ^ hash(self.key())
254
254
255 def __eq__(self, other):
255 def __eq__(self, other):
256 return self.__class__ is other.__class__ and self.key() == other.key()
256 return self.__class__ is other.__class__ and self.key() == other.key()
257
257
258 def __ne__(self, other):
258 def __ne__(self, other):
259 return self.__class__ is not other.__class__ or self.key() != other.key()
259 return self.__class__ is not other.__class__ or self.key() != other.key()
260
260
261 def key(self):
261 def key(self):
262 pass
262 pass
263
263
264 def name(self):
264 def name(self):
265 """
265 """
266 Return the name of this attribute for display by a ``Display`` object
266 Return the name of this attribute for display by a ``Display`` object
267 (e.g. as a column title).
267 (e.g. as a column title).
268 """
268 """
269 key = self.key()
269 key = self.key()
270 if key is None:
270 if key is None:
271 return "_"
271 return "_"
272 return str(key)
272 return str(key)
273
273
274 def attrtype(self, obj):
274 def attrtype(self, obj):
275 """
275 """
276 Return the type of this attribute (i.e. something like "attribute" or
276 Return the type of this attribute (i.e. something like "attribute" or
277 "method").
277 "method").
278 """
278 """
279
279
280 def valuetype(self, obj):
280 def valuetype(self, obj):
281 """
281 """
282 Return the type of this attribute value of the object ``obj``.
282 Return the type of this attribute value of the object ``obj``.
283 """
283 """
284
284
285 def value(self, obj):
285 def value(self, obj):
286 """
286 """
287 Return the value of this attribute of the object ``obj``.
287 Return the value of this attribute of the object ``obj``.
288 """
288 """
289
289
290 def doc(self, obj):
290 def doc(self, obj):
291 """
291 """
292 Return the documentation for this attribute.
292 Return the documentation for this attribute.
293 """
293 """
294
294
295 def shortdoc(self, obj):
295 def shortdoc(self, obj):
296 """
296 """
297 Return a short documentation for this attribute (defaulting to the
297 Return a short documentation for this attribute (defaulting to the
298 first line).
298 first line).
299 """
299 """
300 doc = self.doc(obj)
300 doc = self.doc(obj)
301 if doc is not None:
301 if doc is not None:
302 doc = doc.strip().splitlines()[0].strip()
302 doc = doc.strip().splitlines()[0].strip()
303 return doc
303 return doc
304
304
305 def iter(self, obj):
305 def iter(self, obj):
306 """
306 """
307 Return an iterator for this attribute of the object ``obj``.
307 Return an iterator for this attribute of the object ``obj``.
308 """
308 """
309 return xiter(self.value(obj))
309 return xiter(self.value(obj))
310
310
311
311
312 class SelfDescriptor(Descriptor):
312 class SelfDescriptor(Descriptor):
313 """
313 """
314 A ``SelfDescriptor`` describes the object itself.
314 A ``SelfDescriptor`` describes the object itself.
315 """
315 """
316 def key(self):
316 def key(self):
317 return None
317 return None
318
318
319 def attrtype(self, obj):
319 def attrtype(self, obj):
320 return "self"
320 return "self"
321
321
322 def valuetype(self, obj):
322 def valuetype(self, obj):
323 return type(obj)
323 return type(obj)
324
324
325 def value(self, obj):
325 def value(self, obj):
326 return obj
326 return obj
327
327
328 def __repr__(self):
328 def __repr__(self):
329 return "Self"
329 return "Self"
330
330
331 selfdescriptor = SelfDescriptor() # there's no need for more than one
331 selfdescriptor = SelfDescriptor() # there's no need for more than one
332
332
333
333
334 class AttributeDescriptor(Descriptor):
334 class AttributeDescriptor(Descriptor):
335 """
335 """
336 An ``AttributeDescriptor`` describes a simple attribute of an object.
336 An ``AttributeDescriptor`` describes a simple attribute of an object.
337 """
337 """
338 __slots__ = ("_name", "_doc")
338 __slots__ = ("_name", "_doc")
339
339
340 def __init__(self, name, doc=None):
340 def __init__(self, name, doc=None):
341 self._name = name
341 self._name = name
342 self._doc = doc
342 self._doc = doc
343
343
344 def key(self):
344 def key(self):
345 return self._name
345 return self._name
346
346
347 def doc(self, obj):
347 def doc(self, obj):
348 return self._doc
348 return self._doc
349
349
350 def attrtype(self, obj):
350 def attrtype(self, obj):
351 return "attr"
351 return "attr"
352
352
353 def valuetype(self, obj):
353 def valuetype(self, obj):
354 return type(getattr(obj, self._name))
354 return type(getattr(obj, self._name))
355
355
356 def value(self, obj):
356 def value(self, obj):
357 return getattr(obj, self._name)
357 return getattr(obj, self._name)
358
358
359 def __repr__(self):
359 def __repr__(self):
360 if self._doc is None:
360 if self._doc is None:
361 return "Attribute(%r)" % self._name
361 return "Attribute(%r)" % self._name
362 else:
362 else:
363 return "Attribute(%r, %r)" % (self._name, self._doc)
363 return "Attribute(%r, %r)" % (self._name, self._doc)
364
364
365
365
366 class IndexDescriptor(Descriptor):
366 class IndexDescriptor(Descriptor):
367 """
367 """
368 An ``IndexDescriptor`` describes an "attribute" of an object that is fetched
368 An ``IndexDescriptor`` describes an "attribute" of an object that is fetched
369 via ``__getitem__``.
369 via ``__getitem__``.
370 """
370 """
371 __slots__ = ("_index",)
371 __slots__ = ("_index",)
372
372
373 def __init__(self, index):
373 def __init__(self, index):
374 self._index = index
374 self._index = index
375
375
376 def key(self):
376 def key(self):
377 return self._index
377 return self._index
378
378
379 def attrtype(self, obj):
379 def attrtype(self, obj):
380 return "item"
380 return "item"
381
381
382 def valuetype(self, obj):
382 def valuetype(self, obj):
383 return type(obj[self._index])
383 return type(obj[self._index])
384
384
385 def value(self, obj):
385 def value(self, obj):
386 return obj[self._index]
386 return obj[self._index]
387
387
388 def __repr__(self):
388 def __repr__(self):
389 return "Index(%r)" % self._index
389 return "Index(%r)" % self._index
390
390
391
391
392 class MethodDescriptor(Descriptor):
392 class MethodDescriptor(Descriptor):
393 """
393 """
394 A ``MethodDescriptor`` describes a method of an object that can be called
394 A ``MethodDescriptor`` describes a method of an object that can be called
395 without argument. Note that this method shouldn't change the object.
395 without argument. Note that this method shouldn't change the object.
396 """
396 """
397 __slots__ = ("_name", "_doc")
397 __slots__ = ("_name", "_doc")
398
398
399 def __init__(self, name, doc=None):
399 def __init__(self, name, doc=None):
400 self._name = name
400 self._name = name
401 self._doc = doc
401 self._doc = doc
402
402
403 def key(self):
403 def key(self):
404 return self._name
404 return self._name
405
405
406 def doc(self, obj):
406 def doc(self, obj):
407 if self._doc is None:
407 if self._doc is None:
408 return getattr(obj, self._name).__doc__
408 return getattr(obj, self._name).__doc__
409 return self._doc
409 return self._doc
410
410
411 def attrtype(self, obj):
411 def attrtype(self, obj):
412 return "method"
412 return "method"
413
413
414 def valuetype(self, obj):
414 def valuetype(self, obj):
415 return type(self.value(obj))
415 return type(self.value(obj))
416
416
417 def value(self, obj):
417 def value(self, obj):
418 return getattr(obj, self._name)()
418 return getattr(obj, self._name)()
419
419
420 def __repr__(self):
420 def __repr__(self):
421 if self._doc is None:
421 if self._doc is None:
422 return "Method(%r)" % self._name
422 return "Method(%r)" % self._name
423 else:
423 else:
424 return "Method(%r, %r)" % (self._name, self._doc)
424 return "Method(%r, %r)" % (self._name, self._doc)
425
425
426
426
427 class IterAttributeDescriptor(Descriptor):
427 class IterAttributeDescriptor(Descriptor):
428 """
428 """
429 An ``IterAttributeDescriptor`` works like an ``AttributeDescriptor`` but
429 An ``IterAttributeDescriptor`` works like an ``AttributeDescriptor`` but
430 doesn't return an attribute values (because this value might be e.g. a large
430 doesn't return an attribute values (because this value might be e.g. a large
431 list).
431 list).
432 """
432 """
433 __slots__ = ("_name", "_doc")
433 __slots__ = ("_name", "_doc")
434
434
435 def __init__(self, name, doc=None):
435 def __init__(self, name, doc=None):
436 self._name = name
436 self._name = name
437 self._doc = doc
437 self._doc = doc
438
438
439 def key(self):
439 def key(self):
440 return self._name
440 return self._name
441
441
442 def doc(self, obj):
442 def doc(self, obj):
443 return self._doc
443 return self._doc
444
444
445 def attrtype(self, obj):
445 def attrtype(self, obj):
446 return "iter"
446 return "iter"
447
447
448 def valuetype(self, obj):
448 def valuetype(self, obj):
449 return noitem
449 return noitem
450
450
451 def value(self, obj):
451 def value(self, obj):
452 return noitem
452 return noitem
453
453
454 def iter(self, obj):
454 def iter(self, obj):
455 return xiter(getattr(obj, self._name))
455 return xiter(getattr(obj, self._name))
456
456
457 def __repr__(self):
457 def __repr__(self):
458 if self._doc is None:
458 if self._doc is None:
459 return "IterAttribute(%r)" % self._name
459 return "IterAttribute(%r)" % self._name
460 else:
460 else:
461 return "IterAttribute(%r, %r)" % (self._name, self._doc)
461 return "IterAttribute(%r, %r)" % (self._name, self._doc)
462
462
463
463
464 class IterMethodDescriptor(Descriptor):
464 class IterMethodDescriptor(Descriptor):
465 """
465 """
466 An ``IterMethodDescriptor`` works like an ``MethodDescriptor`` but doesn't
466 An ``IterMethodDescriptor`` works like an ``MethodDescriptor`` but doesn't
467 return an attribute values (because this value might be e.g. a large list).
467 return an attribute values (because this value might be e.g. a large list).
468 """
468 """
469 __slots__ = ("_name", "_doc")
469 __slots__ = ("_name", "_doc")
470
470
471 def __init__(self, name, doc=None):
471 def __init__(self, name, doc=None):
472 self._name = name
472 self._name = name
473 self._doc = doc
473 self._doc = doc
474
474
475 def key(self):
475 def key(self):
476 return self._name
476 return self._name
477
477
478 def doc(self, obj):
478 def doc(self, obj):
479 if self._doc is None:
479 if self._doc is None:
480 return getattr(obj, self._name).__doc__
480 return getattr(obj, self._name).__doc__
481 return self._doc
481 return self._doc
482
482
483 def attrtype(self, obj):
483 def attrtype(self, obj):
484 return "itermethod"
484 return "itermethod"
485
485
486 def valuetype(self, obj):
486 def valuetype(self, obj):
487 return noitem
487 return noitem
488
488
489 def value(self, obj):
489 def value(self, obj):
490 return noitem
490 return noitem
491
491
492 def iter(self, obj):
492 def iter(self, obj):
493 return xiter(getattr(obj, self._name)())
493 return xiter(getattr(obj, self._name)())
494
494
495 def __repr__(self):
495 def __repr__(self):
496 if self._doc is None:
496 if self._doc is None:
497 return "IterMethod(%r)" % self._name
497 return "IterMethod(%r)" % self._name
498 else:
498 else:
499 return "IterMethod(%r, %r)" % (self._name, self._doc)
499 return "IterMethod(%r, %r)" % (self._name, self._doc)
500
500
501
501
502 class FunctionDescriptor(Descriptor):
502 class FunctionDescriptor(Descriptor):
503 """
503 """
504 A ``FunctionDescriptor`` turns a function into a descriptor. The function
504 A ``FunctionDescriptor`` turns a function into a descriptor. The function
505 will be called with the object to get the type and value of the attribute.
505 will be called with the object to get the type and value of the attribute.
506 """
506 """
507 __slots__ = ("_function", "_name", "_doc")
507 __slots__ = ("_function", "_name", "_doc")
508
508
509 def __init__(self, function, name=None, doc=None):
509 def __init__(self, function, name=None, doc=None):
510 self._function = function
510 self._function = function
511 self._name = name
511 self._name = name
512 self._doc = doc
512 self._doc = doc
513
513
514 def key(self):
514 def key(self):
515 return self._function
515 return self._function
516
516
517 def name(self):
517 def name(self):
518 if self._name is not None:
518 if self._name is not None:
519 return self._name
519 return self._name
520 return getattr(self._function, "__xname__", self._function.__name__)
520 return getattr(self._function, "__xname__", self._function.__name__)
521
521
522 def doc(self, obj):
522 def doc(self, obj):
523 if self._doc is None:
523 if self._doc is None:
524 return self._function.__doc__
524 return self._function.__doc__
525 return self._doc
525 return self._doc
526
526
527 def attrtype(self, obj):
527 def attrtype(self, obj):
528 return "function"
528 return "function"
529
529
530 def valuetype(self, obj):
530 def valuetype(self, obj):
531 return type(self._function(obj))
531 return type(self._function(obj))
532
532
533 def value(self, obj):
533 def value(self, obj):
534 return self._function(obj)
534 return self._function(obj)
535
535
536 def __repr__(self):
536 def __repr__(self):
537 if self._doc is None:
537 if self._doc is None:
538 return "Function(%r)" % self._name
538 return "Function(%r)" % self._name
539 else:
539 else:
540 return "Function(%r, %r)" % (self._name, self._doc)
540 return "Function(%r, %r)" % (self._name, self._doc)
541
541
542
542
543 class Table(object):
543 class Table(object):
544 """
544 """
545 A ``Table`` is an object that produces items (just like a normal Python
545 A ``Table`` is an object that produces items (just like a normal Python
546 iterator/generator does) and can be used as the first object in a pipeline
546 iterator/generator does) and can be used as the first object in a pipeline
547 expression. The displayhook will open the default browser for such an object
547 expression. The displayhook will open the default browser for such an object
548 (instead of simply printing the ``repr()`` result).
548 (instead of simply printing the ``repr()`` result).
549 """
549 """
550
550
551 # We want to support ``foo`` and ``foo()`` in pipeline expression:
551 # We want to support ``foo`` and ``foo()`` in pipeline expression:
552 # So we implement the required operators (``|`` and ``+``) in the metaclass,
552 # So we implement the required operators (``|`` and ``+``) in the metaclass,
553 # instantiate the class and forward the operator to the instance
553 # instantiate the class and forward the operator to the instance
554 class __metaclass__(type):
554 class __metaclass__(type):
555 def __iter__(self):
555 def __iter__(self):
556 return iter(self())
556 return iter(self())
557
557
558 def __or__(self, other):
558 def __or__(self, other):
559 return self() | other
559 return self() | other
560
560
561 def __add__(self, other):
561 def __add__(self, other):
562 return self() + other
562 return self() + other
563
563
564 def __radd__(self, other):
564 def __radd__(self, other):
565 return other + self()
565 return other + self()
566
566
567 def __getitem__(self, index):
567 def __getitem__(self, index):
568 return self()[index]
568 return self()[index]
569
569
570 def __getitem__(self, index):
570 def __getitem__(self, index):
571 return item(self, index)
571 return item(self, index)
572
572
573 def __contains__(self, item):
573 def __contains__(self, item):
574 for haveitem in self:
574 for haveitem in self:
575 if item == haveitem:
575 if item == haveitem:
576 return True
576 return True
577 return False
577 return False
578
578
579 def __or__(self, other):
579 def __or__(self, other):
580 # autoinstantiate right hand side
580 # autoinstantiate right hand side
581 if isinstance(other, type) and issubclass(other, (Table, Display)):
581 if isinstance(other, type) and issubclass(other, (Table, Display)):
582 other = other()
582 other = other()
583 # treat simple strings and functions as ``ieval`` instances
583 # treat simple strings and functions as ``ieval`` instances
584 elif not isinstance(other, Display) and not isinstance(other, Table):
584 elif not isinstance(other, Display) and not isinstance(other, Table):
585 other = ieval(other)
585 other = ieval(other)
586 # forward operations to the right hand side
586 # forward operations to the right hand side
587 return other.__ror__(self)
587 return other.__ror__(self)
588
588
589 def __add__(self, other):
589 def __add__(self, other):
590 # autoinstantiate right hand side
590 # autoinstantiate right hand side
591 if isinstance(other, type) and issubclass(other, Table):
591 if isinstance(other, type) and issubclass(other, Table):
592 other = other()
592 other = other()
593 return ichain(self, other)
593 return ichain(self, other)
594
594
595 def __radd__(self, other):
595 def __radd__(self, other):
596 # autoinstantiate left hand side
596 # autoinstantiate left hand side
597 if isinstance(other, type) and issubclass(other, Table):
597 if isinstance(other, type) and issubclass(other, Table):
598 other = other()
598 other = other()
599 return ichain(other, self)
599 return ichain(other, self)
600
600
601
601
602 class Pipe(Table):
602 class Pipe(Table):
603 """
603 """
604 A ``Pipe`` is an object that can be used in a pipeline expression. It
604 A ``Pipe`` is an object that can be used in a pipeline expression. It
605 processes the objects it gets from its input ``Table``/``Pipe``. Note that
605 processes the objects it gets from its input ``Table``/``Pipe``. Note that
606 a ``Pipe`` object can't be used as the first object in a pipeline
606 a ``Pipe`` object can't be used as the first object in a pipeline
607 expression, as it doesn't produces items itself.
607 expression, as it doesn't produces items itself.
608 """
608 """
609 class __metaclass__(Table.__metaclass__):
609 class __metaclass__(Table.__metaclass__):
610 def __ror__(self, input):
610 def __ror__(self, input):
611 return input | self()
611 return input | self()
612
612
613 def __ror__(self, input):
613 def __ror__(self, input):
614 # autoinstantiate left hand side
614 # autoinstantiate left hand side
615 if isinstance(input, type) and issubclass(input, Table):
615 if isinstance(input, type) and issubclass(input, Table):
616 input = input()
616 input = input()
617 self.input = input
617 self.input = input
618 return self
618 return self
619
619
620
620
621 def xrepr(item, mode="default"):
621 def xrepr(item, mode="default"):
622 """
622 """
623 Generic function that adds color output and different display modes to ``repr``.
623 Generic function that adds color output and different display modes to ``repr``.
624
624
625 The result of an ``xrepr`` call is iterable and consists of ``(style, string)``
625 The result of an ``xrepr`` call is iterable and consists of ``(style, string)``
626 tuples. The ``style`` in this tuple must be a ``Style`` object from the
626 tuples. The ``style`` in this tuple must be a ``Style`` object from the
627 ``astring`` module. To reconfigure the output the first yielded tuple can be
627 ``astring`` module. To reconfigure the output the first yielded tuple can be
628 a ``(aligment, full)`` tuple instead of a ``(style, string)`` tuple.
628 a ``(aligment, full)`` tuple instead of a ``(style, string)`` tuple.
629 ``alignment`` can be -1 for left aligned, 0 for centered and 1 for right
629 ``alignment`` can be -1 for left aligned, 0 for centered and 1 for right
630 aligned (the default is left alignment). ``full`` is a boolean that specifies
630 aligned (the default is left alignment). ``full`` is a boolean that specifies
631 whether the complete output must be displayed or the ``Display`` object is
631 whether the complete output must be displayed or the ``Display`` object is
632 allowed to stop output after enough text has been produced (e.g. a syntax
632 allowed to stop output after enough text has been produced (e.g. a syntax
633 highlighted text line would use ``True``, but for a large data structure
633 highlighted text line would use ``True``, but for a large data structure
634 (i.e. a nested list, tuple or dictionary) ``False`` would be used).
634 (i.e. a nested list, tuple or dictionary) ``False`` would be used).
635 The default is full output.
635 The default is full output.
636
636
637 There are four different possible values for ``mode`` depending on where
637 There are four different possible values for ``mode`` depending on where
638 the ``Display`` object will display ``item``:
638 the ``Display`` object will display ``item``:
639
639
640 * ``"header"``: ``item`` will be displayed in a header line (this is used by
640 * ``"header"``: ``item`` will be displayed in a header line (this is used by
641 ``ibrowse``).
641 ``ibrowse``).
642 * ``"footer"``: ``item`` will be displayed in a footer line (this is used by
642 * ``"footer"``: ``item`` will be displayed in a footer line (this is used by
643 ``ibrowse``).
643 ``ibrowse``).
644 * ``"cell"``: ``item`` will be displayed in a table cell/list.
644 * ``"cell"``: ``item`` will be displayed in a table cell/list.
645 * ``"default"``: default mode. If an ``xrepr`` implementation recursively
645 * ``"default"``: default mode. If an ``xrepr`` implementation recursively
646 outputs objects, ``"default"`` must be passed in the recursive calls to
646 outputs objects, ``"default"`` must be passed in the recursive calls to
647 ``xrepr``.
647 ``xrepr``.
648
648
649 If no implementation is registered for ``item``, ``xrepr`` will try the
649 If no implementation is registered for ``item``, ``xrepr`` will try the
650 ``__xrepr__`` method on ``item``. If ``item`` doesn't have an ``__xrepr__``
650 ``__xrepr__`` method on ``item``. If ``item`` doesn't have an ``__xrepr__``
651 method it falls back to ``repr``/``__repr__`` for all modes.
651 method it falls back to ``repr``/``__repr__`` for all modes.
652 """
652 """
653 try:
653 try:
654 func = item.__xrepr__
654 func = item.__xrepr__
655 except AttributeError:
655 except AttributeError:
656 yield (astyle.style_default, repr(item))
656 yield (astyle.style_default, repr(item))
657 else:
657 else:
658 try:
658 try:
659 for x in func(mode):
659 for x in func(mode):
660 yield x
660 yield x
661 except (KeyboardInterrupt, SystemExit):
661 except (KeyboardInterrupt, SystemExit):
662 raise
662 raise
663 except Exception:
663 except Exception:
664 yield (astyle.style_default, repr(item))
664 yield (astyle.style_default, repr(item))
665 xrepr = simplegeneric.generic(xrepr)
665 xrepr = simplegeneric.generic(xrepr)
666
666
667
667
668 def xrepr_none(self, mode="default"):
668 def xrepr_none(self, mode="default"):
669 yield (astyle.style_type_none, repr(self))
669 yield (astyle.style_type_none, repr(self))
670 xrepr.when_object(None)(xrepr_none)
670 xrepr.when_object(None)(xrepr_none)
671
671
672
672
673 def xrepr_bool(self, mode="default"):
673 def xrepr_bool(self, mode="default"):
674 yield (astyle.style_type_bool, repr(self))
674 yield (astyle.style_type_bool, repr(self))
675 xrepr.when_type(bool)(xrepr_bool)
675 xrepr.when_type(bool)(xrepr_bool)
676
676
677
677
678 def xrepr_str(self, mode="default"):
678 def xrepr_str(self, mode="default"):
679 if mode == "cell":
679 if mode == "cell":
680 yield (astyle.style_default, repr(self.expandtabs(tab))[1:-1])
680 yield (astyle.style_default, repr(self.expandtabs(tab))[1:-1])
681 else:
681 else:
682 yield (astyle.style_default, repr(self))
682 yield (astyle.style_default, repr(self))
683 xrepr.when_type(str)(xrepr_str)
683 xrepr.when_type(str)(xrepr_str)
684
684
685
685
686 def xrepr_unicode(self, mode="default"):
686 def xrepr_unicode(self, mode="default"):
687 if mode == "cell":
687 if mode == "cell":
688 yield (astyle.style_default, repr(self.expandtabs(tab))[2:-1])
688 yield (astyle.style_default, repr(self.expandtabs(tab))[2:-1])
689 else:
689 else:
690 yield (astyle.style_default, repr(self))
690 yield (astyle.style_default, repr(self))
691 xrepr.when_type(unicode)(xrepr_unicode)
691 xrepr.when_type(unicode)(xrepr_unicode)
692
692
693
693
694 def xrepr_number(self, mode="default"):
694 def xrepr_number(self, mode="default"):
695 yield (1, True)
695 yield (1, True)
696 yield (astyle.style_type_number, repr(self))
696 yield (astyle.style_type_number, repr(self))
697 xrepr.when_type(int)(xrepr_number)
697 xrepr.when_type(int)(xrepr_number)
698 xrepr.when_type(long)(xrepr_number)
698 xrepr.when_type(long)(xrepr_number)
699 xrepr.when_type(float)(xrepr_number)
699 xrepr.when_type(float)(xrepr_number)
700
700
701
701
702 def xrepr_complex(self, mode="default"):
702 def xrepr_complex(self, mode="default"):
703 yield (astyle.style_type_number, repr(self))
703 yield (astyle.style_type_number, repr(self))
704 xrepr.when_type(complex)(xrepr_number)
704 xrepr.when_type(complex)(xrepr_number)
705
705
706
706
707 def xrepr_datetime(self, mode="default"):
707 def xrepr_datetime(self, mode="default"):
708 if mode == "cell":
708 if mode == "cell":
709 # Don't use strftime() here, as this requires year >= 1900
709 # Don't use strftime() here, as this requires year >= 1900
710 yield (astyle.style_type_datetime,
710 yield (astyle.style_type_datetime,
711 "%04d-%02d-%02d %02d:%02d:%02d.%06d" % \
711 "%04d-%02d-%02d %02d:%02d:%02d.%06d" % \
712 (self.year, self.month, self.day,
712 (self.year, self.month, self.day,
713 self.hour, self.minute, self.second,
713 self.hour, self.minute, self.second,
714 self.microsecond),
714 self.microsecond),
715 )
715 )
716 else:
716 else:
717 yield (astyle.style_type_datetime, repr(self))
717 yield (astyle.style_type_datetime, repr(self))
718 xrepr.when_type(datetime.datetime)(xrepr_datetime)
718 xrepr.when_type(datetime.datetime)(xrepr_datetime)
719
719
720
720
721 def xrepr_date(self, mode="default"):
721 def xrepr_date(self, mode="default"):
722 if mode == "cell":
722 if mode == "cell":
723 yield (astyle.style_type_datetime,
723 yield (astyle.style_type_datetime,
724 "%04d-%02d-%02d" % (self.year, self.month, self.day))
724 "%04d-%02d-%02d" % (self.year, self.month, self.day))
725 else:
725 else:
726 yield (astyle.style_type_datetime, repr(self))
726 yield (astyle.style_type_datetime, repr(self))
727 xrepr.when_type(datetime.date)(xrepr_date)
727 xrepr.when_type(datetime.date)(xrepr_date)
728
728
729
729
730 def xrepr_time(self, mode="default"):
730 def xrepr_time(self, mode="default"):
731 if mode == "cell":
731 if mode == "cell":
732 yield (astyle.style_type_datetime,
732 yield (astyle.style_type_datetime,
733 "%02d:%02d:%02d.%06d" % \
733 "%02d:%02d:%02d.%06d" % \
734 (self.hour, self.minute, self.second, self.microsecond))
734 (self.hour, self.minute, self.second, self.microsecond))
735 else:
735 else:
736 yield (astyle.style_type_datetime, repr(self))
736 yield (astyle.style_type_datetime, repr(self))
737 xrepr.when_type(datetime.time)(xrepr_time)
737 xrepr.when_type(datetime.time)(xrepr_time)
738
738
739
739
740 def xrepr_timedelta(self, mode="default"):
740 def xrepr_timedelta(self, mode="default"):
741 yield (astyle.style_type_datetime, repr(self))
741 yield (astyle.style_type_datetime, repr(self))
742 xrepr.when_type(datetime.timedelta)(xrepr_timedelta)
742 xrepr.when_type(datetime.timedelta)(xrepr_timedelta)
743
743
744
744
745 def xrepr_type(self, mode="default"):
745 def xrepr_type(self, mode="default"):
746 if self.__module__ == "__builtin__":
746 if self.__module__ == "__builtin__":
747 yield (astyle.style_type_type, self.__name__)
747 yield (astyle.style_type_type, self.__name__)
748 else:
748 else:
749 yield (astyle.style_type_type, "%s.%s" % (self.__module__, self.__name__))
749 yield (astyle.style_type_type, "%s.%s" % (self.__module__, self.__name__))
750 xrepr.when_type(type)(xrepr_type)
750 xrepr.when_type(type)(xrepr_type)
751
751
752
752
753 def xrepr_exception(self, mode="default"):
753 def xrepr_exception(self, mode="default"):
754 if self.__class__.__module__ == "exceptions":
754 if self.__class__.__module__ == "exceptions":
755 classname = self.__class__.__name__
755 classname = self.__class__.__name__
756 else:
756 else:
757 classname = "%s.%s" % \
757 classname = "%s.%s" % \
758 (self.__class__.__module__, self.__class__.__name__)
758 (self.__class__.__module__, self.__class__.__name__)
759 if mode == "header" or mode == "footer":
759 if mode == "header" or mode == "footer":
760 yield (astyle.style_error, "%s: %s" % (classname, self))
760 yield (astyle.style_error, "%s: %s" % (classname, self))
761 else:
761 else:
762 yield (astyle.style_error, classname)
762 yield (astyle.style_error, classname)
763 xrepr.when_type(Exception)(xrepr_exception)
763 xrepr.when_type(Exception)(xrepr_exception)
764
764
765
765
766 def xrepr_listtuple(self, mode="default"):
766 def xrepr_listtuple(self, mode="default"):
767 if mode == "header" or mode == "footer":
767 if mode == "header" or mode == "footer":
768 if self.__class__.__module__ == "__builtin__":
768 if self.__class__.__module__ == "__builtin__":
769 classname = self.__class__.__name__
769 classname = self.__class__.__name__
770 else:
770 else:
771 classname = "%s.%s" % \
771 classname = "%s.%s" % \
772 (self.__class__.__module__,self.__class__.__name__)
772 (self.__class__.__module__,self.__class__.__name__)
773 yield (astyle.style_default,
773 yield (astyle.style_default,
774 "<%s object with %d items at 0x%x>" % \
774 "<%s object with %d items at 0x%x>" % \
775 (classname, len(self), id(self)))
775 (classname, len(self), id(self)))
776 else:
776 else:
777 yield (-1, False)
777 yield (-1, False)
778 if isinstance(self, list):
778 if isinstance(self, list):
779 yield (astyle.style_default, "[")
779 yield (astyle.style_default, "[")
780 end = "]"
780 end = "]"
781 else:
781 else:
782 yield (astyle.style_default, "(")
782 yield (astyle.style_default, "(")
783 end = ")"
783 end = ")"
784 for (i, subself) in enumerate(self):
784 for (i, subself) in enumerate(self):
785 if i:
785 if i:
786 yield (astyle.style_default, ", ")
786 yield (astyle.style_default, ", ")
787 for part in xrepr(subself, "default"):
787 for part in xrepr(subself, "default"):
788 yield part
788 yield part
789 yield (astyle.style_default, end)
789 yield (astyle.style_default, end)
790 xrepr.when_type(list)(xrepr_listtuple)
790 xrepr.when_type(list)(xrepr_listtuple)
791 xrepr.when_type(tuple)(xrepr_listtuple)
791 xrepr.when_type(tuple)(xrepr_listtuple)
792
792
793
793
794 def xrepr_dict(self, mode="default"):
794 def xrepr_dict(self, mode="default"):
795 if mode == "header" or mode == "footer":
795 if mode == "header" or mode == "footer":
796 if self.__class__.__module__ == "__builtin__":
796 if self.__class__.__module__ == "__builtin__":
797 classname = self.__class__.__name__
797 classname = self.__class__.__name__
798 else:
798 else:
799 classname = "%s.%s" % \
799 classname = "%s.%s" % \
800 (self.__class__.__module__,self.__class__.__name__)
800 (self.__class__.__module__,self.__class__.__name__)
801 yield (astyle.style_default,
801 yield (astyle.style_default,
802 "<%s object with %d items at 0x%x>" % \
802 "<%s object with %d items at 0x%x>" % \
803 (classname, len(self), id(self)))
803 (classname, len(self), id(self)))
804 else:
804 else:
805 yield (-1, False)
805 yield (-1, False)
806 if isinstance(self, dict):
806 if isinstance(self, dict):
807 yield (astyle.style_default, "{")
807 yield (astyle.style_default, "{")
808 end = "}"
808 end = "}"
809 else:
809 else:
810 yield (astyle.style_default, "dictproxy((")
810 yield (astyle.style_default, "dictproxy((")
811 end = "})"
811 end = "})"
812 for (i, (key, value)) in enumerate(self.iteritems()):
812 for (i, (key, value)) in enumerate(self.iteritems()):
813 if i:
813 if i:
814 yield (astyle.style_default, ", ")
814 yield (astyle.style_default, ", ")
815 for part in xrepr(key, "default"):
815 for part in xrepr(key, "default"):
816 yield part
816 yield part
817 yield (astyle.style_default, ": ")
817 yield (astyle.style_default, ": ")
818 for part in xrepr(value, "default"):
818 for part in xrepr(value, "default"):
819 yield part
819 yield part
820 yield (astyle.style_default, end)
820 yield (astyle.style_default, end)
821 xrepr.when_type(dict)(xrepr_dict)
821 xrepr.when_type(dict)(xrepr_dict)
822 xrepr.when_type(types.DictProxyType)(xrepr_dict)
822 xrepr.when_type(types.DictProxyType)(xrepr_dict)
823
823
824
824
825 def upgradexattr(attr):
825 def upgradexattr(attr):
826 """
826 """
827 Convert an attribute descriptor string to a real descriptor object.
827 Convert an attribute descriptor string to a real descriptor object.
828
828
829 If attr already is a descriptor object return if unmodified. A
829 If attr already is a descriptor object return if unmodified. A
830 ``SelfDescriptor`` will be returned if ``attr`` is ``None``. ``"foo"``
830 ``SelfDescriptor`` will be returned if ``attr`` is ``None``. ``"foo"``
831 returns an ``AttributeDescriptor`` for the attribute named ``"foo"``.
831 returns an ``AttributeDescriptor`` for the attribute named ``"foo"``.
832 ``"foo()"`` returns a ``MethodDescriptor`` for the method named ``"foo"``.
832 ``"foo()"`` returns a ``MethodDescriptor`` for the method named ``"foo"``.
833 ``"-foo"`` will return an ``IterAttributeDescriptor`` for the attribute
833 ``"-foo"`` will return an ``IterAttributeDescriptor`` for the attribute
834 named ``"foo"`` and ``"-foo()"`` will return an ``IterMethodDescriptor``
834 named ``"foo"`` and ``"-foo()"`` will return an ``IterMethodDescriptor``
835 for the method named ``"foo"``. Furthermore integer will return the appropriate
835 for the method named ``"foo"``. Furthermore integer will return the appropriate
836 ``IndexDescriptor`` and callables will return a ``FunctionDescriptor``.
836 ``IndexDescriptor`` and callables will return a ``FunctionDescriptor``.
837 """
837 """
838 if attr is None:
838 if attr is None:
839 return selfdescriptor
839 return selfdescriptor
840 elif isinstance(attr, Descriptor):
840 elif isinstance(attr, Descriptor):
841 return attr
841 return attr
842 elif isinstance(attr, str):
842 elif isinstance(attr, str):
843 if attr.endswith("()"):
843 if attr.endswith("()"):
844 if attr.startswith("-"):
844 if attr.startswith("-"):
845 return IterMethodDescriptor(attr[1:-2])
845 return IterMethodDescriptor(attr[1:-2])
846 else:
846 else:
847 return MethodDescriptor(attr[:-2])
847 return MethodDescriptor(attr[:-2])
848 else:
848 else:
849 if attr.startswith("-"):
849 if attr.startswith("-"):
850 return IterAttributeDescriptor(attr[1:])
850 return IterAttributeDescriptor(attr[1:])
851 else:
851 else:
852 return AttributeDescriptor(attr)
852 return AttributeDescriptor(attr)
853 elif isinstance(attr, (int, long)):
853 elif isinstance(attr, (int, long)):
854 return IndexDescriptor(attr)
854 return IndexDescriptor(attr)
855 elif callable(attr):
855 elif callable(attr):
856 return FunctionDescriptor(attr)
856 return FunctionDescriptor(attr)
857 else:
857 else:
858 raise TypeError("can't handle descriptor %r" % attr)
858 raise TypeError("can't handle descriptor %r" % attr)
859
859
860
860
861 def xattrs(item, mode="default"):
861 def xattrs(item, mode="default"):
862 """
862 """
863 Generic function that returns an iterable of attribute descriptors
863 Generic function that returns an iterable of attribute descriptors
864 to be used for displaying the attributes ob the object ``item`` in display
864 to be used for displaying the attributes ob the object ``item`` in display
865 mode ``mode``.
865 mode ``mode``.
866
866
867 There are two possible modes:
867 There are two possible modes:
868
868
869 * ``"detail"``: The ``Display`` object wants to display a detailed list
869 * ``"detail"``: The ``Display`` object wants to display a detailed list
870 of the object attributes.
870 of the object attributes.
871 * ``"default"``: The ``Display`` object wants to display the object in a
871 * ``"default"``: The ``Display`` object wants to display the object in a
872 list view.
872 list view.
873
873
874 If no implementation is registered for the object ``item`` ``xattrs`` falls
874 If no implementation is registered for the object ``item`` ``xattrs`` falls
875 back to trying the ``__xattrs__`` method of the object. If this doesn't
875 back to trying the ``__xattrs__`` method of the object. If this doesn't
876 exist either, ``dir(item)`` is used for ``"detail"`` mode and ``(None,)``
876 exist either, ``dir(item)`` is used for ``"detail"`` mode and ``(None,)``
877 for ``"default"`` mode.
877 for ``"default"`` mode.
878
878
879 The implementation must yield attribute descriptor (see the class
879 The implementation must yield attribute descriptor (see the class
880 ``Descriptor`` for more info). The ``__xattrs__`` method may also return
880 ``Descriptor`` for more info). The ``__xattrs__`` method may also return
881 attribute descriptor string (and ``None``) which will be converted to real
881 attribute descriptor string (and ``None``) which will be converted to real
882 descriptors by ``upgradexattr()``.
882 descriptors by ``upgradexattr()``.
883 """
883 """
884 try:
884 try:
885 func = item.__xattrs__
885 func = item.__xattrs__
886 except AttributeError:
886 except AttributeError:
887 if mode == "detail":
887 if mode == "detail":
888 for attrname in dir(item):
888 for attrname in dir(item):
889 yield AttributeDescriptor(attrname)
889 yield AttributeDescriptor(attrname)
890 else:
890 else:
891 yield selfdescriptor
891 yield selfdescriptor
892 else:
892 else:
893 for attr in func(mode):
893 for attr in func(mode):
894 yield upgradexattr(attr)
894 yield upgradexattr(attr)
895 xattrs = simplegeneric.generic(xattrs)
895 xattrs = simplegeneric.generic(xattrs)
896
896
897
897
898 def xattrs_complex(self, mode="default"):
898 def xattrs_complex(self, mode="default"):
899 if mode == "detail":
899 if mode == "detail":
900 return (AttributeDescriptor("real"), AttributeDescriptor("imag"))
900 return (AttributeDescriptor("real"), AttributeDescriptor("imag"))
901 return (selfdescriptor,)
901 return (selfdescriptor,)
902 xattrs.when_type(complex)(xattrs_complex)
902 xattrs.when_type(complex)(xattrs_complex)
903
903
904
904
905 def _isdict(item):
905 def _isdict(item):
906 try:
906 try:
907 itermeth = item.__class__.__iter__
907 itermeth = item.__class__.__iter__
908 except (AttributeError, TypeError):
908 except (AttributeError, TypeError):
909 return False
909 return False
910 return itermeth is dict.__iter__ or itermeth is types.DictProxyType.__iter__
910 return itermeth is dict.__iter__ or itermeth is types.DictProxyType.__iter__
911
911
912
912
913 def _isstr(item):
913 def _isstr(item):
914 if not isinstance(item, basestring):
914 if not isinstance(item, basestring):
915 return False
915 return False
916 try:
916 try:
917 itermeth = item.__class__.__iter__
917 itermeth = item.__class__.__iter__
918 except AttributeError:
918 except AttributeError:
919 return True
919 return True
920 return False # ``__iter__`` has been redefined
920 return False # ``__iter__`` has been redefined
921
921
922
922
923 def xiter(item):
923 def xiter(item):
924 """
924 """
925 Generic function that implements iteration for pipeline expression. If no
925 Generic function that implements iteration for pipeline expression. If no
926 implementation is registered for ``item`` ``xiter`` falls back to ``iter``.
926 implementation is registered for ``item`` ``xiter`` falls back to ``iter``.
927 """
927 """
928 try:
928 try:
929 func = item.__xiter__
929 func = item.__xiter__
930 except AttributeError:
930 except AttributeError:
931 if _isdict(item):
931 if _isdict(item):
932 def items(item):
932 def items(item):
933 fields = ("key", "value")
933 fields = ("key", "value")
934 for (key, value) in item.iteritems():
934 for (key, value) in item.iteritems():
935 yield Fields(fields, key=key, value=value)
935 yield Fields(fields, key=key, value=value)
936 return items(item)
936 return items(item)
937 elif isinstance(item, new.module):
937 elif isinstance(item, new.module):
938 def items(item):
938 def items(item):
939 fields = ("key", "value")
939 fields = ("key", "value")
940 for key in sorted(item.__dict__):
940 for key in sorted(item.__dict__):
941 yield Fields(fields, key=key, value=getattr(item, key))
941 yield Fields(fields, key=key, value=getattr(item, key))
942 return items(item)
942 return items(item)
943 elif _isstr(item):
943 elif _isstr(item):
944 if not item:
944 if not item:
945 raise ValueError("can't enter empty string")
945 raise ValueError("can't enter empty string")
946 return iter(item.splitlines())
946 return iter(item.splitlines())
947 return iter(item)
947 return iter(item)
948 else:
948 else:
949 return iter(func()) # iter() just to be safe
949 return iter(func()) # iter() just to be safe
950 xiter = simplegeneric.generic(xiter)
950 xiter = simplegeneric.generic(xiter)
951
951
952
952
953 class ichain(Pipe):
953 class ichain(Pipe):
954 """
954 """
955 Chains multiple ``Table``s into one.
955 Chains multiple ``Table``s into one.
956 """
956 """
957
957
958 def __init__(self, *iters):
958 def __init__(self, *iters):
959 self.iters = iters
959 self.iters = iters
960
960
961 def __iter__(self):
961 def __iter__(self):
962 return itertools.chain(*self.iters)
962 return itertools.chain(*self.iters)
963
963
964 def __xrepr__(self, mode="default"):
964 def __xrepr__(self, mode="default"):
965 if mode == "header" or mode == "footer":
965 if mode == "header" or mode == "footer":
966 for (i, item) in enumerate(self.iters):
966 for (i, item) in enumerate(self.iters):
967 if i:
967 if i:
968 yield (astyle.style_default, "+")
968 yield (astyle.style_default, "+")
969 if isinstance(item, Pipe):
969 if isinstance(item, Pipe):
970 yield (astyle.style_default, "(")
970 yield (astyle.style_default, "(")
971 for part in xrepr(item, mode):
971 for part in xrepr(item, mode):
972 yield part
972 yield part
973 if isinstance(item, Pipe):
973 if isinstance(item, Pipe):
974 yield (astyle.style_default, ")")
974 yield (astyle.style_default, ")")
975 else:
975 else:
976 yield (astyle.style_default, repr(self))
976 yield (astyle.style_default, repr(self))
977
977
978 def __repr__(self):
978 def __repr__(self):
979 args = ", ".join([repr(it) for it in self.iters])
979 args = ", ".join([repr(it) for it in self.iters])
980 return "%s.%s(%s)" % \
980 return "%s.%s(%s)" % \
981 (self.__class__.__module__, self.__class__.__name__, args)
981 (self.__class__.__module__, self.__class__.__name__, args)
982
982
983
983
984 class ifile(path.path):
984 class ifile(path.path):
985 """
985 """
986 file (or directory) object.
986 file (or directory) object.
987 """
987 """
988
988
989 def getmode(self):
989 def getmode(self):
990 return self.stat().st_mode
990 return self.stat().st_mode
991 mode = property(getmode, None, None, "Access mode")
991 mode = property(getmode, None, None, "Access mode")
992
992
993 def gettype(self):
993 def gettype(self):
994 data = [
994 data = [
995 (stat.S_ISREG, "file"),
995 (stat.S_ISREG, "file"),
996 (stat.S_ISDIR, "dir"),
996 (stat.S_ISDIR, "dir"),
997 (stat.S_ISCHR, "chardev"),
997 (stat.S_ISCHR, "chardev"),
998 (stat.S_ISBLK, "blockdev"),
998 (stat.S_ISBLK, "blockdev"),
999 (stat.S_ISFIFO, "fifo"),
999 (stat.S_ISFIFO, "fifo"),
1000 (stat.S_ISLNK, "symlink"),
1000 (stat.S_ISLNK, "symlink"),
1001 (stat.S_ISSOCK,"socket"),
1001 (stat.S_ISSOCK,"socket"),
1002 ]
1002 ]
1003 lstat = self.lstat()
1003 lstat = self.lstat()
1004 if lstat is not None:
1004 if lstat is not None:
1005 types = set([text for (func, text) in data if func(lstat.st_mode)])
1005 types = set([text for (func, text) in data if func(lstat.st_mode)])
1006 else:
1006 else:
1007 types = set()
1007 types = set()
1008 m = self.mode
1008 m = self.mode
1009 types.update([text for (func, text) in data if func(m)])
1009 types.update([text for (func, text) in data if func(m)])
1010 return ", ".join(types)
1010 return ", ".join(types)
1011 type = property(gettype, None, None, "file type (file, directory, link, etc.)")
1011 type = property(gettype, None, None, "file type (file, directory, link, etc.)")
1012
1012
1013 def getmodestr(self):
1013 def getmodestr(self):
1014 m = self.mode
1014 m = self.mode
1015 data = [
1015 data = [
1016 (stat.S_IRUSR, "-r"),
1016 (stat.S_IRUSR, "-r"),
1017 (stat.S_IWUSR, "-w"),
1017 (stat.S_IWUSR, "-w"),
1018 (stat.S_IXUSR, "-x"),
1018 (stat.S_IXUSR, "-x"),
1019 (stat.S_IRGRP, "-r"),
1019 (stat.S_IRGRP, "-r"),
1020 (stat.S_IWGRP, "-w"),
1020 (stat.S_IWGRP, "-w"),
1021 (stat.S_IXGRP, "-x"),
1021 (stat.S_IXGRP, "-x"),
1022 (stat.S_IROTH, "-r"),
1022 (stat.S_IROTH, "-r"),
1023 (stat.S_IWOTH, "-w"),
1023 (stat.S_IWOTH, "-w"),
1024 (stat.S_IXOTH, "-x"),
1024 (stat.S_IXOTH, "-x"),
1025 ]
1025 ]
1026 return "".join([text[bool(m&bit)] for (bit, text) in data])
1026 return "".join([text[bool(m&bit)] for (bit, text) in data])
1027
1027
1028 modestr = property(getmodestr, None, None, "Access mode as string")
1028 modestr = property(getmodestr, None, None, "Access mode as string")
1029
1029
1030 def getblocks(self):
1030 def getblocks(self):
1031 return self.stat().st_blocks
1031 return self.stat().st_blocks
1032 blocks = property(getblocks, None, None, "File size in blocks")
1032 blocks = property(getblocks, None, None, "File size in blocks")
1033
1033
1034 def getblksize(self):
1034 def getblksize(self):
1035 return self.stat().st_blksize
1035 return self.stat().st_blksize
1036 blksize = property(getblksize, None, None, "Filesystem block size")
1036 blksize = property(getblksize, None, None, "Filesystem block size")
1037
1037
1038 def getdev(self):
1038 def getdev(self):
1039 return self.stat().st_dev
1039 return self.stat().st_dev
1040 dev = property(getdev)
1040 dev = property(getdev)
1041
1041
1042 def getnlink(self):
1042 def getnlink(self):
1043 return self.stat().st_nlink
1043 return self.stat().st_nlink
1044 nlink = property(getnlink, None, None, "Number of links")
1044 nlink = property(getnlink, None, None, "Number of links")
1045
1045
1046 def getuid(self):
1046 def getuid(self):
1047 return self.stat().st_uid
1047 return self.stat().st_uid
1048 uid = property(getuid, None, None, "User id of file owner")
1048 uid = property(getuid, None, None, "User id of file owner")
1049
1049
1050 def getgid(self):
1050 def getgid(self):
1051 return self.stat().st_gid
1051 return self.stat().st_gid
1052 gid = property(getgid, None, None, "Group id of file owner")
1052 gid = property(getgid, None, None, "Group id of file owner")
1053
1053
1054 def getowner(self):
1054 def getowner(self):
1055 stat = self.stat()
1055 stat = self.stat()
1056 try:
1056 try:
1057 return pwd.getpwuid(stat.st_uid).pw_name
1057 return pwd.getpwuid(stat.st_uid).pw_name
1058 except KeyError:
1058 except KeyError:
1059 return stat.st_uid
1059 return stat.st_uid
1060 owner = property(getowner, None, None, "Owner name (or id)")
1060 owner = property(getowner, None, None, "Owner name (or id)")
1061
1061
1062 def getgroup(self):
1062 def getgroup(self):
1063 stat = self.stat()
1063 stat = self.stat()
1064 try:
1064 try:
1065 return grp.getgrgid(stat.st_gid).gr_name
1065 return grp.getgrgid(stat.st_gid).gr_name
1066 except KeyError:
1066 except KeyError:
1067 return stat.st_gid
1067 return stat.st_gid
1068 group = property(getgroup, None, None, "Group name (or id)")
1068 group = property(getgroup, None, None, "Group name (or id)")
1069
1069
1070 def getadate(self):
1070 def getadate(self):
1071 return datetime.datetime.utcfromtimestamp(self.atime)
1071 return datetime.datetime.utcfromtimestamp(self.atime)
1072 adate = property(getadate, None, None, "Access date")
1072 adate = property(getadate, None, None, "Access date")
1073
1073
1074 def getcdate(self):
1074 def getcdate(self):
1075 return datetime.datetime.utcfromtimestamp(self.ctime)
1075 return datetime.datetime.utcfromtimestamp(self.ctime)
1076 cdate = property(getcdate, None, None, "Creation date")
1076 cdate = property(getcdate, None, None, "Creation date")
1077
1077
1078 def getmdate(self):
1078 def getmdate(self):
1079 return datetime.datetime.utcfromtimestamp(self.mtime)
1079 return datetime.datetime.utcfromtimestamp(self.mtime)
1080 mdate = property(getmdate, None, None, "Modification date")
1080 mdate = property(getmdate, None, None, "Modification date")
1081
1081
1082 def mimetype(self):
1082 def mimetype(self):
1083 """
1083 """
1084 Return MIME type guessed from the extension.
1084 Return MIME type guessed from the extension.
1085 """
1085 """
1086 return mimetypes.guess_type(self.basename())[0]
1086 return mimetypes.guess_type(self.basename())[0]
1087
1087
1088 def encoding(self):
1088 def encoding(self):
1089 """
1089 """
1090 Return guessed compression (like "compress" or "gzip").
1090 Return guessed compression (like "compress" or "gzip").
1091 """
1091 """
1092 return mimetypes.guess_type(self.basename())[1]
1092 return mimetypes.guess_type(self.basename())[1]
1093
1093
1094 def __repr__(self):
1094 def __repr__(self):
1095 return "ifile(%s)" % path._base.__repr__(self)
1095 return "ifile(%s)" % path._base.__repr__(self)
1096
1096
1097 if sys.platform == "win32":
1097 if sys.platform == "win32":
1098 defaultattrs = (None, "type", "size", "modestr", "mdate")
1098 defaultattrs = (None, "type", "size", "modestr", "mdate")
1099 else:
1099 else:
1100 defaultattrs = (None, "type", "size", "modestr", "owner", "group", "mdate")
1100 defaultattrs = (None, "type", "size", "modestr", "owner", "group", "mdate")
1101
1101
1102 def __xattrs__(self, mode="default"):
1102 def __xattrs__(self, mode="default"):
1103 if mode == "detail":
1103 if mode == "detail":
1104 return (
1104 return (
1105 "name",
1105 "name",
1106 "basename()",
1106 "basename()",
1107 "abspath()",
1107 "abspath()",
1108 "realpath()",
1108 "realpath()",
1109 "type",
1109 "type",
1110 "mode",
1110 "mode",
1111 "modestr",
1111 "modestr",
1112 "stat()",
1112 "stat()",
1113 "lstat()",
1113 "lstat()",
1114 "uid",
1114 "uid",
1115 "gid",
1115 "gid",
1116 "owner",
1116 "owner",
1117 "group",
1117 "group",
1118 "dev",
1118 "dev",
1119 "nlink",
1119 "nlink",
1120 "ctime",
1120 "ctime",
1121 "mtime",
1121 "mtime",
1122 "atime",
1122 "atime",
1123 "cdate",
1123 "cdate",
1124 "mdate",
1124 "mdate",
1125 "adate",
1125 "adate",
1126 "size",
1126 "size",
1127 "blocks",
1127 "blocks",
1128 "blksize",
1128 "blksize",
1129 "isdir()",
1129 "isdir()",
1130 "islink()",
1130 "islink()",
1131 "mimetype()",
1131 "mimetype()",
1132 "encoding()",
1132 "encoding()",
1133 "-listdir()",
1133 "-listdir()",
1134 "-dirs()",
1134 "-dirs()",
1135 "-files()",
1135 "-files()",
1136 "-walk()",
1136 "-walk()",
1137 "-walkdirs()",
1137 "-walkdirs()",
1138 "-walkfiles()",
1138 "-walkfiles()",
1139 )
1139 )
1140 else:
1140 else:
1141 return self.defaultattrs
1141 return self.defaultattrs
1142
1142
1143
1143
1144 def xiter_ifile(self):
1144 def xiter_ifile(self):
1145 if self.isdir():
1145 if self.isdir():
1146 yield (self / os.pardir).abspath()
1146 yield (self / os.pardir).abspath()
1147 for child in sorted(self.listdir()):
1147 for child in sorted(self.listdir()):
1148 yield child
1148 yield child
1149 else:
1149 else:
1150 f = self.open("rb")
1150 f = self.open("rb")
1151 for line in f:
1151 for line in f:
1152 yield line
1152 yield line
1153 f.close()
1153 f.close()
1154 xiter.when_type(ifile)(xiter_ifile)
1154 xiter.when_type(ifile)(xiter_ifile)
1155
1155
1156
1156
1157 # We need to implement ``xrepr`` for ``ifile`` as a generic function, because
1157 # We need to implement ``xrepr`` for ``ifile`` as a generic function, because
1158 # otherwise ``xrepr_str`` would kick in.
1158 # otherwise ``xrepr_str`` would kick in.
1159 def xrepr_ifile(self, mode="default"):
1159 def xrepr_ifile(self, mode="default"):
1160 try:
1160 try:
1161 if self.isdir():
1161 if self.isdir():
1162 name = "idir"
1162 name = "idir"
1163 style = astyle.style_dir
1163 style = astyle.style_dir
1164 else:
1164 else:
1165 name = "ifile"
1165 name = "ifile"
1166 style = astyle.style_file
1166 style = astyle.style_file
1167 except IOError:
1167 except IOError:
1168 name = "ifile"
1168 name = "ifile"
1169 style = astyle.style_default
1169 style = astyle.style_default
1170 if mode == "cell" or mode in "header" or mode == "footer":
1170 if mode == "cell" or mode in "header" or mode == "footer":
1171 abspath = repr(path._base(self.normpath()))
1171 abspath = repr(path._base(self.normpath()))
1172 if abspath.startswith("u"):
1172 if abspath.startswith("u"):
1173 abspath = abspath[2:-1]
1173 abspath = abspath[2:-1]
1174 else:
1174 else:
1175 abspath = abspath[1:-1]
1175 abspath = abspath[1:-1]
1176 if mode == "cell":
1176 if mode == "cell":
1177 yield (style, abspath)
1177 yield (style, abspath)
1178 else:
1178 else:
1179 yield (style, "%s(%s)" % (name, abspath))
1179 yield (style, "%s(%s)" % (name, abspath))
1180 else:
1180 else:
1181 yield (style, repr(self))
1181 yield (style, repr(self))
1182 xrepr.when_type(ifile)(xrepr_ifile)
1182 xrepr.when_type(ifile)(xrepr_ifile)
1183
1183
1184
1184
1185 class ils(Table):
1185 class ils(Table):
1186 """
1186 """
1187 List the current (or a specified) directory.
1187 List the current (or a specified) directory.
1188
1188
1189 Examples:
1189 Examples:
1190
1190
1191 >>> ils
1191 >>> ils
1192 >>> ils("/usr/local/lib/python2.4")
1192 >>> ils("/usr/local/lib/python2.4")
1193 >>> ils("~")
1193 >>> ils("~")
1194 """
1194 """
1195 def __init__(self, base=os.curdir, dirs=True, files=True):
1195 def __init__(self, base=os.curdir, dirs=True, files=True):
1196 self.base = os.path.expanduser(base)
1196 self.base = os.path.expanduser(base)
1197 self.dirs = dirs
1197 self.dirs = dirs
1198 self.files = files
1198 self.files = files
1199
1199
1200 def __iter__(self):
1200 def __iter__(self):
1201 base = ifile(self.base)
1201 base = ifile(self.base)
1202 yield (base / os.pardir).abspath()
1202 yield (base / os.pardir).abspath()
1203 for child in base.listdir():
1203 for child in base.listdir():
1204 if self.dirs:
1204 if self.dirs:
1205 if self.files:
1205 if self.files:
1206 yield child
1206 yield child
1207 else:
1207 else:
1208 if child.isdir():
1208 if child.isdir():
1209 yield child
1209 yield child
1210 elif self.files:
1210 elif self.files:
1211 if not child.isdir():
1211 if not child.isdir():
1212 yield child
1212 yield child
1213
1213
1214 def __xrepr__(self, mode="default"):
1214 def __xrepr__(self, mode="default"):
1215 return ifile(self.base).__xrepr__(mode)
1215 return xrepr(ifile(self.base), mode)
1216
1216
1217 def __repr__(self):
1217 def __repr__(self):
1218 return "%s.%s(%r)" % \
1218 return "%s.%s(%r)" % \
1219 (self.__class__.__module__, self.__class__.__name__, self.base)
1219 (self.__class__.__module__, self.__class__.__name__, self.base)
1220
1220
1221
1221
1222 class iglob(Table):
1222 class iglob(Table):
1223 """
1223 """
1224 List all files and directories matching a specified pattern.
1224 List all files and directories matching a specified pattern.
1225 (See ``glob.glob()`` for more info.).
1225 (See ``glob.glob()`` for more info.).
1226
1226
1227 Examples:
1227 Examples:
1228
1228
1229 >>> iglob("*.py")
1229 >>> iglob("*.py")
1230 """
1230 """
1231 def __init__(self, glob):
1231 def __init__(self, glob):
1232 self.glob = glob
1232 self.glob = glob
1233
1233
1234 def __iter__(self):
1234 def __iter__(self):
1235 for name in glob.glob(self.glob):
1235 for name in glob.glob(self.glob):
1236 yield ifile(name)
1236 yield ifile(name)
1237
1237
1238 def __xrepr__(self, mode="default"):
1238 def __xrepr__(self, mode="default"):
1239 if mode == "header" or mode == "footer" or mode == "cell":
1239 if mode == "header" or mode == "footer" or mode == "cell":
1240 yield (astyle.style_default,
1240 yield (astyle.style_default,
1241 "%s(%r)" % (self.__class__.__name__, self.glob))
1241 "%s(%r)" % (self.__class__.__name__, self.glob))
1242 else:
1242 else:
1243 yield (astyle.style_default, repr(self))
1243 yield (astyle.style_default, repr(self))
1244
1244
1245 def __repr__(self):
1245 def __repr__(self):
1246 return "%s.%s(%r)" % \
1246 return "%s.%s(%r)" % \
1247 (self.__class__.__module__, self.__class__.__name__, self.glob)
1247 (self.__class__.__module__, self.__class__.__name__, self.glob)
1248
1248
1249
1249
1250 class iwalk(Table):
1250 class iwalk(Table):
1251 """
1251 """
1252 List all files and directories in a directory and it's subdirectory.
1252 List all files and directories in a directory and it's subdirectory.
1253
1253
1254 >>> iwalk
1254 >>> iwalk
1255 >>> iwalk("/usr/local/lib/python2.4")
1255 >>> iwalk("/usr/local/lib/python2.4")
1256 >>> iwalk("~")
1256 >>> iwalk("~")
1257 """
1257 """
1258 def __init__(self, base=os.curdir, dirs=True, files=True):
1258 def __init__(self, base=os.curdir, dirs=True, files=True):
1259 self.base = os.path.expanduser(base)
1259 self.base = os.path.expanduser(base)
1260 self.dirs = dirs
1260 self.dirs = dirs
1261 self.files = files
1261 self.files = files
1262
1262
1263 def __iter__(self):
1263 def __iter__(self):
1264 for (dirpath, dirnames, filenames) in os.walk(self.base):
1264 for (dirpath, dirnames, filenames) in os.walk(self.base):
1265 if self.dirs:
1265 if self.dirs:
1266 for name in sorted(dirnames):
1266 for name in sorted(dirnames):
1267 yield ifile(os.path.join(dirpath, name))
1267 yield ifile(os.path.join(dirpath, name))
1268 if self.files:
1268 if self.files:
1269 for name in sorted(filenames):
1269 for name in sorted(filenames):
1270 yield ifile(os.path.join(dirpath, name))
1270 yield ifile(os.path.join(dirpath, name))
1271
1271
1272 def __xrepr__(self, mode="default"):
1272 def __xrepr__(self, mode="default"):
1273 if mode == "header" or mode == "footer" or mode == "cell":
1273 if mode == "header" or mode == "footer" or mode == "cell":
1274 yield (astyle.style_default,
1274 yield (astyle.style_default,
1275 "%s(%r)" % (self.__class__.__name__, self.base))
1275 "%s(%r)" % (self.__class__.__name__, self.base))
1276 else:
1276 else:
1277 yield (astyle.style_default, repr(self))
1277 yield (astyle.style_default, repr(self))
1278
1278
1279 def __repr__(self):
1279 def __repr__(self):
1280 return "%s.%s(%r)" % \
1280 return "%s.%s(%r)" % \
1281 (self.__class__.__module__, self.__class__.__name__, self.base)
1281 (self.__class__.__module__, self.__class__.__name__, self.base)
1282
1282
1283
1283
1284 class ipwdentry(object):
1284 class ipwdentry(object):
1285 """
1285 """
1286 ``ipwdentry`` objects encapsulate entries in the Unix user account and
1286 ``ipwdentry`` objects encapsulate entries in the Unix user account and
1287 password database.
1287 password database.
1288 """
1288 """
1289 def __init__(self, id):
1289 def __init__(self, id):
1290 self._id = id
1290 self._id = id
1291 self._entry = None
1291 self._entry = None
1292
1292
1293 def _getentry(self):
1293 def _getentry(self):
1294 if self._entry is None:
1294 if self._entry is None:
1295 if isinstance(self._id, basestring):
1295 if isinstance(self._id, basestring):
1296 self._entry = pwd.getpwnam(self._id)
1296 self._entry = pwd.getpwnam(self._id)
1297 else:
1297 else:
1298 self._entry = pwd.getpwuid(self._id)
1298 self._entry = pwd.getpwuid(self._id)
1299 return self._entry
1299 return self._entry
1300
1300
1301 def getname(self):
1301 def getname(self):
1302 if isinstance(self._id, basestring):
1302 if isinstance(self._id, basestring):
1303 return self._id
1303 return self._id
1304 else:
1304 else:
1305 return self._getentry().pw_name
1305 return self._getentry().pw_name
1306 name = property(getname, None, None, "User name")
1306 name = property(getname, None, None, "User name")
1307
1307
1308 def getpasswd(self):
1308 def getpasswd(self):
1309 return self._getentry().pw_passwd
1309 return self._getentry().pw_passwd
1310 passwd = property(getpasswd, None, None, "Password")
1310 passwd = property(getpasswd, None, None, "Password")
1311
1311
1312 def getuid(self):
1312 def getuid(self):
1313 if isinstance(self._id, basestring):
1313 if isinstance(self._id, basestring):
1314 return self._getentry().pw_uid
1314 return self._getentry().pw_uid
1315 else:
1315 else:
1316 return self._id
1316 return self._id
1317 uid = property(getuid, None, None, "User id")
1317 uid = property(getuid, None, None, "User id")
1318
1318
1319 def getgid(self):
1319 def getgid(self):
1320 return self._getentry().pw_gid
1320 return self._getentry().pw_gid
1321 gid = property(getgid, None, None, "Primary group id")
1321 gid = property(getgid, None, None, "Primary group id")
1322
1322
1323 def getgroup(self):
1323 def getgroup(self):
1324 return igrpentry(self.gid)
1324 return igrpentry(self.gid)
1325 group = property(getgroup, None, None, "Group")
1325 group = property(getgroup, None, None, "Group")
1326
1326
1327 def getgecos(self):
1327 def getgecos(self):
1328 return self._getentry().pw_gecos
1328 return self._getentry().pw_gecos
1329 gecos = property(getgecos, None, None, "Information (e.g. full user name)")
1329 gecos = property(getgecos, None, None, "Information (e.g. full user name)")
1330
1330
1331 def getdir(self):
1331 def getdir(self):
1332 return self._getentry().pw_dir
1332 return self._getentry().pw_dir
1333 dir = property(getdir, None, None, "$HOME directory")
1333 dir = property(getdir, None, None, "$HOME directory")
1334
1334
1335 def getshell(self):
1335 def getshell(self):
1336 return self._getentry().pw_shell
1336 return self._getentry().pw_shell
1337 shell = property(getshell, None, None, "Login shell")
1337 shell = property(getshell, None, None, "Login shell")
1338
1338
1339 def __xattrs__(self, mode="default"):
1339 def __xattrs__(self, mode="default"):
1340 return ("name", "passwd", "uid", "gid", "gecos", "dir", "shell")
1340 return ("name", "passwd", "uid", "gid", "gecos", "dir", "shell")
1341
1341
1342 def __repr__(self):
1342 def __repr__(self):
1343 return "%s.%s(%r)" % \
1343 return "%s.%s(%r)" % \
1344 (self.__class__.__module__, self.__class__.__name__, self._id)
1344 (self.__class__.__module__, self.__class__.__name__, self._id)
1345
1345
1346
1346
1347 class ipwd(Table):
1347 class ipwd(Table):
1348 """
1348 """
1349 List all entries in the Unix user account and password database.
1349 List all entries in the Unix user account and password database.
1350
1350
1351 Example:
1351 Example:
1352
1352
1353 >>> ipwd | isort("uid")
1353 >>> ipwd | isort("uid")
1354 """
1354 """
1355 def __iter__(self):
1355 def __iter__(self):
1356 for entry in pwd.getpwall():
1356 for entry in pwd.getpwall():
1357 yield ipwdentry(entry.pw_name)
1357 yield ipwdentry(entry.pw_name)
1358
1358
1359 def __xrepr__(self, mode="default"):
1359 def __xrepr__(self, mode="default"):
1360 if mode == "header" or mode == "footer" or mode == "cell":
1360 if mode == "header" or mode == "footer" or mode == "cell":
1361 yield (astyle.style_default, "%s()" % self.__class__.__name__)
1361 yield (astyle.style_default, "%s()" % self.__class__.__name__)
1362 else:
1362 else:
1363 yield (astyle.style_default, repr(self))
1363 yield (astyle.style_default, repr(self))
1364
1364
1365
1365
1366 class igrpentry(object):
1366 class igrpentry(object):
1367 """
1367 """
1368 ``igrpentry`` objects encapsulate entries in the Unix group database.
1368 ``igrpentry`` objects encapsulate entries in the Unix group database.
1369 """
1369 """
1370 def __init__(self, id):
1370 def __init__(self, id):
1371 self._id = id
1371 self._id = id
1372 self._entry = None
1372 self._entry = None
1373
1373
1374 def _getentry(self):
1374 def _getentry(self):
1375 if self._entry is None:
1375 if self._entry is None:
1376 if isinstance(self._id, basestring):
1376 if isinstance(self._id, basestring):
1377 self._entry = grp.getgrnam(self._id)
1377 self._entry = grp.getgrnam(self._id)
1378 else:
1378 else:
1379 self._entry = grp.getgrgid(self._id)
1379 self._entry = grp.getgrgid(self._id)
1380 return self._entry
1380 return self._entry
1381
1381
1382 def getname(self):
1382 def getname(self):
1383 if isinstance(self._id, basestring):
1383 if isinstance(self._id, basestring):
1384 return self._id
1384 return self._id
1385 else:
1385 else:
1386 return self._getentry().gr_name
1386 return self._getentry().gr_name
1387 name = property(getname, None, None, "Group name")
1387 name = property(getname, None, None, "Group name")
1388
1388
1389 def getpasswd(self):
1389 def getpasswd(self):
1390 return self._getentry().gr_passwd
1390 return self._getentry().gr_passwd
1391 passwd = property(getpasswd, None, None, "Password")
1391 passwd = property(getpasswd, None, None, "Password")
1392
1392
1393 def getgid(self):
1393 def getgid(self):
1394 if isinstance(self._id, basestring):
1394 if isinstance(self._id, basestring):
1395 return self._getentry().gr_gid
1395 return self._getentry().gr_gid
1396 else:
1396 else:
1397 return self._id
1397 return self._id
1398 gid = property(getgid, None, None, "Group id")
1398 gid = property(getgid, None, None, "Group id")
1399
1399
1400 def getmem(self):
1400 def getmem(self):
1401 return self._getentry().gr_mem
1401 return self._getentry().gr_mem
1402 mem = property(getmem, None, None, "Members")
1402 mem = property(getmem, None, None, "Members")
1403
1403
1404 def __xattrs__(self, mode="default"):
1404 def __xattrs__(self, mode="default"):
1405 return ("name", "passwd", "gid", "mem")
1405 return ("name", "passwd", "gid", "mem")
1406
1406
1407 def __xrepr__(self, mode="default"):
1407 def __xrepr__(self, mode="default"):
1408 if mode == "header" or mode == "footer" or mode == "cell":
1408 if mode == "header" or mode == "footer" or mode == "cell":
1409 yield (astyle.style_default, "group ")
1409 yield (astyle.style_default, "group ")
1410 try:
1410 try:
1411 yield (astyle.style_default, self.name)
1411 yield (astyle.style_default, self.name)
1412 except KeyError:
1412 except KeyError:
1413 if isinstance(self._id, basestring):
1413 if isinstance(self._id, basestring):
1414 yield (astyle.style_default, self.name_id)
1414 yield (astyle.style_default, self.name_id)
1415 else:
1415 else:
1416 yield (astyle.style_type_number, str(self._id))
1416 yield (astyle.style_type_number, str(self._id))
1417 else:
1417 else:
1418 yield (astyle.style_default, repr(self))
1418 yield (astyle.style_default, repr(self))
1419
1419
1420 def __iter__(self):
1420 def __iter__(self):
1421 for member in self.mem:
1421 for member in self.mem:
1422 yield ipwdentry(member)
1422 yield ipwdentry(member)
1423
1423
1424 def __repr__(self):
1424 def __repr__(self):
1425 return "%s.%s(%r)" % \
1425 return "%s.%s(%r)" % \
1426 (self.__class__.__module__, self.__class__.__name__, self._id)
1426 (self.__class__.__module__, self.__class__.__name__, self._id)
1427
1427
1428
1428
1429 class igrp(Table):
1429 class igrp(Table):
1430 """
1430 """
1431 This ``Table`` lists all entries in the Unix group database.
1431 This ``Table`` lists all entries in the Unix group database.
1432 """
1432 """
1433 def __iter__(self):
1433 def __iter__(self):
1434 for entry in grp.getgrall():
1434 for entry in grp.getgrall():
1435 yield igrpentry(entry.gr_name)
1435 yield igrpentry(entry.gr_name)
1436
1436
1437 def __xrepr__(self, mode="default"):
1437 def __xrepr__(self, mode="default"):
1438 if mode == "header" or mode == "footer":
1438 if mode == "header" or mode == "footer":
1439 yield (astyle.style_default, "%s()" % self.__class__.__name__)
1439 yield (astyle.style_default, "%s()" % self.__class__.__name__)
1440 else:
1440 else:
1441 yield (astyle.style_default, repr(self))
1441 yield (astyle.style_default, repr(self))
1442
1442
1443
1443
1444 class Fields(object):
1444 class Fields(object):
1445 def __init__(self, fieldnames, **fields):
1445 def __init__(self, fieldnames, **fields):
1446 self.__fieldnames = [upgradexattr(fieldname) for fieldname in fieldnames]
1446 self.__fieldnames = [upgradexattr(fieldname) for fieldname in fieldnames]
1447 for (key, value) in fields.iteritems():
1447 for (key, value) in fields.iteritems():
1448 setattr(self, key, value)
1448 setattr(self, key, value)
1449
1449
1450 def __xattrs__(self, mode="default"):
1450 def __xattrs__(self, mode="default"):
1451 return self.__fieldnames
1451 return self.__fieldnames
1452
1452
1453 def __xrepr__(self, mode="default"):
1453 def __xrepr__(self, mode="default"):
1454 yield (-1, False)
1454 yield (-1, False)
1455 if mode == "header" or mode == "cell":
1455 if mode == "header" or mode == "cell":
1456 yield (astyle.style_default, self.__class__.__name__)
1456 yield (astyle.style_default, self.__class__.__name__)
1457 yield (astyle.style_default, "(")
1457 yield (astyle.style_default, "(")
1458 for (i, f) in enumerate(self.__fieldnames):
1458 for (i, f) in enumerate(self.__fieldnames):
1459 if i:
1459 if i:
1460 yield (astyle.style_default, ", ")
1460 yield (astyle.style_default, ", ")
1461 yield (astyle.style_default, f.name())
1461 yield (astyle.style_default, f.name())
1462 yield (astyle.style_default, "=")
1462 yield (astyle.style_default, "=")
1463 for part in xrepr(getattr(self, f), "default"):
1463 for part in xrepr(getattr(self, f), "default"):
1464 yield part
1464 yield part
1465 yield (astyle.style_default, ")")
1465 yield (astyle.style_default, ")")
1466 elif mode == "footer":
1466 elif mode == "footer":
1467 yield (astyle.style_default, self.__class__.__name__)
1467 yield (astyle.style_default, self.__class__.__name__)
1468 yield (astyle.style_default, "(")
1468 yield (astyle.style_default, "(")
1469 for (i, f) in enumerate(self.__fieldnames):
1469 for (i, f) in enumerate(self.__fieldnames):
1470 if i:
1470 if i:
1471 yield (astyle.style_default, ", ")
1471 yield (astyle.style_default, ", ")
1472 yield (astyle.style_default, f.name())
1472 yield (astyle.style_default, f.name())
1473 yield (astyle.style_default, ")")
1473 yield (astyle.style_default, ")")
1474 else:
1474 else:
1475 yield (astyle.style_default, repr(self))
1475 yield (astyle.style_default, repr(self))
1476
1476
1477
1477
1478 class FieldTable(Table, list):
1478 class FieldTable(Table, list):
1479 def __init__(self, *fields):
1479 def __init__(self, *fields):
1480 Table.__init__(self)
1480 Table.__init__(self)
1481 list.__init__(self)
1481 list.__init__(self)
1482 self.fields = fields
1482 self.fields = fields
1483
1483
1484 def add(self, **fields):
1484 def add(self, **fields):
1485 self.append(Fields(self.fields, **fields))
1485 self.append(Fields(self.fields, **fields))
1486
1486
1487 def __xrepr__(self, mode="default"):
1487 def __xrepr__(self, mode="default"):
1488 yield (-1, False)
1488 yield (-1, False)
1489 if mode == "header" or mode == "footer":
1489 if mode == "header" or mode == "footer":
1490 yield (astyle.style_default, self.__class__.__name__)
1490 yield (astyle.style_default, self.__class__.__name__)
1491 yield (astyle.style_default, "(")
1491 yield (astyle.style_default, "(")
1492 for (i, f) in enumerate(self.__fieldnames):
1492 for (i, f) in enumerate(self.__fieldnames):
1493 if i:
1493 if i:
1494 yield (astyle.style_default, ", ")
1494 yield (astyle.style_default, ", ")
1495 yield (astyle.style_default, f)
1495 yield (astyle.style_default, f)
1496 yield (astyle.style_default, ")")
1496 yield (astyle.style_default, ")")
1497 else:
1497 else:
1498 yield (astyle.style_default, repr(self))
1498 yield (astyle.style_default, repr(self))
1499
1499
1500 def __repr__(self):
1500 def __repr__(self):
1501 return "<%s.%s object with fields=%r at 0x%x>" % \
1501 return "<%s.%s object with fields=%r at 0x%x>" % \
1502 (self.__class__.__module__, self.__class__.__name__,
1502 (self.__class__.__module__, self.__class__.__name__,
1503 ", ".join(map(repr, self.fields)), id(self))
1503 ", ".join(map(repr, self.fields)), id(self))
1504
1504
1505
1505
1506 class List(list):
1506 class List(list):
1507 def __xattrs__(self, mode="default"):
1507 def __xattrs__(self, mode="default"):
1508 return xrange(len(self))
1508 return xrange(len(self))
1509
1509
1510 def __xrepr__(self, mode="default"):
1510 def __xrepr__(self, mode="default"):
1511 yield (-1, False)
1511 yield (-1, False)
1512 if mode == "header" or mode == "cell" or mode == "footer" or mode == "default":
1512 if mode == "header" or mode == "cell" or mode == "footer" or mode == "default":
1513 yield (astyle.style_default, self.__class__.__name__)
1513 yield (astyle.style_default, self.__class__.__name__)
1514 yield (astyle.style_default, "(")
1514 yield (astyle.style_default, "(")
1515 for (i, item) in enumerate(self):
1515 for (i, item) in enumerate(self):
1516 if i:
1516 if i:
1517 yield (astyle.style_default, ", ")
1517 yield (astyle.style_default, ", ")
1518 for part in xrepr(item, "default"):
1518 for part in xrepr(item, "default"):
1519 yield part
1519 yield part
1520 yield (astyle.style_default, ")")
1520 yield (astyle.style_default, ")")
1521 else:
1521 else:
1522 yield (astyle.style_default, repr(self))
1522 yield (astyle.style_default, repr(self))
1523
1523
1524
1524
1525 class ienv(Table):
1525 class ienv(Table):
1526 """
1526 """
1527 List environment variables.
1527 List environment variables.
1528
1528
1529 Example:
1529 Example:
1530
1530
1531 >>> ienv
1531 >>> ienv
1532 """
1532 """
1533
1533
1534 def __iter__(self):
1534 def __iter__(self):
1535 fields = ("key", "value")
1535 fields = ("key", "value")
1536 for (key, value) in os.environ.iteritems():
1536 for (key, value) in os.environ.iteritems():
1537 yield Fields(fields, key=key, value=value)
1537 yield Fields(fields, key=key, value=value)
1538
1538
1539 def __xrepr__(self, mode="default"):
1539 def __xrepr__(self, mode="default"):
1540 if mode == "header" or mode == "cell":
1540 if mode == "header" or mode == "cell":
1541 yield (astyle.style_default, "%s()" % self.__class__.__name__)
1541 yield (astyle.style_default, "%s()" % self.__class__.__name__)
1542 else:
1542 else:
1543 yield (astyle.style_default, repr(self))
1543 yield (astyle.style_default, repr(self))
1544
1544
1545
1545
1546 class icsv(Pipe):
1546 class icsv(Pipe):
1547 """
1547 """
1548 This ``Pipe`` lists turn the input (with must be a pipe outputting lines
1548 This ``Pipe`` lists turn the input (with must be a pipe outputting lines
1549 or an ``ifile``) into lines of CVS columns.
1549 or an ``ifile``) into lines of CVS columns.
1550 """
1550 """
1551 def __init__(self, **csvargs):
1551 def __init__(self, **csvargs):
1552 """
1552 """
1553 Create an ``icsv`` object. ``cvsargs`` will be passed through as
1553 Create an ``icsv`` object. ``cvsargs`` will be passed through as
1554 keyword arguments to ``cvs.reader()``.
1554 keyword arguments to ``cvs.reader()``.
1555 """
1555 """
1556 self.csvargs = csvargs
1556 self.csvargs = csvargs
1557
1557
1558 def __iter__(self):
1558 def __iter__(self):
1559 input = self.input
1559 input = self.input
1560 if isinstance(input, ifile):
1560 if isinstance(input, ifile):
1561 input = input.open("rb")
1561 input = input.open("rb")
1562 reader = csv.reader(input, **self.csvargs)
1562 reader = csv.reader(input, **self.csvargs)
1563 for line in reader:
1563 for line in reader:
1564 yield List(line)
1564 yield List(line)
1565
1565
1566 def __xrepr__(self, mode="default"):
1566 def __xrepr__(self, mode="default"):
1567 yield (-1, False)
1567 yield (-1, False)
1568 if mode == "header" or mode == "footer":
1568 if mode == "header" or mode == "footer":
1569 input = getattr(self, "input", None)
1569 input = getattr(self, "input", None)
1570 if input is not None:
1570 if input is not None:
1571 for part in xrepr(input, mode):
1571 for part in xrepr(input, mode):
1572 yield part
1572 yield part
1573 yield (astyle.style_default, " | ")
1573 yield (astyle.style_default, " | ")
1574 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1574 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1575 for (i, (name, value)) in enumerate(self.csvargs.iteritems()):
1575 for (i, (name, value)) in enumerate(self.csvargs.iteritems()):
1576 if i:
1576 if i:
1577 yield (astyle.style_default, ", ")
1577 yield (astyle.style_default, ", ")
1578 yield (astyle.style_default, name)
1578 yield (astyle.style_default, name)
1579 yield (astyle.style_default, "=")
1579 yield (astyle.style_default, "=")
1580 for part in xrepr(value, "default"):
1580 for part in xrepr(value, "default"):
1581 yield part
1581 yield part
1582 yield (astyle.style_default, ")")
1582 yield (astyle.style_default, ")")
1583 else:
1583 else:
1584 yield (astyle.style_default, repr(self))
1584 yield (astyle.style_default, repr(self))
1585
1585
1586 def __repr__(self):
1586 def __repr__(self):
1587 args = ", ".join(["%s=%r" % item for item in self.csvargs.iteritems()])
1587 args = ", ".join(["%s=%r" % item for item in self.csvargs.iteritems()])
1588 return "<%s.%s %s at 0x%x>" % \
1588 return "<%s.%s %s at 0x%x>" % \
1589 (self.__class__.__module__, self.__class__.__name__, args, id(self))
1589 (self.__class__.__module__, self.__class__.__name__, args, id(self))
1590
1590
1591
1591
1592 class ix(Table):
1592 class ix(Table):
1593 """
1593 """
1594 Execute a system command and list its output as lines
1594 Execute a system command and list its output as lines
1595 (similar to ``os.popen()``).
1595 (similar to ``os.popen()``).
1596
1596
1597 Examples:
1597 Examples:
1598
1598
1599 >>> ix("ps x")
1599 >>> ix("ps x")
1600 >>> ix("find .") | ifile
1600 >>> ix("find .") | ifile
1601 """
1601 """
1602 def __init__(self, cmd):
1602 def __init__(self, cmd):
1603 self.cmd = cmd
1603 self.cmd = cmd
1604 self._pipeout = None
1604 self._pipeout = None
1605
1605
1606 def __iter__(self):
1606 def __iter__(self):
1607 (_pipein, self._pipeout) = os.popen4(self.cmd)
1607 (_pipein, self._pipeout) = os.popen4(self.cmd)
1608 _pipein.close()
1608 _pipein.close()
1609 for l in self._pipeout:
1609 for l in self._pipeout:
1610 yield l.rstrip("\r\n")
1610 yield l.rstrip("\r\n")
1611 self._pipeout.close()
1611 self._pipeout.close()
1612 self._pipeout = None
1612 self._pipeout = None
1613
1613
1614 def __del__(self):
1614 def __del__(self):
1615 if self._pipeout is not None and not self._pipeout.closed:
1615 if self._pipeout is not None and not self._pipeout.closed:
1616 self._pipeout.close()
1616 self._pipeout.close()
1617 self._pipeout = None
1617 self._pipeout = None
1618
1618
1619 def __xrepr__(self, mode="default"):
1619 def __xrepr__(self, mode="default"):
1620 if mode == "header" or mode == "footer":
1620 if mode == "header" or mode == "footer":
1621 yield (astyle.style_default,
1621 yield (astyle.style_default,
1622 "%s(%r)" % (self.__class__.__name__, self.cmd))
1622 "%s(%r)" % (self.__class__.__name__, self.cmd))
1623 else:
1623 else:
1624 yield (astyle.style_default, repr(self))
1624 yield (astyle.style_default, repr(self))
1625
1625
1626 def __repr__(self):
1626 def __repr__(self):
1627 return "%s.%s(%r)" % \
1627 return "%s.%s(%r)" % \
1628 (self.__class__.__module__, self.__class__.__name__, self.cmd)
1628 (self.__class__.__module__, self.__class__.__name__, self.cmd)
1629
1629
1630
1630
1631 class ifilter(Pipe):
1631 class ifilter(Pipe):
1632 """
1632 """
1633 Filter an input pipe. Only objects where an expression evaluates to true
1633 Filter an input pipe. Only objects where an expression evaluates to true
1634 (and doesn't raise an exception) are listed.
1634 (and doesn't raise an exception) are listed.
1635
1635
1636 Examples:
1636 Examples:
1637
1637
1638 >>> ils | ifilter("_.isfile() and size>1000")
1638 >>> ils | ifilter("_.isfile() and size>1000")
1639 >>> igrp | ifilter("len(mem)")
1639 >>> igrp | ifilter("len(mem)")
1640 >>> sys.modules | ifilter(lambda _:_.value is not None)
1640 >>> sys.modules | ifilter(lambda _:_.value is not None)
1641 """
1641 """
1642
1642
1643 def __init__(self, expr, globals=None, errors="raiseifallfail"):
1643 def __init__(self, expr, globals=None, errors="raiseifallfail"):
1644 """
1644 """
1645 Create an ``ifilter`` object. ``expr`` can be a callable or a string
1645 Create an ``ifilter`` object. ``expr`` can be a callable or a string
1646 containing an expression. ``globals`` will be used as the global
1646 containing an expression. ``globals`` will be used as the global
1647 namespace for calling string expressions (defaulting to IPython's
1647 namespace for calling string expressions (defaulting to IPython's
1648 user namespace). ``errors`` specifies how exception during evaluation
1648 user namespace). ``errors`` specifies how exception during evaluation
1649 of ``expr`` are handled:
1649 of ``expr`` are handled:
1650
1650
1651 * ``drop``: drop all items that have errors;
1651 * ``drop``: drop all items that have errors;
1652
1652
1653 * ``keep``: keep all items that have errors;
1653 * ``keep``: keep all items that have errors;
1654
1654
1655 * ``keeperror``: keep the exception of all items that have errors;
1655 * ``keeperror``: keep the exception of all items that have errors;
1656
1656
1657 * ``raise``: raise the exception;
1657 * ``raise``: raise the exception;
1658
1658
1659 * ``raiseifallfail``: raise the first exception if all items have errors;
1659 * ``raiseifallfail``: raise the first exception if all items have errors;
1660 otherwise drop those with errors (this is the default).
1660 otherwise drop those with errors (this is the default).
1661 """
1661 """
1662 self.expr = expr
1662 self.expr = expr
1663 self.globals = globals
1663 self.globals = globals
1664 self.errors = errors
1664 self.errors = errors
1665
1665
1666 def __iter__(self):
1666 def __iter__(self):
1667 if callable(self.expr):
1667 if callable(self.expr):
1668 test = self.expr
1668 test = self.expr
1669 else:
1669 else:
1670 g = getglobals(self.globals)
1670 g = getglobals(self.globals)
1671 expr = compile(self.expr, "ipipe-expression", "eval")
1671 expr = compile(self.expr, "ipipe-expression", "eval")
1672 def test(item):
1672 def test(item):
1673 return eval(expr, g, AttrNamespace(item))
1673 return eval(expr, g, AttrNamespace(item))
1674
1674
1675 ok = 0
1675 ok = 0
1676 exc_info = None
1676 exc_info = None
1677 for item in xiter(self.input):
1677 for item in xiter(self.input):
1678 try:
1678 try:
1679 if test(item):
1679 if test(item):
1680 yield item
1680 yield item
1681 ok += 1
1681 ok += 1
1682 except (KeyboardInterrupt, SystemExit):
1682 except (KeyboardInterrupt, SystemExit):
1683 raise
1683 raise
1684 except Exception, exc:
1684 except Exception, exc:
1685 if self.errors == "drop":
1685 if self.errors == "drop":
1686 pass # Ignore errors
1686 pass # Ignore errors
1687 elif self.errors == "keep":
1687 elif self.errors == "keep":
1688 yield item
1688 yield item
1689 elif self.errors == "keeperror":
1689 elif self.errors == "keeperror":
1690 yield exc
1690 yield exc
1691 elif self.errors == "raise":
1691 elif self.errors == "raise":
1692 raise
1692 raise
1693 elif self.errors == "raiseifallfail":
1693 elif self.errors == "raiseifallfail":
1694 if exc_info is None:
1694 if exc_info is None:
1695 exc_info = sys.exc_info()
1695 exc_info = sys.exc_info()
1696 if not ok and exc_info is not None:
1696 if not ok and exc_info is not None:
1697 raise exc_info[0], exc_info[1], exc_info[2]
1697 raise exc_info[0], exc_info[1], exc_info[2]
1698
1698
1699 def __xrepr__(self, mode="default"):
1699 def __xrepr__(self, mode="default"):
1700 if mode == "header" or mode == "footer":
1700 if mode == "header" or mode == "footer":
1701 input = getattr(self, "input", None)
1701 input = getattr(self, "input", None)
1702 if input is not None:
1702 if input is not None:
1703 for part in xrepr(input, mode):
1703 for part in xrepr(input, mode):
1704 yield part
1704 yield part
1705 yield (astyle.style_default, " | ")
1705 yield (astyle.style_default, " | ")
1706 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1706 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1707 for part in xrepr(self.expr, "default"):
1707 for part in xrepr(self.expr, "default"):
1708 yield part
1708 yield part
1709 yield (astyle.style_default, ")")
1709 yield (astyle.style_default, ")")
1710 else:
1710 else:
1711 yield (astyle.style_default, repr(self))
1711 yield (astyle.style_default, repr(self))
1712
1712
1713 def __repr__(self):
1713 def __repr__(self):
1714 return "<%s.%s expr=%r at 0x%x>" % \
1714 return "<%s.%s expr=%r at 0x%x>" % \
1715 (self.__class__.__module__, self.__class__.__name__,
1715 (self.__class__.__module__, self.__class__.__name__,
1716 self.expr, id(self))
1716 self.expr, id(self))
1717
1717
1718
1718
1719 class ieval(Pipe):
1719 class ieval(Pipe):
1720 """
1720 """
1721 Evaluate an expression for each object in the input pipe.
1721 Evaluate an expression for each object in the input pipe.
1722
1722
1723 Examples:
1723 Examples:
1724
1724
1725 >>> ils | ieval("_.abspath()")
1725 >>> ils | ieval("_.abspath()")
1726 >>> sys.path | ieval(ifile)
1726 >>> sys.path | ieval(ifile)
1727 """
1727 """
1728
1728
1729 def __init__(self, expr, globals=None, errors="raiseifallfail"):
1729 def __init__(self, expr, globals=None, errors="raiseifallfail"):
1730 """
1730 """
1731 Create an ``ieval`` object. ``expr`` can be a callable or a string
1731 Create an ``ieval`` object. ``expr`` can be a callable or a string
1732 containing an expression. For the meaning of ``globals`` and
1732 containing an expression. For the meaning of ``globals`` and
1733 ``errors`` see ``ifilter``.
1733 ``errors`` see ``ifilter``.
1734 """
1734 """
1735 self.expr = expr
1735 self.expr = expr
1736 self.globals = globals
1736 self.globals = globals
1737 self.errors = errors
1737 self.errors = errors
1738
1738
1739 def __iter__(self):
1739 def __iter__(self):
1740 if callable(self.expr):
1740 if callable(self.expr):
1741 do = self.expr
1741 do = self.expr
1742 else:
1742 else:
1743 g = getglobals(self.globals)
1743 g = getglobals(self.globals)
1744 expr = compile(self.expr, "ipipe-expression", "eval")
1744 expr = compile(self.expr, "ipipe-expression", "eval")
1745 def do(item):
1745 def do(item):
1746 return eval(expr, g, AttrNamespace(item))
1746 return eval(expr, g, AttrNamespace(item))
1747
1747
1748 ok = 0
1748 ok = 0
1749 exc_info = None
1749 exc_info = None
1750 for item in xiter(self.input):
1750 for item in xiter(self.input):
1751 try:
1751 try:
1752 yield do(item)
1752 yield do(item)
1753 except (KeyboardInterrupt, SystemExit):
1753 except (KeyboardInterrupt, SystemExit):
1754 raise
1754 raise
1755 except Exception, exc:
1755 except Exception, exc:
1756 if self.errors == "drop":
1756 if self.errors == "drop":
1757 pass # Ignore errors
1757 pass # Ignore errors
1758 elif self.errors == "keep":
1758 elif self.errors == "keep":
1759 yield item
1759 yield item
1760 elif self.errors == "keeperror":
1760 elif self.errors == "keeperror":
1761 yield exc
1761 yield exc
1762 elif self.errors == "raise":
1762 elif self.errors == "raise":
1763 raise
1763 raise
1764 elif self.errors == "raiseifallfail":
1764 elif self.errors == "raiseifallfail":
1765 if exc_info is None:
1765 if exc_info is None:
1766 exc_info = sys.exc_info()
1766 exc_info = sys.exc_info()
1767 if not ok and exc_info is not None:
1767 if not ok and exc_info is not None:
1768 raise exc_info[0], exc_info[1], exc_info[2]
1768 raise exc_info[0], exc_info[1], exc_info[2]
1769
1769
1770 def __xrepr__(self, mode="default"):
1770 def __xrepr__(self, mode="default"):
1771 if mode == "header" or mode == "footer":
1771 if mode == "header" or mode == "footer":
1772 input = getattr(self, "input", None)
1772 input = getattr(self, "input", None)
1773 if input is not None:
1773 if input is not None:
1774 for part in xrepr(input, mode):
1774 for part in xrepr(input, mode):
1775 yield part
1775 yield part
1776 yield (astyle.style_default, " | ")
1776 yield (astyle.style_default, " | ")
1777 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1777 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1778 for part in xrepr(self.expr, "default"):
1778 for part in xrepr(self.expr, "default"):
1779 yield part
1779 yield part
1780 yield (astyle.style_default, ")")
1780 yield (astyle.style_default, ")")
1781 else:
1781 else:
1782 yield (astyle.style_default, repr(self))
1782 yield (astyle.style_default, repr(self))
1783
1783
1784 def __repr__(self):
1784 def __repr__(self):
1785 return "<%s.%s expr=%r at 0x%x>" % \
1785 return "<%s.%s expr=%r at 0x%x>" % \
1786 (self.__class__.__module__, self.__class__.__name__,
1786 (self.__class__.__module__, self.__class__.__name__,
1787 self.expr, id(self))
1787 self.expr, id(self))
1788
1788
1789
1789
1790 class ienum(Pipe):
1790 class ienum(Pipe):
1791 """
1791 """
1792 Enumerate the input pipe (i.e. wrap each input object in an object
1792 Enumerate the input pipe (i.e. wrap each input object in an object
1793 with ``index`` and ``object`` attributes).
1793 with ``index`` and ``object`` attributes).
1794
1794
1795 Examples:
1795 Examples:
1796
1796
1797 >>> xrange(20) | ieval("_,_*_") | ienum | ifilter("index % 2 == 0") | ieval("object")
1797 >>> xrange(20) | ieval("_,_*_") | ienum | ifilter("index % 2 == 0") | ieval("object")
1798 """
1798 """
1799 def __iter__(self):
1799 def __iter__(self):
1800 fields = ("index", "object")
1800 fields = ("index", "object")
1801 for (index, object) in enumerate(xiter(self.input)):
1801 for (index, object) in enumerate(xiter(self.input)):
1802 yield Fields(fields, index=index, object=object)
1802 yield Fields(fields, index=index, object=object)
1803
1803
1804
1804
1805 class isort(Pipe):
1805 class isort(Pipe):
1806 """
1806 """
1807 Sorts the input pipe.
1807 Sorts the input pipe.
1808
1808
1809 Examples:
1809 Examples:
1810
1810
1811 >>> ils | isort("size")
1811 >>> ils | isort("size")
1812 >>> ils | isort("_.isdir(), _.lower()", reverse=True)
1812 >>> ils | isort("_.isdir(), _.lower()", reverse=True)
1813 """
1813 """
1814
1814
1815 def __init__(self, key=None, globals=None, reverse=False):
1815 def __init__(self, key=None, globals=None, reverse=False):
1816 """
1816 """
1817 Create an ``isort`` object. ``key`` can be a callable or a string
1817 Create an ``isort`` object. ``key`` can be a callable or a string
1818 containing an expression (or ``None`` in which case the items
1818 containing an expression (or ``None`` in which case the items
1819 themselves will be sorted). If ``reverse`` is true the sort order
1819 themselves will be sorted). If ``reverse`` is true the sort order
1820 will be reversed. For the meaning of ``globals`` see ``ifilter``.
1820 will be reversed. For the meaning of ``globals`` see ``ifilter``.
1821 """
1821 """
1822 self.key = key
1822 self.key = key
1823 self.globals = globals
1823 self.globals = globals
1824 self.reverse = reverse
1824 self.reverse = reverse
1825
1825
1826 def __iter__(self):
1826 def __iter__(self):
1827 if self.key is None:
1827 if self.key is None:
1828 items = sorted(xiter(self.input), reverse=self.reverse)
1828 items = sorted(xiter(self.input), reverse=self.reverse)
1829 elif callable(self.key):
1829 elif callable(self.key):
1830 items = sorted(xiter(self.input), key=self.key, reverse=self.reverse)
1830 items = sorted(xiter(self.input), key=self.key, reverse=self.reverse)
1831 else:
1831 else:
1832 g = getglobals(self.globals)
1832 g = getglobals(self.globals)
1833 key = compile(self.key, "ipipe-expression", "eval")
1833 key = compile(self.key, "ipipe-expression", "eval")
1834 def realkey(item):
1834 def realkey(item):
1835 return eval(key, g, AttrNamespace(item))
1835 return eval(key, g, AttrNamespace(item))
1836 items = sorted(xiter(self.input), key=realkey, reverse=self.reverse)
1836 items = sorted(xiter(self.input), key=realkey, reverse=self.reverse)
1837 for item in items:
1837 for item in items:
1838 yield item
1838 yield item
1839
1839
1840 def __xrepr__(self, mode="default"):
1840 def __xrepr__(self, mode="default"):
1841 if mode == "header" or mode == "footer":
1841 if mode == "header" or mode == "footer":
1842 input = getattr(self, "input", None)
1842 input = getattr(self, "input", None)
1843 if input is not None:
1843 if input is not None:
1844 for part in xrepr(input, mode):
1844 for part in xrepr(input, mode):
1845 yield part
1845 yield part
1846 yield (astyle.style_default, " | ")
1846 yield (astyle.style_default, " | ")
1847 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1847 yield (astyle.style_default, "%s(" % self.__class__.__name__)
1848 for part in xrepr(self.key, "default"):
1848 for part in xrepr(self.key, "default"):
1849 yield part
1849 yield part
1850 if self.reverse:
1850 if self.reverse:
1851 yield (astyle.style_default, ", ")
1851 yield (astyle.style_default, ", ")
1852 for part in xrepr(True, "default"):
1852 for part in xrepr(True, "default"):
1853 yield part
1853 yield part
1854 yield (astyle.style_default, ")")
1854 yield (astyle.style_default, ")")
1855 else:
1855 else:
1856 yield (astyle.style_default, repr(self))
1856 yield (astyle.style_default, repr(self))
1857
1857
1858 def __repr__(self):
1858 def __repr__(self):
1859 return "<%s.%s key=%r reverse=%r at 0x%x>" % \
1859 return "<%s.%s key=%r reverse=%r at 0x%x>" % \
1860 (self.__class__.__module__, self.__class__.__name__,
1860 (self.__class__.__module__, self.__class__.__name__,
1861 self.key, self.reverse, id(self))
1861 self.key, self.reverse, id(self))
1862
1862
1863
1863
1864 tab = 3 # for expandtabs()
1864 tab = 3 # for expandtabs()
1865
1865
1866 def _format(field):
1866 def _format(field):
1867 if isinstance(field, str):
1867 if isinstance(field, str):
1868 text = repr(field.expandtabs(tab))[1:-1]
1868 text = repr(field.expandtabs(tab))[1:-1]
1869 elif isinstance(field, unicode):
1869 elif isinstance(field, unicode):
1870 text = repr(field.expandtabs(tab))[2:-1]
1870 text = repr(field.expandtabs(tab))[2:-1]
1871 elif isinstance(field, datetime.datetime):
1871 elif isinstance(field, datetime.datetime):
1872 # Don't use strftime() here, as this requires year >= 1900
1872 # Don't use strftime() here, as this requires year >= 1900
1873 text = "%04d-%02d-%02d %02d:%02d:%02d.%06d" % \
1873 text = "%04d-%02d-%02d %02d:%02d:%02d.%06d" % \
1874 (field.year, field.month, field.day,
1874 (field.year, field.month, field.day,
1875 field.hour, field.minute, field.second, field.microsecond)
1875 field.hour, field.minute, field.second, field.microsecond)
1876 elif isinstance(field, datetime.date):
1876 elif isinstance(field, datetime.date):
1877 text = "%04d-%02d-%02d" % (field.year, field.month, field.day)
1877 text = "%04d-%02d-%02d" % (field.year, field.month, field.day)
1878 else:
1878 else:
1879 text = repr(field)
1879 text = repr(field)
1880 return text
1880 return text
1881
1881
1882
1882
1883 class Display(object):
1883 class Display(object):
1884 class __metaclass__(type):
1884 class __metaclass__(type):
1885 def __ror__(self, input):
1885 def __ror__(self, input):
1886 return input | self()
1886 return input | self()
1887
1887
1888 def __ror__(self, input):
1888 def __ror__(self, input):
1889 self.input = input
1889 self.input = input
1890 return self
1890 return self
1891
1891
1892 def display(self):
1892 def display(self):
1893 pass
1893 pass
1894
1894
1895
1895
1896 class iless(Display):
1896 class iless(Display):
1897 cmd = "less --quit-if-one-screen --LONG-PROMPT --LINE-NUMBERS --chop-long-lines --shift=8 --RAW-CONTROL-CHARS"
1897 cmd = "less --quit-if-one-screen --LONG-PROMPT --LINE-NUMBERS --chop-long-lines --shift=8 --RAW-CONTROL-CHARS"
1898
1898
1899 def display(self):
1899 def display(self):
1900 try:
1900 try:
1901 pager = os.popen(self.cmd, "w")
1901 pager = os.popen(self.cmd, "w")
1902 try:
1902 try:
1903 for item in xiter(self.input):
1903 for item in xiter(self.input):
1904 first = False
1904 first = False
1905 for attr in xattrs(item, "default"):
1905 for attr in xattrs(item, "default"):
1906 if first:
1906 if first:
1907 first = False
1907 first = False
1908 else:
1908 else:
1909 pager.write(" ")
1909 pager.write(" ")
1910 attr = upgradexattr(attr)
1910 attr = upgradexattr(attr)
1911 if not isinstance(attr, SelfDescriptor):
1911 if not isinstance(attr, SelfDescriptor):
1912 pager.write(attr.name())
1912 pager.write(attr.name())
1913 pager.write("=")
1913 pager.write("=")
1914 pager.write(str(attr.value(item)))
1914 pager.write(str(attr.value(item)))
1915 pager.write("\n")
1915 pager.write("\n")
1916 finally:
1916 finally:
1917 pager.close()
1917 pager.close()
1918 except Exception, exc:
1918 except Exception, exc:
1919 print "%s: %s" % (exc.__class__.__name__, str(exc))
1919 print "%s: %s" % (exc.__class__.__name__, str(exc))
1920
1920
1921
1921
1922 def xformat(value, mode, maxlength):
1922 def xformat(value, mode, maxlength):
1923 align = None
1923 align = None
1924 full = True
1924 full = True
1925 width = 0
1925 width = 0
1926 text = astyle.Text()
1926 text = astyle.Text()
1927 for (style, part) in xrepr(value, mode):
1927 for (style, part) in xrepr(value, mode):
1928 # only consider the first result
1928 # only consider the first result
1929 if align is None:
1929 if align is None:
1930 if isinstance(style, int):
1930 if isinstance(style, int):
1931 # (style, text) really is (alignment, stop)
1931 # (style, text) really is (alignment, stop)
1932 align = style
1932 align = style
1933 full = part
1933 full = part
1934 continue
1934 continue
1935 else:
1935 else:
1936 align = -1
1936 align = -1
1937 full = True
1937 full = True
1938 if not isinstance(style, int):
1938 if not isinstance(style, int):
1939 text.append((style, part))
1939 text.append((style, part))
1940 width += len(part)
1940 width += len(part)
1941 if width >= maxlength and not full:
1941 if width >= maxlength and not full:
1942 text.append((astyle.style_ellisis, "..."))
1942 text.append((astyle.style_ellisis, "..."))
1943 width += 3
1943 width += 3
1944 break
1944 break
1945 if align is None: # default to left alignment
1945 if align is None: # default to left alignment
1946 align = -1
1946 align = -1
1947 return (align, width, text)
1947 return (align, width, text)
1948
1948
1949
1949
1950 class idump(Display):
1950 class idump(Display):
1951 # The approximate maximum length of a column entry
1951 # The approximate maximum length of a column entry
1952 maxattrlength = 200
1952 maxattrlength = 200
1953
1953
1954 # Style for column names
1954 # Style for column names
1955 style_header = astyle.Style.fromstr("white:black:bold")
1955 style_header = astyle.Style.fromstr("white:black:bold")
1956
1956
1957 def __init__(self, *attrs):
1957 def __init__(self, *attrs):
1958 self.attrs = [upgradexattr(attr) for attr in attrs]
1958 self.attrs = [upgradexattr(attr) for attr in attrs]
1959 self.headerpadchar = " "
1959 self.headerpadchar = " "
1960 self.headersepchar = "|"
1960 self.headersepchar = "|"
1961 self.datapadchar = " "
1961 self.datapadchar = " "
1962 self.datasepchar = "|"
1962 self.datasepchar = "|"
1963
1963
1964 def display(self):
1964 def display(self):
1965 stream = genutils.Term.cout
1965 stream = genutils.Term.cout
1966 allattrs = []
1966 allattrs = []
1967 attrset = set()
1967 attrset = set()
1968 colwidths = {}
1968 colwidths = {}
1969 rows = []
1969 rows = []
1970 for item in xiter(self.input):
1970 for item in xiter(self.input):
1971 row = {}
1971 row = {}
1972 attrs = self.attrs
1972 attrs = self.attrs
1973 if not attrs:
1973 if not attrs:
1974 attrs = xattrs(item, "default")
1974 attrs = xattrs(item, "default")
1975 for attr in attrs:
1975 for attr in attrs:
1976 if attr not in attrset:
1976 if attr not in attrset:
1977 allattrs.append(attr)
1977 allattrs.append(attr)
1978 attrset.add(attr)
1978 attrset.add(attr)
1979 colwidths[attr] = len(attr.name())
1979 colwidths[attr] = len(attr.name())
1980 try:
1980 try:
1981 value = attr.value(item)
1981 value = attr.value(item)
1982 except (KeyboardInterrupt, SystemExit):
1982 except (KeyboardInterrupt, SystemExit):
1983 raise
1983 raise
1984 except Exception, exc:
1984 except Exception, exc:
1985 value = exc
1985 value = exc
1986 (align, width, text) = xformat(value, "cell", self.maxattrlength)
1986 (align, width, text) = xformat(value, "cell", self.maxattrlength)
1987 colwidths[attr] = max(colwidths[attr], width)
1987 colwidths[attr] = max(colwidths[attr], width)
1988 # remember alignment, length and colored parts
1988 # remember alignment, length and colored parts
1989 row[attr] = (align, width, text)
1989 row[attr] = (align, width, text)
1990 rows.append(row)
1990 rows.append(row)
1991
1991
1992 stream.write("\n")
1992 stream.write("\n")
1993 for (i, attr) in enumerate(allattrs):
1993 for (i, attr) in enumerate(allattrs):
1994 attrname = attr.name()
1994 attrname = attr.name()
1995 self.style_header(attrname).write(stream)
1995 self.style_header(attrname).write(stream)
1996 spc = colwidths[attr] - len(attrname)
1996 spc = colwidths[attr] - len(attrname)
1997 if i < len(colwidths)-1:
1997 if i < len(colwidths)-1:
1998 stream.write(self.headerpadchar*spc)
1998 stream.write(self.headerpadchar*spc)
1999 stream.write(self.headersepchar)
1999 stream.write(self.headersepchar)
2000 stream.write("\n")
2000 stream.write("\n")
2001
2001
2002 for row in rows:
2002 for row in rows:
2003 for (i, attr) in enumerate(allattrs):
2003 for (i, attr) in enumerate(allattrs):
2004 (align, width, text) = row[attr]
2004 (align, width, text) = row[attr]
2005 spc = colwidths[attr] - width
2005 spc = colwidths[attr] - width
2006 if align == -1:
2006 if align == -1:
2007 text.write(stream)
2007 text.write(stream)
2008 if i < len(colwidths)-1:
2008 if i < len(colwidths)-1:
2009 stream.write(self.datapadchar*spc)
2009 stream.write(self.datapadchar*spc)
2010 elif align == 0:
2010 elif align == 0:
2011 spc = colwidths[attr] - width
2011 spc = colwidths[attr] - width
2012 spc1 = spc//2
2012 spc1 = spc//2
2013 spc2 = spc-spc1
2013 spc2 = spc-spc1
2014 stream.write(self.datapadchar*spc1)
2014 stream.write(self.datapadchar*spc1)
2015 text.write(stream)
2015 text.write(stream)
2016 if i < len(colwidths)-1:
2016 if i < len(colwidths)-1:
2017 stream.write(self.datapadchar*spc2)
2017 stream.write(self.datapadchar*spc2)
2018 else:
2018 else:
2019 stream.write(self.datapadchar*spc)
2019 stream.write(self.datapadchar*spc)
2020 text.write(stream)
2020 text.write(stream)
2021 if i < len(colwidths)-1:
2021 if i < len(colwidths)-1:
2022 stream.write(self.datasepchar)
2022 stream.write(self.datasepchar)
2023 stream.write("\n")
2023 stream.write("\n")
2024
2024
2025
2025
2026 class AttributeDetail(Table):
2026 class AttributeDetail(Table):
2027 """
2027 """
2028 ``AttributeDetail`` objects are use for displaying a detailed list of object
2028 ``AttributeDetail`` objects are use for displaying a detailed list of object
2029 attributes.
2029 attributes.
2030 """
2030 """
2031 def __init__(self, object, descriptor):
2031 def __init__(self, object, descriptor):
2032 self.object = object
2032 self.object = object
2033 self.descriptor = descriptor
2033 self.descriptor = descriptor
2034
2034
2035 def __iter__(self):
2035 def __iter__(self):
2036 return self.descriptor.iter(self.object)
2036 return self.descriptor.iter(self.object)
2037
2037
2038 def name(self):
2038 def name(self):
2039 return self.descriptor.name()
2039 return self.descriptor.name()
2040
2040
2041 def attrtype(self):
2041 def attrtype(self):
2042 return self.descriptor.attrtype(self.object)
2042 return self.descriptor.attrtype(self.object)
2043
2043
2044 def valuetype(self):
2044 def valuetype(self):
2045 return self.descriptor.valuetype(self.object)
2045 return self.descriptor.valuetype(self.object)
2046
2046
2047 def doc(self):
2047 def doc(self):
2048 return self.descriptor.doc(self.object)
2048 return self.descriptor.doc(self.object)
2049
2049
2050 def shortdoc(self):
2050 def shortdoc(self):
2051 return self.descriptor.shortdoc(self.object)
2051 return self.descriptor.shortdoc(self.object)
2052
2052
2053 def value(self):
2053 def value(self):
2054 return self.descriptor.value(self.object)
2054 return self.descriptor.value(self.object)
2055
2055
2056 def __xattrs__(self, mode="default"):
2056 def __xattrs__(self, mode="default"):
2057 attrs = ("name()", "attrtype()", "valuetype()", "value()", "shortdoc()")
2057 attrs = ("name()", "attrtype()", "valuetype()", "value()", "shortdoc()")
2058 if mode == "detail":
2058 if mode == "detail":
2059 attrs += ("doc()",)
2059 attrs += ("doc()",)
2060 return attrs
2060 return attrs
2061
2061
2062 def __xrepr__(self, mode="default"):
2062 def __xrepr__(self, mode="default"):
2063 yield (-1, True)
2063 yield (-1, True)
2064 valuetype = self.valuetype()
2064 valuetype = self.valuetype()
2065 if valuetype is not noitem:
2065 if valuetype is not noitem:
2066 for part in xrepr(valuetype):
2066 for part in xrepr(valuetype):
2067 yield part
2067 yield part
2068 yield (astyle.style_default, " ")
2068 yield (astyle.style_default, " ")
2069 yield (astyle.style_default, self.attrtype())
2069 yield (astyle.style_default, self.attrtype())
2070 yield (astyle.style_default, " ")
2070 yield (astyle.style_default, " ")
2071 yield (astyle.style_default, self.name())
2071 yield (astyle.style_default, self.name())
2072 yield (astyle.style_default, " of ")
2072 yield (astyle.style_default, " of ")
2073 for part in xrepr(self.object):
2073 for part in xrepr(self.object):
2074 yield part
2074 yield part
2075
2075
2076
2076
2077 try:
2077 try:
2078 from ibrowse import ibrowse
2078 from ibrowse import ibrowse
2079 except ImportError:
2079 except ImportError:
2080 # No curses (probably Windows) => use ``idump`` as the default display.
2080 # No curses (probably Windows) => use ``idump`` as the default display.
2081 defaultdisplay = idump
2081 defaultdisplay = idump
2082 else:
2082 else:
2083 defaultdisplay = ibrowse
2083 defaultdisplay = ibrowse
2084 __all__.append("ibrowse")
2084 __all__.append("ibrowse")
2085
2085
2086
2086
2087 # If we're running under IPython, install an IPython displayhook that
2087 # If we're running under IPython, install an IPython displayhook that
2088 # returns the object from Display.display(), else install a displayhook
2088 # returns the object from Display.display(), else install a displayhook
2089 # directly as sys.displayhook
2089 # directly as sys.displayhook
2090 api = None
2090 api = None
2091 if ipapi is not None:
2091 if ipapi is not None:
2092 try:
2092 try:
2093 api = ipapi.get()
2093 api = ipapi.get()
2094 except AttributeError:
2094 except AttributeError:
2095 pass
2095 pass
2096
2096
2097 if api is not None:
2097 if api is not None:
2098 def displayhook(self, obj):
2098 def displayhook(self, obj):
2099 if isinstance(obj, type) and issubclass(obj, Table):
2099 if isinstance(obj, type) and issubclass(obj, Table):
2100 obj = obj()
2100 obj = obj()
2101 if isinstance(obj, Table):
2101 if isinstance(obj, Table):
2102 obj = obj | defaultdisplay
2102 obj = obj | defaultdisplay
2103 if isinstance(obj, Display):
2103 if isinstance(obj, Display):
2104 return obj.display()
2104 return obj.display()
2105 else:
2105 else:
2106 raise ipapi.TryNext
2106 raise ipapi.TryNext
2107 api.set_hook("result_display", displayhook)
2107 api.set_hook("result_display", displayhook)
2108 else:
2108 else:
2109 def installdisplayhook():
2109 def installdisplayhook():
2110 _originalhook = sys.displayhook
2110 _originalhook = sys.displayhook
2111 def displayhook(obj):
2111 def displayhook(obj):
2112 if isinstance(obj, type) and issubclass(obj, Table):
2112 if isinstance(obj, type) and issubclass(obj, Table):
2113 obj = obj()
2113 obj = obj()
2114 if isinstance(obj, Table):
2114 if isinstance(obj, Table):
2115 obj = obj | defaultdisplay
2115 obj = obj | defaultdisplay
2116 if isinstance(obj, Display):
2116 if isinstance(obj, Display):
2117 return obj.display()
2117 return obj.display()
2118 else:
2118 else:
2119 _originalhook(obj)
2119 _originalhook(obj)
2120 sys.displayhook = displayhook
2120 sys.displayhook = displayhook
2121 installdisplayhook()
2121 installdisplayhook()
@@ -1,5986 +1,5995 b''
1 2006-11-24 Walter Doerwald <walter@livinglogic.de>
2 * IPython/Extensions/astyle.py: Do a relative import of ipipe, so that
3 we don't get a duplicate ipipe module, where registration of the xrepr
4 implementation for Text is useless.
5
6 * IPython/Extensions/ipipe.py: Fix __xrepr__() implementation for ils.
7
8 * IPython/Extensions/ibrowse.py: Fix keymapping for the enter command.
9
1 2006-11-24 Ville Vainio <vivainio@gmail.com>
10 2006-11-24 Ville Vainio <vivainio@gmail.com>
2
11
3 * Magic.py, manual_base.lyx: Kirill Smelkov patch:
12 * Magic.py, manual_base.lyx: Kirill Smelkov patch:
4 try to use "cProfile" instead of the slower pure python
13 try to use "cProfile" instead of the slower pure python
5 "profile"
14 "profile"
6
15
7 2006-11-23 Ville Vainio <vivainio@gmail.com>
16 2006-11-23 Ville Vainio <vivainio@gmail.com>
8
17
9 * manual_base.lyx: Kirill Smelkov patch: Fix wrong
18 * manual_base.lyx: Kirill Smelkov patch: Fix wrong
10 Qt+IPython+Designer link in documentation.
19 Qt+IPython+Designer link in documentation.
11
20
12 * Extensions/ipy_pydb.py: R. Bernstein's patch for passing
21 * Extensions/ipy_pydb.py: R. Bernstein's patch for passing
13 correct Pdb object to %pydb.
22 correct Pdb object to %pydb.
14
23
15
24
16 2006-11-22 Walter Doerwald <walter@livinglogic.de>
25 2006-11-22 Walter Doerwald <walter@livinglogic.de>
17 * IPython/Extensions/astyle.py: Text needs it's own implemenation of the
26 * IPython/Extensions/astyle.py: Text needs it's own implemenation of the
18 generic xrepr(), otherwise the list implementation would kick in.
27 generic xrepr(), otherwise the list implementation would kick in.
19
28
20 2006-11-21 Ville Vainio <vivainio@gmail.com>
29 2006-11-21 Ville Vainio <vivainio@gmail.com>
21
30
22 * upgrade_dir.py: Now actually overwrites a nonmodified user file
31 * upgrade_dir.py: Now actually overwrites a nonmodified user file
23 with one from UserConfig.
32 with one from UserConfig.
24
33
25 * ipy_profile_sh.py: Add dummy "depth" to var_expand lambda,
34 * ipy_profile_sh.py: Add dummy "depth" to var_expand lambda,
26 it was missing which broke the sh profile.
35 it was missing which broke the sh profile.
27
36
28 * completer.py: file completer now uses explicit '/' instead
37 * completer.py: file completer now uses explicit '/' instead
29 of os.path.join, expansion of 'foo' was broken on win32
38 of os.path.join, expansion of 'foo' was broken on win32
30 if there was one directory with name 'foobar'.
39 if there was one directory with name 'foobar'.
31
40
32 * A bunch of patches from Kirill Smelkov:
41 * A bunch of patches from Kirill Smelkov:
33
42
34 * [patch 9/9] doc: point bug-tracker URL to IPythons trac-tickets.
43 * [patch 9/9] doc: point bug-tracker URL to IPythons trac-tickets.
35
44
36 * [patch 7/9] Implement %page -r (page in raw mode) -
45 * [patch 7/9] Implement %page -r (page in raw mode) -
37
46
38 * [patch 5/9] ScientificPython webpage has moved
47 * [patch 5/9] ScientificPython webpage has moved
39
48
40 * [patch 4/9] The manual mentions %ds, should be %dhist
49 * [patch 4/9] The manual mentions %ds, should be %dhist
41
50
42 * [patch 3/9] Kill old bits from %prun doc.
51 * [patch 3/9] Kill old bits from %prun doc.
43
52
44 * [patch 1/9] Fix typos here and there.
53 * [patch 1/9] Fix typos here and there.
45
54
46 2006-11-08 Ville Vainio <vivainio@gmail.com>
55 2006-11-08 Ville Vainio <vivainio@gmail.com>
47
56
48 * completer.py (attr_matches): catch all exceptions raised
57 * completer.py (attr_matches): catch all exceptions raised
49 by eval of expr with dots.
58 by eval of expr with dots.
50
59
51 2006-11-07 Fernando Perez <Fernando.Perez@colorado.edu>
60 2006-11-07 Fernando Perez <Fernando.Perez@colorado.edu>
52
61
53 * IPython/iplib.py (runsource): Prepend an 'if 1:' to the user
62 * IPython/iplib.py (runsource): Prepend an 'if 1:' to the user
54 input if it starts with whitespace. This allows you to paste
63 input if it starts with whitespace. This allows you to paste
55 indented input from any editor without manually having to type in
64 indented input from any editor without manually having to type in
56 the 'if 1:', which is convenient when working interactively.
65 the 'if 1:', which is convenient when working interactively.
57 Slightly modifed version of a patch by Bo Peng
66 Slightly modifed version of a patch by Bo Peng
58 <bpeng-AT-rice.edu>.
67 <bpeng-AT-rice.edu>.
59
68
60 2006-11-03 Fernando Perez <Fernando.Perez@colorado.edu>
69 2006-11-03 Fernando Perez <Fernando.Perez@colorado.edu>
61
70
62 * IPython/irunner.py (main): modified irunner so it automatically
71 * IPython/irunner.py (main): modified irunner so it automatically
63 recognizes the right runner to use based on the extension (.py for
72 recognizes the right runner to use based on the extension (.py for
64 python, .ipy for ipython and .sage for sage).
73 python, .ipy for ipython and .sage for sage).
65
74
66 * IPython/iplib.py (InteractiveShell.ipconfig): new builtin, also
75 * IPython/iplib.py (InteractiveShell.ipconfig): new builtin, also
67 visible in ipapi as ip.config(), to programatically control the
76 visible in ipapi as ip.config(), to programatically control the
68 internal rc object. There's an accompanying %config magic for
77 internal rc object. There's an accompanying %config magic for
69 interactive use, which has been enhanced to match the
78 interactive use, which has been enhanced to match the
70 funtionality in ipconfig.
79 funtionality in ipconfig.
71
80
72 * IPython/Magic.py (magic_system_verbose): Change %system_verbose
81 * IPython/Magic.py (magic_system_verbose): Change %system_verbose
73 so it's not just a toggle, it now takes an argument. Add support
82 so it's not just a toggle, it now takes an argument. Add support
74 for a customizable header when making system calls, as the new
83 for a customizable header when making system calls, as the new
75 system_header variable in the ipythonrc file.
84 system_header variable in the ipythonrc file.
76
85
77 2006-11-03 Walter Doerwald <walter@livinglogic.de>
86 2006-11-03 Walter Doerwald <walter@livinglogic.de>
78
87
79 * IPython/Extensions/ipipe.py: xrepr(), xiter() and xattrs() are now
88 * IPython/Extensions/ipipe.py: xrepr(), xiter() and xattrs() are now
80 generic functions (using Philip J. Eby's simplegeneric package).
89 generic functions (using Philip J. Eby's simplegeneric package).
81 This makes it possible to customize the display of third-party classes
90 This makes it possible to customize the display of third-party classes
82 without having to monkeypatch them. xiter() no longer supports a mode
91 without having to monkeypatch them. xiter() no longer supports a mode
83 argument and the XMode class has been removed. The same functionality can
92 argument and the XMode class has been removed. The same functionality can
84 be implemented via IterAttributeDescriptor and IterMethodDescriptor.
93 be implemented via IterAttributeDescriptor and IterMethodDescriptor.
85 One consequence of the switch to generic functions is that xrepr() and
94 One consequence of the switch to generic functions is that xrepr() and
86 xattrs() implementation must define the default value for the mode
95 xattrs() implementation must define the default value for the mode
87 argument themselves and xattrs() implementations must return real
96 argument themselves and xattrs() implementations must return real
88 descriptors.
97 descriptors.
89
98
90 * IPython/external: This new subpackage will contain all third-party
99 * IPython/external: This new subpackage will contain all third-party
91 packages that are bundled with IPython. (The first one is simplegeneric).
100 packages that are bundled with IPython. (The first one is simplegeneric).
92
101
93 * IPython/Extensions/ipipe.py (ifile/ils): Readd output of the parent
102 * IPython/Extensions/ipipe.py (ifile/ils): Readd output of the parent
94 directory which as been dropped in r1703.
103 directory which as been dropped in r1703.
95
104
96 * IPython/Extensions/ipipe.py (iless): Fixed.
105 * IPython/Extensions/ipipe.py (iless): Fixed.
97
106
98 * IPython/Extensions/ibrowse: Fixed sorting under Python 2.3.
107 * IPython/Extensions/ibrowse: Fixed sorting under Python 2.3.
99
108
100 2006-11-03 Fernando Perez <Fernando.Perez@colorado.edu>
109 2006-11-03 Fernando Perez <Fernando.Perez@colorado.edu>
101
110
102 * IPython/iplib.py (InteractiveShell.var_expand): fix stack
111 * IPython/iplib.py (InteractiveShell.var_expand): fix stack
103 handling in variable expansion so that shells and magics recognize
112 handling in variable expansion so that shells and magics recognize
104 function local scopes correctly. Bug reported by Brian.
113 function local scopes correctly. Bug reported by Brian.
105
114
106 * scripts/ipython: remove the very first entry in sys.path which
115 * scripts/ipython: remove the very first entry in sys.path which
107 Python auto-inserts for scripts, so that sys.path under IPython is
116 Python auto-inserts for scripts, so that sys.path under IPython is
108 as similar as possible to that under plain Python.
117 as similar as possible to that under plain Python.
109
118
110 * IPython/completer.py (IPCompleter.file_matches): Fix
119 * IPython/completer.py (IPCompleter.file_matches): Fix
111 tab-completion so that quotes are not closed unless the completion
120 tab-completion so that quotes are not closed unless the completion
112 is unambiguous. After a request by Stefan. Minor cleanups in
121 is unambiguous. After a request by Stefan. Minor cleanups in
113 ipy_stock_completers.
122 ipy_stock_completers.
114
123
115 2006-11-02 Ville Vainio <vivainio@gmail.com>
124 2006-11-02 Ville Vainio <vivainio@gmail.com>
116
125
117 * ipy_stock_completers.py: Add %run and %cd completers.
126 * ipy_stock_completers.py: Add %run and %cd completers.
118
127
119 * completer.py: Try running custom completer for both
128 * completer.py: Try running custom completer for both
120 "foo" and "%foo" if the command is just "foo". Ignore case
129 "foo" and "%foo" if the command is just "foo". Ignore case
121 when filtering possible completions.
130 when filtering possible completions.
122
131
123 * UserConfig/ipy_user_conf.py: install stock completers as default
132 * UserConfig/ipy_user_conf.py: install stock completers as default
124
133
125 * iplib.py (history_saving_wrapper), debugger(), ipy_pydb.py:
134 * iplib.py (history_saving_wrapper), debugger(), ipy_pydb.py:
126 simplified readline history save / restore through a wrapper
135 simplified readline history save / restore through a wrapper
127 function
136 function
128
137
129
138
130 2006-10-31 Ville Vainio <vivainio@gmail.com>
139 2006-10-31 Ville Vainio <vivainio@gmail.com>
131
140
132 * strdispatch.py, completer.py, ipy_stock_completers.py:
141 * strdispatch.py, completer.py, ipy_stock_completers.py:
133 Allow str_key ("command") in completer hooks. Implement
142 Allow str_key ("command") in completer hooks. Implement
134 trivial completer for 'import' (stdlib modules only). Rename
143 trivial completer for 'import' (stdlib modules only). Rename
135 ipy_linux_package_managers.py to ipy_stock_completers.py.
144 ipy_linux_package_managers.py to ipy_stock_completers.py.
136 SVN completer.
145 SVN completer.
137
146
138 * Extensions/ledit.py: %magic line editor for easily and
147 * Extensions/ledit.py: %magic line editor for easily and
139 incrementally manipulating lists of strings. The magic command
148 incrementally manipulating lists of strings. The magic command
140 name is %led.
149 name is %led.
141
150
142 2006-10-30 Ville Vainio <vivainio@gmail.com>
151 2006-10-30 Ville Vainio <vivainio@gmail.com>
143
152
144 * Debugger.py, iplib.py (debugger()): Add last set of Rocky
153 * Debugger.py, iplib.py (debugger()): Add last set of Rocky
145 Bernsteins's patches for pydb integration.
154 Bernsteins's patches for pydb integration.
146 http://bashdb.sourceforge.net/pydb/
155 http://bashdb.sourceforge.net/pydb/
147
156
148 * strdispatch.py, iplib.py, completer.py, IPython/__init__.py,
157 * strdispatch.py, iplib.py, completer.py, IPython/__init__.py,
149 Extensions/ipy_linux_package_managers.py, hooks.py: Implement
158 Extensions/ipy_linux_package_managers.py, hooks.py: Implement
150 custom completer hook to allow the users to implement their own
159 custom completer hook to allow the users to implement their own
151 completers. See ipy_linux_package_managers.py for example. The
160 completers. See ipy_linux_package_managers.py for example. The
152 hook name is 'complete_command'.
161 hook name is 'complete_command'.
153
162
154 2006-10-28 Fernando Perez <Fernando.Perez@colorado.edu>
163 2006-10-28 Fernando Perez <Fernando.Perez@colorado.edu>
155
164
156 * IPython/UserConfig/ipythonrc-scipy: minor cleanups to remove old
165 * IPython/UserConfig/ipythonrc-scipy: minor cleanups to remove old
157 Numeric leftovers.
166 Numeric leftovers.
158
167
159 * ipython.el (py-execute-region): apply Stefan's patch to fix
168 * ipython.el (py-execute-region): apply Stefan's patch to fix
160 garbled results if the python shell hasn't been previously started.
169 garbled results if the python shell hasn't been previously started.
161
170
162 * IPython/genutils.py (arg_split): moved to genutils, since it's a
171 * IPython/genutils.py (arg_split): moved to genutils, since it's a
163 pretty generic function and useful for other things.
172 pretty generic function and useful for other things.
164
173
165 * IPython/OInspect.py (getsource): Add customizable source
174 * IPython/OInspect.py (getsource): Add customizable source
166 extractor. After a request/patch form W. Stein (SAGE).
175 extractor. After a request/patch form W. Stein (SAGE).
167
176
168 * IPython/irunner.py (InteractiveRunner.run_source): reset tty
177 * IPython/irunner.py (InteractiveRunner.run_source): reset tty
169 window size to a more reasonable value from what pexpect does,
178 window size to a more reasonable value from what pexpect does,
170 since their choice causes wrapping bugs with long input lines.
179 since their choice causes wrapping bugs with long input lines.
171
180
172 2006-10-28 Ville Vainio <vivainio@gmail.com>
181 2006-10-28 Ville Vainio <vivainio@gmail.com>
173
182
174 * Magic.py (%run): Save and restore the readline history from
183 * Magic.py (%run): Save and restore the readline history from
175 file around %run commands to prevent side effects from
184 file around %run commands to prevent side effects from
176 %runned programs that might use readline (e.g. pydb).
185 %runned programs that might use readline (e.g. pydb).
177
186
178 * extensions/ipy_pydb.py: Adds %pydb magic when imported, for
187 * extensions/ipy_pydb.py: Adds %pydb magic when imported, for
179 invoking the pydb enhanced debugger.
188 invoking the pydb enhanced debugger.
180
189
181 2006-10-23 Walter Doerwald <walter@livinglogic.de>
190 2006-10-23 Walter Doerwald <walter@livinglogic.de>
182
191
183 * IPython/Extensions/ipipe.py (ifile): Remove all methods that
192 * IPython/Extensions/ipipe.py (ifile): Remove all methods that
184 call the base class method and propagate the return value to
193 call the base class method and propagate the return value to
185 ifile. This is now done by path itself.
194 ifile. This is now done by path itself.
186
195
187 2006-10-15 Fernando Perez <Fernando.Perez@colorado.edu>
196 2006-10-15 Fernando Perez <Fernando.Perez@colorado.edu>
188
197
189 * IPython/ipapi.py (IPApi.__init__): Added new entry to public
198 * IPython/ipapi.py (IPApi.__init__): Added new entry to public
190 api: set_crash_handler(), to expose the ability to change the
199 api: set_crash_handler(), to expose the ability to change the
191 internal crash handler.
200 internal crash handler.
192
201
193 * IPython/CrashHandler.py (CrashHandler.__init__): abstract out
202 * IPython/CrashHandler.py (CrashHandler.__init__): abstract out
194 the various parameters of the crash handler so that apps using
203 the various parameters of the crash handler so that apps using
195 IPython as their engine can customize crash handling. Ipmlemented
204 IPython as their engine can customize crash handling. Ipmlemented
196 at the request of SAGE.
205 at the request of SAGE.
197
206
198 2006-10-14 Ville Vainio <vivainio@gmail.com>
207 2006-10-14 Ville Vainio <vivainio@gmail.com>
199
208
200 * Magic.py, ipython.el: applied first "safe" part of Rocky
209 * Magic.py, ipython.el: applied first "safe" part of Rocky
201 Bernstein's patch set for pydb integration.
210 Bernstein's patch set for pydb integration.
202
211
203 * Magic.py (%unalias, %alias): %store'd aliases can now be
212 * Magic.py (%unalias, %alias): %store'd aliases can now be
204 removed with '%unalias'. %alias w/o args now shows most
213 removed with '%unalias'. %alias w/o args now shows most
205 interesting (stored / manually defined) aliases last
214 interesting (stored / manually defined) aliases last
206 where they catch the eye w/o scrolling.
215 where they catch the eye w/o scrolling.
207
216
208 * Magic.py (%rehashx), ext_rehashdir.py: files with
217 * Magic.py (%rehashx), ext_rehashdir.py: files with
209 'py' extension are always considered executable, even
218 'py' extension are always considered executable, even
210 when not in PATHEXT environment variable.
219 when not in PATHEXT environment variable.
211
220
212 2006-10-12 Ville Vainio <vivainio@gmail.com>
221 2006-10-12 Ville Vainio <vivainio@gmail.com>
213
222
214 * jobctrl.py: Add new "jobctrl" extension for spawning background
223 * jobctrl.py: Add new "jobctrl" extension for spawning background
215 processes with "&find /". 'import jobctrl' to try it out. Requires
224 processes with "&find /". 'import jobctrl' to try it out. Requires
216 'subprocess' module, standard in python 2.4+.
225 'subprocess' module, standard in python 2.4+.
217
226
218 * iplib.py (expand_aliases, handle_alias): Aliases expand transitively,
227 * iplib.py (expand_aliases, handle_alias): Aliases expand transitively,
219 so if foo -> bar and bar -> baz, then foo -> baz.
228 so if foo -> bar and bar -> baz, then foo -> baz.
220
229
221 2006-10-09 Fernando Perez <Fernando.Perez@colorado.edu>
230 2006-10-09 Fernando Perez <Fernando.Perez@colorado.edu>
222
231
223 * IPython/Magic.py (Magic.parse_options): add a new posix option
232 * IPython/Magic.py (Magic.parse_options): add a new posix option
224 to allow parsing of input args in magics that doesn't strip quotes
233 to allow parsing of input args in magics that doesn't strip quotes
225 (if posix=False). This also closes %timeit bug reported by
234 (if posix=False). This also closes %timeit bug reported by
226 Stefan.
235 Stefan.
227
236
228 2006-10-03 Ville Vainio <vivainio@gmail.com>
237 2006-10-03 Ville Vainio <vivainio@gmail.com>
229
238
230 * iplib.py (raw_input, interact): Return ValueError catching for
239 * iplib.py (raw_input, interact): Return ValueError catching for
231 raw_input. Fixes infinite loop for sys.stdin.close() or
240 raw_input. Fixes infinite loop for sys.stdin.close() or
232 sys.stdout.close().
241 sys.stdout.close().
233
242
234 2006-09-27 Fernando Perez <Fernando.Perez@colorado.edu>
243 2006-09-27 Fernando Perez <Fernando.Perez@colorado.edu>
235
244
236 * IPython/irunner.py (InteractiveRunner.run_source): small fixes
245 * IPython/irunner.py (InteractiveRunner.run_source): small fixes
237 to help in handling doctests. irunner is now pretty useful for
246 to help in handling doctests. irunner is now pretty useful for
238 running standalone scripts and simulate a full interactive session
247 running standalone scripts and simulate a full interactive session
239 in a format that can be then pasted as a doctest.
248 in a format that can be then pasted as a doctest.
240
249
241 * IPython/iplib.py (InteractiveShell.__init__): Install exit/quit
250 * IPython/iplib.py (InteractiveShell.__init__): Install exit/quit
242 on top of the default (useless) ones. This also fixes the nasty
251 on top of the default (useless) ones. This also fixes the nasty
243 way in which 2.5's Quitter() exits (reverted [1785]).
252 way in which 2.5's Quitter() exits (reverted [1785]).
244
253
245 * IPython/Debugger.py (Pdb.__init__): Fix ipdb to work with python
254 * IPython/Debugger.py (Pdb.__init__): Fix ipdb to work with python
246 2.5.
255 2.5.
247
256
248 * IPython/ultraTB.py (TBTools.set_colors): Make sure that ipdb
257 * IPython/ultraTB.py (TBTools.set_colors): Make sure that ipdb
249 color scheme is updated as well when color scheme is changed
258 color scheme is updated as well when color scheme is changed
250 interactively.
259 interactively.
251
260
252 2006-09-27 Ville Vainio <vivainio@gmail.com>
261 2006-09-27 Ville Vainio <vivainio@gmail.com>
253
262
254 * iplib.py (raw_input): python 2.5 closes stdin on quit -> avoid
263 * iplib.py (raw_input): python 2.5 closes stdin on quit -> avoid
255 infinite loop and just exit. It's a hack, but will do for a while.
264 infinite loop and just exit. It's a hack, but will do for a while.
256
265
257 2006-08-25 Walter Doerwald <walter@livinglogic.de>
266 2006-08-25 Walter Doerwald <walter@livinglogic.de>
258
267
259 * IPython/Extensions/ipipe.py (ils): Add arguments dirs and files to
268 * IPython/Extensions/ipipe.py (ils): Add arguments dirs and files to
260 the constructor, this makes it possible to get a list of only directories
269 the constructor, this makes it possible to get a list of only directories
261 or only files.
270 or only files.
262
271
263 2006-08-12 Ville Vainio <vivainio@gmail.com>
272 2006-08-12 Ville Vainio <vivainio@gmail.com>
264
273
265 * Fakemodule.py, OInspect.py: Reverted 2006-08-11 mods,
274 * Fakemodule.py, OInspect.py: Reverted 2006-08-11 mods,
266 they broke unittest
275 they broke unittest
267
276
268 2006-08-11 Ville Vainio <vivainio@gmail.com>
277 2006-08-11 Ville Vainio <vivainio@gmail.com>
269
278
270 * Fakemodule.py, OInspect.py: remove 2006-08-09 monkepatch
279 * Fakemodule.py, OInspect.py: remove 2006-08-09 monkepatch
271 by resolving issue properly, i.e. by inheriting FakeModule
280 by resolving issue properly, i.e. by inheriting FakeModule
272 from types.ModuleType. Pickling ipython interactive data
281 from types.ModuleType. Pickling ipython interactive data
273 should still work as usual (testing appreciated).
282 should still work as usual (testing appreciated).
274
283
275 2006-08-09 Fernando Perez <Fernando.Perez@colorado.edu>
284 2006-08-09 Fernando Perez <Fernando.Perez@colorado.edu>
276
285
277 * IPython/OInspect.py: monkeypatch inspect from the stdlib if
286 * IPython/OInspect.py: monkeypatch inspect from the stdlib if
278 running under python 2.3 with code from 2.4 to fix a bug with
287 running under python 2.3 with code from 2.4 to fix a bug with
279 help(). Reported by the Debian maintainers, Norbert Tretkowski
288 help(). Reported by the Debian maintainers, Norbert Tretkowski
280 <norbert-AT-tretkowski.de> and Alexandre Fayolle
289 <norbert-AT-tretkowski.de> and Alexandre Fayolle
281 <afayolle-AT-debian.org>.
290 <afayolle-AT-debian.org>.
282
291
283 2006-08-04 Walter Doerwald <walter@livinglogic.de>
292 2006-08-04 Walter Doerwald <walter@livinglogic.de>
284
293
285 * IPython/Extensions/ibrowse.py: Fixed the help message in the footer
294 * IPython/Extensions/ibrowse.py: Fixed the help message in the footer
286 (which was displaying "quit" twice).
295 (which was displaying "quit" twice).
287
296
288 2006-07-28 Walter Doerwald <walter@livinglogic.de>
297 2006-07-28 Walter Doerwald <walter@livinglogic.de>
289
298
290 * IPython/Extensions/ipipe.py: Fix isort.__iter__() (was still using
299 * IPython/Extensions/ipipe.py: Fix isort.__iter__() (was still using
291 the mode argument).
300 the mode argument).
292
301
293 2006-07-27 Walter Doerwald <walter@livinglogic.de>
302 2006-07-27 Walter Doerwald <walter@livinglogic.de>
294
303
295 * IPython/Extensions/ipipe.py: Fix getglobals() if we're
304 * IPython/Extensions/ipipe.py: Fix getglobals() if we're
296 not running under IPython.
305 not running under IPython.
297
306
298 * IPython/Extensions/ipipe.py: Rename XAttr to AttributeDetail
307 * IPython/Extensions/ipipe.py: Rename XAttr to AttributeDetail
299 and make it iterable (iterating over the attribute itself). Add two new
308 and make it iterable (iterating over the attribute itself). Add two new
300 magic strings for __xattrs__(): If the string starts with "-", the attribute
309 magic strings for __xattrs__(): If the string starts with "-", the attribute
301 will not be displayed in ibrowse's detail view (but it can still be
310 will not be displayed in ibrowse's detail view (but it can still be
302 iterated over). This makes it possible to add attributes that are large
311 iterated over). This makes it possible to add attributes that are large
303 lists or generator methods to the detail view. Replace magic attribute names
312 lists or generator methods to the detail view. Replace magic attribute names
304 and _attrname() and _getattr() with "descriptors": For each type of magic
313 and _attrname() and _getattr() with "descriptors": For each type of magic
305 attribute name there's a subclass of Descriptor: None -> SelfDescriptor();
314 attribute name there's a subclass of Descriptor: None -> SelfDescriptor();
306 "foo" -> AttributeDescriptor("foo"); "foo()" -> MethodDescriptor("foo");
315 "foo" -> AttributeDescriptor("foo"); "foo()" -> MethodDescriptor("foo");
307 "-foo" -> IterAttributeDescriptor("foo"); "-foo()" -> IterMethodDescriptor("foo");
316 "-foo" -> IterAttributeDescriptor("foo"); "-foo()" -> IterMethodDescriptor("foo");
308 foo() -> FunctionDescriptor(foo). Magic strings returned from __xattrs__()
317 foo() -> FunctionDescriptor(foo). Magic strings returned from __xattrs__()
309 are still supported.
318 are still supported.
310
319
311 * IPython/Extensions/ibrowse.py: If fetching the next row from the input
320 * IPython/Extensions/ibrowse.py: If fetching the next row from the input
312 fails in ibrowse.fetch(), the exception object is added as the last item
321 fails in ibrowse.fetch(), the exception object is added as the last item
313 and item fetching is canceled. This prevents ibrowse from aborting if e.g.
322 and item fetching is canceled. This prevents ibrowse from aborting if e.g.
314 a generator throws an exception midway through execution.
323 a generator throws an exception midway through execution.
315
324
316 * IPython/Extensions/ipipe.py: Turn ifile's properties mimetype and
325 * IPython/Extensions/ipipe.py: Turn ifile's properties mimetype and
317 encoding into methods.
326 encoding into methods.
318
327
319 2006-07-26 Ville Vainio <vivainio@gmail.com>
328 2006-07-26 Ville Vainio <vivainio@gmail.com>
320
329
321 * iplib.py: history now stores multiline input as single
330 * iplib.py: history now stores multiline input as single
322 history entries. Patch by Jorgen Cederlof.
331 history entries. Patch by Jorgen Cederlof.
323
332
324 2006-07-18 Walter Doerwald <walter@livinglogic.de>
333 2006-07-18 Walter Doerwald <walter@livinglogic.de>
325
334
326 * IPython/Extensions/ibrowse.py: Make cursor visible over
335 * IPython/Extensions/ibrowse.py: Make cursor visible over
327 non existing attributes.
336 non existing attributes.
328
337
329 2006-07-14 Walter Doerwald <walter@livinglogic.de>
338 2006-07-14 Walter Doerwald <walter@livinglogic.de>
330
339
331 * IPython/Extensions/ipipe.py (ix): Use os.popen4() so that the
340 * IPython/Extensions/ipipe.py (ix): Use os.popen4() so that the
332 error output of the running command doesn't mess up the screen.
341 error output of the running command doesn't mess up the screen.
333
342
334 2006-07-13 Walter Doerwald <walter@livinglogic.de>
343 2006-07-13 Walter Doerwald <walter@livinglogic.de>
335
344
336 * IPython/Extensions/ipipe.py (isort): Make isort usable without
345 * IPython/Extensions/ipipe.py (isort): Make isort usable without
337 argument. This sorts the items themselves.
346 argument. This sorts the items themselves.
338
347
339 2006-07-12 Walter Doerwald <walter@livinglogic.de>
348 2006-07-12 Walter Doerwald <walter@livinglogic.de>
340
349
341 * IPython/Extensions/ipipe.py (eval, ifilter, isort, ieval):
350 * IPython/Extensions/ipipe.py (eval, ifilter, isort, ieval):
342 Compile expression strings into code objects. This should speed
351 Compile expression strings into code objects. This should speed
343 up ifilter and friends somewhat.
352 up ifilter and friends somewhat.
344
353
345 2006-07-08 Ville Vainio <vivainio@gmail.com>
354 2006-07-08 Ville Vainio <vivainio@gmail.com>
346
355
347 * Magic.py: %cpaste now strips > from the beginning of lines
356 * Magic.py: %cpaste now strips > from the beginning of lines
348 to ease pasting quoted code from emails. Contributed by
357 to ease pasting quoted code from emails. Contributed by
349 Stefan van der Walt.
358 Stefan van der Walt.
350
359
351 2006-06-29 Ville Vainio <vivainio@gmail.com>
360 2006-06-29 Ville Vainio <vivainio@gmail.com>
352
361
353 * ipmaker.py, Shell.py: qt4agg matplotlib backend support for pylab
362 * ipmaker.py, Shell.py: qt4agg matplotlib backend support for pylab
354 mode, patch contributed by Darren Dale. NEEDS TESTING!
363 mode, patch contributed by Darren Dale. NEEDS TESTING!
355
364
356 2006-06-28 Walter Doerwald <walter@livinglogic.de>
365 2006-06-28 Walter Doerwald <walter@livinglogic.de>
357
366
358 * IPython/Extensions/ibrowse.py: Give the ibrowse cursor row
367 * IPython/Extensions/ibrowse.py: Give the ibrowse cursor row
359 a blue background. Fix fetching new display rows when the browser
368 a blue background. Fix fetching new display rows when the browser
360 scrolls more than a screenful (e.g. by using the goto command).
369 scrolls more than a screenful (e.g. by using the goto command).
361
370
362 2006-06-27 Ville Vainio <vivainio@gmail.com>
371 2006-06-27 Ville Vainio <vivainio@gmail.com>
363
372
364 * Magic.py (_inspect, _ofind) Apply David Huard's
373 * Magic.py (_inspect, _ofind) Apply David Huard's
365 patch for displaying the correct docstring for 'property'
374 patch for displaying the correct docstring for 'property'
366 attributes.
375 attributes.
367
376
368 2006-06-23 Walter Doerwald <walter@livinglogic.de>
377 2006-06-23 Walter Doerwald <walter@livinglogic.de>
369
378
370 * IPython/Extensions/ibrowse.py: Put the documentation of the keyboard
379 * IPython/Extensions/ibrowse.py: Put the documentation of the keyboard
371 commands into the methods implementing them.
380 commands into the methods implementing them.
372
381
373 2006-06-22 Fernando Perez <Fernando.Perez@colorado.edu>
382 2006-06-22 Fernando Perez <Fernando.Perez@colorado.edu>
374
383
375 * ipython.el (ipython-indentation-hook): cleanup patch, submitted
384 * ipython.el (ipython-indentation-hook): cleanup patch, submitted
376 by Kov Chai <tchaikov-AT-gmail.com>. He notes that the original
385 by Kov Chai <tchaikov-AT-gmail.com>. He notes that the original
377 autoindent support was authored by Jin Liu.
386 autoindent support was authored by Jin Liu.
378
387
379 2006-06-22 Walter Doerwald <walter@livinglogic.de>
388 2006-06-22 Walter Doerwald <walter@livinglogic.de>
380
389
381 * IPython/Extensions/ibrowse.py: Replace the plain dictionaries used
390 * IPython/Extensions/ibrowse.py: Replace the plain dictionaries used
382 for keymaps with a custom class that simplifies handling.
391 for keymaps with a custom class that simplifies handling.
383
392
384 2006-06-19 Walter Doerwald <walter@livinglogic.de>
393 2006-06-19 Walter Doerwald <walter@livinglogic.de>
385
394
386 * IPython/Extensions/ibrowse.py: ibrowse now properly handles terminal
395 * IPython/Extensions/ibrowse.py: ibrowse now properly handles terminal
387 resizing. This requires Python 2.5 to work.
396 resizing. This requires Python 2.5 to work.
388
397
389 2006-06-16 Walter Doerwald <walter@livinglogic.de>
398 2006-06-16 Walter Doerwald <walter@livinglogic.de>
390
399
391 * IPython/Extensions/ibrowse.py: Add two new commands to
400 * IPython/Extensions/ibrowse.py: Add two new commands to
392 ibrowse: "hideattr" (mapped to "h") hides the attribute under
401 ibrowse: "hideattr" (mapped to "h") hides the attribute under
393 the cursor. "unhiderattrs" (mapped to "H") reveals all hidden
402 the cursor. "unhiderattrs" (mapped to "H") reveals all hidden
394 attributes again. Remapped the help command to "?". Display
403 attributes again. Remapped the help command to "?". Display
395 keycodes in the range 0x01-0x1F as CTRL-xx. Add CTRL-a and CTRL-e
404 keycodes in the range 0x01-0x1F as CTRL-xx. Add CTRL-a and CTRL-e
396 as keys for the "home" and "end" commands. Add three new commands
405 as keys for the "home" and "end" commands. Add three new commands
397 to the input mode for "find" and friends: "delend" (CTRL-K)
406 to the input mode for "find" and friends: "delend" (CTRL-K)
398 deletes to the end of line. "incsearchup" searches upwards in the
407 deletes to the end of line. "incsearchup" searches upwards in the
399 command history for an input that starts with the text before the cursor.
408 command history for an input that starts with the text before the cursor.
400 "incsearchdown" does the same downwards. Removed a bogus mapping of
409 "incsearchdown" does the same downwards. Removed a bogus mapping of
401 the x key to "delete".
410 the x key to "delete".
402
411
403 2006-06-15 Ville Vainio <vivainio@gmail.com>
412 2006-06-15 Ville Vainio <vivainio@gmail.com>
404
413
405 * iplib.py, hooks.py: Added new generate_prompt hook that can be
414 * iplib.py, hooks.py: Added new generate_prompt hook that can be
406 used to create prompts dynamically, instead of the "old" way of
415 used to create prompts dynamically, instead of the "old" way of
407 assigning "magic" strings to prompt_in1 and prompt_in2. The old
416 assigning "magic" strings to prompt_in1 and prompt_in2. The old
408 way still works (it's invoked by the default hook), of course.
417 way still works (it's invoked by the default hook), of course.
409
418
410 * Prompts.py: added generate_output_prompt hook for altering output
419 * Prompts.py: added generate_output_prompt hook for altering output
411 prompt
420 prompt
412
421
413 * Release.py: Changed version string to 0.7.3.svn.
422 * Release.py: Changed version string to 0.7.3.svn.
414
423
415 2006-06-15 Walter Doerwald <walter@livinglogic.de>
424 2006-06-15 Walter Doerwald <walter@livinglogic.de>
416
425
417 * IPython/Extensions/ibrowse.py: Change _BrowserLevel.moveto() so that
426 * IPython/Extensions/ibrowse.py: Change _BrowserLevel.moveto() so that
418 the call to fetch() always tries to fetch enough data for at least one
427 the call to fetch() always tries to fetch enough data for at least one
419 full screen. This makes it possible to simply call moveto(0,0,True) in
428 full screen. This makes it possible to simply call moveto(0,0,True) in
420 the constructor. Fix typos and removed the obsolete goto attribute.
429 the constructor. Fix typos and removed the obsolete goto attribute.
421
430
422 2006-06-12 Ville Vainio <vivainio@gmail.com>
431 2006-06-12 Ville Vainio <vivainio@gmail.com>
423
432
424 * ipy_profile_sh.py: applied Krisha Mohan Gundu's patch for
433 * ipy_profile_sh.py: applied Krisha Mohan Gundu's patch for
425 allowing $variable interpolation within multiline statements,
434 allowing $variable interpolation within multiline statements,
426 though so far only with "sh" profile for a testing period.
435 though so far only with "sh" profile for a testing period.
427 The patch also enables splitting long commands with \ but it
436 The patch also enables splitting long commands with \ but it
428 doesn't work properly yet.
437 doesn't work properly yet.
429
438
430 2006-06-12 Walter Doerwald <walter@livinglogic.de>
439 2006-06-12 Walter Doerwald <walter@livinglogic.de>
431
440
432 * IPython/Extensions/ibrowse.py (_dodisplay): Display the length of the
441 * IPython/Extensions/ibrowse.py (_dodisplay): Display the length of the
433 input history and the position of the cursor in the input history for
442 input history and the position of the cursor in the input history for
434 the find, findbackwards and goto command.
443 the find, findbackwards and goto command.
435
444
436 2006-06-10 Walter Doerwald <walter@livinglogic.de>
445 2006-06-10 Walter Doerwald <walter@livinglogic.de>
437
446
438 * IPython/Extensions/ibrowse.py: Add a class _CommandInput that
447 * IPython/Extensions/ibrowse.py: Add a class _CommandInput that
439 implements the basic functionality of browser commands that require
448 implements the basic functionality of browser commands that require
440 input. Reimplement the goto, find and findbackwards commands as
449 input. Reimplement the goto, find and findbackwards commands as
441 subclasses of _CommandInput. Add an input history and keymaps to those
450 subclasses of _CommandInput. Add an input history and keymaps to those
442 commands. Add "\r" as a keyboard shortcut for the enterdefault and
451 commands. Add "\r" as a keyboard shortcut for the enterdefault and
443 execute commands.
452 execute commands.
444
453
445 2006-06-07 Ville Vainio <vivainio@gmail.com>
454 2006-06-07 Ville Vainio <vivainio@gmail.com>
446
455
447 * iplib.py: ipython mybatch.ipy exits ipython immediately after
456 * iplib.py: ipython mybatch.ipy exits ipython immediately after
448 running the batch files instead of leaving the session open.
457 running the batch files instead of leaving the session open.
449
458
450 2006-06-07 Fernando Perez <Fernando.Perez@colorado.edu>
459 2006-06-07 Fernando Perez <Fernando.Perez@colorado.edu>
451
460
452 * IPython/iplib.py (InteractiveShell.__init__): update BSD fix, as
461 * IPython/iplib.py (InteractiveShell.__init__): update BSD fix, as
453 the original fix was incomplete. Patch submitted by W. Maier.
462 the original fix was incomplete. Patch submitted by W. Maier.
454
463
455 2006-06-07 Ville Vainio <vivainio@gmail.com>
464 2006-06-07 Ville Vainio <vivainio@gmail.com>
456
465
457 * iplib.py,Magic.py, ipmaker.py (magic_rehashx):
466 * iplib.py,Magic.py, ipmaker.py (magic_rehashx):
458 Confirmation prompts can be supressed by 'quiet' option.
467 Confirmation prompts can be supressed by 'quiet' option.
459 _ip.options.quiet = 1 means "assume yes for all yes/no queries".
468 _ip.options.quiet = 1 means "assume yes for all yes/no queries".
460
469
461 2006-06-06 *** Released version 0.7.2
470 2006-06-06 *** Released version 0.7.2
462
471
463 2006-06-06 Fernando Perez <Fernando.Perez@colorado.edu>
472 2006-06-06 Fernando Perez <Fernando.Perez@colorado.edu>
464
473
465 * IPython/Release.py (version): Made 0.7.2 final for release.
474 * IPython/Release.py (version): Made 0.7.2 final for release.
466 Repo tagged and release cut.
475 Repo tagged and release cut.
467
476
468 2006-06-05 Ville Vainio <vivainio@gmail.com>
477 2006-06-05 Ville Vainio <vivainio@gmail.com>
469
478
470 * Magic.py (magic_rehashx): Honor no_alias list earlier in
479 * Magic.py (magic_rehashx): Honor no_alias list earlier in
471 %rehashx, to avoid clobbering builtins in ipy_profile_sh.py
480 %rehashx, to avoid clobbering builtins in ipy_profile_sh.py
472
481
473 * upgrade_dir.py: try import 'path' module a bit harder
482 * upgrade_dir.py: try import 'path' module a bit harder
474 (for %upgrade)
483 (for %upgrade)
475
484
476 2006-06-03 Fernando Perez <Fernando.Perez@colorado.edu>
485 2006-06-03 Fernando Perez <Fernando.Perez@colorado.edu>
477
486
478 * IPython/genutils.py (ask_yes_no): treat EOF as a default answer
487 * IPython/genutils.py (ask_yes_no): treat EOF as a default answer
479 instead of looping 20 times.
488 instead of looping 20 times.
480
489
481 * IPython/ipmaker.py (make_IPython): honor -ipythondir flag
490 * IPython/ipmaker.py (make_IPython): honor -ipythondir flag
482 correctly at initialization time. Bug reported by Krishna Mohan
491 correctly at initialization time. Bug reported by Krishna Mohan
483 Gundu <gkmohan-AT-gmail.com> on the user list.
492 Gundu <gkmohan-AT-gmail.com> on the user list.
484
493
485 * IPython/Release.py (version): Mark 0.7.2 version to start
494 * IPython/Release.py (version): Mark 0.7.2 version to start
486 testing for release on 06/06.
495 testing for release on 06/06.
487
496
488 2006-05-31 Fernando Perez <Fernando.Perez@colorado.edu>
497 2006-05-31 Fernando Perez <Fernando.Perez@colorado.edu>
489
498
490 * scripts/irunner: thin script interface so users don't have to
499 * scripts/irunner: thin script interface so users don't have to
491 find the module and call it as an executable, since modules rarely
500 find the module and call it as an executable, since modules rarely
492 live in people's PATH.
501 live in people's PATH.
493
502
494 * IPython/irunner.py (InteractiveRunner.__init__): added
503 * IPython/irunner.py (InteractiveRunner.__init__): added
495 delaybeforesend attribute to control delays with newer versions of
504 delaybeforesend attribute to control delays with newer versions of
496 pexpect. Thanks to detailed help from pexpect's author, Noah
505 pexpect. Thanks to detailed help from pexpect's author, Noah
497 Spurrier <noah-AT-noah.org>. Noted how to use the SAGE runner
506 Spurrier <noah-AT-noah.org>. Noted how to use the SAGE runner
498 correctly (it works in NoColor mode).
507 correctly (it works in NoColor mode).
499
508
500 * IPython/iplib.py (handle_normal): fix nasty crash reported on
509 * IPython/iplib.py (handle_normal): fix nasty crash reported on
501 SAGE list, from improper log() calls.
510 SAGE list, from improper log() calls.
502
511
503 2006-05-31 Ville Vainio <vivainio@gmail.com>
512 2006-05-31 Ville Vainio <vivainio@gmail.com>
504
513
505 * upgrade_dir.py, Magic.py (magic_upgrade): call upgrade_dir
514 * upgrade_dir.py, Magic.py (magic_upgrade): call upgrade_dir
506 with args in parens to work correctly with dirs that have spaces.
515 with args in parens to work correctly with dirs that have spaces.
507
516
508 2006-05-30 Fernando Perez <Fernando.Perez@colorado.edu>
517 2006-05-30 Fernando Perez <Fernando.Perez@colorado.edu>
509
518
510 * IPython/Logger.py (Logger.logstart): add option to log raw input
519 * IPython/Logger.py (Logger.logstart): add option to log raw input
511 instead of the processed one. A -r flag was added to the
520 instead of the processed one. A -r flag was added to the
512 %logstart magic used for controlling logging.
521 %logstart magic used for controlling logging.
513
522
514 2006-05-29 Fernando Perez <Fernando.Perez@colorado.edu>
523 2006-05-29 Fernando Perez <Fernando.Perez@colorado.edu>
515
524
516 * IPython/iplib.py (InteractiveShell.__init__): add check for the
525 * IPython/iplib.py (InteractiveShell.__init__): add check for the
517 *BSDs to omit --color from all 'ls' aliases, since *BSD ls doesn't
526 *BSDs to omit --color from all 'ls' aliases, since *BSD ls doesn't
518 recognize the option. After a bug report by Will Maier. This
527 recognize the option. After a bug report by Will Maier. This
519 closes #64 (will do it after confirmation from W. Maier).
528 closes #64 (will do it after confirmation from W. Maier).
520
529
521 * IPython/irunner.py: New module to run scripts as if manually
530 * IPython/irunner.py: New module to run scripts as if manually
522 typed into an interactive environment, based on pexpect. After a
531 typed into an interactive environment, based on pexpect. After a
523 submission by Ken Schutte <kschutte-AT-csail.mit.edu> on the
532 submission by Ken Schutte <kschutte-AT-csail.mit.edu> on the
524 ipython-user list. Simple unittests in the tests/ directory.
533 ipython-user list. Simple unittests in the tests/ directory.
525
534
526 * tools/release: add Will Maier, OpenBSD port maintainer, to
535 * tools/release: add Will Maier, OpenBSD port maintainer, to
527 recepients list. We are now officially part of the OpenBSD ports:
536 recepients list. We are now officially part of the OpenBSD ports:
528 http://www.openbsd.org/ports.html ! Many thanks to Will for the
537 http://www.openbsd.org/ports.html ! Many thanks to Will for the
529 work.
538 work.
530
539
531 2006-05-26 Fernando Perez <Fernando.Perez@colorado.edu>
540 2006-05-26 Fernando Perez <Fernando.Perez@colorado.edu>
532
541
533 * IPython/ipmaker.py (make_IPython): modify sys.argv fix (below)
542 * IPython/ipmaker.py (make_IPython): modify sys.argv fix (below)
534 so that it doesn't break tkinter apps.
543 so that it doesn't break tkinter apps.
535
544
536 * IPython/iplib.py (_prefilter): fix bug where aliases would
545 * IPython/iplib.py (_prefilter): fix bug where aliases would
537 shadow variables when autocall was fully off. Reported by SAGE
546 shadow variables when autocall was fully off. Reported by SAGE
538 author William Stein.
547 author William Stein.
539
548
540 * IPython/OInspect.py (Inspector.__init__): add a flag to control
549 * IPython/OInspect.py (Inspector.__init__): add a flag to control
541 at what detail level strings are computed when foo? is requested.
550 at what detail level strings are computed when foo? is requested.
542 This allows users to ask for example that the string form of an
551 This allows users to ask for example that the string form of an
543 object is only computed when foo?? is called, or even never, by
552 object is only computed when foo?? is called, or even never, by
544 setting the object_info_string_level >= 2 in the configuration
553 setting the object_info_string_level >= 2 in the configuration
545 file. This new option has been added and documented. After a
554 file. This new option has been added and documented. After a
546 request by SAGE to be able to control the printing of very large
555 request by SAGE to be able to control the printing of very large
547 objects more easily.
556 objects more easily.
548
557
549 2006-05-25 Fernando Perez <Fernando.Perez@colorado.edu>
558 2006-05-25 Fernando Perez <Fernando.Perez@colorado.edu>
550
559
551 * IPython/ipmaker.py (make_IPython): remove the ipython call path
560 * IPython/ipmaker.py (make_IPython): remove the ipython call path
552 from sys.argv, to be 100% consistent with how Python itself works
561 from sys.argv, to be 100% consistent with how Python itself works
553 (as seen for example with python -i file.py). After a bug report
562 (as seen for example with python -i file.py). After a bug report
554 by Jeffrey Collins.
563 by Jeffrey Collins.
555
564
556 * IPython/Shell.py (MatplotlibShellBase._matplotlib_config): Fix
565 * IPython/Shell.py (MatplotlibShellBase._matplotlib_config): Fix
557 nasty bug which was preventing custom namespaces with -pylab,
566 nasty bug which was preventing custom namespaces with -pylab,
558 reported by M. Foord. Minor cleanup, remove old matplotlib.matlab
567 reported by M. Foord. Minor cleanup, remove old matplotlib.matlab
559 compatibility (long gone from mpl).
568 compatibility (long gone from mpl).
560
569
561 * IPython/ipapi.py (make_session): name change: create->make. We
570 * IPython/ipapi.py (make_session): name change: create->make. We
562 use make in other places (ipmaker,...), it's shorter and easier to
571 use make in other places (ipmaker,...), it's shorter and easier to
563 type and say, etc. I'm trying to clean things before 0.7.2 so
572 type and say, etc. I'm trying to clean things before 0.7.2 so
564 that I can keep things stable wrt to ipapi in the chainsaw branch.
573 that I can keep things stable wrt to ipapi in the chainsaw branch.
565
574
566 * ipython.el: fix the py-pdbtrack-input-prompt variable so that
575 * ipython.el: fix the py-pdbtrack-input-prompt variable so that
567 python-mode recognizes our debugger mode. Add support for
576 python-mode recognizes our debugger mode. Add support for
568 autoindent inside (X)emacs. After a patch sent in by Jin Liu
577 autoindent inside (X)emacs. After a patch sent in by Jin Liu
569 <m.liu.jin-AT-gmail.com> originally written by
578 <m.liu.jin-AT-gmail.com> originally written by
570 doxgen-AT-newsmth.net (with minor modifications for xemacs
579 doxgen-AT-newsmth.net (with minor modifications for xemacs
571 compatibility)
580 compatibility)
572
581
573 * IPython/Debugger.py (Pdb.format_stack_entry): fix formatting of
582 * IPython/Debugger.py (Pdb.format_stack_entry): fix formatting of
574 tracebacks when walking the stack so that the stack tracking system
583 tracebacks when walking the stack so that the stack tracking system
575 in emacs' python-mode can identify the frames correctly.
584 in emacs' python-mode can identify the frames correctly.
576
585
577 * IPython/ipmaker.py (make_IPython): make the internal (and
586 * IPython/ipmaker.py (make_IPython): make the internal (and
578 default config) autoedit_syntax value false by default. Too many
587 default config) autoedit_syntax value false by default. Too many
579 users have complained to me (both on and off-list) about problems
588 users have complained to me (both on and off-list) about problems
580 with this option being on by default, so I'm making it default to
589 with this option being on by default, so I'm making it default to
581 off. It can still be enabled by anyone via the usual mechanisms.
590 off. It can still be enabled by anyone via the usual mechanisms.
582
591
583 * IPython/completer.py (Completer.attr_matches): add support for
592 * IPython/completer.py (Completer.attr_matches): add support for
584 PyCrust-style _getAttributeNames magic method. Patch contributed
593 PyCrust-style _getAttributeNames magic method. Patch contributed
585 by <mscott-AT-goldenspud.com>. Closes #50.
594 by <mscott-AT-goldenspud.com>. Closes #50.
586
595
587 * IPython/iplib.py (InteractiveShell.__init__): remove the
596 * IPython/iplib.py (InteractiveShell.__init__): remove the
588 deletion of exit/quit from __builtin__, which can break
597 deletion of exit/quit from __builtin__, which can break
589 third-party tools like the Zope debugging console. The
598 third-party tools like the Zope debugging console. The
590 %exit/%quit magics remain. In general, it's probably a good idea
599 %exit/%quit magics remain. In general, it's probably a good idea
591 not to delete anything from __builtin__, since we never know what
600 not to delete anything from __builtin__, since we never know what
592 that will break. In any case, python now (for 2.5) will support
601 that will break. In any case, python now (for 2.5) will support
593 'real' exit/quit, so this issue is moot. Closes #55.
602 'real' exit/quit, so this issue is moot. Closes #55.
594
603
595 * IPython/genutils.py (with_obj): rename the 'with' function to
604 * IPython/genutils.py (with_obj): rename the 'with' function to
596 'withobj' to avoid incompatibilities with Python 2.5, where 'with'
605 'withobj' to avoid incompatibilities with Python 2.5, where 'with'
597 becomes a language keyword. Closes #53.
606 becomes a language keyword. Closes #53.
598
607
599 * IPython/FakeModule.py (FakeModule.__init__): add a proper
608 * IPython/FakeModule.py (FakeModule.__init__): add a proper
600 __file__ attribute to this so it fools more things into thinking
609 __file__ attribute to this so it fools more things into thinking
601 it is a real module. Closes #59.
610 it is a real module. Closes #59.
602
611
603 * IPython/Magic.py (magic_edit): add -n option to open the editor
612 * IPython/Magic.py (magic_edit): add -n option to open the editor
604 at a specific line number. After a patch by Stefan van der Walt.
613 at a specific line number. After a patch by Stefan van der Walt.
605
614
606 2006-05-23 Fernando Perez <Fernando.Perez@colorado.edu>
615 2006-05-23 Fernando Perez <Fernando.Perez@colorado.edu>
607
616
608 * IPython/iplib.py (edit_syntax_error): fix crash when for some
617 * IPython/iplib.py (edit_syntax_error): fix crash when for some
609 reason the file could not be opened. After automatic crash
618 reason the file could not be opened. After automatic crash
610 reports sent by James Graham <jgraham-AT-ast.cam.ac.uk> and
619 reports sent by James Graham <jgraham-AT-ast.cam.ac.uk> and
611 Charles Dolan <charlespatrickdolan-AT-yahoo.com>.
620 Charles Dolan <charlespatrickdolan-AT-yahoo.com>.
612 (_should_recompile): Don't fire editor if using %bg, since there
621 (_should_recompile): Don't fire editor if using %bg, since there
613 is no file in the first place. From the same report as above.
622 is no file in the first place. From the same report as above.
614 (raw_input): protect against faulty third-party prefilters. After
623 (raw_input): protect against faulty third-party prefilters. After
615 an automatic crash report sent by Dirk Laurie <dirk-AT-sun.ac.za>
624 an automatic crash report sent by Dirk Laurie <dirk-AT-sun.ac.za>
616 while running under SAGE.
625 while running under SAGE.
617
626
618 2006-05-23 Ville Vainio <vivainio@gmail.com>
627 2006-05-23 Ville Vainio <vivainio@gmail.com>
619
628
620 * ipapi.py: Stripped down ip.to_user_ns() to work only as
629 * ipapi.py: Stripped down ip.to_user_ns() to work only as
621 ip.to_user_ns("x1 y1"), which exposes vars x1 and y1. ipapi.get()
630 ip.to_user_ns("x1 y1"), which exposes vars x1 and y1. ipapi.get()
622 now returns None (again), unless dummy is specifically allowed by
631 now returns None (again), unless dummy is specifically allowed by
623 ipapi.get(allow_dummy=True).
632 ipapi.get(allow_dummy=True).
624
633
625 2006-05-18 Fernando Perez <Fernando.Perez@colorado.edu>
634 2006-05-18 Fernando Perez <Fernando.Perez@colorado.edu>
626
635
627 * IPython: remove all 2.2-compatibility objects and hacks from
636 * IPython: remove all 2.2-compatibility objects and hacks from
628 everywhere, since we only support 2.3 at this point. Docs
637 everywhere, since we only support 2.3 at this point. Docs
629 updated.
638 updated.
630
639
631 * IPython/ipapi.py (IPApi.__init__): Cleanup of all getters.
640 * IPython/ipapi.py (IPApi.__init__): Cleanup of all getters.
632 Anything requiring extra validation can be turned into a Python
641 Anything requiring extra validation can be turned into a Python
633 property in the future. I used a property for the db one b/c
642 property in the future. I used a property for the db one b/c
634 there was a nasty circularity problem with the initialization
643 there was a nasty circularity problem with the initialization
635 order, which right now I don't have time to clean up.
644 order, which right now I don't have time to clean up.
636
645
637 * IPython/Shell.py (MTInteractiveShell.runcode): Fix, I think,
646 * IPython/Shell.py (MTInteractiveShell.runcode): Fix, I think,
638 another locking bug reported by Jorgen. I'm not 100% sure though,
647 another locking bug reported by Jorgen. I'm not 100% sure though,
639 so more testing is needed...
648 so more testing is needed...
640
649
641 2006-05-17 Fernando Perez <Fernando.Perez@colorado.edu>
650 2006-05-17 Fernando Perez <Fernando.Perez@colorado.edu>
642
651
643 * IPython/ipapi.py (IPApi.to_user_ns): New function to inject
652 * IPython/ipapi.py (IPApi.to_user_ns): New function to inject
644 local variables from any routine in user code (typically executed
653 local variables from any routine in user code (typically executed
645 with %run) directly into the interactive namespace. Very useful
654 with %run) directly into the interactive namespace. Very useful
646 when doing complex debugging.
655 when doing complex debugging.
647 (IPythonNotRunning): Changed the default None object to a dummy
656 (IPythonNotRunning): Changed the default None object to a dummy
648 whose attributes can be queried as well as called without
657 whose attributes can be queried as well as called without
649 exploding, to ease writing code which works transparently both in
658 exploding, to ease writing code which works transparently both in
650 and out of ipython and uses some of this API.
659 and out of ipython and uses some of this API.
651
660
652 2006-05-16 Fernando Perez <Fernando.Perez@colorado.edu>
661 2006-05-16 Fernando Perez <Fernando.Perez@colorado.edu>
653
662
654 * IPython/hooks.py (result_display): Fix the fact that our display
663 * IPython/hooks.py (result_display): Fix the fact that our display
655 hook was using str() instead of repr(), as the default python
664 hook was using str() instead of repr(), as the default python
656 console does. This had gone unnoticed b/c it only happened if
665 console does. This had gone unnoticed b/c it only happened if
657 %Pprint was off, but the inconsistency was there.
666 %Pprint was off, but the inconsistency was there.
658
667
659 2006-05-15 Ville Vainio <vivainio@gmail.com>
668 2006-05-15 Ville Vainio <vivainio@gmail.com>
660
669
661 * Oinspect.py: Only show docstring for nonexisting/binary files
670 * Oinspect.py: Only show docstring for nonexisting/binary files
662 when doing object??, closing ticket #62
671 when doing object??, closing ticket #62
663
672
664 2006-05-13 Fernando Perez <Fernando.Perez@colorado.edu>
673 2006-05-13 Fernando Perez <Fernando.Perez@colorado.edu>
665
674
666 * IPython/Shell.py (MTInteractiveShell.runsource): Fix threading
675 * IPython/Shell.py (MTInteractiveShell.runsource): Fix threading
667 bug, closes http://www.scipy.net/roundup/ipython/issue55. A lock
676 bug, closes http://www.scipy.net/roundup/ipython/issue55. A lock
668 was being released in a routine which hadn't checked if it had
677 was being released in a routine which hadn't checked if it had
669 been the one to acquire it.
678 been the one to acquire it.
670
679
671 2006-05-07 Fernando Perez <Fernando.Perez@colorado.edu>
680 2006-05-07 Fernando Perez <Fernando.Perez@colorado.edu>
672
681
673 * IPython/Release.py (version): put out 0.7.2.rc1 for testing.
682 * IPython/Release.py (version): put out 0.7.2.rc1 for testing.
674
683
675 2006-04-11 Ville Vainio <vivainio@gmail.com>
684 2006-04-11 Ville Vainio <vivainio@gmail.com>
676
685
677 * iplib.py, ipmaker.py: .ipy extension now means "ipython batch file"
686 * iplib.py, ipmaker.py: .ipy extension now means "ipython batch file"
678 in command line. E.g. "ipython test.ipy" runs test.ipy with ipython
687 in command line. E.g. "ipython test.ipy" runs test.ipy with ipython
679 prefilters, allowing stuff like magics and aliases in the file.
688 prefilters, allowing stuff like magics and aliases in the file.
680
689
681 * Prompts.py, Extensions/clearcmd.py, ipy_system_conf.py: %clear magic
690 * Prompts.py, Extensions/clearcmd.py, ipy_system_conf.py: %clear magic
682 added. Supported now are "%clear in" and "%clear out" (clear input and
691 added. Supported now are "%clear in" and "%clear out" (clear input and
683 output history, respectively). Also fixed CachedOutput.flush to
692 output history, respectively). Also fixed CachedOutput.flush to
684 properly flush the output cache.
693 properly flush the output cache.
685
694
686 * Extensions/pspersistence.py: Fix %store to avoid "%store obj.attr"
695 * Extensions/pspersistence.py: Fix %store to avoid "%store obj.attr"
687 half-success (and fail explicitly).
696 half-success (and fail explicitly).
688
697
689 2006-03-28 Ville Vainio <vivainio@gmail.com>
698 2006-03-28 Ville Vainio <vivainio@gmail.com>
690
699
691 * iplib.py: Fix quoting of aliases so that only argless ones
700 * iplib.py: Fix quoting of aliases so that only argless ones
692 are quoted
701 are quoted
693
702
694 2006-03-28 Ville Vainio <vivainio@gmail.com>
703 2006-03-28 Ville Vainio <vivainio@gmail.com>
695
704
696 * iplib.py: Quote aliases with spaces in the name.
705 * iplib.py: Quote aliases with spaces in the name.
697 "c:\program files\blah\bin" is now legal alias target.
706 "c:\program files\blah\bin" is now legal alias target.
698
707
699 * ext_rehashdir.py: Space no longer allowed as arg
708 * ext_rehashdir.py: Space no longer allowed as arg
700 separator, since space is legal in path names.
709 separator, since space is legal in path names.
701
710
702 2006-03-16 Ville Vainio <vivainio@gmail.com>
711 2006-03-16 Ville Vainio <vivainio@gmail.com>
703
712
704 * upgrade_dir.py: Take path.py from Extensions, correcting
713 * upgrade_dir.py: Take path.py from Extensions, correcting
705 %upgrade magic
714 %upgrade magic
706
715
707 * ipmaker.py: Suggest using %upgrade if ipy_user_conf.py isn't found.
716 * ipmaker.py: Suggest using %upgrade if ipy_user_conf.py isn't found.
708
717
709 * hooks.py: Only enclose editor binary in quotes if legal and
718 * hooks.py: Only enclose editor binary in quotes if legal and
710 necessary (space in the name, and is an existing file). Fixes a bug
719 necessary (space in the name, and is an existing file). Fixes a bug
711 reported by Zachary Pincus.
720 reported by Zachary Pincus.
712
721
713 2006-03-13 Fernando Perez <Fernando.Perez@colorado.edu>
722 2006-03-13 Fernando Perez <Fernando.Perez@colorado.edu>
714
723
715 * Manual: thanks to a tip on proper color handling for Emacs, by
724 * Manual: thanks to a tip on proper color handling for Emacs, by
716 Eric J Haywiser <ejh1-AT-MIT.EDU>.
725 Eric J Haywiser <ejh1-AT-MIT.EDU>.
717
726
718 * ipython.el: close http://www.scipy.net/roundup/ipython/issue57
727 * ipython.el: close http://www.scipy.net/roundup/ipython/issue57
719 by applying the provided patch. Thanks to Liu Jin
728 by applying the provided patch. Thanks to Liu Jin
720 <m.liu.jin-AT-gmail.com> for the contribution. No problems under
729 <m.liu.jin-AT-gmail.com> for the contribution. No problems under
721 XEmacs/Linux, I'm trusting the submitter that it actually helps
730 XEmacs/Linux, I'm trusting the submitter that it actually helps
722 under win32/GNU Emacs. Will revisit if any problems are reported.
731 under win32/GNU Emacs. Will revisit if any problems are reported.
723
732
724 2006-03-12 Fernando Perez <Fernando.Perez@colorado.edu>
733 2006-03-12 Fernando Perez <Fernando.Perez@colorado.edu>
725
734
726 * IPython/Gnuplot2.py (_FileClass): update for current Gnuplot.py
735 * IPython/Gnuplot2.py (_FileClass): update for current Gnuplot.py
727 from SVN, thanks to a patch by Ryan Woodard <rywo@bas.ac.uk>.
736 from SVN, thanks to a patch by Ryan Woodard <rywo@bas.ac.uk>.
728
737
729 2006-03-12 Ville Vainio <vivainio@gmail.com>
738 2006-03-12 Ville Vainio <vivainio@gmail.com>
730
739
731 * Magic.py (magic_timeit): Added %timeit magic, contributed by
740 * Magic.py (magic_timeit): Added %timeit magic, contributed by
732 Torsten Marek.
741 Torsten Marek.
733
742
734 2006-03-12 Fernando Perez <Fernando.Perez@colorado.edu>
743 2006-03-12 Fernando Perez <Fernando.Perez@colorado.edu>
735
744
736 * IPython/Magic.py (magic_macro): fix so that the n1-n2 syntax for
745 * IPython/Magic.py (magic_macro): fix so that the n1-n2 syntax for
737 line ranges works again.
746 line ranges works again.
738
747
739 2006-03-11 Fernando Perez <Fernando.Perez@colorado.edu>
748 2006-03-11 Fernando Perez <Fernando.Perez@colorado.edu>
740
749
741 * IPython/iplib.py (showtraceback): add back sys.last_traceback
750 * IPython/iplib.py (showtraceback): add back sys.last_traceback
742 and friends, after a discussion with Zach Pincus on ipython-user.
751 and friends, after a discussion with Zach Pincus on ipython-user.
743 I'm not 100% sure, but after thinking about it quite a bit, it may
752 I'm not 100% sure, but after thinking about it quite a bit, it may
744 be OK. Testing with the multithreaded shells didn't reveal any
753 be OK. Testing with the multithreaded shells didn't reveal any
745 problems, but let's keep an eye out.
754 problems, but let's keep an eye out.
746
755
747 In the process, I fixed a few things which were calling
756 In the process, I fixed a few things which were calling
748 self.InteractiveTB() directly (like safe_execfile), which is a
757 self.InteractiveTB() directly (like safe_execfile), which is a
749 mistake: ALL exception reporting should be done by calling
758 mistake: ALL exception reporting should be done by calling
750 self.showtraceback(), which handles state and tab-completion and
759 self.showtraceback(), which handles state and tab-completion and
751 more.
760 more.
752
761
753 2006-03-01 Ville Vainio <vivainio@gmail.com>
762 2006-03-01 Ville Vainio <vivainio@gmail.com>
754
763
755 * Extensions/ipipe.py: Added Walter Doerwald's "ipipe" module.
764 * Extensions/ipipe.py: Added Walter Doerwald's "ipipe" module.
756 To use, do "from ipipe import *".
765 To use, do "from ipipe import *".
757
766
758 2006-02-24 Ville Vainio <vivainio@gmail.com>
767 2006-02-24 Ville Vainio <vivainio@gmail.com>
759
768
760 * Magic.py, upgrade_dir.py: %upgrade magic added. Does things more
769 * Magic.py, upgrade_dir.py: %upgrade magic added. Does things more
761 "cleanly" and safely than the older upgrade mechanism.
770 "cleanly" and safely than the older upgrade mechanism.
762
771
763 2006-02-21 Ville Vainio <vivainio@gmail.com>
772 2006-02-21 Ville Vainio <vivainio@gmail.com>
764
773
765 * Magic.py: %save works again.
774 * Magic.py: %save works again.
766
775
767 2006-02-15 Ville Vainio <vivainio@gmail.com>
776 2006-02-15 Ville Vainio <vivainio@gmail.com>
768
777
769 * Magic.py: %Pprint works again
778 * Magic.py: %Pprint works again
770
779
771 * Extensions/ipy_sane_defaults.py: Provide everything provided
780 * Extensions/ipy_sane_defaults.py: Provide everything provided
772 in default ipythonrc, to make it possible to have a completely empty
781 in default ipythonrc, to make it possible to have a completely empty
773 ipythonrc (and thus completely rc-file free configuration)
782 ipythonrc (and thus completely rc-file free configuration)
774
783
775 2006-02-11 Fernando Perez <Fernando.Perez@colorado.edu>
784 2006-02-11 Fernando Perez <Fernando.Perez@colorado.edu>
776
785
777 * IPython/hooks.py (editor): quote the call to the editor command,
786 * IPython/hooks.py (editor): quote the call to the editor command,
778 to allow commands with spaces in them. Problem noted by watching
787 to allow commands with spaces in them. Problem noted by watching
779 Ian Oswald's video about textpad under win32 at
788 Ian Oswald's video about textpad under win32 at
780 http://showmedo.com/videoListPage?listKey=PythonIPythonSeries
789 http://showmedo.com/videoListPage?listKey=PythonIPythonSeries
781
790
782 * IPython/UserConfig/ipythonrc: Replace @ signs with % when
791 * IPython/UserConfig/ipythonrc: Replace @ signs with % when
783 describing magics (we haven't used @ for a loong time).
792 describing magics (we haven't used @ for a loong time).
784
793
785 * IPython/ultraTB.py (VerboseTB.text.text_repr): Added patch
794 * IPython/ultraTB.py (VerboseTB.text.text_repr): Added patch
786 contributed by marienz to close
795 contributed by marienz to close
787 http://www.scipy.net/roundup/ipython/issue53.
796 http://www.scipy.net/roundup/ipython/issue53.
788
797
789 2006-02-10 Ville Vainio <vivainio@gmail.com>
798 2006-02-10 Ville Vainio <vivainio@gmail.com>
790
799
791 * genutils.py: getoutput now works in win32 too
800 * genutils.py: getoutput now works in win32 too
792
801
793 * completer.py: alias and magic completion only invoked
802 * completer.py: alias and magic completion only invoked
794 at the first "item" in the line, to avoid "cd %store"
803 at the first "item" in the line, to avoid "cd %store"
795 nonsense.
804 nonsense.
796
805
797 2006-02-09 Ville Vainio <vivainio@gmail.com>
806 2006-02-09 Ville Vainio <vivainio@gmail.com>
798
807
799 * test/*: Added a unit testing framework (finally).
808 * test/*: Added a unit testing framework (finally).
800 '%run runtests.py' to run test_*.
809 '%run runtests.py' to run test_*.
801
810
802 * ipapi.py: Exposed runlines and set_custom_exc
811 * ipapi.py: Exposed runlines and set_custom_exc
803
812
804 2006-02-07 Ville Vainio <vivainio@gmail.com>
813 2006-02-07 Ville Vainio <vivainio@gmail.com>
805
814
806 * iplib.py: don't split "f 1 2" to "f(1,2)" in autocall,
815 * iplib.py: don't split "f 1 2" to "f(1,2)" in autocall,
807 instead use "f(1 2)" as before.
816 instead use "f(1 2)" as before.
808
817
809 2006-02-05 Fernando Perez <Fernando.Perez@colorado.edu>
818 2006-02-05 Fernando Perez <Fernando.Perez@colorado.edu>
810
819
811 * IPython/demo.py (IPythonDemo): Add new classes to the demo
820 * IPython/demo.py (IPythonDemo): Add new classes to the demo
812 facilities, for demos processed by the IPython input filter
821 facilities, for demos processed by the IPython input filter
813 (IPythonDemo), and for running a script one-line-at-a-time as a
822 (IPythonDemo), and for running a script one-line-at-a-time as a
814 demo, both for pure Python (LineDemo) and for IPython-processed
823 demo, both for pure Python (LineDemo) and for IPython-processed
815 input (IPythonLineDemo). After a request by Dave Kohel, from the
824 input (IPythonLineDemo). After a request by Dave Kohel, from the
816 SAGE team.
825 SAGE team.
817 (Demo.edit): added an edit() method to the demo objects, to edit
826 (Demo.edit): added an edit() method to the demo objects, to edit
818 the in-memory copy of the last executed block.
827 the in-memory copy of the last executed block.
819
828
820 * IPython/Magic.py (magic_edit): add '-r' option for 'raw'
829 * IPython/Magic.py (magic_edit): add '-r' option for 'raw'
821 processing to %edit, %macro and %save. These commands can now be
830 processing to %edit, %macro and %save. These commands can now be
822 invoked on the unprocessed input as it was typed by the user
831 invoked on the unprocessed input as it was typed by the user
823 (without any prefilters applied). After requests by the SAGE team
832 (without any prefilters applied). After requests by the SAGE team
824 at SAGE days 2006: http://modular.ucsd.edu/sage/days1/schedule.html.
833 at SAGE days 2006: http://modular.ucsd.edu/sage/days1/schedule.html.
825
834
826 2006-02-01 Ville Vainio <vivainio@gmail.com>
835 2006-02-01 Ville Vainio <vivainio@gmail.com>
827
836
828 * setup.py, eggsetup.py: easy_install ipython==dev works
837 * setup.py, eggsetup.py: easy_install ipython==dev works
829 correctly now (on Linux)
838 correctly now (on Linux)
830
839
831 * ipy_user_conf,ipmaker: user config changes, removed spurious
840 * ipy_user_conf,ipmaker: user config changes, removed spurious
832 warnings
841 warnings
833
842
834 * iplib: if rc.banner is string, use it as is.
843 * iplib: if rc.banner is string, use it as is.
835
844
836 * Magic: %pycat accepts a string argument and pages it's contents.
845 * Magic: %pycat accepts a string argument and pages it's contents.
837
846
838
847
839 2006-01-30 Ville Vainio <vivainio@gmail.com>
848 2006-01-30 Ville Vainio <vivainio@gmail.com>
840
849
841 * pickleshare,pspersistence,ipapi,Magic: persistence overhaul.
850 * pickleshare,pspersistence,ipapi,Magic: persistence overhaul.
842 Now %store and bookmarks work through PickleShare, meaning that
851 Now %store and bookmarks work through PickleShare, meaning that
843 concurrent access is possible and all ipython sessions see the
852 concurrent access is possible and all ipython sessions see the
844 same database situation all the time, instead of snapshot of
853 same database situation all the time, instead of snapshot of
845 the situation when the session was started. Hence, %bookmark
854 the situation when the session was started. Hence, %bookmark
846 results are immediately accessible from othes sessions. The database
855 results are immediately accessible from othes sessions. The database
847 is also available for use by user extensions. See:
856 is also available for use by user extensions. See:
848 http://www.python.org/pypi/pickleshare
857 http://www.python.org/pypi/pickleshare
849
858
850 * hooks.py: Two new hooks, 'shutdown_hook' and 'late_startup_hook'.
859 * hooks.py: Two new hooks, 'shutdown_hook' and 'late_startup_hook'.
851
860
852 * aliases can now be %store'd
861 * aliases can now be %store'd
853
862
854 * path.py moved to Extensions so that pickleshare does not need
863 * path.py moved to Extensions so that pickleshare does not need
855 IPython-specific import. Extensions added to pythonpath right
864 IPython-specific import. Extensions added to pythonpath right
856 at __init__.
865 at __init__.
857
866
858 * iplib.py: ipalias deprecated/redundant; aliases are converted and
867 * iplib.py: ipalias deprecated/redundant; aliases are converted and
859 called with _ip.system and the pre-transformed command string.
868 called with _ip.system and the pre-transformed command string.
860
869
861 2006-01-29 Fernando Perez <Fernando.Perez@colorado.edu>
870 2006-01-29 Fernando Perez <Fernando.Perez@colorado.edu>
862
871
863 * IPython/iplib.py (interact): Fix that we were not catching
872 * IPython/iplib.py (interact): Fix that we were not catching
864 KeyboardInterrupt exceptions properly. I'm not quite sure why the
873 KeyboardInterrupt exceptions properly. I'm not quite sure why the
865 logic here had to change, but it's fixed now.
874 logic here had to change, but it's fixed now.
866
875
867 2006-01-29 Ville Vainio <vivainio@gmail.com>
876 2006-01-29 Ville Vainio <vivainio@gmail.com>
868
877
869 * iplib.py: Try to import pyreadline on Windows.
878 * iplib.py: Try to import pyreadline on Windows.
870
879
871 2006-01-27 Ville Vainio <vivainio@gmail.com>
880 2006-01-27 Ville Vainio <vivainio@gmail.com>
872
881
873 * iplib.py: Expose ipapi as _ip in builtin namespace.
882 * iplib.py: Expose ipapi as _ip in builtin namespace.
874 Makes ipmagic (-> _ip.magic), ipsystem (-> _ip.system)
883 Makes ipmagic (-> _ip.magic), ipsystem (-> _ip.system)
875 and ip_set_hook (-> _ip.set_hook) redundant. % and !
884 and ip_set_hook (-> _ip.set_hook) redundant. % and !
876 syntax now produce _ip.* variant of the commands.
885 syntax now produce _ip.* variant of the commands.
877
886
878 * "_ip.options().autoedit_syntax = 2" automatically throws
887 * "_ip.options().autoedit_syntax = 2" automatically throws
879 user to editor for syntax error correction without prompting.
888 user to editor for syntax error correction without prompting.
880
889
881 2006-01-27 Ville Vainio <vivainio@gmail.com>
890 2006-01-27 Ville Vainio <vivainio@gmail.com>
882
891
883 * ipmaker.py: Give "realistic" sys.argv for scripts (without
892 * ipmaker.py: Give "realistic" sys.argv for scripts (without
884 'ipython' at argv[0]) executed through command line.
893 'ipython' at argv[0]) executed through command line.
885 NOTE: this DEPRECATES calling ipython with multiple scripts
894 NOTE: this DEPRECATES calling ipython with multiple scripts
886 ("ipython a.py b.py c.py")
895 ("ipython a.py b.py c.py")
887
896
888 * iplib.py, hooks.py: Added configurable input prefilter,
897 * iplib.py, hooks.py: Added configurable input prefilter,
889 named 'input_prefilter'. See ext_rescapture.py for example
898 named 'input_prefilter'. See ext_rescapture.py for example
890 usage.
899 usage.
891
900
892 * ext_rescapture.py, Magic.py: Better system command output capture
901 * ext_rescapture.py, Magic.py: Better system command output capture
893 through 'var = !ls' (deprecates user-visible %sc). Same notation
902 through 'var = !ls' (deprecates user-visible %sc). Same notation
894 applies for magics, 'var = %alias' assigns alias list to var.
903 applies for magics, 'var = %alias' assigns alias list to var.
895
904
896 * ipapi.py: added meta() for accessing extension-usable data store.
905 * ipapi.py: added meta() for accessing extension-usable data store.
897
906
898 * iplib.py: added InteractiveShell.getapi(). New magics should be
907 * iplib.py: added InteractiveShell.getapi(). New magics should be
899 written doing self.getapi() instead of using the shell directly.
908 written doing self.getapi() instead of using the shell directly.
900
909
901 * Magic.py: %store now allows doing %store foo > ~/myfoo.txt and
910 * Magic.py: %store now allows doing %store foo > ~/myfoo.txt and
902 %store foo >> ~/myfoo.txt to store variables to files (in clean
911 %store foo >> ~/myfoo.txt to store variables to files (in clean
903 textual form, not a restorable pickle).
912 textual form, not a restorable pickle).
904
913
905 * ipmaker.py: now import ipy_profile_PROFILENAME automatically
914 * ipmaker.py: now import ipy_profile_PROFILENAME automatically
906
915
907 * usage.py, Magic.py: added %quickref
916 * usage.py, Magic.py: added %quickref
908
917
909 * iplib.py: ESC_PAREN fixes: /f 1 2 -> f(1,2), not f(1 2).
918 * iplib.py: ESC_PAREN fixes: /f 1 2 -> f(1,2), not f(1 2).
910
919
911 * GetoptErrors when invoking magics etc. with wrong args
920 * GetoptErrors when invoking magics etc. with wrong args
912 are now more helpful:
921 are now more helpful:
913 GetoptError: option -l not recognized (allowed: "qb" )
922 GetoptError: option -l not recognized (allowed: "qb" )
914
923
915 2006-01-25 Fernando Perez <Fernando.Perez@colorado.edu>
924 2006-01-25 Fernando Perez <Fernando.Perez@colorado.edu>
916
925
917 * IPython/demo.py (Demo.show): Flush stdout after each block, so
926 * IPython/demo.py (Demo.show): Flush stdout after each block, so
918 computationally intensive blocks don't appear to stall the demo.
927 computationally intensive blocks don't appear to stall the demo.
919
928
920 2006-01-24 Ville Vainio <vivainio@gmail.com>
929 2006-01-24 Ville Vainio <vivainio@gmail.com>
921
930
922 * iplib.py, hooks.py: 'result_display' hook can return a non-None
931 * iplib.py, hooks.py: 'result_display' hook can return a non-None
923 value to manipulate resulting history entry.
932 value to manipulate resulting history entry.
924
933
925 * ipapi.py: Moved TryNext here from hooks.py. Moved functions
934 * ipapi.py: Moved TryNext here from hooks.py. Moved functions
926 to instance methods of IPApi class, to make extending an embedded
935 to instance methods of IPApi class, to make extending an embedded
927 IPython feasible. See ext_rehashdir.py for example usage.
936 IPython feasible. See ext_rehashdir.py for example usage.
928
937
929 * Merged 1071-1076 from branches/0.7.1
938 * Merged 1071-1076 from branches/0.7.1
930
939
931
940
932 2006-01-23 Fernando Perez <Fernando.Perez@colorado.edu>
941 2006-01-23 Fernando Perez <Fernando.Perez@colorado.edu>
933
942
934 * tools/release (daystamp): Fix build tools to use the new
943 * tools/release (daystamp): Fix build tools to use the new
935 eggsetup.py script to build lightweight eggs.
944 eggsetup.py script to build lightweight eggs.
936
945
937 * Applied changesets 1062 and 1064 before 0.7.1 release.
946 * Applied changesets 1062 and 1064 before 0.7.1 release.
938
947
939 * IPython/Magic.py (magic_history): Add '-r' option to %hist, to
948 * IPython/Magic.py (magic_history): Add '-r' option to %hist, to
940 see the raw input history (without conversions like %ls ->
949 see the raw input history (without conversions like %ls ->
941 ipmagic("ls")). After a request from W. Stein, SAGE
950 ipmagic("ls")). After a request from W. Stein, SAGE
942 (http://modular.ucsd.edu/sage) developer. This information is
951 (http://modular.ucsd.edu/sage) developer. This information is
943 stored in the input_hist_raw attribute of the IPython instance, so
952 stored in the input_hist_raw attribute of the IPython instance, so
944 developers can access it if needed (it's an InputList instance).
953 developers can access it if needed (it's an InputList instance).
945
954
946 * Versionstring = 0.7.2.svn
955 * Versionstring = 0.7.2.svn
947
956
948 * eggsetup.py: A separate script for constructing eggs, creates
957 * eggsetup.py: A separate script for constructing eggs, creates
949 proper launch scripts even on Windows (an .exe file in
958 proper launch scripts even on Windows (an .exe file in
950 \python24\scripts).
959 \python24\scripts).
951
960
952 * ipapi.py: launch_new_instance, launch entry point needed for the
961 * ipapi.py: launch_new_instance, launch entry point needed for the
953 egg.
962 egg.
954
963
955 2006-01-23 Ville Vainio <vivainio@gmail.com>
964 2006-01-23 Ville Vainio <vivainio@gmail.com>
956
965
957 * Added %cpaste magic for pasting python code
966 * Added %cpaste magic for pasting python code
958
967
959 2006-01-22 Ville Vainio <vivainio@gmail.com>
968 2006-01-22 Ville Vainio <vivainio@gmail.com>
960
969
961 * Merge from branches/0.7.1 into trunk, revs 1052-1057
970 * Merge from branches/0.7.1 into trunk, revs 1052-1057
962
971
963 * Versionstring = 0.7.2.svn
972 * Versionstring = 0.7.2.svn
964
973
965 * eggsetup.py: A separate script for constructing eggs, creates
974 * eggsetup.py: A separate script for constructing eggs, creates
966 proper launch scripts even on Windows (an .exe file in
975 proper launch scripts even on Windows (an .exe file in
967 \python24\scripts).
976 \python24\scripts).
968
977
969 * ipapi.py: launch_new_instance, launch entry point needed for the
978 * ipapi.py: launch_new_instance, launch entry point needed for the
970 egg.
979 egg.
971
980
972 2006-01-22 Fernando Perez <Fernando.Perez@colorado.edu>
981 2006-01-22 Fernando Perez <Fernando.Perez@colorado.edu>
973
982
974 * IPython/OInspect.py (Inspector.pinfo): fix bug where foo?? or
983 * IPython/OInspect.py (Inspector.pinfo): fix bug where foo?? or
975 %pfile foo would print the file for foo even if it was a binary.
984 %pfile foo would print the file for foo even if it was a binary.
976 Now, extensions '.so' and '.dll' are skipped.
985 Now, extensions '.so' and '.dll' are skipped.
977
986
978 * IPython/Shell.py (MTInteractiveShell.__init__): Fix threading
987 * IPython/Shell.py (MTInteractiveShell.__init__): Fix threading
979 bug, where macros would fail in all threaded modes. I'm not 100%
988 bug, where macros would fail in all threaded modes. I'm not 100%
980 sure, so I'm going to put out an rc instead of making a release
989 sure, so I'm going to put out an rc instead of making a release
981 today, and wait for feedback for at least a few days.
990 today, and wait for feedback for at least a few days.
982
991
983 * IPython/iplib.py (handle_normal): fix (finally? somehow I doubt
992 * IPython/iplib.py (handle_normal): fix (finally? somehow I doubt
984 it...) the handling of pasting external code with autoindent on.
993 it...) the handling of pasting external code with autoindent on.
985 To get out of a multiline input, the rule will appear for most
994 To get out of a multiline input, the rule will appear for most
986 users unchanged: two blank lines or change the indent level
995 users unchanged: two blank lines or change the indent level
987 proposed by IPython. But there is a twist now: you can
996 proposed by IPython. But there is a twist now: you can
988 add/subtract only *one or two spaces*. If you add/subtract three
997 add/subtract only *one or two spaces*. If you add/subtract three
989 or more (unless you completely delete the line), IPython will
998 or more (unless you completely delete the line), IPython will
990 accept that line, and you'll need to enter a second one of pure
999 accept that line, and you'll need to enter a second one of pure
991 whitespace. I know it sounds complicated, but I can't find a
1000 whitespace. I know it sounds complicated, but I can't find a
992 different solution that covers all the cases, with the right
1001 different solution that covers all the cases, with the right
993 heuristics. Hopefully in actual use, nobody will really notice
1002 heuristics. Hopefully in actual use, nobody will really notice
994 all these strange rules and things will 'just work'.
1003 all these strange rules and things will 'just work'.
995
1004
996 2006-01-21 Fernando Perez <Fernando.Perez@colorado.edu>
1005 2006-01-21 Fernando Perez <Fernando.Perez@colorado.edu>
997
1006
998 * IPython/iplib.py (interact): catch exceptions which can be
1007 * IPython/iplib.py (interact): catch exceptions which can be
999 triggered asynchronously by signal handlers. Thanks to an
1008 triggered asynchronously by signal handlers. Thanks to an
1000 automatic crash report, submitted by Colin Kingsley
1009 automatic crash report, submitted by Colin Kingsley
1001 <tercel-AT-gentoo.org>.
1010 <tercel-AT-gentoo.org>.
1002
1011
1003 2006-01-20 Ville Vainio <vivainio@gmail.com>
1012 2006-01-20 Ville Vainio <vivainio@gmail.com>
1004
1013
1005 * Ipython/Extensions/ext_rehashdir.py: Created a usable example
1014 * Ipython/Extensions/ext_rehashdir.py: Created a usable example
1006 (%rehashdir, very useful, try it out) of how to extend ipython
1015 (%rehashdir, very useful, try it out) of how to extend ipython
1007 with new magics. Also added Extensions dir to pythonpath to make
1016 with new magics. Also added Extensions dir to pythonpath to make
1008 importing extensions easy.
1017 importing extensions easy.
1009
1018
1010 * %store now complains when trying to store interactively declared
1019 * %store now complains when trying to store interactively declared
1011 classes / instances of those classes.
1020 classes / instances of those classes.
1012
1021
1013 * Extensions/ipy_system_conf.py, UserConfig/ipy_user_conf.py,
1022 * Extensions/ipy_system_conf.py, UserConfig/ipy_user_conf.py,
1014 ipmaker.py: Config rehaul. Now ipy_..._conf.py are always imported
1023 ipmaker.py: Config rehaul. Now ipy_..._conf.py are always imported
1015 if they exist, and ipy_user_conf.py with some defaults is created for
1024 if they exist, and ipy_user_conf.py with some defaults is created for
1016 the user.
1025 the user.
1017
1026
1018 * Startup rehashing done by the config file, not InterpreterExec.
1027 * Startup rehashing done by the config file, not InterpreterExec.
1019 This means system commands are available even without selecting the
1028 This means system commands are available even without selecting the
1020 pysh profile. It's the sensible default after all.
1029 pysh profile. It's the sensible default after all.
1021
1030
1022 2006-01-20 Fernando Perez <Fernando.Perez@colorado.edu>
1031 2006-01-20 Fernando Perez <Fernando.Perez@colorado.edu>
1023
1032
1024 * IPython/iplib.py (raw_input): I _think_ I got the pasting of
1033 * IPython/iplib.py (raw_input): I _think_ I got the pasting of
1025 multiline code with autoindent on working. But I am really not
1034 multiline code with autoindent on working. But I am really not
1026 sure, so this needs more testing. Will commit a debug-enabled
1035 sure, so this needs more testing. Will commit a debug-enabled
1027 version for now, while I test it some more, so that Ville and
1036 version for now, while I test it some more, so that Ville and
1028 others may also catch any problems. Also made
1037 others may also catch any problems. Also made
1029 self.indent_current_str() a method, to ensure that there's no
1038 self.indent_current_str() a method, to ensure that there's no
1030 chance of the indent space count and the corresponding string
1039 chance of the indent space count and the corresponding string
1031 falling out of sync. All code needing the string should just call
1040 falling out of sync. All code needing the string should just call
1032 the method.
1041 the method.
1033
1042
1034 2006-01-18 Fernando Perez <Fernando.Perez@colorado.edu>
1043 2006-01-18 Fernando Perez <Fernando.Perez@colorado.edu>
1035
1044
1036 * IPython/Magic.py (magic_edit): fix check for when users don't
1045 * IPython/Magic.py (magic_edit): fix check for when users don't
1037 save their output files, the try/except was in the wrong section.
1046 save their output files, the try/except was in the wrong section.
1038
1047
1039 2006-01-17 Fernando Perez <Fernando.Perez@colorado.edu>
1048 2006-01-17 Fernando Perez <Fernando.Perez@colorado.edu>
1040
1049
1041 * IPython/Magic.py (magic_run): fix __file__ global missing from
1050 * IPython/Magic.py (magic_run): fix __file__ global missing from
1042 script's namespace when executed via %run. After a report by
1051 script's namespace when executed via %run. After a report by
1043 Vivian.
1052 Vivian.
1044
1053
1045 * IPython/Debugger.py (Pdb.__init__): Fix breakage with '%run -d'
1054 * IPython/Debugger.py (Pdb.__init__): Fix breakage with '%run -d'
1046 when using python 2.4. The parent constructor changed in 2.4, and
1055 when using python 2.4. The parent constructor changed in 2.4, and
1047 we need to track it directly (we can't call it, as it messes up
1056 we need to track it directly (we can't call it, as it messes up
1048 readline and tab-completion inside our pdb would stop working).
1057 readline and tab-completion inside our pdb would stop working).
1049 After a bug report by R. Bernstein <rocky-AT-panix.com>.
1058 After a bug report by R. Bernstein <rocky-AT-panix.com>.
1050
1059
1051 2006-01-16 Ville Vainio <vivainio@gmail.com>
1060 2006-01-16 Ville Vainio <vivainio@gmail.com>
1052
1061
1053 * Ipython/magic.py: Reverted back to old %edit functionality
1062 * Ipython/magic.py: Reverted back to old %edit functionality
1054 that returns file contents on exit.
1063 that returns file contents on exit.
1055
1064
1056 * IPython/path.py: Added Jason Orendorff's "path" module to
1065 * IPython/path.py: Added Jason Orendorff's "path" module to
1057 IPython tree, http://www.jorendorff.com/articles/python/path/.
1066 IPython tree, http://www.jorendorff.com/articles/python/path/.
1058 You can get path objects conveniently through %sc, and !!, e.g.:
1067 You can get path objects conveniently through %sc, and !!, e.g.:
1059 sc files=ls
1068 sc files=ls
1060 for p in files.paths: # or files.p
1069 for p in files.paths: # or files.p
1061 print p,p.mtime
1070 print p,p.mtime
1062
1071
1063 * Ipython/iplib.py:"," and ";" autoquoting-upon-autocall
1072 * Ipython/iplib.py:"," and ";" autoquoting-upon-autocall
1064 now work again without considering the exclusion regexp -
1073 now work again without considering the exclusion regexp -
1065 hence, things like ',foo my/path' turn to 'foo("my/path")'
1074 hence, things like ',foo my/path' turn to 'foo("my/path")'
1066 instead of syntax error.
1075 instead of syntax error.
1067
1076
1068
1077
1069 2006-01-14 Ville Vainio <vivainio@gmail.com>
1078 2006-01-14 Ville Vainio <vivainio@gmail.com>
1070
1079
1071 * IPython/ipapi.py (ashook, asmagic, options): Added convenience
1080 * IPython/ipapi.py (ashook, asmagic, options): Added convenience
1072 ipapi decorators for python 2.4 users, options() provides access to rc
1081 ipapi decorators for python 2.4 users, options() provides access to rc
1073 data.
1082 data.
1074
1083
1075 * IPython/Magic.py (magic_cd): %cd now accepts backslashes
1084 * IPython/Magic.py (magic_cd): %cd now accepts backslashes
1076 as path separators (even on Linux ;-). Space character after
1085 as path separators (even on Linux ;-). Space character after
1077 backslash (as yielded by tab completer) is still space;
1086 backslash (as yielded by tab completer) is still space;
1078 "%cd long\ name" works as expected.
1087 "%cd long\ name" works as expected.
1079
1088
1080 * IPython/ipapi.py,hooks.py,iplib.py: Hooks now implemented
1089 * IPython/ipapi.py,hooks.py,iplib.py: Hooks now implemented
1081 as "chain of command", with priority. API stays the same,
1090 as "chain of command", with priority. API stays the same,
1082 TryNext exception raised by a hook function signals that
1091 TryNext exception raised by a hook function signals that
1083 current hook failed and next hook should try handling it, as
1092 current hook failed and next hook should try handling it, as
1084 suggested by Walter DΓΆrwald <walter@livinglogic.de>. Walter also
1093 suggested by Walter DΓΆrwald <walter@livinglogic.de>. Walter also
1085 requested configurable display hook, which is now implemented.
1094 requested configurable display hook, which is now implemented.
1086
1095
1087 2006-01-13 Ville Vainio <vivainio@gmail.com>
1096 2006-01-13 Ville Vainio <vivainio@gmail.com>
1088
1097
1089 * IPython/platutils*.py: platform specific utility functions,
1098 * IPython/platutils*.py: platform specific utility functions,
1090 so far only set_term_title is implemented (change terminal
1099 so far only set_term_title is implemented (change terminal
1091 label in windowing systems). %cd now changes the title to
1100 label in windowing systems). %cd now changes the title to
1092 current dir.
1101 current dir.
1093
1102
1094 * IPython/Release.py: Added myself to "authors" list,
1103 * IPython/Release.py: Added myself to "authors" list,
1095 had to create new files.
1104 had to create new files.
1096
1105
1097 * IPython/iplib.py (handle_shell_escape): fixed logical flaw in
1106 * IPython/iplib.py (handle_shell_escape): fixed logical flaw in
1098 shell escape; not a known bug but had potential to be one in the
1107 shell escape; not a known bug but had potential to be one in the
1099 future.
1108 future.
1100
1109
1101 * IPython/ipapi.py (added),OInspect.py,iplib.py: "Public"
1110 * IPython/ipapi.py (added),OInspect.py,iplib.py: "Public"
1102 extension API for IPython! See the module for usage example. Fix
1111 extension API for IPython! See the module for usage example. Fix
1103 OInspect for docstring-less magic functions.
1112 OInspect for docstring-less magic functions.
1104
1113
1105
1114
1106 2006-01-13 Fernando Perez <Fernando.Perez@colorado.edu>
1115 2006-01-13 Fernando Perez <Fernando.Perez@colorado.edu>
1107
1116
1108 * IPython/iplib.py (raw_input): temporarily deactivate all
1117 * IPython/iplib.py (raw_input): temporarily deactivate all
1109 attempts at allowing pasting of code with autoindent on. It
1118 attempts at allowing pasting of code with autoindent on. It
1110 introduced bugs (reported by Prabhu) and I can't seem to find a
1119 introduced bugs (reported by Prabhu) and I can't seem to find a
1111 robust combination which works in all cases. Will have to revisit
1120 robust combination which works in all cases. Will have to revisit
1112 later.
1121 later.
1113
1122
1114 * IPython/genutils.py: remove isspace() function. We've dropped
1123 * IPython/genutils.py: remove isspace() function. We've dropped
1115 2.2 compatibility, so it's OK to use the string method.
1124 2.2 compatibility, so it's OK to use the string method.
1116
1125
1117 2006-01-12 Fernando Perez <Fernando.Perez@colorado.edu>
1126 2006-01-12 Fernando Perez <Fernando.Perez@colorado.edu>
1118
1127
1119 * IPython/iplib.py (InteractiveShell.__init__): fix regexp
1128 * IPython/iplib.py (InteractiveShell.__init__): fix regexp
1120 matching what NOT to autocall on, to include all python binary
1129 matching what NOT to autocall on, to include all python binary
1121 operators (including things like 'and', 'or', 'is' and 'in').
1130 operators (including things like 'and', 'or', 'is' and 'in').
1122 Prompted by a bug report on 'foo & bar', but I realized we had
1131 Prompted by a bug report on 'foo & bar', but I realized we had
1123 many more potential bug cases with other operators. The regexp is
1132 many more potential bug cases with other operators. The regexp is
1124 self.re_exclude_auto, it's fairly commented.
1133 self.re_exclude_auto, it's fairly commented.
1125
1134
1126 2006-01-12 Ville Vainio <vivainio@gmail.com>
1135 2006-01-12 Ville Vainio <vivainio@gmail.com>
1127
1136
1128 * IPython/iplib.py (make_quoted_expr,handle_shell_escape):
1137 * IPython/iplib.py (make_quoted_expr,handle_shell_escape):
1129 Prettified and hardened string/backslash quoting with ipsystem(),
1138 Prettified and hardened string/backslash quoting with ipsystem(),
1130 ipalias() and ipmagic(). Now even \ characters are passed to
1139 ipalias() and ipmagic(). Now even \ characters are passed to
1131 %magics, !shell escapes and aliases exactly as they are in the
1140 %magics, !shell escapes and aliases exactly as they are in the
1132 ipython command line. Should improve backslash experience,
1141 ipython command line. Should improve backslash experience,
1133 particularly in Windows (path delimiter for some commands that
1142 particularly in Windows (path delimiter for some commands that
1134 won't understand '/'), but Unix benefits as well (regexps). %cd
1143 won't understand '/'), but Unix benefits as well (regexps). %cd
1135 magic still doesn't support backslash path delimiters, though. Also
1144 magic still doesn't support backslash path delimiters, though. Also
1136 deleted all pretense of supporting multiline command strings in
1145 deleted all pretense of supporting multiline command strings in
1137 !system or %magic commands. Thanks to Jerry McRae for suggestions.
1146 !system or %magic commands. Thanks to Jerry McRae for suggestions.
1138
1147
1139 * doc/build_doc_instructions.txt added. Documentation on how to
1148 * doc/build_doc_instructions.txt added. Documentation on how to
1140 use doc/update_manual.py, added yesterday. Both files contributed
1149 use doc/update_manual.py, added yesterday. Both files contributed
1141 by JΓΆrgen Stenarson <jorgen.stenarson-AT-bostream.nu>. This slates
1150 by JΓΆrgen Stenarson <jorgen.stenarson-AT-bostream.nu>. This slates
1142 doc/*.sh for deprecation at a later date.
1151 doc/*.sh for deprecation at a later date.
1143
1152
1144 * /ipython.py Added ipython.py to root directory for
1153 * /ipython.py Added ipython.py to root directory for
1145 zero-installation (tar xzvf ipython.tgz; cd ipython; python
1154 zero-installation (tar xzvf ipython.tgz; cd ipython; python
1146 ipython.py) and development convenience (no need to keep doing
1155 ipython.py) and development convenience (no need to keep doing
1147 "setup.py install" between changes).
1156 "setup.py install" between changes).
1148
1157
1149 * Made ! and !! shell escapes work (again) in multiline expressions:
1158 * Made ! and !! shell escapes work (again) in multiline expressions:
1150 if 1:
1159 if 1:
1151 !ls
1160 !ls
1152 !!ls
1161 !!ls
1153
1162
1154 2006-01-12 Fernando Perez <Fernando.Perez@colorado.edu>
1163 2006-01-12 Fernando Perez <Fernando.Perez@colorado.edu>
1155
1164
1156 * IPython/ipstruct.py (Struct): Rename IPython.Struct to
1165 * IPython/ipstruct.py (Struct): Rename IPython.Struct to
1157 IPython.ipstruct, to avoid local shadowing of the stdlib 'struct'
1166 IPython.ipstruct, to avoid local shadowing of the stdlib 'struct'
1158 module in case-insensitive installation. Was causing crashes
1167 module in case-insensitive installation. Was causing crashes
1159 under win32. Closes http://www.scipy.net/roundup/ipython/issue49.
1168 under win32. Closes http://www.scipy.net/roundup/ipython/issue49.
1160
1169
1161 * IPython/Magic.py (magic_pycat): Fix pycat, patch by Marien Zwart
1170 * IPython/Magic.py (magic_pycat): Fix pycat, patch by Marien Zwart
1162 <marienz-AT-gentoo.org>, closes
1171 <marienz-AT-gentoo.org>, closes
1163 http://www.scipy.net/roundup/ipython/issue51.
1172 http://www.scipy.net/roundup/ipython/issue51.
1164
1173
1165 2006-01-11 Fernando Perez <Fernando.Perez@colorado.edu>
1174 2006-01-11 Fernando Perez <Fernando.Perez@colorado.edu>
1166
1175
1167 * IPython/Shell.py (IPShellGTK.on_timer): Finally fix the
1176 * IPython/Shell.py (IPShellGTK.on_timer): Finally fix the
1168 problem of excessive CPU usage under *nix and keyboard lag under
1177 problem of excessive CPU usage under *nix and keyboard lag under
1169 win32.
1178 win32.
1170
1179
1171 2006-01-10 *** Released version 0.7.0
1180 2006-01-10 *** Released version 0.7.0
1172
1181
1173 2006-01-10 Fernando Perez <Fernando.Perez@colorado.edu>
1182 2006-01-10 Fernando Perez <Fernando.Perez@colorado.edu>
1174
1183
1175 * IPython/Release.py (revision): tag version number to 0.7.0,
1184 * IPython/Release.py (revision): tag version number to 0.7.0,
1176 ready for release.
1185 ready for release.
1177
1186
1178 * IPython/Magic.py (magic_edit): Add print statement to %edit so
1187 * IPython/Magic.py (magic_edit): Add print statement to %edit so
1179 it informs the user of the name of the temp. file used. This can
1188 it informs the user of the name of the temp. file used. This can
1180 help if you decide later to reuse that same file, so you know
1189 help if you decide later to reuse that same file, so you know
1181 where to copy the info from.
1190 where to copy the info from.
1182
1191
1183 2006-01-09 Fernando Perez <Fernando.Perez@colorado.edu>
1192 2006-01-09 Fernando Perez <Fernando.Perez@colorado.edu>
1184
1193
1185 * setup_bdist_egg.py: little script to build an egg. Added
1194 * setup_bdist_egg.py: little script to build an egg. Added
1186 support in the release tools as well.
1195 support in the release tools as well.
1187
1196
1188 2006-01-08 Fernando Perez <Fernando.Perez@colorado.edu>
1197 2006-01-08 Fernando Perez <Fernando.Perez@colorado.edu>
1189
1198
1190 * IPython/Shell.py (IPShellWX.__init__): add support for WXPython
1199 * IPython/Shell.py (IPShellWX.__init__): add support for WXPython
1191 version selection (new -wxversion command line and ipythonrc
1200 version selection (new -wxversion command line and ipythonrc
1192 parameter). Patch contributed by Arnd Baecker
1201 parameter). Patch contributed by Arnd Baecker
1193 <arnd.baecker-AT-web.de>.
1202 <arnd.baecker-AT-web.de>.
1194
1203
1195 * IPython/iplib.py (embed_mainloop): fix tab-completion in
1204 * IPython/iplib.py (embed_mainloop): fix tab-completion in
1196 embedded instances, for variables defined at the interactive
1205 embedded instances, for variables defined at the interactive
1197 prompt of the embedded ipython. Reported by Arnd.
1206 prompt of the embedded ipython. Reported by Arnd.
1198
1207
1199 * IPython/Magic.py (magic_autocall): Fix %autocall magic. Now
1208 * IPython/Magic.py (magic_autocall): Fix %autocall magic. Now
1200 it can be used as a (stateful) toggle, or with a direct parameter.
1209 it can be used as a (stateful) toggle, or with a direct parameter.
1201
1210
1202 * IPython/ultraTB.py (_fixed_getinnerframes): remove debug assert which
1211 * IPython/ultraTB.py (_fixed_getinnerframes): remove debug assert which
1203 could be triggered in certain cases and cause the traceback
1212 could be triggered in certain cases and cause the traceback
1204 printer not to work.
1213 printer not to work.
1205
1214
1206 2006-01-07 Fernando Perez <Fernando.Perez@colorado.edu>
1215 2006-01-07 Fernando Perez <Fernando.Perez@colorado.edu>
1207
1216
1208 * IPython/iplib.py (_should_recompile): Small fix, closes
1217 * IPython/iplib.py (_should_recompile): Small fix, closes
1209 http://www.scipy.net/roundup/ipython/issue48. Patch by Scott.
1218 http://www.scipy.net/roundup/ipython/issue48. Patch by Scott.
1210
1219
1211 2006-01-04 Fernando Perez <Fernando.Perez@colorado.edu>
1220 2006-01-04 Fernando Perez <Fernando.Perez@colorado.edu>
1212
1221
1213 * IPython/Shell.py (IPShellGTK.mainloop): fix bug in the GTK
1222 * IPython/Shell.py (IPShellGTK.mainloop): fix bug in the GTK
1214 backend for matplotlib (100% cpu utiliziation). Thanks to Charlie
1223 backend for matplotlib (100% cpu utiliziation). Thanks to Charlie
1215 Moad for help with tracking it down.
1224 Moad for help with tracking it down.
1216
1225
1217 * IPython/iplib.py (handle_auto): fix autocall handling for
1226 * IPython/iplib.py (handle_auto): fix autocall handling for
1218 objects which support BOTH __getitem__ and __call__ (so that f [x]
1227 objects which support BOTH __getitem__ and __call__ (so that f [x]
1219 is left alone, instead of becoming f([x]) automatically).
1228 is left alone, instead of becoming f([x]) automatically).
1220
1229
1221 * IPython/Magic.py (magic_cd): fix crash when cd -b was used.
1230 * IPython/Magic.py (magic_cd): fix crash when cd -b was used.
1222 Ville's patch.
1231 Ville's patch.
1223
1232
1224 2006-01-03 Fernando Perez <Fernando.Perez@colorado.edu>
1233 2006-01-03 Fernando Perez <Fernando.Perez@colorado.edu>
1225
1234
1226 * IPython/iplib.py (handle_auto): changed autocall semantics to
1235 * IPython/iplib.py (handle_auto): changed autocall semantics to
1227 include 'smart' mode, where the autocall transformation is NOT
1236 include 'smart' mode, where the autocall transformation is NOT
1228 applied if there are no arguments on the line. This allows you to
1237 applied if there are no arguments on the line. This allows you to
1229 just type 'foo' if foo is a callable to see its internal form,
1238 just type 'foo' if foo is a callable to see its internal form,
1230 instead of having it called with no arguments (typically a
1239 instead of having it called with no arguments (typically a
1231 mistake). The old 'full' autocall still exists: for that, you
1240 mistake). The old 'full' autocall still exists: for that, you
1232 need to set the 'autocall' parameter to 2 in your ipythonrc file.
1241 need to set the 'autocall' parameter to 2 in your ipythonrc file.
1233
1242
1234 * IPython/completer.py (Completer.attr_matches): add
1243 * IPython/completer.py (Completer.attr_matches): add
1235 tab-completion support for Enthoughts' traits. After a report by
1244 tab-completion support for Enthoughts' traits. After a report by
1236 Arnd and a patch by Prabhu.
1245 Arnd and a patch by Prabhu.
1237
1246
1238 2006-01-02 Fernando Perez <Fernando.Perez@colorado.edu>
1247 2006-01-02 Fernando Perez <Fernando.Perez@colorado.edu>
1239
1248
1240 * IPython/ultraTB.py (_fixed_getinnerframes): added Alex
1249 * IPython/ultraTB.py (_fixed_getinnerframes): added Alex
1241 Schmolck's patch to fix inspect.getinnerframes().
1250 Schmolck's patch to fix inspect.getinnerframes().
1242
1251
1243 * IPython/iplib.py (InteractiveShell.__init__): significant fixes
1252 * IPython/iplib.py (InteractiveShell.__init__): significant fixes
1244 for embedded instances, regarding handling of namespaces and items
1253 for embedded instances, regarding handling of namespaces and items
1245 added to the __builtin__ one. Multiple embedded instances and
1254 added to the __builtin__ one. Multiple embedded instances and
1246 recursive embeddings should work better now (though I'm not sure
1255 recursive embeddings should work better now (though I'm not sure
1247 I've got all the corner cases fixed, that code is a bit of a brain
1256 I've got all the corner cases fixed, that code is a bit of a brain
1248 twister).
1257 twister).
1249
1258
1250 * IPython/Magic.py (magic_edit): added support to edit in-memory
1259 * IPython/Magic.py (magic_edit): added support to edit in-memory
1251 macros (automatically creates the necessary temp files). %edit
1260 macros (automatically creates the necessary temp files). %edit
1252 also doesn't return the file contents anymore, it's just noise.
1261 also doesn't return the file contents anymore, it's just noise.
1253
1262
1254 * IPython/completer.py (Completer.attr_matches): revert change to
1263 * IPython/completer.py (Completer.attr_matches): revert change to
1255 complete only on attributes listed in __all__. I realized it
1264 complete only on attributes listed in __all__. I realized it
1256 cripples the tab-completion system as a tool for exploring the
1265 cripples the tab-completion system as a tool for exploring the
1257 internals of unknown libraries (it renders any non-__all__
1266 internals of unknown libraries (it renders any non-__all__
1258 attribute off-limits). I got bit by this when trying to see
1267 attribute off-limits). I got bit by this when trying to see
1259 something inside the dis module.
1268 something inside the dis module.
1260
1269
1261 2005-12-31 Fernando Perez <Fernando.Perez@colorado.edu>
1270 2005-12-31 Fernando Perez <Fernando.Perez@colorado.edu>
1262
1271
1263 * IPython/iplib.py (InteractiveShell.__init__): add .meta
1272 * IPython/iplib.py (InteractiveShell.__init__): add .meta
1264 namespace for users and extension writers to hold data in. This
1273 namespace for users and extension writers to hold data in. This
1265 follows the discussion in
1274 follows the discussion in
1266 http://projects.scipy.org/ipython/ipython/wiki/RefactoringIPython.
1275 http://projects.scipy.org/ipython/ipython/wiki/RefactoringIPython.
1267
1276
1268 * IPython/completer.py (IPCompleter.complete): small patch to help
1277 * IPython/completer.py (IPCompleter.complete): small patch to help
1269 tab-completion under Emacs, after a suggestion by John Barnard
1278 tab-completion under Emacs, after a suggestion by John Barnard
1270 <barnarj-AT-ccf.org>.
1279 <barnarj-AT-ccf.org>.
1271
1280
1272 * IPython/Magic.py (Magic.extract_input_slices): added support for
1281 * IPython/Magic.py (Magic.extract_input_slices): added support for
1273 the slice notation in magics to use N-M to represent numbers N...M
1282 the slice notation in magics to use N-M to represent numbers N...M
1274 (closed endpoints). This is used by %macro and %save.
1283 (closed endpoints). This is used by %macro and %save.
1275
1284
1276 * IPython/completer.py (Completer.attr_matches): for modules which
1285 * IPython/completer.py (Completer.attr_matches): for modules which
1277 define __all__, complete only on those. After a patch by Jeffrey
1286 define __all__, complete only on those. After a patch by Jeffrey
1278 Collins <jcollins_boulder-AT-earthlink.net>. Also, clean up and
1287 Collins <jcollins_boulder-AT-earthlink.net>. Also, clean up and
1279 speed up this routine.
1288 speed up this routine.
1280
1289
1281 * IPython/Logger.py (Logger.log): fix a history handling bug. I
1290 * IPython/Logger.py (Logger.log): fix a history handling bug. I
1282 don't know if this is the end of it, but the behavior now is
1291 don't know if this is the end of it, but the behavior now is
1283 certainly much more correct. Note that coupled with macros,
1292 certainly much more correct. Note that coupled with macros,
1284 slightly surprising (at first) behavior may occur: a macro will in
1293 slightly surprising (at first) behavior may occur: a macro will in
1285 general expand to multiple lines of input, so upon exiting, the
1294 general expand to multiple lines of input, so upon exiting, the
1286 in/out counters will both be bumped by the corresponding amount
1295 in/out counters will both be bumped by the corresponding amount
1287 (as if the macro's contents had been typed interactively). Typing
1296 (as if the macro's contents had been typed interactively). Typing
1288 %hist will reveal the intermediate (silently processed) lines.
1297 %hist will reveal the intermediate (silently processed) lines.
1289
1298
1290 * IPython/Magic.py (magic_run): fix a subtle bug which could cause
1299 * IPython/Magic.py (magic_run): fix a subtle bug which could cause
1291 pickle to fail (%run was overwriting __main__ and not restoring
1300 pickle to fail (%run was overwriting __main__ and not restoring
1292 it, but pickle relies on __main__ to operate).
1301 it, but pickle relies on __main__ to operate).
1293
1302
1294 * IPython/iplib.py (InteractiveShell): fix pdb calling: I'm now
1303 * IPython/iplib.py (InteractiveShell): fix pdb calling: I'm now
1295 using properties, but forgot to make the main InteractiveShell
1304 using properties, but forgot to make the main InteractiveShell
1296 class a new-style class. Properties fail silently, and
1305 class a new-style class. Properties fail silently, and
1297 mysteriously, with old-style class (getters work, but
1306 mysteriously, with old-style class (getters work, but
1298 setters don't do anything).
1307 setters don't do anything).
1299
1308
1300 2005-12-30 Fernando Perez <Fernando.Perez@colorado.edu>
1309 2005-12-30 Fernando Perez <Fernando.Perez@colorado.edu>
1301
1310
1302 * IPython/Magic.py (magic_history): fix history reporting bug (I
1311 * IPython/Magic.py (magic_history): fix history reporting bug (I
1303 know some nasties are still there, I just can't seem to find a
1312 know some nasties are still there, I just can't seem to find a
1304 reproducible test case to track them down; the input history is
1313 reproducible test case to track them down; the input history is
1305 falling out of sync...)
1314 falling out of sync...)
1306
1315
1307 * IPython/iplib.py (handle_shell_escape): fix bug where both
1316 * IPython/iplib.py (handle_shell_escape): fix bug where both
1308 aliases and system accesses where broken for indented code (such
1317 aliases and system accesses where broken for indented code (such
1309 as loops).
1318 as loops).
1310
1319
1311 * IPython/genutils.py (shell): fix small but critical bug for
1320 * IPython/genutils.py (shell): fix small but critical bug for
1312 win32 system access.
1321 win32 system access.
1313
1322
1314 2005-12-29 Fernando Perez <Fernando.Perez@colorado.edu>
1323 2005-12-29 Fernando Perez <Fernando.Perez@colorado.edu>
1315
1324
1316 * IPython/iplib.py (showtraceback): remove use of the
1325 * IPython/iplib.py (showtraceback): remove use of the
1317 sys.last_{type/value/traceback} structures, which are non
1326 sys.last_{type/value/traceback} structures, which are non
1318 thread-safe.
1327 thread-safe.
1319 (_prefilter): change control flow to ensure that we NEVER
1328 (_prefilter): change control flow to ensure that we NEVER
1320 introspect objects when autocall is off. This will guarantee that
1329 introspect objects when autocall is off. This will guarantee that
1321 having an input line of the form 'x.y', where access to attribute
1330 having an input line of the form 'x.y', where access to attribute
1322 'y' has side effects, doesn't trigger the side effect TWICE. It
1331 'y' has side effects, doesn't trigger the side effect TWICE. It
1323 is important to note that, with autocall on, these side effects
1332 is important to note that, with autocall on, these side effects
1324 can still happen.
1333 can still happen.
1325 (ipsystem): new builtin, to complete the ip{magic/alias/system}
1334 (ipsystem): new builtin, to complete the ip{magic/alias/system}
1326 trio. IPython offers these three kinds of special calls which are
1335 trio. IPython offers these three kinds of special calls which are
1327 not python code, and it's a good thing to have their call method
1336 not python code, and it's a good thing to have their call method
1328 be accessible as pure python functions (not just special syntax at
1337 be accessible as pure python functions (not just special syntax at
1329 the command line). It gives us a better internal implementation
1338 the command line). It gives us a better internal implementation
1330 structure, as well as exposing these for user scripting more
1339 structure, as well as exposing these for user scripting more
1331 cleanly.
1340 cleanly.
1332
1341
1333 * IPython/macro.py (Macro.__init__): moved macros to a standalone
1342 * IPython/macro.py (Macro.__init__): moved macros to a standalone
1334 file. Now that they'll be more likely to be used with the
1343 file. Now that they'll be more likely to be used with the
1335 persistance system (%store), I want to make sure their module path
1344 persistance system (%store), I want to make sure their module path
1336 doesn't change in the future, so that we don't break things for
1345 doesn't change in the future, so that we don't break things for
1337 users' persisted data.
1346 users' persisted data.
1338
1347
1339 * IPython/iplib.py (autoindent_update): move indentation
1348 * IPython/iplib.py (autoindent_update): move indentation
1340 management into the _text_ processing loop, not the keyboard
1349 management into the _text_ processing loop, not the keyboard
1341 interactive one. This is necessary to correctly process non-typed
1350 interactive one. This is necessary to correctly process non-typed
1342 multiline input (such as macros).
1351 multiline input (such as macros).
1343
1352
1344 * IPython/Magic.py (Magic.format_latex): patch by Stefan van der
1353 * IPython/Magic.py (Magic.format_latex): patch by Stefan van der
1345 Walt <stefan-AT-sun.ac.za> to fix latex formatting of docstrings,
1354 Walt <stefan-AT-sun.ac.za> to fix latex formatting of docstrings,
1346 which was producing problems in the resulting manual.
1355 which was producing problems in the resulting manual.
1347 (magic_whos): improve reporting of instances (show their class,
1356 (magic_whos): improve reporting of instances (show their class,
1348 instead of simply printing 'instance' which isn't terribly
1357 instead of simply printing 'instance' which isn't terribly
1349 informative).
1358 informative).
1350
1359
1351 * IPython/genutils.py (shell): commit Jorgen Stenarson's patch
1360 * IPython/genutils.py (shell): commit Jorgen Stenarson's patch
1352 (minor mods) to support network shares under win32.
1361 (minor mods) to support network shares under win32.
1353
1362
1354 * IPython/winconsole.py (get_console_size): add new winconsole
1363 * IPython/winconsole.py (get_console_size): add new winconsole
1355 module and fixes to page_dumb() to improve its behavior under
1364 module and fixes to page_dumb() to improve its behavior under
1356 win32. Contributed by Alexander Belchenko <bialix-AT-ukr.net>.
1365 win32. Contributed by Alexander Belchenko <bialix-AT-ukr.net>.
1357
1366
1358 * IPython/Magic.py (Macro): simplified Macro class to just
1367 * IPython/Magic.py (Macro): simplified Macro class to just
1359 subclass list. We've had only 2.2 compatibility for a very long
1368 subclass list. We've had only 2.2 compatibility for a very long
1360 time, yet I was still avoiding subclassing the builtin types. No
1369 time, yet I was still avoiding subclassing the builtin types. No
1361 more (I'm also starting to use properties, though I won't shift to
1370 more (I'm also starting to use properties, though I won't shift to
1362 2.3-specific features quite yet).
1371 2.3-specific features quite yet).
1363 (magic_store): added Ville's patch for lightweight variable
1372 (magic_store): added Ville's patch for lightweight variable
1364 persistence, after a request on the user list by Matt Wilkie
1373 persistence, after a request on the user list by Matt Wilkie
1365 <maphew-AT-gmail.com>. The new %store magic's docstring has full
1374 <maphew-AT-gmail.com>. The new %store magic's docstring has full
1366 details.
1375 details.
1367
1376
1368 * IPython/iplib.py (InteractiveShell.post_config_initialization):
1377 * IPython/iplib.py (InteractiveShell.post_config_initialization):
1369 changed the default logfile name from 'ipython.log' to
1378 changed the default logfile name from 'ipython.log' to
1370 'ipython_log.py'. These logs are real python files, and now that
1379 'ipython_log.py'. These logs are real python files, and now that
1371 we have much better multiline support, people are more likely to
1380 we have much better multiline support, people are more likely to
1372 want to use them as such. Might as well name them correctly.
1381 want to use them as such. Might as well name them correctly.
1373
1382
1374 * IPython/Magic.py: substantial cleanup. While we can't stop
1383 * IPython/Magic.py: substantial cleanup. While we can't stop
1375 using magics as mixins, due to the existing customizations 'out
1384 using magics as mixins, due to the existing customizations 'out
1376 there' which rely on the mixin naming conventions, at least I
1385 there' which rely on the mixin naming conventions, at least I
1377 cleaned out all cross-class name usage. So once we are OK with
1386 cleaned out all cross-class name usage. So once we are OK with
1378 breaking compatibility, the two systems can be separated.
1387 breaking compatibility, the two systems can be separated.
1379
1388
1380 * IPython/Logger.py: major cleanup. This one is NOT a mixin
1389 * IPython/Logger.py: major cleanup. This one is NOT a mixin
1381 anymore, and the class is a fair bit less hideous as well. New
1390 anymore, and the class is a fair bit less hideous as well. New
1382 features were also introduced: timestamping of input, and logging
1391 features were also introduced: timestamping of input, and logging
1383 of output results. These are user-visible with the -t and -o
1392 of output results. These are user-visible with the -t and -o
1384 options to %logstart. Closes
1393 options to %logstart. Closes
1385 http://www.scipy.net/roundup/ipython/issue11 and a request by
1394 http://www.scipy.net/roundup/ipython/issue11 and a request by
1386 William Stein (SAGE developer - http://modular.ucsd.edu/sage).
1395 William Stein (SAGE developer - http://modular.ucsd.edu/sage).
1387
1396
1388 2005-12-28 Fernando Perez <Fernando.Perez@colorado.edu>
1397 2005-12-28 Fernando Perez <Fernando.Perez@colorado.edu>
1389
1398
1390 * IPython/iplib.py (handle_shell_escape): add Ville's patch to
1399 * IPython/iplib.py (handle_shell_escape): add Ville's patch to
1391 better handle backslashes in paths. See the thread 'More Windows
1400 better handle backslashes in paths. See the thread 'More Windows
1392 questions part 2 - \/ characters revisited' on the iypthon user
1401 questions part 2 - \/ characters revisited' on the iypthon user
1393 list:
1402 list:
1394 http://scipy.net/pipermail/ipython-user/2005-June/000907.html
1403 http://scipy.net/pipermail/ipython-user/2005-June/000907.html
1395
1404
1396 (InteractiveShell.__init__): fix tab-completion bug in threaded shells.
1405 (InteractiveShell.__init__): fix tab-completion bug in threaded shells.
1397
1406
1398 (InteractiveShell.__init__): change threaded shells to not use the
1407 (InteractiveShell.__init__): change threaded shells to not use the
1399 ipython crash handler. This was causing more problems than not,
1408 ipython crash handler. This was causing more problems than not,
1400 as exceptions in the main thread (GUI code, typically) would
1409 as exceptions in the main thread (GUI code, typically) would
1401 always show up as a 'crash', when they really weren't.
1410 always show up as a 'crash', when they really weren't.
1402
1411
1403 The colors and exception mode commands (%colors/%xmode) have been
1412 The colors and exception mode commands (%colors/%xmode) have been
1404 synchronized to also take this into account, so users can get
1413 synchronized to also take this into account, so users can get
1405 verbose exceptions for their threaded code as well. I also added
1414 verbose exceptions for their threaded code as well. I also added
1406 support for activating pdb inside this exception handler as well,
1415 support for activating pdb inside this exception handler as well,
1407 so now GUI authors can use IPython's enhanced pdb at runtime.
1416 so now GUI authors can use IPython's enhanced pdb at runtime.
1408
1417
1409 * IPython/ipmaker.py (make_IPython): make the autoedit_syntax flag
1418 * IPython/ipmaker.py (make_IPython): make the autoedit_syntax flag
1410 true by default, and add it to the shipped ipythonrc file. Since
1419 true by default, and add it to the shipped ipythonrc file. Since
1411 this asks the user before proceeding, I think it's OK to make it
1420 this asks the user before proceeding, I think it's OK to make it
1412 true by default.
1421 true by default.
1413
1422
1414 * IPython/Magic.py (magic_exit): make new exit/quit magics instead
1423 * IPython/Magic.py (magic_exit): make new exit/quit magics instead
1415 of the previous special-casing of input in the eval loop. I think
1424 of the previous special-casing of input in the eval loop. I think
1416 this is cleaner, as they really are commands and shouldn't have
1425 this is cleaner, as they really are commands and shouldn't have
1417 a special role in the middle of the core code.
1426 a special role in the middle of the core code.
1418
1427
1419 2005-12-27 Fernando Perez <Fernando.Perez@colorado.edu>
1428 2005-12-27 Fernando Perez <Fernando.Perez@colorado.edu>
1420
1429
1421 * IPython/iplib.py (edit_syntax_error): added support for
1430 * IPython/iplib.py (edit_syntax_error): added support for
1422 automatically reopening the editor if the file had a syntax error
1431 automatically reopening the editor if the file had a syntax error
1423 in it. Thanks to scottt who provided the patch at:
1432 in it. Thanks to scottt who provided the patch at:
1424 http://www.scipy.net/roundup/ipython/issue36 (slightly modified
1433 http://www.scipy.net/roundup/ipython/issue36 (slightly modified
1425 version committed).
1434 version committed).
1426
1435
1427 * IPython/iplib.py (handle_normal): add suport for multi-line
1436 * IPython/iplib.py (handle_normal): add suport for multi-line
1428 input with emtpy lines. This fixes
1437 input with emtpy lines. This fixes
1429 http://www.scipy.net/roundup/ipython/issue43 and a similar
1438 http://www.scipy.net/roundup/ipython/issue43 and a similar
1430 discussion on the user list.
1439 discussion on the user list.
1431
1440
1432 WARNING: a behavior change is necessarily introduced to support
1441 WARNING: a behavior change is necessarily introduced to support
1433 blank lines: now a single blank line with whitespace does NOT
1442 blank lines: now a single blank line with whitespace does NOT
1434 break the input loop, which means that when autoindent is on, by
1443 break the input loop, which means that when autoindent is on, by
1435 default hitting return on the next (indented) line does NOT exit.
1444 default hitting return on the next (indented) line does NOT exit.
1436
1445
1437 Instead, to exit a multiline input you can either have:
1446 Instead, to exit a multiline input you can either have:
1438
1447
1439 - TWO whitespace lines (just hit return again), or
1448 - TWO whitespace lines (just hit return again), or
1440 - a single whitespace line of a different length than provided
1449 - a single whitespace line of a different length than provided
1441 by the autoindent (add or remove a space).
1450 by the autoindent (add or remove a space).
1442
1451
1443 * IPython/completer.py (MagicCompleter.__init__): new 'completer'
1452 * IPython/completer.py (MagicCompleter.__init__): new 'completer'
1444 module to better organize all readline-related functionality.
1453 module to better organize all readline-related functionality.
1445 I've deleted FlexCompleter and put all completion clases here.
1454 I've deleted FlexCompleter and put all completion clases here.
1446
1455
1447 * IPython/iplib.py (raw_input): improve indentation management.
1456 * IPython/iplib.py (raw_input): improve indentation management.
1448 It is now possible to paste indented code with autoindent on, and
1457 It is now possible to paste indented code with autoindent on, and
1449 the code is interpreted correctly (though it still looks bad on
1458 the code is interpreted correctly (though it still looks bad on
1450 screen, due to the line-oriented nature of ipython).
1459 screen, due to the line-oriented nature of ipython).
1451 (MagicCompleter.complete): change behavior so that a TAB key on an
1460 (MagicCompleter.complete): change behavior so that a TAB key on an
1452 otherwise empty line actually inserts a tab, instead of completing
1461 otherwise empty line actually inserts a tab, instead of completing
1453 on the entire global namespace. This makes it easier to use the
1462 on the entire global namespace. This makes it easier to use the
1454 TAB key for indentation. After a request by Hans Meine
1463 TAB key for indentation. After a request by Hans Meine
1455 <hans_meine-AT-gmx.net>
1464 <hans_meine-AT-gmx.net>
1456 (_prefilter): add support so that typing plain 'exit' or 'quit'
1465 (_prefilter): add support so that typing plain 'exit' or 'quit'
1457 does a sensible thing. Originally I tried to deviate as little as
1466 does a sensible thing. Originally I tried to deviate as little as
1458 possible from the default python behavior, but even that one may
1467 possible from the default python behavior, but even that one may
1459 change in this direction (thread on python-dev to that effect).
1468 change in this direction (thread on python-dev to that effect).
1460 Regardless, ipython should do the right thing even if CPython's
1469 Regardless, ipython should do the right thing even if CPython's
1461 '>>>' prompt doesn't.
1470 '>>>' prompt doesn't.
1462 (InteractiveShell): removed subclassing code.InteractiveConsole
1471 (InteractiveShell): removed subclassing code.InteractiveConsole
1463 class. By now we'd overridden just about all of its methods: I've
1472 class. By now we'd overridden just about all of its methods: I've
1464 copied the remaining two over, and now ipython is a standalone
1473 copied the remaining two over, and now ipython is a standalone
1465 class. This will provide a clearer picture for the chainsaw
1474 class. This will provide a clearer picture for the chainsaw
1466 branch refactoring.
1475 branch refactoring.
1467
1476
1468 2005-12-26 Fernando Perez <Fernando.Perez@colorado.edu>
1477 2005-12-26 Fernando Perez <Fernando.Perez@colorado.edu>
1469
1478
1470 * IPython/ultraTB.py (VerboseTB.text): harden reporting against
1479 * IPython/ultraTB.py (VerboseTB.text): harden reporting against
1471 failures for objects which break when dir() is called on them.
1480 failures for objects which break when dir() is called on them.
1472
1481
1473 * IPython/FlexCompleter.py (Completer.__init__): Added support for
1482 * IPython/FlexCompleter.py (Completer.__init__): Added support for
1474 distinct local and global namespaces in the completer API. This
1483 distinct local and global namespaces in the completer API. This
1475 change allows us to properly handle completion with distinct
1484 change allows us to properly handle completion with distinct
1476 scopes, including in embedded instances (this had never really
1485 scopes, including in embedded instances (this had never really
1477 worked correctly).
1486 worked correctly).
1478
1487
1479 Note: this introduces a change in the constructor for
1488 Note: this introduces a change in the constructor for
1480 MagicCompleter, as a new global_namespace parameter is now the
1489 MagicCompleter, as a new global_namespace parameter is now the
1481 second argument (the others were bumped one position).
1490 second argument (the others were bumped one position).
1482
1491
1483 2005-12-25 Fernando Perez <Fernando.Perez@colorado.edu>
1492 2005-12-25 Fernando Perez <Fernando.Perez@colorado.edu>
1484
1493
1485 * IPython/iplib.py (embed_mainloop): fix tab-completion in
1494 * IPython/iplib.py (embed_mainloop): fix tab-completion in
1486 embedded instances (which can be done now thanks to Vivian's
1495 embedded instances (which can be done now thanks to Vivian's
1487 frame-handling fixes for pdb).
1496 frame-handling fixes for pdb).
1488 (InteractiveShell.__init__): Fix namespace handling problem in
1497 (InteractiveShell.__init__): Fix namespace handling problem in
1489 embedded instances. We were overwriting __main__ unconditionally,
1498 embedded instances. We were overwriting __main__ unconditionally,
1490 and this should only be done for 'full' (non-embedded) IPython;
1499 and this should only be done for 'full' (non-embedded) IPython;
1491 embedded instances must respect the caller's __main__. Thanks to
1500 embedded instances must respect the caller's __main__. Thanks to
1492 a bug report by Yaroslav Bulatov <yaroslavvb-AT-gmail.com>
1501 a bug report by Yaroslav Bulatov <yaroslavvb-AT-gmail.com>
1493
1502
1494 2005-12-24 Fernando Perez <Fernando.Perez@colorado.edu>
1503 2005-12-24 Fernando Perez <Fernando.Perez@colorado.edu>
1495
1504
1496 * setup.py: added download_url to setup(). This registers the
1505 * setup.py: added download_url to setup(). This registers the
1497 download address at PyPI, which is not only useful to humans
1506 download address at PyPI, which is not only useful to humans
1498 browsing the site, but is also picked up by setuptools (the Eggs
1507 browsing the site, but is also picked up by setuptools (the Eggs
1499 machinery). Thanks to Ville and R. Kern for the info/discussion
1508 machinery). Thanks to Ville and R. Kern for the info/discussion
1500 on this.
1509 on this.
1501
1510
1502 2005-12-23 Fernando Perez <Fernando.Perez@colorado.edu>
1511 2005-12-23 Fernando Perez <Fernando.Perez@colorado.edu>
1503
1512
1504 * IPython/Debugger.py (Pdb.__init__): Major pdb mode enhancements.
1513 * IPython/Debugger.py (Pdb.__init__): Major pdb mode enhancements.
1505 This brings a lot of nice functionality to the pdb mode, which now
1514 This brings a lot of nice functionality to the pdb mode, which now
1506 has tab-completion, syntax highlighting, and better stack handling
1515 has tab-completion, syntax highlighting, and better stack handling
1507 than before. Many thanks to Vivian De Smedt
1516 than before. Many thanks to Vivian De Smedt
1508 <vivian-AT-vdesmedt.com> for the original patches.
1517 <vivian-AT-vdesmedt.com> for the original patches.
1509
1518
1510 2005-12-08 Fernando Perez <Fernando.Perez@colorado.edu>
1519 2005-12-08 Fernando Perez <Fernando.Perez@colorado.edu>
1511
1520
1512 * IPython/Shell.py (IPShellGTK.mainloop): fix mainloop() calling
1521 * IPython/Shell.py (IPShellGTK.mainloop): fix mainloop() calling
1513 sequence to consistently accept the banner argument. The
1522 sequence to consistently accept the banner argument. The
1514 inconsistency was tripping SAGE, thanks to Gary Zablackis
1523 inconsistency was tripping SAGE, thanks to Gary Zablackis
1515 <gzabl-AT-yahoo.com> for the report.
1524 <gzabl-AT-yahoo.com> for the report.
1516
1525
1517 2005-11-15 Fernando Perez <Fernando.Perez@colorado.edu>
1526 2005-11-15 Fernando Perez <Fernando.Perez@colorado.edu>
1518
1527
1519 * IPython/iplib.py (InteractiveShell.post_config_initialization):
1528 * IPython/iplib.py (InteractiveShell.post_config_initialization):
1520 Fix bug where a naked 'alias' call in the ipythonrc file would
1529 Fix bug where a naked 'alias' call in the ipythonrc file would
1521 cause a crash. Bug reported by Jorgen Stenarson.
1530 cause a crash. Bug reported by Jorgen Stenarson.
1522
1531
1523 2005-11-15 Fernando Perez <Fernando.Perez@colorado.edu>
1532 2005-11-15 Fernando Perez <Fernando.Perez@colorado.edu>
1524
1533
1525 * IPython/ipmaker.py (make_IPython): cleanups which should improve
1534 * IPython/ipmaker.py (make_IPython): cleanups which should improve
1526 startup time.
1535 startup time.
1527
1536
1528 * IPython/iplib.py (runcode): my globals 'fix' for embedded
1537 * IPython/iplib.py (runcode): my globals 'fix' for embedded
1529 instances had introduced a bug with globals in normal code. Now
1538 instances had introduced a bug with globals in normal code. Now
1530 it's working in all cases.
1539 it's working in all cases.
1531
1540
1532 * IPython/Magic.py (magic_psearch): Finish wildcard cleanup and
1541 * IPython/Magic.py (magic_psearch): Finish wildcard cleanup and
1533 API changes. A new ipytonrc option, 'wildcards_case_sensitive'
1542 API changes. A new ipytonrc option, 'wildcards_case_sensitive'
1534 has been introduced to set the default case sensitivity of the
1543 has been introduced to set the default case sensitivity of the
1535 searches. Users can still select either mode at runtime on a
1544 searches. Users can still select either mode at runtime on a
1536 per-search basis.
1545 per-search basis.
1537
1546
1538 2005-11-13 Fernando Perez <Fernando.Perez@colorado.edu>
1547 2005-11-13 Fernando Perez <Fernando.Perez@colorado.edu>
1539
1548
1540 * IPython/wildcard.py (NameSpace.__init__): fix resolution of
1549 * IPython/wildcard.py (NameSpace.__init__): fix resolution of
1541 attributes in wildcard searches for subclasses. Modified version
1550 attributes in wildcard searches for subclasses. Modified version
1542 of a patch by Jorgen.
1551 of a patch by Jorgen.
1543
1552
1544 2005-11-12 Fernando Perez <Fernando.Perez@colorado.edu>
1553 2005-11-12 Fernando Perez <Fernando.Perez@colorado.edu>
1545
1554
1546 * IPython/iplib.py (embed_mainloop): Fix handling of globals for
1555 * IPython/iplib.py (embed_mainloop): Fix handling of globals for
1547 embedded instances. I added a user_global_ns attribute to the
1556 embedded instances. I added a user_global_ns attribute to the
1548 InteractiveShell class to handle this.
1557 InteractiveShell class to handle this.
1549
1558
1550 2005-10-31 Fernando Perez <Fernando.Perez@colorado.edu>
1559 2005-10-31 Fernando Perez <Fernando.Perez@colorado.edu>
1551
1560
1552 * IPython/Shell.py (IPShellGTK.mainloop): Change timeout_add to
1561 * IPython/Shell.py (IPShellGTK.mainloop): Change timeout_add to
1553 idle_add, which fixes horrible keyboard lag problems under gtk 2.6
1562 idle_add, which fixes horrible keyboard lag problems under gtk 2.6
1554 (reported under win32, but may happen also in other platforms).
1563 (reported under win32, but may happen also in other platforms).
1555 Bug report and fix courtesy of Sean Moore <smm-AT-logic.bm>
1564 Bug report and fix courtesy of Sean Moore <smm-AT-logic.bm>
1556
1565
1557 2005-10-15 Fernando Perez <Fernando.Perez@colorado.edu>
1566 2005-10-15 Fernando Perez <Fernando.Perez@colorado.edu>
1558
1567
1559 * IPython/Magic.py (magic_psearch): new support for wildcard
1568 * IPython/Magic.py (magic_psearch): new support for wildcard
1560 patterns. Now, typing ?a*b will list all names which begin with a
1569 patterns. Now, typing ?a*b will list all names which begin with a
1561 and end in b, for example. The %psearch magic has full
1570 and end in b, for example. The %psearch magic has full
1562 docstrings. Many thanks to JΓΆrgen Stenarson
1571 docstrings. Many thanks to JΓΆrgen Stenarson
1563 <jorgen.stenarson-AT-bostream.nu>, author of the patches
1572 <jorgen.stenarson-AT-bostream.nu>, author of the patches
1564 implementing this functionality.
1573 implementing this functionality.
1565
1574
1566 2005-09-27 Fernando Perez <Fernando.Perez@colorado.edu>
1575 2005-09-27 Fernando Perez <Fernando.Perez@colorado.edu>
1567
1576
1568 * Manual: fixed long-standing annoyance of double-dashes (as in
1577 * Manual: fixed long-standing annoyance of double-dashes (as in
1569 --prefix=~, for example) being stripped in the HTML version. This
1578 --prefix=~, for example) being stripped in the HTML version. This
1570 is a latex2html bug, but a workaround was provided. Many thanks
1579 is a latex2html bug, but a workaround was provided. Many thanks
1571 to George K. Thiruvathukal <gthiruv-AT-luc.edu> for the detailed
1580 to George K. Thiruvathukal <gthiruv-AT-luc.edu> for the detailed
1572 help, and Michael Tobis <mtobis-AT-gmail.com> for getting the ball
1581 help, and Michael Tobis <mtobis-AT-gmail.com> for getting the ball
1573 rolling. This seemingly small issue had tripped a number of users
1582 rolling. This seemingly small issue had tripped a number of users
1574 when first installing, so I'm glad to see it gone.
1583 when first installing, so I'm glad to see it gone.
1575
1584
1576 2005-09-27 Fernando Perez <Fernando.Perez@colorado.edu>
1585 2005-09-27 Fernando Perez <Fernando.Perez@colorado.edu>
1577
1586
1578 * IPython/Extensions/numeric_formats.py: fix missing import,
1587 * IPython/Extensions/numeric_formats.py: fix missing import,
1579 reported by Stephen Walton.
1588 reported by Stephen Walton.
1580
1589
1581 2005-09-24 Fernando Perez <Fernando.Perez@colorado.edu>
1590 2005-09-24 Fernando Perez <Fernando.Perez@colorado.edu>
1582
1591
1583 * IPython/demo.py: finish demo module, fully documented now.
1592 * IPython/demo.py: finish demo module, fully documented now.
1584
1593
1585 * IPython/genutils.py (file_read): simple little utility to read a
1594 * IPython/genutils.py (file_read): simple little utility to read a
1586 file and ensure it's closed afterwards.
1595 file and ensure it's closed afterwards.
1587
1596
1588 2005-09-23 Fernando Perez <Fernando.Perez@colorado.edu>
1597 2005-09-23 Fernando Perez <Fernando.Perez@colorado.edu>
1589
1598
1590 * IPython/demo.py (Demo.__init__): added support for individually
1599 * IPython/demo.py (Demo.__init__): added support for individually
1591 tagging blocks for automatic execution.
1600 tagging blocks for automatic execution.
1592
1601
1593 * IPython/Magic.py (magic_pycat): new %pycat magic for showing
1602 * IPython/Magic.py (magic_pycat): new %pycat magic for showing
1594 syntax-highlighted python sources, requested by John.
1603 syntax-highlighted python sources, requested by John.
1595
1604
1596 2005-09-22 Fernando Perez <Fernando.Perez@colorado.edu>
1605 2005-09-22 Fernando Perez <Fernando.Perez@colorado.edu>
1597
1606
1598 * IPython/demo.py (Demo.again): fix bug where again() blocks after
1607 * IPython/demo.py (Demo.again): fix bug where again() blocks after
1599 finishing.
1608 finishing.
1600
1609
1601 * IPython/genutils.py (shlex_split): moved from Magic to here,
1610 * IPython/genutils.py (shlex_split): moved from Magic to here,
1602 where all 2.2 compatibility stuff lives. I needed it for demo.py.
1611 where all 2.2 compatibility stuff lives. I needed it for demo.py.
1603
1612
1604 * IPython/demo.py (Demo.__init__): added support for silent
1613 * IPython/demo.py (Demo.__init__): added support for silent
1605 blocks, improved marks as regexps, docstrings written.
1614 blocks, improved marks as regexps, docstrings written.
1606 (Demo.__init__): better docstring, added support for sys.argv.
1615 (Demo.__init__): better docstring, added support for sys.argv.
1607
1616
1608 * IPython/genutils.py (marquee): little utility used by the demo
1617 * IPython/genutils.py (marquee): little utility used by the demo
1609 code, handy in general.
1618 code, handy in general.
1610
1619
1611 * IPython/demo.py (Demo.__init__): new class for interactive
1620 * IPython/demo.py (Demo.__init__): new class for interactive
1612 demos. Not documented yet, I just wrote it in a hurry for
1621 demos. Not documented yet, I just wrote it in a hurry for
1613 scipy'05. Will docstring later.
1622 scipy'05. Will docstring later.
1614
1623
1615 2005-09-20 Fernando Perez <Fernando.Perez@colorado.edu>
1624 2005-09-20 Fernando Perez <Fernando.Perez@colorado.edu>
1616
1625
1617 * IPython/Shell.py (sigint_handler): Drastic simplification which
1626 * IPython/Shell.py (sigint_handler): Drastic simplification which
1618 also seems to make Ctrl-C work correctly across threads! This is
1627 also seems to make Ctrl-C work correctly across threads! This is
1619 so simple, that I can't beleive I'd missed it before. Needs more
1628 so simple, that I can't beleive I'd missed it before. Needs more
1620 testing, though.
1629 testing, though.
1621 (KBINT): Never mind, revert changes. I'm sure I'd tried something
1630 (KBINT): Never mind, revert changes. I'm sure I'd tried something
1622 like this before...
1631 like this before...
1623
1632
1624 * IPython/genutils.py (get_home_dir): add protection against
1633 * IPython/genutils.py (get_home_dir): add protection against
1625 non-dirs in win32 registry.
1634 non-dirs in win32 registry.
1626
1635
1627 * IPython/iplib.py (InteractiveShell.alias_table_validate): fix
1636 * IPython/iplib.py (InteractiveShell.alias_table_validate): fix
1628 bug where dict was mutated while iterating (pysh crash).
1637 bug where dict was mutated while iterating (pysh crash).
1629
1638
1630 2005-09-06 Fernando Perez <Fernando.Perez@colorado.edu>
1639 2005-09-06 Fernando Perez <Fernando.Perez@colorado.edu>
1631
1640
1632 * IPython/iplib.py (handle_auto): Fix inconsistency arising from
1641 * IPython/iplib.py (handle_auto): Fix inconsistency arising from
1633 spurious newlines added by this routine. After a report by
1642 spurious newlines added by this routine. After a report by
1634 F. Mantegazza.
1643 F. Mantegazza.
1635
1644
1636 2005-09-05 Fernando Perez <Fernando.Perez@colorado.edu>
1645 2005-09-05 Fernando Perez <Fernando.Perez@colorado.edu>
1637
1646
1638 * IPython/Shell.py (hijack_gtk): remove pygtk.require("2.0")
1647 * IPython/Shell.py (hijack_gtk): remove pygtk.require("2.0")
1639 calls. These were a leftover from the GTK 1.x days, and can cause
1648 calls. These were a leftover from the GTK 1.x days, and can cause
1640 problems in certain cases (after a report by John Hunter).
1649 problems in certain cases (after a report by John Hunter).
1641
1650
1642 * IPython/iplib.py (InteractiveShell.__init__): Trap exception if
1651 * IPython/iplib.py (InteractiveShell.__init__): Trap exception if
1643 os.getcwd() fails at init time. Thanks to patch from David Remahl
1652 os.getcwd() fails at init time. Thanks to patch from David Remahl
1644 <chmod007-AT-mac.com>.
1653 <chmod007-AT-mac.com>.
1645 (InteractiveShell.__init__): prevent certain special magics from
1654 (InteractiveShell.__init__): prevent certain special magics from
1646 being shadowed by aliases. Closes
1655 being shadowed by aliases. Closes
1647 http://www.scipy.net/roundup/ipython/issue41.
1656 http://www.scipy.net/roundup/ipython/issue41.
1648
1657
1649 2005-08-31 Fernando Perez <Fernando.Perez@colorado.edu>
1658 2005-08-31 Fernando Perez <Fernando.Perez@colorado.edu>
1650
1659
1651 * IPython/iplib.py (InteractiveShell.complete): Added new
1660 * IPython/iplib.py (InteractiveShell.complete): Added new
1652 top-level completion method to expose the completion mechanism
1661 top-level completion method to expose the completion mechanism
1653 beyond readline-based environments.
1662 beyond readline-based environments.
1654
1663
1655 2005-08-19 Fernando Perez <Fernando.Perez@colorado.edu>
1664 2005-08-19 Fernando Perez <Fernando.Perez@colorado.edu>
1656
1665
1657 * tools/ipsvnc (svnversion): fix svnversion capture.
1666 * tools/ipsvnc (svnversion): fix svnversion capture.
1658
1667
1659 * IPython/iplib.py (InteractiveShell.__init__): Add has_readline
1668 * IPython/iplib.py (InteractiveShell.__init__): Add has_readline
1660 attribute to self, which was missing. Before, it was set by a
1669 attribute to self, which was missing. Before, it was set by a
1661 routine which in certain cases wasn't being called, so the
1670 routine which in certain cases wasn't being called, so the
1662 instance could end up missing the attribute. This caused a crash.
1671 instance could end up missing the attribute. This caused a crash.
1663 Closes http://www.scipy.net/roundup/ipython/issue40.
1672 Closes http://www.scipy.net/roundup/ipython/issue40.
1664
1673
1665 2005-08-16 Fernando Perez <fperez@colorado.edu>
1674 2005-08-16 Fernando Perez <fperez@colorado.edu>
1666
1675
1667 * IPython/ultraTB.py (VerboseTB.text): don't crash if object
1676 * IPython/ultraTB.py (VerboseTB.text): don't crash if object
1668 contains non-string attribute. Closes
1677 contains non-string attribute. Closes
1669 http://www.scipy.net/roundup/ipython/issue38.
1678 http://www.scipy.net/roundup/ipython/issue38.
1670
1679
1671 2005-08-14 Fernando Perez <fperez@colorado.edu>
1680 2005-08-14 Fernando Perez <fperez@colorado.edu>
1672
1681
1673 * tools/ipsvnc: Minor improvements, to add changeset info.
1682 * tools/ipsvnc: Minor improvements, to add changeset info.
1674
1683
1675 2005-08-12 Fernando Perez <fperez@colorado.edu>
1684 2005-08-12 Fernando Perez <fperez@colorado.edu>
1676
1685
1677 * IPython/iplib.py (runsource): remove self.code_to_run_src
1686 * IPython/iplib.py (runsource): remove self.code_to_run_src
1678 attribute. I realized this is nothing more than
1687 attribute. I realized this is nothing more than
1679 '\n'.join(self.buffer), and having the same data in two different
1688 '\n'.join(self.buffer), and having the same data in two different
1680 places is just asking for synchronization bugs. This may impact
1689 places is just asking for synchronization bugs. This may impact
1681 people who have custom exception handlers, so I need to warn
1690 people who have custom exception handlers, so I need to warn
1682 ipython-dev about it (F. Mantegazza may use them).
1691 ipython-dev about it (F. Mantegazza may use them).
1683
1692
1684 2005-07-29 Fernando Perez <Fernando.Perez@colorado.edu>
1693 2005-07-29 Fernando Perez <Fernando.Perez@colorado.edu>
1685
1694
1686 * IPython/genutils.py: fix 2.2 compatibility (generators)
1695 * IPython/genutils.py: fix 2.2 compatibility (generators)
1687
1696
1688 2005-07-18 Fernando Perez <fperez@colorado.edu>
1697 2005-07-18 Fernando Perez <fperez@colorado.edu>
1689
1698
1690 * IPython/genutils.py (get_home_dir): fix to help users with
1699 * IPython/genutils.py (get_home_dir): fix to help users with
1691 invalid $HOME under win32.
1700 invalid $HOME under win32.
1692
1701
1693 2005-07-17 Fernando Perez <fperez@colorado.edu>
1702 2005-07-17 Fernando Perez <fperez@colorado.edu>
1694
1703
1695 * IPython/Prompts.py (str_safe): Make unicode-safe. Also remove
1704 * IPython/Prompts.py (str_safe): Make unicode-safe. Also remove
1696 some old hacks and clean up a bit other routines; code should be
1705 some old hacks and clean up a bit other routines; code should be
1697 simpler and a bit faster.
1706 simpler and a bit faster.
1698
1707
1699 * IPython/iplib.py (interact): removed some last-resort attempts
1708 * IPython/iplib.py (interact): removed some last-resort attempts
1700 to survive broken stdout/stderr. That code was only making it
1709 to survive broken stdout/stderr. That code was only making it
1701 harder to abstract out the i/o (necessary for gui integration),
1710 harder to abstract out the i/o (necessary for gui integration),
1702 and the crashes it could prevent were extremely rare in practice
1711 and the crashes it could prevent were extremely rare in practice
1703 (besides being fully user-induced in a pretty violent manner).
1712 (besides being fully user-induced in a pretty violent manner).
1704
1713
1705 * IPython/genutils.py (IOStream.__init__): Simplify the i/o stuff.
1714 * IPython/genutils.py (IOStream.__init__): Simplify the i/o stuff.
1706 Nothing major yet, but the code is simpler to read; this should
1715 Nothing major yet, but the code is simpler to read; this should
1707 make it easier to do more serious modifications in the future.
1716 make it easier to do more serious modifications in the future.
1708
1717
1709 * IPython/Extensions/InterpreterExec.py: Fix auto-quoting in pysh,
1718 * IPython/Extensions/InterpreterExec.py: Fix auto-quoting in pysh,
1710 which broke in .15 (thanks to a report by Ville).
1719 which broke in .15 (thanks to a report by Ville).
1711
1720
1712 * IPython/Itpl.py (Itpl.__init__): add unicode support (it may not
1721 * IPython/Itpl.py (Itpl.__init__): add unicode support (it may not
1713 be quite correct, I know next to nothing about unicode). This
1722 be quite correct, I know next to nothing about unicode). This
1714 will allow unicode strings to be used in prompts, amongst other
1723 will allow unicode strings to be used in prompts, amongst other
1715 cases. It also will prevent ipython from crashing when unicode
1724 cases. It also will prevent ipython from crashing when unicode
1716 shows up unexpectedly in many places. If ascii encoding fails, we
1725 shows up unexpectedly in many places. If ascii encoding fails, we
1717 assume utf_8. Currently the encoding is not a user-visible
1726 assume utf_8. Currently the encoding is not a user-visible
1718 setting, though it could be made so if there is demand for it.
1727 setting, though it could be made so if there is demand for it.
1719
1728
1720 * IPython/ipmaker.py (make_IPython): remove old 2.1-specific hack.
1729 * IPython/ipmaker.py (make_IPython): remove old 2.1-specific hack.
1721
1730
1722 * IPython/Struct.py (Struct.merge): switch keys() to iterator.
1731 * IPython/Struct.py (Struct.merge): switch keys() to iterator.
1723
1732
1724 * IPython/background_jobs.py: moved 2.2 compatibility to genutils.
1733 * IPython/background_jobs.py: moved 2.2 compatibility to genutils.
1725
1734
1726 * IPython/genutils.py: Add 2.2 compatibility here, so all other
1735 * IPython/genutils.py: Add 2.2 compatibility here, so all other
1727 code can work transparently for 2.2/2.3.
1736 code can work transparently for 2.2/2.3.
1728
1737
1729 2005-07-16 Fernando Perez <fperez@colorado.edu>
1738 2005-07-16 Fernando Perez <fperez@colorado.edu>
1730
1739
1731 * IPython/ultraTB.py (ExceptionColors): Make a global variable
1740 * IPython/ultraTB.py (ExceptionColors): Make a global variable
1732 out of the color scheme table used for coloring exception
1741 out of the color scheme table used for coloring exception
1733 tracebacks. This allows user code to add new schemes at runtime.
1742 tracebacks. This allows user code to add new schemes at runtime.
1734 This is a minimally modified version of the patch at
1743 This is a minimally modified version of the patch at
1735 http://www.scipy.net/roundup/ipython/issue35, many thanks to pabw
1744 http://www.scipy.net/roundup/ipython/issue35, many thanks to pabw
1736 for the contribution.
1745 for the contribution.
1737
1746
1738 * IPython/FlexCompleter.py (Completer.attr_matches): Add a
1747 * IPython/FlexCompleter.py (Completer.attr_matches): Add a
1739 slightly modified version of the patch in
1748 slightly modified version of the patch in
1740 http://www.scipy.net/roundup/ipython/issue34, which also allows me
1749 http://www.scipy.net/roundup/ipython/issue34, which also allows me
1741 to remove the previous try/except solution (which was costlier).
1750 to remove the previous try/except solution (which was costlier).
1742 Thanks to Gaetan Lehmann <gaetan.lehmann-AT-jouy.inra.fr> for the fix.
1751 Thanks to Gaetan Lehmann <gaetan.lehmann-AT-jouy.inra.fr> for the fix.
1743
1752
1744 2005-06-08 Fernando Perez <fperez@colorado.edu>
1753 2005-06-08 Fernando Perez <fperez@colorado.edu>
1745
1754
1746 * IPython/iplib.py (write/write_err): Add methods to abstract all
1755 * IPython/iplib.py (write/write_err): Add methods to abstract all
1747 I/O a bit more.
1756 I/O a bit more.
1748
1757
1749 * IPython/Shell.py (IPShellGTK.mainloop): Fix GTK deprecation
1758 * IPython/Shell.py (IPShellGTK.mainloop): Fix GTK deprecation
1750 warning, reported by Aric Hagberg, fix by JD Hunter.
1759 warning, reported by Aric Hagberg, fix by JD Hunter.
1751
1760
1752 2005-06-02 *** Released version 0.6.15
1761 2005-06-02 *** Released version 0.6.15
1753
1762
1754 2005-06-01 Fernando Perez <fperez@colorado.edu>
1763 2005-06-01 Fernando Perez <fperez@colorado.edu>
1755
1764
1756 * IPython/iplib.py (MagicCompleter.file_matches): Fix
1765 * IPython/iplib.py (MagicCompleter.file_matches): Fix
1757 tab-completion of filenames within open-quoted strings. Note that
1766 tab-completion of filenames within open-quoted strings. Note that
1758 this requires that in ~/.ipython/ipythonrc, users change the
1767 this requires that in ~/.ipython/ipythonrc, users change the
1759 readline delimiters configuration to read:
1768 readline delimiters configuration to read:
1760
1769
1761 readline_remove_delims -/~
1770 readline_remove_delims -/~
1762
1771
1763
1772
1764 2005-05-31 *** Released version 0.6.14
1773 2005-05-31 *** Released version 0.6.14
1765
1774
1766 2005-05-29 Fernando Perez <fperez@colorado.edu>
1775 2005-05-29 Fernando Perez <fperez@colorado.edu>
1767
1776
1768 * IPython/ultraTB.py (VerboseTB.text): Fix crash for tracebacks
1777 * IPython/ultraTB.py (VerboseTB.text): Fix crash for tracebacks
1769 with files not on the filesystem. Reported by Eliyahu Sandler
1778 with files not on the filesystem. Reported by Eliyahu Sandler
1770 <eli@gondolin.net>
1779 <eli@gondolin.net>
1771
1780
1772 2005-05-22 Fernando Perez <fperez@colorado.edu>
1781 2005-05-22 Fernando Perez <fperez@colorado.edu>
1773
1782
1774 * IPython/iplib.py: Fix a few crashes in the --upgrade option.
1783 * IPython/iplib.py: Fix a few crashes in the --upgrade option.
1775 After an initial report by LUK ShunTim <shuntim.luk@polyu.edu.hk>.
1784 After an initial report by LUK ShunTim <shuntim.luk@polyu.edu.hk>.
1776
1785
1777 2005-05-19 Fernando Perez <fperez@colorado.edu>
1786 2005-05-19 Fernando Perez <fperez@colorado.edu>
1778
1787
1779 * IPython/iplib.py (safe_execfile): close a file which could be
1788 * IPython/iplib.py (safe_execfile): close a file which could be
1780 left open (causing problems in win32, which locks open files).
1789 left open (causing problems in win32, which locks open files).
1781 Thanks to a bug report by D Brown <dbrown2@yahoo.com>.
1790 Thanks to a bug report by D Brown <dbrown2@yahoo.com>.
1782
1791
1783 2005-05-18 Fernando Perez <fperez@colorado.edu>
1792 2005-05-18 Fernando Perez <fperez@colorado.edu>
1784
1793
1785 * IPython/Shell.py (MatplotlibShellBase.mplot_exec): pass all
1794 * IPython/Shell.py (MatplotlibShellBase.mplot_exec): pass all
1786 keyword arguments correctly to safe_execfile().
1795 keyword arguments correctly to safe_execfile().
1787
1796
1788 2005-05-13 Fernando Perez <fperez@colorado.edu>
1797 2005-05-13 Fernando Perez <fperez@colorado.edu>
1789
1798
1790 * ipython.1: Added info about Qt to manpage, and threads warning
1799 * ipython.1: Added info about Qt to manpage, and threads warning
1791 to usage page (invoked with --help).
1800 to usage page (invoked with --help).
1792
1801
1793 * IPython/iplib.py (MagicCompleter.python_func_kw_matches): Added
1802 * IPython/iplib.py (MagicCompleter.python_func_kw_matches): Added
1794 new matcher (it goes at the end of the priority list) to do
1803 new matcher (it goes at the end of the priority list) to do
1795 tab-completion on named function arguments. Submitted by George
1804 tab-completion on named function arguments. Submitted by George
1796 Sakkis <gsakkis-AT-eden.rutgers.edu>. See the thread at
1805 Sakkis <gsakkis-AT-eden.rutgers.edu>. See the thread at
1797 http://www.scipy.net/pipermail/ipython-dev/2005-April/000436.html
1806 http://www.scipy.net/pipermail/ipython-dev/2005-April/000436.html
1798 for more details.
1807 for more details.
1799
1808
1800 * IPython/Magic.py (magic_run): Added new -e flag to ignore
1809 * IPython/Magic.py (magic_run): Added new -e flag to ignore
1801 SystemExit exceptions in the script being run. Thanks to a report
1810 SystemExit exceptions in the script being run. Thanks to a report
1802 by danny shevitz <danny_shevitz-AT-yahoo.com>, about this
1811 by danny shevitz <danny_shevitz-AT-yahoo.com>, about this
1803 producing very annoying behavior when running unit tests.
1812 producing very annoying behavior when running unit tests.
1804
1813
1805 2005-05-12 Fernando Perez <fperez@colorado.edu>
1814 2005-05-12 Fernando Perez <fperez@colorado.edu>
1806
1815
1807 * IPython/iplib.py (handle_auto): fixed auto-quoting and parens,
1816 * IPython/iplib.py (handle_auto): fixed auto-quoting and parens,
1808 which I'd broken (again) due to a changed regexp. In the process,
1817 which I'd broken (again) due to a changed regexp. In the process,
1809 added ';' as an escape to auto-quote the whole line without
1818 added ';' as an escape to auto-quote the whole line without
1810 splitting its arguments. Thanks to a report by Jerry McRae
1819 splitting its arguments. Thanks to a report by Jerry McRae
1811 <qrs0xyc02-AT-sneakemail.com>.
1820 <qrs0xyc02-AT-sneakemail.com>.
1812
1821
1813 * IPython/ultraTB.py (VerboseTB.text): protect against rare but
1822 * IPython/ultraTB.py (VerboseTB.text): protect against rare but
1814 possible crashes caused by a TokenError. Reported by Ed Schofield
1823 possible crashes caused by a TokenError. Reported by Ed Schofield
1815 <schofield-AT-ftw.at>.
1824 <schofield-AT-ftw.at>.
1816
1825
1817 2005-05-06 Fernando Perez <fperez@colorado.edu>
1826 2005-05-06 Fernando Perez <fperez@colorado.edu>
1818
1827
1819 * IPython/Shell.py (hijack_wx): Fix to work with WX v.2.6.
1828 * IPython/Shell.py (hijack_wx): Fix to work with WX v.2.6.
1820
1829
1821 2005-04-29 Fernando Perez <fperez@colorado.edu>
1830 2005-04-29 Fernando Perez <fperez@colorado.edu>
1822
1831
1823 * IPython/Shell.py (IPShellQt): Thanks to Denis Rivière
1832 * IPython/Shell.py (IPShellQt): Thanks to Denis Rivière
1824 <nudz-AT-free.fr>, Yann Cointepas <yann-AT-sapetnioc.org> and Benjamin
1833 <nudz-AT-free.fr>, Yann Cointepas <yann-AT-sapetnioc.org> and Benjamin
1825 Thyreau <Benji2-AT-decideur.info>, we now have a -qthread option
1834 Thyreau <Benji2-AT-decideur.info>, we now have a -qthread option
1826 which provides support for Qt interactive usage (similar to the
1835 which provides support for Qt interactive usage (similar to the
1827 existing one for WX and GTK). This had been often requested.
1836 existing one for WX and GTK). This had been often requested.
1828
1837
1829 2005-04-14 *** Released version 0.6.13
1838 2005-04-14 *** Released version 0.6.13
1830
1839
1831 2005-04-08 Fernando Perez <fperez@colorado.edu>
1840 2005-04-08 Fernando Perez <fperez@colorado.edu>
1832
1841
1833 * IPython/Magic.py (Magic._ofind): remove docstring evaluation
1842 * IPython/Magic.py (Magic._ofind): remove docstring evaluation
1834 from _ofind, which gets called on almost every input line. Now,
1843 from _ofind, which gets called on almost every input line. Now,
1835 we only try to get docstrings if they are actually going to be
1844 we only try to get docstrings if they are actually going to be
1836 used (the overhead of fetching unnecessary docstrings can be
1845 used (the overhead of fetching unnecessary docstrings can be
1837 noticeable for certain objects, such as Pyro proxies).
1846 noticeable for certain objects, such as Pyro proxies).
1838
1847
1839 * IPython/iplib.py (MagicCompleter.python_matches): Change the API
1848 * IPython/iplib.py (MagicCompleter.python_matches): Change the API
1840 for completers. For some reason I had been passing them the state
1849 for completers. For some reason I had been passing them the state
1841 variable, which completers never actually need, and was in
1850 variable, which completers never actually need, and was in
1842 conflict with the rlcompleter API. Custom completers ONLY need to
1851 conflict with the rlcompleter API. Custom completers ONLY need to
1843 take the text parameter.
1852 take the text parameter.
1844
1853
1845 * IPython/Extensions/InterpreterExec.py: Fix regexp so that magics
1854 * IPython/Extensions/InterpreterExec.py: Fix regexp so that magics
1846 work correctly in pysh. I've also moved all the logic which used
1855 work correctly in pysh. I've also moved all the logic which used
1847 to be in pysh.py here, which will prevent problems with future
1856 to be in pysh.py here, which will prevent problems with future
1848 upgrades. However, this time I must warn users to update their
1857 upgrades. However, this time I must warn users to update their
1849 pysh profile to include the line
1858 pysh profile to include the line
1850
1859
1851 import_all IPython.Extensions.InterpreterExec
1860 import_all IPython.Extensions.InterpreterExec
1852
1861
1853 because otherwise things won't work for them. They MUST also
1862 because otherwise things won't work for them. They MUST also
1854 delete pysh.py and the line
1863 delete pysh.py and the line
1855
1864
1856 execfile pysh.py
1865 execfile pysh.py
1857
1866
1858 from their ipythonrc-pysh.
1867 from their ipythonrc-pysh.
1859
1868
1860 * IPython/FlexCompleter.py (Completer.attr_matches): Make more
1869 * IPython/FlexCompleter.py (Completer.attr_matches): Make more
1861 robust in the face of objects whose dir() returns non-strings
1870 robust in the face of objects whose dir() returns non-strings
1862 (which it shouldn't, but some broken libs like ITK do). Thanks to
1871 (which it shouldn't, but some broken libs like ITK do). Thanks to
1863 a patch by John Hunter (implemented differently, though). Also
1872 a patch by John Hunter (implemented differently, though). Also
1864 minor improvements by using .extend instead of + on lists.
1873 minor improvements by using .extend instead of + on lists.
1865
1874
1866 * pysh.py:
1875 * pysh.py:
1867
1876
1868 2005-04-06 Fernando Perez <fperez@colorado.edu>
1877 2005-04-06 Fernando Perez <fperez@colorado.edu>
1869
1878
1870 * IPython/ipmaker.py (make_IPython): Make multi_line_specials on
1879 * IPython/ipmaker.py (make_IPython): Make multi_line_specials on
1871 by default, so that all users benefit from it. Those who don't
1880 by default, so that all users benefit from it. Those who don't
1872 want it can still turn it off.
1881 want it can still turn it off.
1873
1882
1874 * IPython/UserConfig/ipythonrc: Add multi_line_specials to the
1883 * IPython/UserConfig/ipythonrc: Add multi_line_specials to the
1875 config file, I'd forgotten about this, so users were getting it
1884 config file, I'd forgotten about this, so users were getting it
1876 off by default.
1885 off by default.
1877
1886
1878 * IPython/iplib.py (ipmagic): big overhaul of the magic system for
1887 * IPython/iplib.py (ipmagic): big overhaul of the magic system for
1879 consistency. Now magics can be called in multiline statements,
1888 consistency. Now magics can be called in multiline statements,
1880 and python variables can be expanded in magic calls via $var.
1889 and python variables can be expanded in magic calls via $var.
1881 This makes the magic system behave just like aliases or !system
1890 This makes the magic system behave just like aliases or !system
1882 calls.
1891 calls.
1883
1892
1884 2005-03-28 Fernando Perez <fperez@colorado.edu>
1893 2005-03-28 Fernando Perez <fperez@colorado.edu>
1885
1894
1886 * IPython/iplib.py (handle_auto): cleanup to use %s instead of
1895 * IPython/iplib.py (handle_auto): cleanup to use %s instead of
1887 expensive string additions for building command. Add support for
1896 expensive string additions for building command. Add support for
1888 trailing ';' when autocall is used.
1897 trailing ';' when autocall is used.
1889
1898
1890 2005-03-26 Fernando Perez <fperez@colorado.edu>
1899 2005-03-26 Fernando Perez <fperez@colorado.edu>
1891
1900
1892 * ipython.el: Fix http://www.scipy.net/roundup/ipython/issue31.
1901 * ipython.el: Fix http://www.scipy.net/roundup/ipython/issue31.
1893 Bugfix by A. Schmolck, the ipython.el maintainer. Also make
1902 Bugfix by A. Schmolck, the ipython.el maintainer. Also make
1894 ipython.el robust against prompts with any number of spaces
1903 ipython.el robust against prompts with any number of spaces
1895 (including 0) after the ':' character.
1904 (including 0) after the ':' character.
1896
1905
1897 * IPython/Prompts.py (Prompt2.set_p_str): Fix spurious space in
1906 * IPython/Prompts.py (Prompt2.set_p_str): Fix spurious space in
1898 continuation prompt, which misled users to think the line was
1907 continuation prompt, which misled users to think the line was
1899 already indented. Closes debian Bug#300847, reported to me by
1908 already indented. Closes debian Bug#300847, reported to me by
1900 Norbert Tretkowski <tretkowski-AT-inittab.de>.
1909 Norbert Tretkowski <tretkowski-AT-inittab.de>.
1901
1910
1902 2005-03-23 Fernando Perez <fperez@colorado.edu>
1911 2005-03-23 Fernando Perez <fperez@colorado.edu>
1903
1912
1904 * IPython/Prompts.py (Prompt1.__str__): Make sure that prompts are
1913 * IPython/Prompts.py (Prompt1.__str__): Make sure that prompts are
1905 properly aligned if they have embedded newlines.
1914 properly aligned if they have embedded newlines.
1906
1915
1907 * IPython/iplib.py (runlines): Add a public method to expose
1916 * IPython/iplib.py (runlines): Add a public method to expose
1908 IPython's code execution machinery, so that users can run strings
1917 IPython's code execution machinery, so that users can run strings
1909 as if they had been typed at the prompt interactively.
1918 as if they had been typed at the prompt interactively.
1910 (InteractiveShell.__init__): Added getoutput() to the __IPYTHON__
1919 (InteractiveShell.__init__): Added getoutput() to the __IPYTHON__
1911 methods which can call the system shell, but with python variable
1920 methods which can call the system shell, but with python variable
1912 expansion. The three such methods are: __IPYTHON__.system,
1921 expansion. The three such methods are: __IPYTHON__.system,
1913 .getoutput and .getoutputerror. These need to be documented in a
1922 .getoutput and .getoutputerror. These need to be documented in a
1914 'public API' section (to be written) of the manual.
1923 'public API' section (to be written) of the manual.
1915
1924
1916 2005-03-20 Fernando Perez <fperez@colorado.edu>
1925 2005-03-20 Fernando Perez <fperez@colorado.edu>
1917
1926
1918 * IPython/iplib.py (InteractiveShell.set_custom_exc): new system
1927 * IPython/iplib.py (InteractiveShell.set_custom_exc): new system
1919 for custom exception handling. This is quite powerful, and it
1928 for custom exception handling. This is quite powerful, and it
1920 allows for user-installable exception handlers which can trap
1929 allows for user-installable exception handlers which can trap
1921 custom exceptions at runtime and treat them separately from
1930 custom exceptions at runtime and treat them separately from
1922 IPython's default mechanisms. At the request of FrΓ©dΓ©ric
1931 IPython's default mechanisms. At the request of FrΓ©dΓ©ric
1923 Mantegazza <mantegazza-AT-ill.fr>.
1932 Mantegazza <mantegazza-AT-ill.fr>.
1924 (InteractiveShell.set_custom_completer): public API function to
1933 (InteractiveShell.set_custom_completer): public API function to
1925 add new completers at runtime.
1934 add new completers at runtime.
1926
1935
1927 2005-03-19 Fernando Perez <fperez@colorado.edu>
1936 2005-03-19 Fernando Perez <fperez@colorado.edu>
1928
1937
1929 * IPython/OInspect.py (getdoc): Add a call to obj.getdoc(), to
1938 * IPython/OInspect.py (getdoc): Add a call to obj.getdoc(), to
1930 allow objects which provide their docstrings via non-standard
1939 allow objects which provide their docstrings via non-standard
1931 mechanisms (like Pyro proxies) to still be inspected by ipython's
1940 mechanisms (like Pyro proxies) to still be inspected by ipython's
1932 ? system.
1941 ? system.
1933
1942
1934 * IPython/iplib.py (InteractiveShell.__init__): back off the _o/_e
1943 * IPython/iplib.py (InteractiveShell.__init__): back off the _o/_e
1935 automatic capture system. I tried quite hard to make it work
1944 automatic capture system. I tried quite hard to make it work
1936 reliably, and simply failed. I tried many combinations with the
1945 reliably, and simply failed. I tried many combinations with the
1937 subprocess module, but eventually nothing worked in all needed
1946 subprocess module, but eventually nothing worked in all needed
1938 cases (not blocking stdin for the child, duplicating stdout
1947 cases (not blocking stdin for the child, duplicating stdout
1939 without blocking, etc). The new %sc/%sx still do capture to these
1948 without blocking, etc). The new %sc/%sx still do capture to these
1940 magical list/string objects which make shell use much more
1949 magical list/string objects which make shell use much more
1941 conveninent, so not all is lost.
1950 conveninent, so not all is lost.
1942
1951
1943 XXX - FIX MANUAL for the change above!
1952 XXX - FIX MANUAL for the change above!
1944
1953
1945 (runsource): I copied code.py's runsource() into ipython to modify
1954 (runsource): I copied code.py's runsource() into ipython to modify
1946 it a bit. Now the code object and source to be executed are
1955 it a bit. Now the code object and source to be executed are
1947 stored in ipython. This makes this info accessible to third-party
1956 stored in ipython. This makes this info accessible to third-party
1948 tools, like custom exception handlers. After a request by FrΓ©dΓ©ric
1957 tools, like custom exception handlers. After a request by FrΓ©dΓ©ric
1949 Mantegazza <mantegazza-AT-ill.fr>.
1958 Mantegazza <mantegazza-AT-ill.fr>.
1950
1959
1951 * IPython/UserConfig/ipythonrc: Add up/down arrow keys to
1960 * IPython/UserConfig/ipythonrc: Add up/down arrow keys to
1952 history-search via readline (like C-p/C-n). I'd wanted this for a
1961 history-search via readline (like C-p/C-n). I'd wanted this for a
1953 long time, but only recently found out how to do it. For users
1962 long time, but only recently found out how to do it. For users
1954 who already have their ipythonrc files made and want this, just
1963 who already have their ipythonrc files made and want this, just
1955 add:
1964 add:
1956
1965
1957 readline_parse_and_bind "\e[A": history-search-backward
1966 readline_parse_and_bind "\e[A": history-search-backward
1958 readline_parse_and_bind "\e[B": history-search-forward
1967 readline_parse_and_bind "\e[B": history-search-forward
1959
1968
1960 2005-03-18 Fernando Perez <fperez@colorado.edu>
1969 2005-03-18 Fernando Perez <fperez@colorado.edu>
1961
1970
1962 * IPython/Magic.py (magic_sc): %sc and %sx now use the fancy
1971 * IPython/Magic.py (magic_sc): %sc and %sx now use the fancy
1963 LSString and SList classes which allow transparent conversions
1972 LSString and SList classes which allow transparent conversions
1964 between list mode and whitespace-separated string.
1973 between list mode and whitespace-separated string.
1965 (magic_r): Fix recursion problem in %r.
1974 (magic_r): Fix recursion problem in %r.
1966
1975
1967 * IPython/genutils.py (LSString): New class to be used for
1976 * IPython/genutils.py (LSString): New class to be used for
1968 automatic storage of the results of all alias/system calls in _o
1977 automatic storage of the results of all alias/system calls in _o
1969 and _e (stdout/err). These provide a .l/.list attribute which
1978 and _e (stdout/err). These provide a .l/.list attribute which
1970 does automatic splitting on newlines. This means that for most
1979 does automatic splitting on newlines. This means that for most
1971 uses, you'll never need to do capturing of output with %sc/%sx
1980 uses, you'll never need to do capturing of output with %sc/%sx
1972 anymore, since ipython keeps this always done for you. Note that
1981 anymore, since ipython keeps this always done for you. Note that
1973 only the LAST results are stored, the _o/e variables are
1982 only the LAST results are stored, the _o/e variables are
1974 overwritten on each call. If you need to save their contents
1983 overwritten on each call. If you need to save their contents
1975 further, simply bind them to any other name.
1984 further, simply bind them to any other name.
1976
1985
1977 2005-03-17 Fernando Perez <fperez@colorado.edu>
1986 2005-03-17 Fernando Perez <fperez@colorado.edu>
1978
1987
1979 * IPython/Prompts.py (BasePrompt.cwd_filt): a few more fixes for
1988 * IPython/Prompts.py (BasePrompt.cwd_filt): a few more fixes for
1980 prompt namespace handling.
1989 prompt namespace handling.
1981
1990
1982 2005-03-16 Fernando Perez <fperez@colorado.edu>
1991 2005-03-16 Fernando Perez <fperez@colorado.edu>
1983
1992
1984 * IPython/Prompts.py (CachedOutput.__init__): Fix default and
1993 * IPython/Prompts.py (CachedOutput.__init__): Fix default and
1985 classic prompts to be '>>> ' (final space was missing, and it
1994 classic prompts to be '>>> ' (final space was missing, and it
1986 trips the emacs python mode).
1995 trips the emacs python mode).
1987 (BasePrompt.__str__): Added safe support for dynamic prompt
1996 (BasePrompt.__str__): Added safe support for dynamic prompt
1988 strings. Now you can set your prompt string to be '$x', and the
1997 strings. Now you can set your prompt string to be '$x', and the
1989 value of x will be printed from your interactive namespace. The
1998 value of x will be printed from your interactive namespace. The
1990 interpolation syntax includes the full Itpl support, so
1999 interpolation syntax includes the full Itpl support, so
1991 ${foo()+x+bar()} is a valid prompt string now, and the function
2000 ${foo()+x+bar()} is a valid prompt string now, and the function
1992 calls will be made at runtime.
2001 calls will be made at runtime.
1993
2002
1994 2005-03-15 Fernando Perez <fperez@colorado.edu>
2003 2005-03-15 Fernando Perez <fperez@colorado.edu>
1995
2004
1996 * IPython/Magic.py (magic_history): renamed %hist to %history, to
2005 * IPython/Magic.py (magic_history): renamed %hist to %history, to
1997 avoid name clashes in pylab. %hist still works, it just forwards
2006 avoid name clashes in pylab. %hist still works, it just forwards
1998 the call to %history.
2007 the call to %history.
1999
2008
2000 2005-03-02 *** Released version 0.6.12
2009 2005-03-02 *** Released version 0.6.12
2001
2010
2002 2005-03-02 Fernando Perez <fperez@colorado.edu>
2011 2005-03-02 Fernando Perez <fperez@colorado.edu>
2003
2012
2004 * IPython/iplib.py (handle_magic): log magic calls properly as
2013 * IPython/iplib.py (handle_magic): log magic calls properly as
2005 ipmagic() function calls.
2014 ipmagic() function calls.
2006
2015
2007 * IPython/Magic.py (magic_time): Improved %time to support
2016 * IPython/Magic.py (magic_time): Improved %time to support
2008 statements and provide wall-clock as well as CPU time.
2017 statements and provide wall-clock as well as CPU time.
2009
2018
2010 2005-02-27 Fernando Perez <fperez@colorado.edu>
2019 2005-02-27 Fernando Perez <fperez@colorado.edu>
2011
2020
2012 * IPython/hooks.py: New hooks module, to expose user-modifiable
2021 * IPython/hooks.py: New hooks module, to expose user-modifiable
2013 IPython functionality in a clean manner. For now only the editor
2022 IPython functionality in a clean manner. For now only the editor
2014 hook is actually written, and other thigns which I intend to turn
2023 hook is actually written, and other thigns which I intend to turn
2015 into proper hooks aren't yet there. The display and prefilter
2024 into proper hooks aren't yet there. The display and prefilter
2016 stuff, for example, should be hooks. But at least now the
2025 stuff, for example, should be hooks. But at least now the
2017 framework is in place, and the rest can be moved here with more
2026 framework is in place, and the rest can be moved here with more
2018 time later. IPython had had a .hooks variable for a long time for
2027 time later. IPython had had a .hooks variable for a long time for
2019 this purpose, but I'd never actually used it for anything.
2028 this purpose, but I'd never actually used it for anything.
2020
2029
2021 2005-02-26 Fernando Perez <fperez@colorado.edu>
2030 2005-02-26 Fernando Perez <fperez@colorado.edu>
2022
2031
2023 * IPython/ipmaker.py (make_IPython): make the default ipython
2032 * IPython/ipmaker.py (make_IPython): make the default ipython
2024 directory be called _ipython under win32, to follow more the
2033 directory be called _ipython under win32, to follow more the
2025 naming peculiarities of that platform (where buggy software like
2034 naming peculiarities of that platform (where buggy software like
2026 Visual Sourcesafe breaks with .named directories). Reported by
2035 Visual Sourcesafe breaks with .named directories). Reported by
2027 Ville Vainio.
2036 Ville Vainio.
2028
2037
2029 2005-02-23 Fernando Perez <fperez@colorado.edu>
2038 2005-02-23 Fernando Perez <fperez@colorado.edu>
2030
2039
2031 * IPython/iplib.py (InteractiveShell.__init__): removed a few
2040 * IPython/iplib.py (InteractiveShell.__init__): removed a few
2032 auto_aliases for win32 which were causing problems. Users can
2041 auto_aliases for win32 which were causing problems. Users can
2033 define the ones they personally like.
2042 define the ones they personally like.
2034
2043
2035 2005-02-21 Fernando Perez <fperez@colorado.edu>
2044 2005-02-21 Fernando Perez <fperez@colorado.edu>
2036
2045
2037 * IPython/Magic.py (magic_time): new magic to time execution of
2046 * IPython/Magic.py (magic_time): new magic to time execution of
2038 expressions. After a request by Charles Moad <cmoad-AT-indiana.edu>.
2047 expressions. After a request by Charles Moad <cmoad-AT-indiana.edu>.
2039
2048
2040 2005-02-19 Fernando Perez <fperez@colorado.edu>
2049 2005-02-19 Fernando Perez <fperez@colorado.edu>
2041
2050
2042 * IPython/ConfigLoader.py (ConfigLoader.load): Allow empty strings
2051 * IPython/ConfigLoader.py (ConfigLoader.load): Allow empty strings
2043 into keys (for prompts, for example).
2052 into keys (for prompts, for example).
2044
2053
2045 * IPython/Prompts.py (BasePrompt.set_p_str): Fix to allow empty
2054 * IPython/Prompts.py (BasePrompt.set_p_str): Fix to allow empty
2046 prompts in case users want them. This introduces a small behavior
2055 prompts in case users want them. This introduces a small behavior
2047 change: ipython does not automatically add a space to all prompts
2056 change: ipython does not automatically add a space to all prompts
2048 anymore. To get the old prompts with a space, users should add it
2057 anymore. To get the old prompts with a space, users should add it
2049 manually to their ipythonrc file, so for example prompt_in1 should
2058 manually to their ipythonrc file, so for example prompt_in1 should
2050 now read 'In [\#]: ' instead of 'In [\#]:'.
2059 now read 'In [\#]: ' instead of 'In [\#]:'.
2051 (BasePrompt.__init__): New option prompts_pad_left (only in rc
2060 (BasePrompt.__init__): New option prompts_pad_left (only in rc
2052 file) to control left-padding of secondary prompts.
2061 file) to control left-padding of secondary prompts.
2053
2062
2054 * IPython/Magic.py (Magic.profile_missing_notice): Don't crash if
2063 * IPython/Magic.py (Magic.profile_missing_notice): Don't crash if
2055 the profiler can't be imported. Fix for Debian, which removed
2064 the profiler can't be imported. Fix for Debian, which removed
2056 profile.py because of License issues. I applied a slightly
2065 profile.py because of License issues. I applied a slightly
2057 modified version of the original Debian patch at
2066 modified version of the original Debian patch at
2058 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=294500.
2067 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=294500.
2059
2068
2060 2005-02-17 Fernando Perez <fperez@colorado.edu>
2069 2005-02-17 Fernando Perez <fperez@colorado.edu>
2061
2070
2062 * IPython/genutils.py (native_line_ends): Fix bug which would
2071 * IPython/genutils.py (native_line_ends): Fix bug which would
2063 cause improper line-ends under win32 b/c I was not opening files
2072 cause improper line-ends under win32 b/c I was not opening files
2064 in binary mode. Bug report and fix thanks to Ville.
2073 in binary mode. Bug report and fix thanks to Ville.
2065
2074
2066 * IPython/iplib.py (handle_auto): Fix bug which I introduced when
2075 * IPython/iplib.py (handle_auto): Fix bug which I introduced when
2067 trying to catch spurious foo[1] autocalls. My fix actually broke
2076 trying to catch spurious foo[1] autocalls. My fix actually broke
2068 ',/' autoquote/call with explicit escape (bad regexp).
2077 ',/' autoquote/call with explicit escape (bad regexp).
2069
2078
2070 2005-02-15 *** Released version 0.6.11
2079 2005-02-15 *** Released version 0.6.11
2071
2080
2072 2005-02-14 Fernando Perez <fperez@colorado.edu>
2081 2005-02-14 Fernando Perez <fperez@colorado.edu>
2073
2082
2074 * IPython/background_jobs.py: New background job management
2083 * IPython/background_jobs.py: New background job management
2075 subsystem. This is implemented via a new set of classes, and
2084 subsystem. This is implemented via a new set of classes, and
2076 IPython now provides a builtin 'jobs' object for background job
2085 IPython now provides a builtin 'jobs' object for background job
2077 execution. A convenience %bg magic serves as a lightweight
2086 execution. A convenience %bg magic serves as a lightweight
2078 frontend for starting the more common type of calls. This was
2087 frontend for starting the more common type of calls. This was
2079 inspired by discussions with B. Granger and the BackgroundCommand
2088 inspired by discussions with B. Granger and the BackgroundCommand
2080 class described in the book Python Scripting for Computational
2089 class described in the book Python Scripting for Computational
2081 Science, by H. P. Langtangen: http://folk.uio.no/hpl/scripting
2090 Science, by H. P. Langtangen: http://folk.uio.no/hpl/scripting
2082 (although ultimately no code from this text was used, as IPython's
2091 (although ultimately no code from this text was used, as IPython's
2083 system is a separate implementation).
2092 system is a separate implementation).
2084
2093
2085 * IPython/iplib.py (MagicCompleter.python_matches): add new option
2094 * IPython/iplib.py (MagicCompleter.python_matches): add new option
2086 to control the completion of single/double underscore names
2095 to control the completion of single/double underscore names
2087 separately. As documented in the example ipytonrc file, the
2096 separately. As documented in the example ipytonrc file, the
2088 readline_omit__names variable can now be set to 2, to omit even
2097 readline_omit__names variable can now be set to 2, to omit even
2089 single underscore names. Thanks to a patch by Brian Wong
2098 single underscore names. Thanks to a patch by Brian Wong
2090 <BrianWong-AT-AirgoNetworks.Com>.
2099 <BrianWong-AT-AirgoNetworks.Com>.
2091 (InteractiveShell.__init__): Fix bug which would cause foo[1] to
2100 (InteractiveShell.__init__): Fix bug which would cause foo[1] to
2092 be autocalled as foo([1]) if foo were callable. A problem for
2101 be autocalled as foo([1]) if foo were callable. A problem for
2093 things which are both callable and implement __getitem__.
2102 things which are both callable and implement __getitem__.
2094 (init_readline): Fix autoindentation for win32. Thanks to a patch
2103 (init_readline): Fix autoindentation for win32. Thanks to a patch
2095 by Vivian De Smedt <vivian-AT-vdesmedt.com>.
2104 by Vivian De Smedt <vivian-AT-vdesmedt.com>.
2096
2105
2097 2005-02-12 Fernando Perez <fperez@colorado.edu>
2106 2005-02-12 Fernando Perez <fperez@colorado.edu>
2098
2107
2099 * IPython/ipmaker.py (make_IPython): Disabled the stout traps
2108 * IPython/ipmaker.py (make_IPython): Disabled the stout traps
2100 which I had written long ago to sort out user error messages which
2109 which I had written long ago to sort out user error messages which
2101 may occur during startup. This seemed like a good idea initially,
2110 may occur during startup. This seemed like a good idea initially,
2102 but it has proven a disaster in retrospect. I don't want to
2111 but it has proven a disaster in retrospect. I don't want to
2103 change much code for now, so my fix is to set the internal 'debug'
2112 change much code for now, so my fix is to set the internal 'debug'
2104 flag to true everywhere, whose only job was precisely to control
2113 flag to true everywhere, whose only job was precisely to control
2105 this subsystem. This closes issue 28 (as well as avoiding all
2114 this subsystem. This closes issue 28 (as well as avoiding all
2106 sorts of strange hangups which occur from time to time).
2115 sorts of strange hangups which occur from time to time).
2107
2116
2108 2005-02-07 Fernando Perez <fperez@colorado.edu>
2117 2005-02-07 Fernando Perez <fperez@colorado.edu>
2109
2118
2110 * IPython/Magic.py (magic_edit): Fix 'ed -p' not working when the
2119 * IPython/Magic.py (magic_edit): Fix 'ed -p' not working when the
2111 previous call produced a syntax error.
2120 previous call produced a syntax error.
2112
2121
2113 * IPython/OInspect.py (Inspector.pinfo): Fix crash when inspecting
2122 * IPython/OInspect.py (Inspector.pinfo): Fix crash when inspecting
2114 classes without constructor.
2123 classes without constructor.
2115
2124
2116 2005-02-06 Fernando Perez <fperez@colorado.edu>
2125 2005-02-06 Fernando Perez <fperez@colorado.edu>
2117
2126
2118 * IPython/iplib.py (MagicCompleter.complete): Extend the list of
2127 * IPython/iplib.py (MagicCompleter.complete): Extend the list of
2119 completions with the results of each matcher, so we return results
2128 completions with the results of each matcher, so we return results
2120 to the user from all namespaces. This breaks with ipython
2129 to the user from all namespaces. This breaks with ipython
2121 tradition, but I think it's a nicer behavior. Now you get all
2130 tradition, but I think it's a nicer behavior. Now you get all
2122 possible completions listed, from all possible namespaces (python,
2131 possible completions listed, from all possible namespaces (python,
2123 filesystem, magics...) After a request by John Hunter
2132 filesystem, magics...) After a request by John Hunter
2124 <jdhunter-AT-nitace.bsd.uchicago.edu>.
2133 <jdhunter-AT-nitace.bsd.uchicago.edu>.
2125
2134
2126 2005-02-05 Fernando Perez <fperez@colorado.edu>
2135 2005-02-05 Fernando Perez <fperez@colorado.edu>
2127
2136
2128 * IPython/Magic.py (magic_prun): Fix bug where prun would fail if
2137 * IPython/Magic.py (magic_prun): Fix bug where prun would fail if
2129 the call had quote characters in it (the quotes were stripped).
2138 the call had quote characters in it (the quotes were stripped).
2130
2139
2131 2005-01-31 Fernando Perez <fperez@colorado.edu>
2140 2005-01-31 Fernando Perez <fperez@colorado.edu>
2132
2141
2133 * IPython/iplib.py (InteractiveShell.__init__): reduce reliance on
2142 * IPython/iplib.py (InteractiveShell.__init__): reduce reliance on
2134 Itpl.itpl() to make the code more robust against psyco
2143 Itpl.itpl() to make the code more robust against psyco
2135 optimizations.
2144 optimizations.
2136
2145
2137 * IPython/Itpl.py (Itpl.__str__): Use a _getframe() call instead
2146 * IPython/Itpl.py (Itpl.__str__): Use a _getframe() call instead
2138 of causing an exception. Quicker, cleaner.
2147 of causing an exception. Quicker, cleaner.
2139
2148
2140 2005-01-28 Fernando Perez <fperez@colorado.edu>
2149 2005-01-28 Fernando Perez <fperez@colorado.edu>
2141
2150
2142 * scripts/ipython_win_post_install.py (install): hardcode
2151 * scripts/ipython_win_post_install.py (install): hardcode
2143 sys.prefix+'python.exe' as the executable path. It turns out that
2152 sys.prefix+'python.exe' as the executable path. It turns out that
2144 during the post-installation run, sys.executable resolves to the
2153 during the post-installation run, sys.executable resolves to the
2145 name of the binary installer! I should report this as a distutils
2154 name of the binary installer! I should report this as a distutils
2146 bug, I think. I updated the .10 release with this tiny fix, to
2155 bug, I think. I updated the .10 release with this tiny fix, to
2147 avoid annoying the lists further.
2156 avoid annoying the lists further.
2148
2157
2149 2005-01-27 *** Released version 0.6.10
2158 2005-01-27 *** Released version 0.6.10
2150
2159
2151 2005-01-27 Fernando Perez <fperez@colorado.edu>
2160 2005-01-27 Fernando Perez <fperez@colorado.edu>
2152
2161
2153 * IPython/numutils.py (norm): Added 'inf' as optional name for
2162 * IPython/numutils.py (norm): Added 'inf' as optional name for
2154 L-infinity norm, included references to mathworld.com for vector
2163 L-infinity norm, included references to mathworld.com for vector
2155 norm definitions.
2164 norm definitions.
2156 (amin/amax): added amin/amax for array min/max. Similar to what
2165 (amin/amax): added amin/amax for array min/max. Similar to what
2157 pylab ships with after the recent reorganization of names.
2166 pylab ships with after the recent reorganization of names.
2158 (spike/spike_odd): removed deprecated spike/spike_odd functions.
2167 (spike/spike_odd): removed deprecated spike/spike_odd functions.
2159
2168
2160 * ipython.el: committed Alex's recent fixes and improvements.
2169 * ipython.el: committed Alex's recent fixes and improvements.
2161 Tested with python-mode from CVS, and it looks excellent. Since
2170 Tested with python-mode from CVS, and it looks excellent. Since
2162 python-mode hasn't released anything in a while, I'm temporarily
2171 python-mode hasn't released anything in a while, I'm temporarily
2163 putting a copy of today's CVS (v 4.70) of python-mode in:
2172 putting a copy of today's CVS (v 4.70) of python-mode in:
2164 http://ipython.scipy.org/tmp/python-mode.el
2173 http://ipython.scipy.org/tmp/python-mode.el
2165
2174
2166 * scripts/ipython_win_post_install.py (install): Win32 fix to use
2175 * scripts/ipython_win_post_install.py (install): Win32 fix to use
2167 sys.executable for the executable name, instead of assuming it's
2176 sys.executable for the executable name, instead of assuming it's
2168 called 'python.exe' (the post-installer would have produced broken
2177 called 'python.exe' (the post-installer would have produced broken
2169 setups on systems with a differently named python binary).
2178 setups on systems with a differently named python binary).
2170
2179
2171 * IPython/PyColorize.py (Parser.__call__): change explicit '\n'
2180 * IPython/PyColorize.py (Parser.__call__): change explicit '\n'
2172 references to os.linesep, to make the code more
2181 references to os.linesep, to make the code more
2173 platform-independent. This is also part of the win32 coloring
2182 platform-independent. This is also part of the win32 coloring
2174 fixes.
2183 fixes.
2175
2184
2176 * IPython/genutils.py (page_dumb): Remove attempts to chop long
2185 * IPython/genutils.py (page_dumb): Remove attempts to chop long
2177 lines, which actually cause coloring bugs because the length of
2186 lines, which actually cause coloring bugs because the length of
2178 the line is very difficult to correctly compute with embedded
2187 the line is very difficult to correctly compute with embedded
2179 escapes. This was the source of all the coloring problems under
2188 escapes. This was the source of all the coloring problems under
2180 Win32. I think that _finally_, Win32 users have a properly
2189 Win32. I think that _finally_, Win32 users have a properly
2181 working ipython in all respects. This would never have happened
2190 working ipython in all respects. This would never have happened
2182 if not for Gary Bishop and Viktor Ransmayr's great help and work.
2191 if not for Gary Bishop and Viktor Ransmayr's great help and work.
2183
2192
2184 2005-01-26 *** Released version 0.6.9
2193 2005-01-26 *** Released version 0.6.9
2185
2194
2186 2005-01-25 Fernando Perez <fperez@colorado.edu>
2195 2005-01-25 Fernando Perez <fperez@colorado.edu>
2187
2196
2188 * setup.py: finally, we have a true Windows installer, thanks to
2197 * setup.py: finally, we have a true Windows installer, thanks to
2189 the excellent work of Viktor Ransmayr
2198 the excellent work of Viktor Ransmayr
2190 <viktor.ransmayr-AT-t-online.de>. The docs have been updated for
2199 <viktor.ransmayr-AT-t-online.de>. The docs have been updated for
2191 Windows users. The setup routine is quite a bit cleaner thanks to
2200 Windows users. The setup routine is quite a bit cleaner thanks to
2192 this, and the post-install script uses the proper functions to
2201 this, and the post-install script uses the proper functions to
2193 allow a clean de-installation using the standard Windows Control
2202 allow a clean de-installation using the standard Windows Control
2194 Panel.
2203 Panel.
2195
2204
2196 * IPython/genutils.py (get_home_dir): changed to use the $HOME
2205 * IPython/genutils.py (get_home_dir): changed to use the $HOME
2197 environment variable under all OSes (including win32) if
2206 environment variable under all OSes (including win32) if
2198 available. This will give consistency to win32 users who have set
2207 available. This will give consistency to win32 users who have set
2199 this variable for any reason. If os.environ['HOME'] fails, the
2208 this variable for any reason. If os.environ['HOME'] fails, the
2200 previous policy of using HOMEDRIVE\HOMEPATH kicks in.
2209 previous policy of using HOMEDRIVE\HOMEPATH kicks in.
2201
2210
2202 2005-01-24 Fernando Perez <fperez@colorado.edu>
2211 2005-01-24 Fernando Perez <fperez@colorado.edu>
2203
2212
2204 * IPython/numutils.py (empty_like): add empty_like(), similar to
2213 * IPython/numutils.py (empty_like): add empty_like(), similar to
2205 zeros_like() but taking advantage of the new empty() Numeric routine.
2214 zeros_like() but taking advantage of the new empty() Numeric routine.
2206
2215
2207 2005-01-23 *** Released version 0.6.8
2216 2005-01-23 *** Released version 0.6.8
2208
2217
2209 2005-01-22 Fernando Perez <fperez@colorado.edu>
2218 2005-01-22 Fernando Perez <fperez@colorado.edu>
2210
2219
2211 * IPython/Shell.py (MatplotlibShellBase.mplot_exec): I removed the
2220 * IPython/Shell.py (MatplotlibShellBase.mplot_exec): I removed the
2212 automatic show() calls. After discussing things with JDH, it
2221 automatic show() calls. After discussing things with JDH, it
2213 turns out there are too many corner cases where this can go wrong.
2222 turns out there are too many corner cases where this can go wrong.
2214 It's best not to try to be 'too smart', and simply have ipython
2223 It's best not to try to be 'too smart', and simply have ipython
2215 reproduce as much as possible the default behavior of a normal
2224 reproduce as much as possible the default behavior of a normal
2216 python shell.
2225 python shell.
2217
2226
2218 * IPython/iplib.py (InteractiveShell.__init__): Modified the
2227 * IPython/iplib.py (InteractiveShell.__init__): Modified the
2219 line-splitting regexp and _prefilter() to avoid calling getattr()
2228 line-splitting regexp and _prefilter() to avoid calling getattr()
2220 on assignments. This closes
2229 on assignments. This closes
2221 http://www.scipy.net/roundup/ipython/issue24. Note that Python's
2230 http://www.scipy.net/roundup/ipython/issue24. Note that Python's
2222 readline uses getattr(), so a simple <TAB> keypress is still
2231 readline uses getattr(), so a simple <TAB> keypress is still
2223 enough to trigger getattr() calls on an object.
2232 enough to trigger getattr() calls on an object.
2224
2233
2225 2005-01-21 Fernando Perez <fperez@colorado.edu>
2234 2005-01-21 Fernando Perez <fperez@colorado.edu>
2226
2235
2227 * IPython/Shell.py (MatplotlibShellBase.magic_run): Fix the %run
2236 * IPython/Shell.py (MatplotlibShellBase.magic_run): Fix the %run
2228 docstring under pylab so it doesn't mask the original.
2237 docstring under pylab so it doesn't mask the original.
2229
2238
2230 2005-01-21 *** Released version 0.6.7
2239 2005-01-21 *** Released version 0.6.7
2231
2240
2232 2005-01-21 Fernando Perez <fperez@colorado.edu>
2241 2005-01-21 Fernando Perez <fperez@colorado.edu>
2233
2242
2234 * IPython/Shell.py (MTInteractiveShell.runcode): Trap a crash with
2243 * IPython/Shell.py (MTInteractiveShell.runcode): Trap a crash with
2235 signal handling for win32 users in multithreaded mode.
2244 signal handling for win32 users in multithreaded mode.
2236
2245
2237 2005-01-17 Fernando Perez <fperez@colorado.edu>
2246 2005-01-17 Fernando Perez <fperez@colorado.edu>
2238
2247
2239 * IPython/OInspect.py (Inspector.pinfo): Fix crash when inspecting
2248 * IPython/OInspect.py (Inspector.pinfo): Fix crash when inspecting
2240 instances with no __init__. After a crash report by Norbert Nemec
2249 instances with no __init__. After a crash report by Norbert Nemec
2241 <Norbert-AT-nemec-online.de>.
2250 <Norbert-AT-nemec-online.de>.
2242
2251
2243 2005-01-14 Fernando Perez <fperez@colorado.edu>
2252 2005-01-14 Fernando Perez <fperez@colorado.edu>
2244
2253
2245 * IPython/ultraTB.py (VerboseTB.text): Fix bug in reporting of
2254 * IPython/ultraTB.py (VerboseTB.text): Fix bug in reporting of
2246 names for verbose exceptions, when multiple dotted names and the
2255 names for verbose exceptions, when multiple dotted names and the
2247 'parent' object were present on the same line.
2256 'parent' object were present on the same line.
2248
2257
2249 2005-01-11 Fernando Perez <fperez@colorado.edu>
2258 2005-01-11 Fernando Perez <fperez@colorado.edu>
2250
2259
2251 * IPython/genutils.py (flag_calls): new utility to trap and flag
2260 * IPython/genutils.py (flag_calls): new utility to trap and flag
2252 calls in functions. I need it to clean up matplotlib support.
2261 calls in functions. I need it to clean up matplotlib support.
2253 Also removed some deprecated code in genutils.
2262 Also removed some deprecated code in genutils.
2254
2263
2255 * IPython/Shell.py (MatplotlibShellBase.mplot_exec): small fix so
2264 * IPython/Shell.py (MatplotlibShellBase.mplot_exec): small fix so
2256 that matplotlib scripts called with %run, which don't call show()
2265 that matplotlib scripts called with %run, which don't call show()
2257 themselves, still have their plotting windows open.
2266 themselves, still have their plotting windows open.
2258
2267
2259 2005-01-05 Fernando Perez <fperez@colorado.edu>
2268 2005-01-05 Fernando Perez <fperez@colorado.edu>
2260
2269
2261 * IPython/Shell.py (IPShellGTK.__init__): Patch by Andrew Straw
2270 * IPython/Shell.py (IPShellGTK.__init__): Patch by Andrew Straw
2262 <astraw-AT-caltech.edu>, to fix gtk deprecation warnings.
2271 <astraw-AT-caltech.edu>, to fix gtk deprecation warnings.
2263
2272
2264 2004-12-19 Fernando Perez <fperez@colorado.edu>
2273 2004-12-19 Fernando Perez <fperez@colorado.edu>
2265
2274
2266 * IPython/Shell.py (MTInteractiveShell.runcode): Get rid of
2275 * IPython/Shell.py (MTInteractiveShell.runcode): Get rid of
2267 parent_runcode, which was an eyesore. The same result can be
2276 parent_runcode, which was an eyesore. The same result can be
2268 obtained with Python's regular superclass mechanisms.
2277 obtained with Python's regular superclass mechanisms.
2269
2278
2270 2004-12-17 Fernando Perez <fperez@colorado.edu>
2279 2004-12-17 Fernando Perez <fperez@colorado.edu>
2271
2280
2272 * IPython/Magic.py (Magic.magic_sc): Fix quote stripping problem
2281 * IPython/Magic.py (Magic.magic_sc): Fix quote stripping problem
2273 reported by Prabhu.
2282 reported by Prabhu.
2274 (Magic.magic_sx): direct all errors to Term.cerr (defaults to
2283 (Magic.magic_sx): direct all errors to Term.cerr (defaults to
2275 sys.stderr) instead of explicitly calling sys.stderr. This helps
2284 sys.stderr) instead of explicitly calling sys.stderr. This helps
2276 maintain our I/O abstractions clean, for future GUI embeddings.
2285 maintain our I/O abstractions clean, for future GUI embeddings.
2277
2286
2278 * IPython/genutils.py (info): added new utility for sys.stderr
2287 * IPython/genutils.py (info): added new utility for sys.stderr
2279 unified info message handling (thin wrapper around warn()).
2288 unified info message handling (thin wrapper around warn()).
2280
2289
2281 * IPython/ultraTB.py (VerboseTB.text): Fix misreported global
2290 * IPython/ultraTB.py (VerboseTB.text): Fix misreported global
2282 composite (dotted) names on verbose exceptions.
2291 composite (dotted) names on verbose exceptions.
2283 (VerboseTB.nullrepr): harden against another kind of errors which
2292 (VerboseTB.nullrepr): harden against another kind of errors which
2284 Python's inspect module can trigger, and which were crashing
2293 Python's inspect module can trigger, and which were crashing
2285 IPython. Thanks to a report by Marco Lombardi
2294 IPython. Thanks to a report by Marco Lombardi
2286 <mlombard-AT-ma010192.hq.eso.org>.
2295 <mlombard-AT-ma010192.hq.eso.org>.
2287
2296
2288 2004-12-13 *** Released version 0.6.6
2297 2004-12-13 *** Released version 0.6.6
2289
2298
2290 2004-12-12 Fernando Perez <fperez@colorado.edu>
2299 2004-12-12 Fernando Perez <fperez@colorado.edu>
2291
2300
2292 * IPython/Shell.py (IPShellGTK.mainloop): catch RuntimeErrors
2301 * IPython/Shell.py (IPShellGTK.mainloop): catch RuntimeErrors
2293 generated by pygtk upon initialization if it was built without
2302 generated by pygtk upon initialization if it was built without
2294 threads (for matplotlib users). After a crash reported by
2303 threads (for matplotlib users). After a crash reported by
2295 Leguijt, Jaap J SIEP-EPT-RES <Jaap.Leguijt-AT-shell.com>.
2304 Leguijt, Jaap J SIEP-EPT-RES <Jaap.Leguijt-AT-shell.com>.
2296
2305
2297 * IPython/ipmaker.py (make_IPython): fix small bug in the
2306 * IPython/ipmaker.py (make_IPython): fix small bug in the
2298 import_some parameter for multiple imports.
2307 import_some parameter for multiple imports.
2299
2308
2300 * IPython/iplib.py (ipmagic): simplified the interface of
2309 * IPython/iplib.py (ipmagic): simplified the interface of
2301 ipmagic() to take a single string argument, just as it would be
2310 ipmagic() to take a single string argument, just as it would be
2302 typed at the IPython cmd line.
2311 typed at the IPython cmd line.
2303 (ipalias): Added new ipalias() with an interface identical to
2312 (ipalias): Added new ipalias() with an interface identical to
2304 ipmagic(). This completes exposing a pure python interface to the
2313 ipmagic(). This completes exposing a pure python interface to the
2305 alias and magic system, which can be used in loops or more complex
2314 alias and magic system, which can be used in loops or more complex
2306 code where IPython's automatic line mangling is not active.
2315 code where IPython's automatic line mangling is not active.
2307
2316
2308 * IPython/genutils.py (timing): changed interface of timing to
2317 * IPython/genutils.py (timing): changed interface of timing to
2309 simply run code once, which is the most common case. timings()
2318 simply run code once, which is the most common case. timings()
2310 remains unchanged, for the cases where you want multiple runs.
2319 remains unchanged, for the cases where you want multiple runs.
2311
2320
2312 * IPython/Shell.py (MatplotlibShellBase._matplotlib_config): Fix a
2321 * IPython/Shell.py (MatplotlibShellBase._matplotlib_config): Fix a
2313 bug where Python2.2 crashes with exec'ing code which does not end
2322 bug where Python2.2 crashes with exec'ing code which does not end
2314 in a single newline. Python 2.3 is OK, so I hadn't noticed this
2323 in a single newline. Python 2.3 is OK, so I hadn't noticed this
2315 before.
2324 before.
2316
2325
2317 2004-12-10 Fernando Perez <fperez@colorado.edu>
2326 2004-12-10 Fernando Perez <fperez@colorado.edu>
2318
2327
2319 * IPython/Magic.py (Magic.magic_prun): changed name of option from
2328 * IPython/Magic.py (Magic.magic_prun): changed name of option from
2320 -t to -T, to accomodate the new -t flag in %run (the %run and
2329 -t to -T, to accomodate the new -t flag in %run (the %run and
2321 %prun options are kind of intermixed, and it's not easy to change
2330 %prun options are kind of intermixed, and it's not easy to change
2322 this with the limitations of python's getopt).
2331 this with the limitations of python's getopt).
2323
2332
2324 * IPython/Magic.py (Magic.magic_run): Added new -t option to time
2333 * IPython/Magic.py (Magic.magic_run): Added new -t option to time
2325 the execution of scripts. It's not as fine-tuned as timeit.py,
2334 the execution of scripts. It's not as fine-tuned as timeit.py,
2326 but it works from inside ipython (and under 2.2, which lacks
2335 but it works from inside ipython (and under 2.2, which lacks
2327 timeit.py). Optionally a number of runs > 1 can be given for
2336 timeit.py). Optionally a number of runs > 1 can be given for
2328 timing very short-running code.
2337 timing very short-running code.
2329
2338
2330 * IPython/genutils.py (uniq_stable): new routine which returns a
2339 * IPython/genutils.py (uniq_stable): new routine which returns a
2331 list of unique elements in any iterable, but in stable order of
2340 list of unique elements in any iterable, but in stable order of
2332 appearance. I needed this for the ultraTB fixes, and it's a handy
2341 appearance. I needed this for the ultraTB fixes, and it's a handy
2333 utility.
2342 utility.
2334
2343
2335 * IPython/ultraTB.py (VerboseTB.text): Fix proper reporting of
2344 * IPython/ultraTB.py (VerboseTB.text): Fix proper reporting of
2336 dotted names in Verbose exceptions. This had been broken since
2345 dotted names in Verbose exceptions. This had been broken since
2337 the very start, now x.y will properly be printed in a Verbose
2346 the very start, now x.y will properly be printed in a Verbose
2338 traceback, instead of x being shown and y appearing always as an
2347 traceback, instead of x being shown and y appearing always as an
2339 'undefined global'. Getting this to work was a bit tricky,
2348 'undefined global'. Getting this to work was a bit tricky,
2340 because by default python tokenizers are stateless. Saved by
2349 because by default python tokenizers are stateless. Saved by
2341 python's ability to easily add a bit of state to an arbitrary
2350 python's ability to easily add a bit of state to an arbitrary
2342 function (without needing to build a full-blown callable object).
2351 function (without needing to build a full-blown callable object).
2343
2352
2344 Also big cleanup of this code, which had horrendous runtime
2353 Also big cleanup of this code, which had horrendous runtime
2345 lookups of zillions of attributes for colorization. Moved all
2354 lookups of zillions of attributes for colorization. Moved all
2346 this code into a few templates, which make it cleaner and quicker.
2355 this code into a few templates, which make it cleaner and quicker.
2347
2356
2348 Printout quality was also improved for Verbose exceptions: one
2357 Printout quality was also improved for Verbose exceptions: one
2349 variable per line, and memory addresses are printed (this can be
2358 variable per line, and memory addresses are printed (this can be
2350 quite handy in nasty debugging situations, which is what Verbose
2359 quite handy in nasty debugging situations, which is what Verbose
2351 is for).
2360 is for).
2352
2361
2353 * IPython/ipmaker.py (make_IPython): Do NOT execute files named in
2362 * IPython/ipmaker.py (make_IPython): Do NOT execute files named in
2354 the command line as scripts to be loaded by embedded instances.
2363 the command line as scripts to be loaded by embedded instances.
2355 Doing so has the potential for an infinite recursion if there are
2364 Doing so has the potential for an infinite recursion if there are
2356 exceptions thrown in the process. This fixes a strange crash
2365 exceptions thrown in the process. This fixes a strange crash
2357 reported by Philippe MULLER <muller-AT-irit.fr>.
2366 reported by Philippe MULLER <muller-AT-irit.fr>.
2358
2367
2359 2004-12-09 Fernando Perez <fperez@colorado.edu>
2368 2004-12-09 Fernando Perez <fperez@colorado.edu>
2360
2369
2361 * IPython/Shell.py (MatplotlibShellBase.use): Change pylab support
2370 * IPython/Shell.py (MatplotlibShellBase.use): Change pylab support
2362 to reflect new names in matplotlib, which now expose the
2371 to reflect new names in matplotlib, which now expose the
2363 matlab-compatible interface via a pylab module instead of the
2372 matlab-compatible interface via a pylab module instead of the
2364 'matlab' name. The new code is backwards compatible, so users of
2373 'matlab' name. The new code is backwards compatible, so users of
2365 all matplotlib versions are OK. Patch by J. Hunter.
2374 all matplotlib versions are OK. Patch by J. Hunter.
2366
2375
2367 * IPython/OInspect.py (Inspector.pinfo): Add to object? printing
2376 * IPython/OInspect.py (Inspector.pinfo): Add to object? printing
2368 of __init__ docstrings for instances (class docstrings are already
2377 of __init__ docstrings for instances (class docstrings are already
2369 automatically printed). Instances with customized docstrings
2378 automatically printed). Instances with customized docstrings
2370 (indep. of the class) are also recognized and all 3 separate
2379 (indep. of the class) are also recognized and all 3 separate
2371 docstrings are printed (instance, class, constructor). After some
2380 docstrings are printed (instance, class, constructor). After some
2372 comments/suggestions by J. Hunter.
2381 comments/suggestions by J. Hunter.
2373
2382
2374 2004-12-05 Fernando Perez <fperez@colorado.edu>
2383 2004-12-05 Fernando Perez <fperez@colorado.edu>
2375
2384
2376 * IPython/iplib.py (MagicCompleter.complete): Remove annoying
2385 * IPython/iplib.py (MagicCompleter.complete): Remove annoying
2377 warnings when tab-completion fails and triggers an exception.
2386 warnings when tab-completion fails and triggers an exception.
2378
2387
2379 2004-12-03 Fernando Perez <fperez@colorado.edu>
2388 2004-12-03 Fernando Perez <fperez@colorado.edu>
2380
2389
2381 * IPython/Magic.py (magic_prun): Fix bug where an exception would
2390 * IPython/Magic.py (magic_prun): Fix bug where an exception would
2382 be triggered when using 'run -p'. An incorrect option flag was
2391 be triggered when using 'run -p'. An incorrect option flag was
2383 being set ('d' instead of 'D').
2392 being set ('d' instead of 'D').
2384 (manpage): fix missing escaped \- sign.
2393 (manpage): fix missing escaped \- sign.
2385
2394
2386 2004-11-30 *** Released version 0.6.5
2395 2004-11-30 *** Released version 0.6.5
2387
2396
2388 2004-11-30 Fernando Perez <fperez@colorado.edu>
2397 2004-11-30 Fernando Perez <fperez@colorado.edu>
2389
2398
2390 * IPython/Magic.py (Magic.magic_run): Fix bug in breakpoint
2399 * IPython/Magic.py (Magic.magic_run): Fix bug in breakpoint
2391 setting with -d option.
2400 setting with -d option.
2392
2401
2393 * setup.py (docfiles): Fix problem where the doc glob I was using
2402 * setup.py (docfiles): Fix problem where the doc glob I was using
2394 was COMPLETELY BROKEN. It was giving the right files by pure
2403 was COMPLETELY BROKEN. It was giving the right files by pure
2395 accident, but failed once I tried to include ipython.el. Note:
2404 accident, but failed once I tried to include ipython.el. Note:
2396 glob() does NOT allow you to do exclusion on multiple endings!
2405 glob() does NOT allow you to do exclusion on multiple endings!
2397
2406
2398 2004-11-29 Fernando Perez <fperez@colorado.edu>
2407 2004-11-29 Fernando Perez <fperez@colorado.edu>
2399
2408
2400 * IPython/usage.py (__doc__): cleaned up usage docstring, by using
2409 * IPython/usage.py (__doc__): cleaned up usage docstring, by using
2401 the manpage as the source. Better formatting & consistency.
2410 the manpage as the source. Better formatting & consistency.
2402
2411
2403 * IPython/Magic.py (magic_run): Added new -d option, to run
2412 * IPython/Magic.py (magic_run): Added new -d option, to run
2404 scripts under the control of the python pdb debugger. Note that
2413 scripts under the control of the python pdb debugger. Note that
2405 this required changing the %prun option -d to -D, to avoid a clash
2414 this required changing the %prun option -d to -D, to avoid a clash
2406 (since %run must pass options to %prun, and getopt is too dumb to
2415 (since %run must pass options to %prun, and getopt is too dumb to
2407 handle options with string values with embedded spaces). Thanks
2416 handle options with string values with embedded spaces). Thanks
2408 to a suggestion by Matthew Arnison <maffew-AT-cat.org.au>.
2417 to a suggestion by Matthew Arnison <maffew-AT-cat.org.au>.
2409 (magic_who_ls): added type matching to %who and %whos, so that one
2418 (magic_who_ls): added type matching to %who and %whos, so that one
2410 can filter their output to only include variables of certain
2419 can filter their output to only include variables of certain
2411 types. Another suggestion by Matthew.
2420 types. Another suggestion by Matthew.
2412 (magic_whos): Added memory summaries in kb and Mb for arrays.
2421 (magic_whos): Added memory summaries in kb and Mb for arrays.
2413 (magic_who): Improve formatting (break lines every 9 vars).
2422 (magic_who): Improve formatting (break lines every 9 vars).
2414
2423
2415 2004-11-28 Fernando Perez <fperez@colorado.edu>
2424 2004-11-28 Fernando Perez <fperez@colorado.edu>
2416
2425
2417 * IPython/Logger.py (Logger.log): Fix bug in syncing the input
2426 * IPython/Logger.py (Logger.log): Fix bug in syncing the input
2418 cache when empty lines were present.
2427 cache when empty lines were present.
2419
2428
2420 2004-11-24 Fernando Perez <fperez@colorado.edu>
2429 2004-11-24 Fernando Perez <fperez@colorado.edu>
2421
2430
2422 * IPython/usage.py (__doc__): document the re-activated threading
2431 * IPython/usage.py (__doc__): document the re-activated threading
2423 options for WX and GTK.
2432 options for WX and GTK.
2424
2433
2425 2004-11-23 Fernando Perez <fperez@colorado.edu>
2434 2004-11-23 Fernando Perez <fperez@colorado.edu>
2426
2435
2427 * IPython/Shell.py (start): Added Prabhu's big patch to reactivate
2436 * IPython/Shell.py (start): Added Prabhu's big patch to reactivate
2428 the -wthread and -gthread options, along with a new -tk one to try
2437 the -wthread and -gthread options, along with a new -tk one to try
2429 and coordinate Tk threading with wx/gtk. The tk support is very
2438 and coordinate Tk threading with wx/gtk. The tk support is very
2430 platform dependent, since it seems to require Tcl and Tk to be
2439 platform dependent, since it seems to require Tcl and Tk to be
2431 built with threads (Fedora1/2 appears NOT to have it, but in
2440 built with threads (Fedora1/2 appears NOT to have it, but in
2432 Prabhu's Debian boxes it works OK). But even with some Tk
2441 Prabhu's Debian boxes it works OK). But even with some Tk
2433 limitations, this is a great improvement.
2442 limitations, this is a great improvement.
2434
2443
2435 * IPython/Prompts.py (prompt_specials_color): Added \t for time
2444 * IPython/Prompts.py (prompt_specials_color): Added \t for time
2436 info in user prompts. Patch by Prabhu.
2445 info in user prompts. Patch by Prabhu.
2437
2446
2438 2004-11-18 Fernando Perez <fperez@colorado.edu>
2447 2004-11-18 Fernando Perez <fperez@colorado.edu>
2439
2448
2440 * IPython/genutils.py (ask_yes_no): Add check for a max of 20
2449 * IPython/genutils.py (ask_yes_no): Add check for a max of 20
2441 EOFErrors and bail, to avoid infinite loops if a non-terminating
2450 EOFErrors and bail, to avoid infinite loops if a non-terminating
2442 file is fed into ipython. Patch submitted in issue 19 by user,
2451 file is fed into ipython. Patch submitted in issue 19 by user,
2443 many thanks.
2452 many thanks.
2444
2453
2445 * IPython/iplib.py (InteractiveShell.handle_auto): do NOT trigger
2454 * IPython/iplib.py (InteractiveShell.handle_auto): do NOT trigger
2446 autoquote/parens in continuation prompts, which can cause lots of
2455 autoquote/parens in continuation prompts, which can cause lots of
2447 problems. Closes roundup issue 20.
2456 problems. Closes roundup issue 20.
2448
2457
2449 2004-11-17 Fernando Perez <fperez@colorado.edu>
2458 2004-11-17 Fernando Perez <fperez@colorado.edu>
2450
2459
2451 * debian/control (Build-Depends-Indep): Fix dpatch dependency,
2460 * debian/control (Build-Depends-Indep): Fix dpatch dependency,
2452 reported as debian bug #280505. I'm not sure my local changelog
2461 reported as debian bug #280505. I'm not sure my local changelog
2453 entry has the proper debian format (Jack?).
2462 entry has the proper debian format (Jack?).
2454
2463
2455 2004-11-08 *** Released version 0.6.4
2464 2004-11-08 *** Released version 0.6.4
2456
2465
2457 2004-11-08 Fernando Perez <fperez@colorado.edu>
2466 2004-11-08 Fernando Perez <fperez@colorado.edu>
2458
2467
2459 * IPython/iplib.py (init_readline): Fix exit message for Windows
2468 * IPython/iplib.py (init_readline): Fix exit message for Windows
2460 when readline is active. Thanks to a report by Eric Jones
2469 when readline is active. Thanks to a report by Eric Jones
2461 <eric-AT-enthought.com>.
2470 <eric-AT-enthought.com>.
2462
2471
2463 2004-11-07 Fernando Perez <fperez@colorado.edu>
2472 2004-11-07 Fernando Perez <fperez@colorado.edu>
2464
2473
2465 * IPython/genutils.py (page): Add a trap for OSError exceptions,
2474 * IPython/genutils.py (page): Add a trap for OSError exceptions,
2466 sometimes seen by win2k/cygwin users.
2475 sometimes seen by win2k/cygwin users.
2467
2476
2468 2004-11-06 Fernando Perez <fperez@colorado.edu>
2477 2004-11-06 Fernando Perez <fperez@colorado.edu>
2469
2478
2470 * IPython/iplib.py (interact): Change the handling of %Exit from
2479 * IPython/iplib.py (interact): Change the handling of %Exit from
2471 trying to propagate a SystemExit to an internal ipython flag.
2480 trying to propagate a SystemExit to an internal ipython flag.
2472 This is less elegant than using Python's exception mechanism, but
2481 This is less elegant than using Python's exception mechanism, but
2473 I can't get that to work reliably with threads, so under -pylab
2482 I can't get that to work reliably with threads, so under -pylab
2474 %Exit was hanging IPython. Cross-thread exception handling is
2483 %Exit was hanging IPython. Cross-thread exception handling is
2475 really a bitch. Thaks to a bug report by Stephen Walton
2484 really a bitch. Thaks to a bug report by Stephen Walton
2476 <stephen.walton-AT-csun.edu>.
2485 <stephen.walton-AT-csun.edu>.
2477
2486
2478 2004-11-04 Fernando Perez <fperez@colorado.edu>
2487 2004-11-04 Fernando Perez <fperez@colorado.edu>
2479
2488
2480 * IPython/iplib.py (raw_input_original): store a pointer to the
2489 * IPython/iplib.py (raw_input_original): store a pointer to the
2481 true raw_input to harden against code which can modify it
2490 true raw_input to harden against code which can modify it
2482 (wx.py.PyShell does this and would otherwise crash ipython).
2491 (wx.py.PyShell does this and would otherwise crash ipython).
2483 Thanks to a bug report by Jim Flowers <james.flowers-AT-lgx.com>.
2492 Thanks to a bug report by Jim Flowers <james.flowers-AT-lgx.com>.
2484
2493
2485 * IPython/Shell.py (MTInteractiveShell.runsource): Cleaner fix for
2494 * IPython/Shell.py (MTInteractiveShell.runsource): Cleaner fix for
2486 Ctrl-C problem, which does not mess up the input line.
2495 Ctrl-C problem, which does not mess up the input line.
2487
2496
2488 2004-11-03 Fernando Perez <fperez@colorado.edu>
2497 2004-11-03 Fernando Perez <fperez@colorado.edu>
2489
2498
2490 * IPython/Release.py: Changed licensing to BSD, in all files.
2499 * IPython/Release.py: Changed licensing to BSD, in all files.
2491 (name): lowercase name for tarball/RPM release.
2500 (name): lowercase name for tarball/RPM release.
2492
2501
2493 * IPython/OInspect.py (getdoc): wrap inspect.getdoc() safely for
2502 * IPython/OInspect.py (getdoc): wrap inspect.getdoc() safely for
2494 use throughout ipython.
2503 use throughout ipython.
2495
2504
2496 * IPython/Magic.py (Magic._ofind): Switch to using the new
2505 * IPython/Magic.py (Magic._ofind): Switch to using the new
2497 OInspect.getdoc() function.
2506 OInspect.getdoc() function.
2498
2507
2499 * IPython/Shell.py (sigint_handler): Hack to ignore the execution
2508 * IPython/Shell.py (sigint_handler): Hack to ignore the execution
2500 of the line currently being canceled via Ctrl-C. It's extremely
2509 of the line currently being canceled via Ctrl-C. It's extremely
2501 ugly, but I don't know how to do it better (the problem is one of
2510 ugly, but I don't know how to do it better (the problem is one of
2502 handling cross-thread exceptions).
2511 handling cross-thread exceptions).
2503
2512
2504 2004-10-28 Fernando Perez <fperez@colorado.edu>
2513 2004-10-28 Fernando Perez <fperez@colorado.edu>
2505
2514
2506 * IPython/Shell.py (signal_handler): add signal handlers to trap
2515 * IPython/Shell.py (signal_handler): add signal handlers to trap
2507 SIGINT and SIGSEGV in threaded code properly. Thanks to a bug
2516 SIGINT and SIGSEGV in threaded code properly. Thanks to a bug
2508 report by Francesc Alted.
2517 report by Francesc Alted.
2509
2518
2510 2004-10-21 Fernando Perez <fperez@colorado.edu>
2519 2004-10-21 Fernando Perez <fperez@colorado.edu>
2511
2520
2512 * IPython/Extensions/InterpreterExec.py (prefilter_shell): Fix @
2521 * IPython/Extensions/InterpreterExec.py (prefilter_shell): Fix @
2513 to % for pysh syntax extensions.
2522 to % for pysh syntax extensions.
2514
2523
2515 2004-10-09 Fernando Perez <fperez@colorado.edu>
2524 2004-10-09 Fernando Perez <fperez@colorado.edu>
2516
2525
2517 * IPython/Magic.py (Magic.magic_whos): modify output of Numeric
2526 * IPython/Magic.py (Magic.magic_whos): modify output of Numeric
2518 arrays to print a more useful summary, without calling str(arr).
2527 arrays to print a more useful summary, without calling str(arr).
2519 This avoids the problem of extremely lengthy computations which
2528 This avoids the problem of extremely lengthy computations which
2520 occur if arr is large, and appear to the user as a system lockup
2529 occur if arr is large, and appear to the user as a system lockup
2521 with 100% cpu activity. After a suggestion by Kristian Sandberg
2530 with 100% cpu activity. After a suggestion by Kristian Sandberg
2522 <Kristian.Sandberg@colorado.edu>.
2531 <Kristian.Sandberg@colorado.edu>.
2523 (Magic.__init__): fix bug in global magic escapes not being
2532 (Magic.__init__): fix bug in global magic escapes not being
2524 correctly set.
2533 correctly set.
2525
2534
2526 2004-10-08 Fernando Perez <fperez@colorado.edu>
2535 2004-10-08 Fernando Perez <fperez@colorado.edu>
2527
2536
2528 * IPython/Magic.py (__license__): change to absolute imports of
2537 * IPython/Magic.py (__license__): change to absolute imports of
2529 ipython's own internal packages, to start adapting to the absolute
2538 ipython's own internal packages, to start adapting to the absolute
2530 import requirement of PEP-328.
2539 import requirement of PEP-328.
2531
2540
2532 * IPython/genutils.py (__author__): Fix coding to utf-8 on all
2541 * IPython/genutils.py (__author__): Fix coding to utf-8 on all
2533 files, and standardize author/license marks through the Release
2542 files, and standardize author/license marks through the Release
2534 module instead of having per/file stuff (except for files with
2543 module instead of having per/file stuff (except for files with
2535 particular licenses, like the MIT/PSF-licensed codes).
2544 particular licenses, like the MIT/PSF-licensed codes).
2536
2545
2537 * IPython/Debugger.py: remove dead code for python 2.1
2546 * IPython/Debugger.py: remove dead code for python 2.1
2538
2547
2539 2004-10-04 Fernando Perez <fperez@colorado.edu>
2548 2004-10-04 Fernando Perez <fperez@colorado.edu>
2540
2549
2541 * IPython/iplib.py (ipmagic): New function for accessing magics
2550 * IPython/iplib.py (ipmagic): New function for accessing magics
2542 via a normal python function call.
2551 via a normal python function call.
2543
2552
2544 * IPython/Magic.py (Magic.magic_magic): Change the magic escape
2553 * IPython/Magic.py (Magic.magic_magic): Change the magic escape
2545 from '@' to '%', to accomodate the new @decorator syntax of python
2554 from '@' to '%', to accomodate the new @decorator syntax of python
2546 2.4.
2555 2.4.
2547
2556
2548 2004-09-29 Fernando Perez <fperez@colorado.edu>
2557 2004-09-29 Fernando Perez <fperez@colorado.edu>
2549
2558
2550 * IPython/Shell.py (MatplotlibShellBase.use): Added a wrapper to
2559 * IPython/Shell.py (MatplotlibShellBase.use): Added a wrapper to
2551 matplotlib.use to prevent running scripts which try to switch
2560 matplotlib.use to prevent running scripts which try to switch
2552 interactive backends from within ipython. This will just crash
2561 interactive backends from within ipython. This will just crash
2553 the python interpreter, so we can't allow it (but a detailed error
2562 the python interpreter, so we can't allow it (but a detailed error
2554 is given to the user).
2563 is given to the user).
2555
2564
2556 2004-09-28 Fernando Perez <fperez@colorado.edu>
2565 2004-09-28 Fernando Perez <fperez@colorado.edu>
2557
2566
2558 * IPython/Shell.py (MatplotlibShellBase.mplot_exec):
2567 * IPython/Shell.py (MatplotlibShellBase.mplot_exec):
2559 matplotlib-related fixes so that using @run with non-matplotlib
2568 matplotlib-related fixes so that using @run with non-matplotlib
2560 scripts doesn't pop up spurious plot windows. This requires
2569 scripts doesn't pop up spurious plot windows. This requires
2561 matplotlib >= 0.63, where I had to make some changes as well.
2570 matplotlib >= 0.63, where I had to make some changes as well.
2562
2571
2563 * IPython/ipmaker.py (make_IPython): update version requirement to
2572 * IPython/ipmaker.py (make_IPython): update version requirement to
2564 python 2.2.
2573 python 2.2.
2565
2574
2566 * IPython/iplib.py (InteractiveShell.mainloop): Add an optional
2575 * IPython/iplib.py (InteractiveShell.mainloop): Add an optional
2567 banner arg for embedded customization.
2576 banner arg for embedded customization.
2568
2577
2569 * IPython/Magic.py (Magic.__init__): big cleanup to remove all
2578 * IPython/Magic.py (Magic.__init__): big cleanup to remove all
2570 explicit uses of __IP as the IPython's instance name. Now things
2579 explicit uses of __IP as the IPython's instance name. Now things
2571 are properly handled via the shell.name value. The actual code
2580 are properly handled via the shell.name value. The actual code
2572 is a bit ugly b/c I'm doing it via a global in Magic.py, but this
2581 is a bit ugly b/c I'm doing it via a global in Magic.py, but this
2573 is much better than before. I'll clean things completely when the
2582 is much better than before. I'll clean things completely when the
2574 magic stuff gets a real overhaul.
2583 magic stuff gets a real overhaul.
2575
2584
2576 * ipython.1: small fixes, sent in by Jack Moffit. He also sent in
2585 * ipython.1: small fixes, sent in by Jack Moffit. He also sent in
2577 minor changes to debian dir.
2586 minor changes to debian dir.
2578
2587
2579 * IPython/iplib.py (InteractiveShell.__init__): Fix adding a
2588 * IPython/iplib.py (InteractiveShell.__init__): Fix adding a
2580 pointer to the shell itself in the interactive namespace even when
2589 pointer to the shell itself in the interactive namespace even when
2581 a user-supplied dict is provided. This is needed for embedding
2590 a user-supplied dict is provided. This is needed for embedding
2582 purposes (found by tests with Michel Sanner).
2591 purposes (found by tests with Michel Sanner).
2583
2592
2584 2004-09-27 Fernando Perez <fperez@colorado.edu>
2593 2004-09-27 Fernando Perez <fperez@colorado.edu>
2585
2594
2586 * IPython/UserConfig/ipythonrc: remove []{} from
2595 * IPython/UserConfig/ipythonrc: remove []{} from
2587 readline_remove_delims, so that things like [modname.<TAB> do
2596 readline_remove_delims, so that things like [modname.<TAB> do
2588 proper completion. This disables [].TAB, but that's a less common
2597 proper completion. This disables [].TAB, but that's a less common
2589 case than module names in list comprehensions, for example.
2598 case than module names in list comprehensions, for example.
2590 Thanks to a report by Andrea Riciputi.
2599 Thanks to a report by Andrea Riciputi.
2591
2600
2592 2004-09-09 Fernando Perez <fperez@colorado.edu>
2601 2004-09-09 Fernando Perez <fperez@colorado.edu>
2593
2602
2594 * IPython/Shell.py (IPShellGTK.mainloop): reorder to avoid
2603 * IPython/Shell.py (IPShellGTK.mainloop): reorder to avoid
2595 blocking problems in win32 and osx. Fix by John.
2604 blocking problems in win32 and osx. Fix by John.
2596
2605
2597 2004-09-08 Fernando Perez <fperez@colorado.edu>
2606 2004-09-08 Fernando Perez <fperez@colorado.edu>
2598
2607
2599 * IPython/Shell.py (IPShellWX.OnInit): Fix output redirection bug
2608 * IPython/Shell.py (IPShellWX.OnInit): Fix output redirection bug
2600 for Win32 and OSX. Fix by John Hunter.
2609 for Win32 and OSX. Fix by John Hunter.
2601
2610
2602 2004-08-30 *** Released version 0.6.3
2611 2004-08-30 *** Released version 0.6.3
2603
2612
2604 2004-08-30 Fernando Perez <fperez@colorado.edu>
2613 2004-08-30 Fernando Perez <fperez@colorado.edu>
2605
2614
2606 * setup.py (isfile): Add manpages to list of dependent files to be
2615 * setup.py (isfile): Add manpages to list of dependent files to be
2607 updated.
2616 updated.
2608
2617
2609 2004-08-27 Fernando Perez <fperez@colorado.edu>
2618 2004-08-27 Fernando Perez <fperez@colorado.edu>
2610
2619
2611 * IPython/Shell.py (start): I've disabled -wthread and -gthread
2620 * IPython/Shell.py (start): I've disabled -wthread and -gthread
2612 for now. They don't really work with standalone WX/GTK code
2621 for now. They don't really work with standalone WX/GTK code
2613 (though matplotlib IS working fine with both of those backends).
2622 (though matplotlib IS working fine with both of those backends).
2614 This will neeed much more testing. I disabled most things with
2623 This will neeed much more testing. I disabled most things with
2615 comments, so turning it back on later should be pretty easy.
2624 comments, so turning it back on later should be pretty easy.
2616
2625
2617 * IPython/iplib.py (InteractiveShell.__init__): Fix accidental
2626 * IPython/iplib.py (InteractiveShell.__init__): Fix accidental
2618 autocalling of expressions like r'foo', by modifying the line
2627 autocalling of expressions like r'foo', by modifying the line
2619 split regexp. Closes
2628 split regexp. Closes
2620 http://www.scipy.net/roundup/ipython/issue18, reported by Nicholas
2629 http://www.scipy.net/roundup/ipython/issue18, reported by Nicholas
2621 Riley <ipythonbugs-AT-sabi.net>.
2630 Riley <ipythonbugs-AT-sabi.net>.
2622 (InteractiveShell.mainloop): honor --nobanner with banner
2631 (InteractiveShell.mainloop): honor --nobanner with banner
2623 extensions.
2632 extensions.
2624
2633
2625 * IPython/Shell.py: Significant refactoring of all classes, so
2634 * IPython/Shell.py: Significant refactoring of all classes, so
2626 that we can really support ALL matplotlib backends and threading
2635 that we can really support ALL matplotlib backends and threading
2627 models (John spotted a bug with Tk which required this). Now we
2636 models (John spotted a bug with Tk which required this). Now we
2628 should support single-threaded, WX-threads and GTK-threads, both
2637 should support single-threaded, WX-threads and GTK-threads, both
2629 for generic code and for matplotlib.
2638 for generic code and for matplotlib.
2630
2639
2631 * IPython/ipmaker.py (__call__): Changed -mpthread option to
2640 * IPython/ipmaker.py (__call__): Changed -mpthread option to
2632 -pylab, to simplify things for users. Will also remove the pylab
2641 -pylab, to simplify things for users. Will also remove the pylab
2633 profile, since now all of matplotlib configuration is directly
2642 profile, since now all of matplotlib configuration is directly
2634 handled here. This also reduces startup time.
2643 handled here. This also reduces startup time.
2635
2644
2636 * IPython/Shell.py (IPShellGTK.run): Fixed bug where mainloop() of
2645 * IPython/Shell.py (IPShellGTK.run): Fixed bug where mainloop() of
2637 shell wasn't being correctly called. Also in IPShellWX.
2646 shell wasn't being correctly called. Also in IPShellWX.
2638
2647
2639 * IPython/iplib.py (InteractiveShell.__init__): Added option to
2648 * IPython/iplib.py (InteractiveShell.__init__): Added option to
2640 fine-tune banner.
2649 fine-tune banner.
2641
2650
2642 * IPython/numutils.py (spike): Deprecate these spike functions,
2651 * IPython/numutils.py (spike): Deprecate these spike functions,
2643 delete (long deprecated) gnuplot_exec handler.
2652 delete (long deprecated) gnuplot_exec handler.
2644
2653
2645 2004-08-26 Fernando Perez <fperez@colorado.edu>
2654 2004-08-26 Fernando Perez <fperez@colorado.edu>
2646
2655
2647 * ipython.1: Update for threading options, plus some others which
2656 * ipython.1: Update for threading options, plus some others which
2648 were missing.
2657 were missing.
2649
2658
2650 * IPython/ipmaker.py (__call__): Added -wthread option for
2659 * IPython/ipmaker.py (__call__): Added -wthread option for
2651 wxpython thread handling. Make sure threading options are only
2660 wxpython thread handling. Make sure threading options are only
2652 valid at the command line.
2661 valid at the command line.
2653
2662
2654 * scripts/ipython: moved shell selection into a factory function
2663 * scripts/ipython: moved shell selection into a factory function
2655 in Shell.py, to keep the starter script to a minimum.
2664 in Shell.py, to keep the starter script to a minimum.
2656
2665
2657 2004-08-25 Fernando Perez <fperez@colorado.edu>
2666 2004-08-25 Fernando Perez <fperez@colorado.edu>
2658
2667
2659 * IPython/Shell.py (IPShellWX.wxexit): fixes to WX threading, by
2668 * IPython/Shell.py (IPShellWX.wxexit): fixes to WX threading, by
2660 John. Along with some recent changes he made to matplotlib, the
2669 John. Along with some recent changes he made to matplotlib, the
2661 next versions of both systems should work very well together.
2670 next versions of both systems should work very well together.
2662
2671
2663 2004-08-24 Fernando Perez <fperez@colorado.edu>
2672 2004-08-24 Fernando Perez <fperez@colorado.edu>
2664
2673
2665 * IPython/Magic.py (Magic.magic_prun): cleanup some dead code. I
2674 * IPython/Magic.py (Magic.magic_prun): cleanup some dead code. I
2666 tried to switch the profiling to using hotshot, but I'm getting
2675 tried to switch the profiling to using hotshot, but I'm getting
2667 strange errors from prof.runctx() there. I may be misreading the
2676 strange errors from prof.runctx() there. I may be misreading the
2668 docs, but it looks weird. For now the profiling code will
2677 docs, but it looks weird. For now the profiling code will
2669 continue to use the standard profiler.
2678 continue to use the standard profiler.
2670
2679
2671 2004-08-23 Fernando Perez <fperez@colorado.edu>
2680 2004-08-23 Fernando Perez <fperez@colorado.edu>
2672
2681
2673 * IPython/Shell.py (IPShellWX.__init__): Improvements to the WX
2682 * IPython/Shell.py (IPShellWX.__init__): Improvements to the WX
2674 threaded shell, by John Hunter. It's not quite ready yet, but
2683 threaded shell, by John Hunter. It's not quite ready yet, but
2675 close.
2684 close.
2676
2685
2677 2004-08-22 Fernando Perez <fperez@colorado.edu>
2686 2004-08-22 Fernando Perez <fperez@colorado.edu>
2678
2687
2679 * IPython/iplib.py (InteractiveShell.interact): tab cleanups, also
2688 * IPython/iplib.py (InteractiveShell.interact): tab cleanups, also
2680 in Magic and ultraTB.
2689 in Magic and ultraTB.
2681
2690
2682 * ipython.1: document threading options in manpage.
2691 * ipython.1: document threading options in manpage.
2683
2692
2684 * scripts/ipython: Changed name of -thread option to -gthread,
2693 * scripts/ipython: Changed name of -thread option to -gthread,
2685 since this is GTK specific. I want to leave the door open for a
2694 since this is GTK specific. I want to leave the door open for a
2686 -wthread option for WX, which will most likely be necessary. This
2695 -wthread option for WX, which will most likely be necessary. This
2687 change affects usage and ipmaker as well.
2696 change affects usage and ipmaker as well.
2688
2697
2689 * IPython/Shell.py (matplotlib_shell): Add a factory function to
2698 * IPython/Shell.py (matplotlib_shell): Add a factory function to
2690 handle the matplotlib shell issues. Code by John Hunter
2699 handle the matplotlib shell issues. Code by John Hunter
2691 <jdhunter-AT-nitace.bsd.uchicago.edu>.
2700 <jdhunter-AT-nitace.bsd.uchicago.edu>.
2692 (IPShellMatplotlibWX.__init__): Rudimentary WX support. It's
2701 (IPShellMatplotlibWX.__init__): Rudimentary WX support. It's
2693 broken (and disabled for end users) for now, but it puts the
2702 broken (and disabled for end users) for now, but it puts the
2694 infrastructure in place.
2703 infrastructure in place.
2695
2704
2696 2004-08-21 Fernando Perez <fperez@colorado.edu>
2705 2004-08-21 Fernando Perez <fperez@colorado.edu>
2697
2706
2698 * ipythonrc-pylab: Add matplotlib support.
2707 * ipythonrc-pylab: Add matplotlib support.
2699
2708
2700 * matplotlib_config.py: new files for matplotlib support, part of
2709 * matplotlib_config.py: new files for matplotlib support, part of
2701 the pylab profile.
2710 the pylab profile.
2702
2711
2703 * IPython/usage.py (__doc__): documented the threading options.
2712 * IPython/usage.py (__doc__): documented the threading options.
2704
2713
2705 2004-08-20 Fernando Perez <fperez@colorado.edu>
2714 2004-08-20 Fernando Perez <fperez@colorado.edu>
2706
2715
2707 * ipython: Modified the main calling routine to handle the -thread
2716 * ipython: Modified the main calling routine to handle the -thread
2708 and -mpthread options. This needs to be done as a top-level hack,
2717 and -mpthread options. This needs to be done as a top-level hack,
2709 because it determines which class to instantiate for IPython
2718 because it determines which class to instantiate for IPython
2710 itself.
2719 itself.
2711
2720
2712 * IPython/Shell.py (MTInteractiveShell.__init__): New set of
2721 * IPython/Shell.py (MTInteractiveShell.__init__): New set of
2713 classes to support multithreaded GTK operation without blocking,
2722 classes to support multithreaded GTK operation without blocking,
2714 and matplotlib with all backends. This is a lot of still very
2723 and matplotlib with all backends. This is a lot of still very
2715 experimental code, and threads are tricky. So it may still have a
2724 experimental code, and threads are tricky. So it may still have a
2716 few rough edges... This code owes a lot to
2725 few rough edges... This code owes a lot to
2717 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65109, by
2726 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65109, by
2718 Brian # McErlean and John Finlay, to Antoon Pardon for fixes, and
2727 Brian # McErlean and John Finlay, to Antoon Pardon for fixes, and
2719 to John Hunter for all the matplotlib work.
2728 to John Hunter for all the matplotlib work.
2720
2729
2721 * IPython/ipmaker.py (__call__): Added -thread and -mpthread
2730 * IPython/ipmaker.py (__call__): Added -thread and -mpthread
2722 options for gtk thread and matplotlib support.
2731 options for gtk thread and matplotlib support.
2723
2732
2724 2004-08-16 Fernando Perez <fperez@colorado.edu>
2733 2004-08-16 Fernando Perez <fperez@colorado.edu>
2725
2734
2726 * IPython/iplib.py (InteractiveShell.__init__): don't trigger
2735 * IPython/iplib.py (InteractiveShell.__init__): don't trigger
2727 autocall for things like p*q,p/q,p+q,p-q, when p is callable. Bug
2736 autocall for things like p*q,p/q,p+q,p-q, when p is callable. Bug
2728 reported by Stephen Walton <stephen.walton-AT-csun.edu>.
2737 reported by Stephen Walton <stephen.walton-AT-csun.edu>.
2729
2738
2730 2004-08-11 Fernando Perez <fperez@colorado.edu>
2739 2004-08-11 Fernando Perez <fperez@colorado.edu>
2731
2740
2732 * setup.py (isfile): Fix build so documentation gets updated for
2741 * setup.py (isfile): Fix build so documentation gets updated for
2733 rpms (it was only done for .tgz builds).
2742 rpms (it was only done for .tgz builds).
2734
2743
2735 2004-08-10 Fernando Perez <fperez@colorado.edu>
2744 2004-08-10 Fernando Perez <fperez@colorado.edu>
2736
2745
2737 * genutils.py (Term): Fix misspell of stdin stream (sin->cin).
2746 * genutils.py (Term): Fix misspell of stdin stream (sin->cin).
2738
2747
2739 * iplib.py : Silence syntax error exceptions in tab-completion.
2748 * iplib.py : Silence syntax error exceptions in tab-completion.
2740
2749
2741 2004-08-05 Fernando Perez <fperez@colorado.edu>
2750 2004-08-05 Fernando Perez <fperez@colorado.edu>
2742
2751
2743 * IPython/Prompts.py (Prompt2.set_colors): Fix incorrectly set
2752 * IPython/Prompts.py (Prompt2.set_colors): Fix incorrectly set
2744 'color off' mark for continuation prompts. This was causing long
2753 'color off' mark for continuation prompts. This was causing long
2745 continuation lines to mis-wrap.
2754 continuation lines to mis-wrap.
2746
2755
2747 2004-08-01 Fernando Perez <fperez@colorado.edu>
2756 2004-08-01 Fernando Perez <fperez@colorado.edu>
2748
2757
2749 * IPython/ipmaker.py (make_IPython): Allow the shell class used
2758 * IPython/ipmaker.py (make_IPython): Allow the shell class used
2750 for building ipython to be a parameter. All this is necessary
2759 for building ipython to be a parameter. All this is necessary
2751 right now to have a multithreaded version, but this insane
2760 right now to have a multithreaded version, but this insane
2752 non-design will be cleaned up soon. For now, it's a hack that
2761 non-design will be cleaned up soon. For now, it's a hack that
2753 works.
2762 works.
2754
2763
2755 * IPython/Shell.py (IPShell.__init__): Stop using mutable default
2764 * IPython/Shell.py (IPShell.__init__): Stop using mutable default
2756 args in various places. No bugs so far, but it's a dangerous
2765 args in various places. No bugs so far, but it's a dangerous
2757 practice.
2766 practice.
2758
2767
2759 2004-07-31 Fernando Perez <fperez@colorado.edu>
2768 2004-07-31 Fernando Perez <fperez@colorado.edu>
2760
2769
2761 * IPython/iplib.py (complete): ignore SyntaxError exceptions to
2770 * IPython/iplib.py (complete): ignore SyntaxError exceptions to
2762 fix completion of files with dots in their names under most
2771 fix completion of files with dots in their names under most
2763 profiles (pysh was OK because the completion order is different).
2772 profiles (pysh was OK because the completion order is different).
2764
2773
2765 2004-07-27 Fernando Perez <fperez@colorado.edu>
2774 2004-07-27 Fernando Perez <fperez@colorado.edu>
2766
2775
2767 * IPython/iplib.py (InteractiveShell.__init__): build dict of
2776 * IPython/iplib.py (InteractiveShell.__init__): build dict of
2768 keywords manually, b/c the one in keyword.py was removed in python
2777 keywords manually, b/c the one in keyword.py was removed in python
2769 2.4. Patch by Anakim Border <aborder-AT-users.sourceforge.net>.
2778 2.4. Patch by Anakim Border <aborder-AT-users.sourceforge.net>.
2770 This is NOT a bug under python 2.3 and earlier.
2779 This is NOT a bug under python 2.3 and earlier.
2771
2780
2772 2004-07-26 Fernando Perez <fperez@colorado.edu>
2781 2004-07-26 Fernando Perez <fperez@colorado.edu>
2773
2782
2774 * IPython/ultraTB.py (VerboseTB.text): Add another
2783 * IPython/ultraTB.py (VerboseTB.text): Add another
2775 linecache.checkcache() call to try to prevent inspect.py from
2784 linecache.checkcache() call to try to prevent inspect.py from
2776 crashing under python 2.3. I think this fixes
2785 crashing under python 2.3. I think this fixes
2777 http://www.scipy.net/roundup/ipython/issue17.
2786 http://www.scipy.net/roundup/ipython/issue17.
2778
2787
2779 2004-07-26 *** Released version 0.6.2
2788 2004-07-26 *** Released version 0.6.2
2780
2789
2781 2004-07-26 Fernando Perez <fperez@colorado.edu>
2790 2004-07-26 Fernando Perez <fperez@colorado.edu>
2782
2791
2783 * IPython/Magic.py (Magic.magic_cd): Fix bug where 'cd -N' would
2792 * IPython/Magic.py (Magic.magic_cd): Fix bug where 'cd -N' would
2784 fail for any number.
2793 fail for any number.
2785 (Magic.magic_bookmark): Fix bug where 'bookmark -l' would fail for
2794 (Magic.magic_bookmark): Fix bug where 'bookmark -l' would fail for
2786 empty bookmarks.
2795 empty bookmarks.
2787
2796
2788 2004-07-26 *** Released version 0.6.1
2797 2004-07-26 *** Released version 0.6.1
2789
2798
2790 2004-07-26 Fernando Perez <fperez@colorado.edu>
2799 2004-07-26 Fernando Perez <fperez@colorado.edu>
2791
2800
2792 * ipython_win_post_install.py (run): Added pysh shortcut for Windows.
2801 * ipython_win_post_install.py (run): Added pysh shortcut for Windows.
2793
2802
2794 * IPython/iplib.py (protect_filename): Applied Ville's patch for
2803 * IPython/iplib.py (protect_filename): Applied Ville's patch for
2795 escaping '()[]{}' in filenames.
2804 escaping '()[]{}' in filenames.
2796
2805
2797 * IPython/Magic.py (shlex_split): Fix handling of '*' and '?' for
2806 * IPython/Magic.py (shlex_split): Fix handling of '*' and '?' for
2798 Python 2.2 users who lack a proper shlex.split.
2807 Python 2.2 users who lack a proper shlex.split.
2799
2808
2800 2004-07-19 Fernando Perez <fperez@colorado.edu>
2809 2004-07-19 Fernando Perez <fperez@colorado.edu>
2801
2810
2802 * IPython/iplib.py (InteractiveShell.init_readline): Add support
2811 * IPython/iplib.py (InteractiveShell.init_readline): Add support
2803 for reading readline's init file. I follow the normal chain:
2812 for reading readline's init file. I follow the normal chain:
2804 $INPUTRC is honored, otherwise ~/.inputrc is used. Thanks to a
2813 $INPUTRC is honored, otherwise ~/.inputrc is used. Thanks to a
2805 report by Mike Heeter. This closes
2814 report by Mike Heeter. This closes
2806 http://www.scipy.net/roundup/ipython/issue16.
2815 http://www.scipy.net/roundup/ipython/issue16.
2807
2816
2808 2004-07-18 Fernando Perez <fperez@colorado.edu>
2817 2004-07-18 Fernando Perez <fperez@colorado.edu>
2809
2818
2810 * IPython/iplib.py (__init__): Add better handling of '\' under
2819 * IPython/iplib.py (__init__): Add better handling of '\' under
2811 Win32 for filenames. After a patch by Ville.
2820 Win32 for filenames. After a patch by Ville.
2812
2821
2813 2004-07-17 Fernando Perez <fperez@colorado.edu>
2822 2004-07-17 Fernando Perez <fperez@colorado.edu>
2814
2823
2815 * IPython/iplib.py (InteractiveShell._prefilter): fix bug where
2824 * IPython/iplib.py (InteractiveShell._prefilter): fix bug where
2816 autocalling would be triggered for 'foo is bar' if foo is
2825 autocalling would be triggered for 'foo is bar' if foo is
2817 callable. I also cleaned up the autocall detection code to use a
2826 callable. I also cleaned up the autocall detection code to use a
2818 regexp, which is faster. Bug reported by Alexander Schmolck.
2827 regexp, which is faster. Bug reported by Alexander Schmolck.
2819
2828
2820 * IPython/Magic.py (Magic.magic_pinfo): Fix bug where strings with
2829 * IPython/Magic.py (Magic.magic_pinfo): Fix bug where strings with
2821 '?' in them would confuse the help system. Reported by Alex
2830 '?' in them would confuse the help system. Reported by Alex
2822 Schmolck.
2831 Schmolck.
2823
2832
2824 2004-07-16 Fernando Perez <fperez@colorado.edu>
2833 2004-07-16 Fernando Perez <fperez@colorado.edu>
2825
2834
2826 * IPython/GnuplotInteractive.py (__all__): added plot2.
2835 * IPython/GnuplotInteractive.py (__all__): added plot2.
2827
2836
2828 * IPython/Gnuplot2.py (Gnuplot.plot2): added new function for
2837 * IPython/Gnuplot2.py (Gnuplot.plot2): added new function for
2829 plotting dictionaries, lists or tuples of 1d arrays.
2838 plotting dictionaries, lists or tuples of 1d arrays.
2830
2839
2831 * IPython/Magic.py (Magic.magic_hist): small clenaups and
2840 * IPython/Magic.py (Magic.magic_hist): small clenaups and
2832 optimizations.
2841 optimizations.
2833
2842
2834 * IPython/iplib.py:Remove old Changelog info for cleanup. This is
2843 * IPython/iplib.py:Remove old Changelog info for cleanup. This is
2835 the information which was there from Janko's original IPP code:
2844 the information which was there from Janko's original IPP code:
2836
2845
2837 03.05.99 20:53 porto.ifm.uni-kiel.de
2846 03.05.99 20:53 porto.ifm.uni-kiel.de
2838 --Started changelog.
2847 --Started changelog.
2839 --make clear do what it say it does
2848 --make clear do what it say it does
2840 --added pretty output of lines from inputcache
2849 --added pretty output of lines from inputcache
2841 --Made Logger a mixin class, simplifies handling of switches
2850 --Made Logger a mixin class, simplifies handling of switches
2842 --Added own completer class. .string<TAB> expands to last history
2851 --Added own completer class. .string<TAB> expands to last history
2843 line which starts with string. The new expansion is also present
2852 line which starts with string. The new expansion is also present
2844 with Ctrl-r from the readline library. But this shows, who this
2853 with Ctrl-r from the readline library. But this shows, who this
2845 can be done for other cases.
2854 can be done for other cases.
2846 --Added convention that all shell functions should accept a
2855 --Added convention that all shell functions should accept a
2847 parameter_string This opens the door for different behaviour for
2856 parameter_string This opens the door for different behaviour for
2848 each function. @cd is a good example of this.
2857 each function. @cd is a good example of this.
2849
2858
2850 04.05.99 12:12 porto.ifm.uni-kiel.de
2859 04.05.99 12:12 porto.ifm.uni-kiel.de
2851 --added logfile rotation
2860 --added logfile rotation
2852 --added new mainloop method which freezes first the namespace
2861 --added new mainloop method which freezes first the namespace
2853
2862
2854 07.05.99 21:24 porto.ifm.uni-kiel.de
2863 07.05.99 21:24 porto.ifm.uni-kiel.de
2855 --added the docreader classes. Now there is a help system.
2864 --added the docreader classes. Now there is a help system.
2856 -This is only a first try. Currently it's not easy to put new
2865 -This is only a first try. Currently it's not easy to put new
2857 stuff in the indices. But this is the way to go. Info would be
2866 stuff in the indices. But this is the way to go. Info would be
2858 better, but HTML is every where and not everybody has an info
2867 better, but HTML is every where and not everybody has an info
2859 system installed and it's not so easy to change html-docs to info.
2868 system installed and it's not so easy to change html-docs to info.
2860 --added global logfile option
2869 --added global logfile option
2861 --there is now a hook for object inspection method pinfo needs to
2870 --there is now a hook for object inspection method pinfo needs to
2862 be provided for this. Can be reached by two '??'.
2871 be provided for this. Can be reached by two '??'.
2863
2872
2864 08.05.99 20:51 porto.ifm.uni-kiel.de
2873 08.05.99 20:51 porto.ifm.uni-kiel.de
2865 --added a README
2874 --added a README
2866 --bug in rc file. Something has changed so functions in the rc
2875 --bug in rc file. Something has changed so functions in the rc
2867 file need to reference the shell and not self. Not clear if it's a
2876 file need to reference the shell and not self. Not clear if it's a
2868 bug or feature.
2877 bug or feature.
2869 --changed rc file for new behavior
2878 --changed rc file for new behavior
2870
2879
2871 2004-07-15 Fernando Perez <fperez@colorado.edu>
2880 2004-07-15 Fernando Perez <fperez@colorado.edu>
2872
2881
2873 * IPython/Logger.py (Logger.log): fixed recent bug where the input
2882 * IPython/Logger.py (Logger.log): fixed recent bug where the input
2874 cache was falling out of sync in bizarre manners when multi-line
2883 cache was falling out of sync in bizarre manners when multi-line
2875 input was present. Minor optimizations and cleanup.
2884 input was present. Minor optimizations and cleanup.
2876
2885
2877 (Logger): Remove old Changelog info for cleanup. This is the
2886 (Logger): Remove old Changelog info for cleanup. This is the
2878 information which was there from Janko's original code:
2887 information which was there from Janko's original code:
2879
2888
2880 Changes to Logger: - made the default log filename a parameter
2889 Changes to Logger: - made the default log filename a parameter
2881
2890
2882 - put a check for lines beginning with !@? in log(). Needed
2891 - put a check for lines beginning with !@? in log(). Needed
2883 (even if the handlers properly log their lines) for mid-session
2892 (even if the handlers properly log their lines) for mid-session
2884 logging activation to work properly. Without this, lines logged
2893 logging activation to work properly. Without this, lines logged
2885 in mid session, which get read from the cache, would end up
2894 in mid session, which get read from the cache, would end up
2886 'bare' (with !@? in the open) in the log. Now they are caught
2895 'bare' (with !@? in the open) in the log. Now they are caught
2887 and prepended with a #.
2896 and prepended with a #.
2888
2897
2889 * IPython/iplib.py (InteractiveShell.init_readline): added check
2898 * IPython/iplib.py (InteractiveShell.init_readline): added check
2890 in case MagicCompleter fails to be defined, so we don't crash.
2899 in case MagicCompleter fails to be defined, so we don't crash.
2891
2900
2892 2004-07-13 Fernando Perez <fperez@colorado.edu>
2901 2004-07-13 Fernando Perez <fperez@colorado.edu>
2893
2902
2894 * IPython/Gnuplot2.py (Gnuplot.hardcopy): add automatic generation
2903 * IPython/Gnuplot2.py (Gnuplot.hardcopy): add automatic generation
2895 of EPS if the requested filename ends in '.eps'.
2904 of EPS if the requested filename ends in '.eps'.
2896
2905
2897 2004-07-04 Fernando Perez <fperez@colorado.edu>
2906 2004-07-04 Fernando Perez <fperez@colorado.edu>
2898
2907
2899 * IPython/iplib.py (InteractiveShell.handle_shell_escape): Fix
2908 * IPython/iplib.py (InteractiveShell.handle_shell_escape): Fix
2900 escaping of quotes when calling the shell.
2909 escaping of quotes when calling the shell.
2901
2910
2902 2004-07-02 Fernando Perez <fperez@colorado.edu>
2911 2004-07-02 Fernando Perez <fperez@colorado.edu>
2903
2912
2904 * IPython/Prompts.py (CachedOutput.update): Fix problem with
2913 * IPython/Prompts.py (CachedOutput.update): Fix problem with
2905 gettext not working because we were clobbering '_'. Fixes
2914 gettext not working because we were clobbering '_'. Fixes
2906 http://www.scipy.net/roundup/ipython/issue6.
2915 http://www.scipy.net/roundup/ipython/issue6.
2907
2916
2908 2004-07-01 Fernando Perez <fperez@colorado.edu>
2917 2004-07-01 Fernando Perez <fperez@colorado.edu>
2909
2918
2910 * IPython/Magic.py (Magic.magic_cd): integrated bookmark handling
2919 * IPython/Magic.py (Magic.magic_cd): integrated bookmark handling
2911 into @cd. Patch by Ville.
2920 into @cd. Patch by Ville.
2912
2921
2913 * IPython/iplib.py (InteractiveShell.post_config_initialization):
2922 * IPython/iplib.py (InteractiveShell.post_config_initialization):
2914 new function to store things after ipmaker runs. Patch by Ville.
2923 new function to store things after ipmaker runs. Patch by Ville.
2915 Eventually this will go away once ipmaker is removed and the class
2924 Eventually this will go away once ipmaker is removed and the class
2916 gets cleaned up, but for now it's ok. Key functionality here is
2925 gets cleaned up, but for now it's ok. Key functionality here is
2917 the addition of the persistent storage mechanism, a dict for
2926 the addition of the persistent storage mechanism, a dict for
2918 keeping data across sessions (for now just bookmarks, but more can
2927 keeping data across sessions (for now just bookmarks, but more can
2919 be implemented later).
2928 be implemented later).
2920
2929
2921 * IPython/Magic.py (Magic.magic_bookmark): New bookmark system,
2930 * IPython/Magic.py (Magic.magic_bookmark): New bookmark system,
2922 persistent across sections. Patch by Ville, I modified it
2931 persistent across sections. Patch by Ville, I modified it
2923 soemwhat to allow bookmarking arbitrary dirs other than CWD. Also
2932 soemwhat to allow bookmarking arbitrary dirs other than CWD. Also
2924 added a '-l' option to list all bookmarks.
2933 added a '-l' option to list all bookmarks.
2925
2934
2926 * IPython/iplib.py (InteractiveShell.atexit_operations): new
2935 * IPython/iplib.py (InteractiveShell.atexit_operations): new
2927 center for cleanup. Registered with atexit.register(). I moved
2936 center for cleanup. Registered with atexit.register(). I moved
2928 here the old exit_cleanup(). After a patch by Ville.
2937 here the old exit_cleanup(). After a patch by Ville.
2929
2938
2930 * IPython/Magic.py (get_py_filename): added '~' to the accepted
2939 * IPython/Magic.py (get_py_filename): added '~' to the accepted
2931 characters in the hacked shlex_split for python 2.2.
2940 characters in the hacked shlex_split for python 2.2.
2932
2941
2933 * IPython/iplib.py (file_matches): more fixes to filenames with
2942 * IPython/iplib.py (file_matches): more fixes to filenames with
2934 whitespace in them. It's not perfect, but limitations in python's
2943 whitespace in them. It's not perfect, but limitations in python's
2935 readline make it impossible to go further.
2944 readline make it impossible to go further.
2936
2945
2937 2004-06-29 Fernando Perez <fperez@colorado.edu>
2946 2004-06-29 Fernando Perez <fperez@colorado.edu>
2938
2947
2939 * IPython/iplib.py (file_matches): escape whitespace correctly in
2948 * IPython/iplib.py (file_matches): escape whitespace correctly in
2940 filename completions. Bug reported by Ville.
2949 filename completions. Bug reported by Ville.
2941
2950
2942 2004-06-28 Fernando Perez <fperez@colorado.edu>
2951 2004-06-28 Fernando Perez <fperez@colorado.edu>
2943
2952
2944 * IPython/ipmaker.py (__call__): Added per-profile histories. Now
2953 * IPython/ipmaker.py (__call__): Added per-profile histories. Now
2945 the history file will be called 'history-PROFNAME' (or just
2954 the history file will be called 'history-PROFNAME' (or just
2946 'history' if no profile is loaded). I was getting annoyed at
2955 'history' if no profile is loaded). I was getting annoyed at
2947 getting my Numerical work history clobbered by pysh sessions.
2956 getting my Numerical work history clobbered by pysh sessions.
2948
2957
2949 * IPython/iplib.py (InteractiveShell.__init__): Internal
2958 * IPython/iplib.py (InteractiveShell.__init__): Internal
2950 getoutputerror() function so that we can honor the system_verbose
2959 getoutputerror() function so that we can honor the system_verbose
2951 flag for _all_ system calls. I also added escaping of #
2960 flag for _all_ system calls. I also added escaping of #
2952 characters here to avoid confusing Itpl.
2961 characters here to avoid confusing Itpl.
2953
2962
2954 * IPython/Magic.py (shlex_split): removed call to shell in
2963 * IPython/Magic.py (shlex_split): removed call to shell in
2955 parse_options and replaced it with shlex.split(). The annoying
2964 parse_options and replaced it with shlex.split(). The annoying
2956 part was that in Python 2.2, shlex.split() doesn't exist, so I had
2965 part was that in Python 2.2, shlex.split() doesn't exist, so I had
2957 to backport it from 2.3, with several frail hacks (the shlex
2966 to backport it from 2.3, with several frail hacks (the shlex
2958 module is rather limited in 2.2). Thanks to a suggestion by Ville
2967 module is rather limited in 2.2). Thanks to a suggestion by Ville
2959 Vainio <vivainio@kolumbus.fi>. For Python 2.3 there should be no
2968 Vainio <vivainio@kolumbus.fi>. For Python 2.3 there should be no
2960 problem.
2969 problem.
2961
2970
2962 (Magic.magic_system_verbose): new toggle to print the actual
2971 (Magic.magic_system_verbose): new toggle to print the actual
2963 system calls made by ipython. Mainly for debugging purposes.
2972 system calls made by ipython. Mainly for debugging purposes.
2964
2973
2965 * IPython/GnuplotRuntime.py (gnu_out): fix bug for cygwin, which
2974 * IPython/GnuplotRuntime.py (gnu_out): fix bug for cygwin, which
2966 doesn't support persistence. Reported (and fix suggested) by
2975 doesn't support persistence. Reported (and fix suggested) by
2967 Travis Caldwell <travis_caldwell2000@yahoo.com>.
2976 Travis Caldwell <travis_caldwell2000@yahoo.com>.
2968
2977
2969 2004-06-26 Fernando Perez <fperez@colorado.edu>
2978 2004-06-26 Fernando Perez <fperez@colorado.edu>
2970
2979
2971 * IPython/Logger.py (Logger.log): fix to handle correctly empty
2980 * IPython/Logger.py (Logger.log): fix to handle correctly empty
2972 continue prompts.
2981 continue prompts.
2973
2982
2974 * IPython/Extensions/InterpreterExec.py (pysh): moved the pysh()
2983 * IPython/Extensions/InterpreterExec.py (pysh): moved the pysh()
2975 function (basically a big docstring) and a few more things here to
2984 function (basically a big docstring) and a few more things here to
2976 speedup startup. pysh.py is now very lightweight. We want because
2985 speedup startup. pysh.py is now very lightweight. We want because
2977 it gets execfile'd, while InterpreterExec gets imported, so
2986 it gets execfile'd, while InterpreterExec gets imported, so
2978 byte-compilation saves time.
2987 byte-compilation saves time.
2979
2988
2980 2004-06-25 Fernando Perez <fperez@colorado.edu>
2989 2004-06-25 Fernando Perez <fperez@colorado.edu>
2981
2990
2982 * IPython/Magic.py (Magic.magic_cd): Fixed to restore usage of 'cd
2991 * IPython/Magic.py (Magic.magic_cd): Fixed to restore usage of 'cd
2983 -NUM', which was recently broken.
2992 -NUM', which was recently broken.
2984
2993
2985 * IPython/iplib.py (InteractiveShell.handle_shell_escape): allow !
2994 * IPython/iplib.py (InteractiveShell.handle_shell_escape): allow !
2986 in multi-line input (but not !!, which doesn't make sense there).
2995 in multi-line input (but not !!, which doesn't make sense there).
2987
2996
2988 * IPython/UserConfig/ipythonrc: made autoindent on by default.
2997 * IPython/UserConfig/ipythonrc: made autoindent on by default.
2989 It's just too useful, and people can turn it off in the less
2998 It's just too useful, and people can turn it off in the less
2990 common cases where it's a problem.
2999 common cases where it's a problem.
2991
3000
2992 2004-06-24 Fernando Perez <fperez@colorado.edu>
3001 2004-06-24 Fernando Perez <fperez@colorado.edu>
2993
3002
2994 * IPython/iplib.py (InteractiveShell._prefilter): big change -
3003 * IPython/iplib.py (InteractiveShell._prefilter): big change -
2995 special syntaxes (like alias calling) is now allied in multi-line
3004 special syntaxes (like alias calling) is now allied in multi-line
2996 input. This is still _very_ experimental, but it's necessary for
3005 input. This is still _very_ experimental, but it's necessary for
2997 efficient shell usage combining python looping syntax with system
3006 efficient shell usage combining python looping syntax with system
2998 calls. For now it's restricted to aliases, I don't think it
3007 calls. For now it's restricted to aliases, I don't think it
2999 really even makes sense to have this for magics.
3008 really even makes sense to have this for magics.
3000
3009
3001 2004-06-23 Fernando Perez <fperez@colorado.edu>
3010 2004-06-23 Fernando Perez <fperez@colorado.edu>
3002
3011
3003 * IPython/Extensions/InterpreterExec.py (prefilter_shell): Added
3012 * IPython/Extensions/InterpreterExec.py (prefilter_shell): Added
3004 $var=cmd <=> @sc var=cmd and $$var=cmd <=> @sc -l var=cmd.
3013 $var=cmd <=> @sc var=cmd and $$var=cmd <=> @sc -l var=cmd.
3005
3014
3006 * IPython/Magic.py (Magic.magic_rehashx): modified to handle
3015 * IPython/Magic.py (Magic.magic_rehashx): modified to handle
3007 extensions under Windows (after code sent by Gary Bishop). The
3016 extensions under Windows (after code sent by Gary Bishop). The
3008 extensions considered 'executable' are stored in IPython's rc
3017 extensions considered 'executable' are stored in IPython's rc
3009 structure as win_exec_ext.
3018 structure as win_exec_ext.
3010
3019
3011 * IPython/genutils.py (shell): new function, like system() but
3020 * IPython/genutils.py (shell): new function, like system() but
3012 without return value. Very useful for interactive shell work.
3021 without return value. Very useful for interactive shell work.
3013
3022
3014 * IPython/Magic.py (Magic.magic_unalias): New @unalias function to
3023 * IPython/Magic.py (Magic.magic_unalias): New @unalias function to
3015 delete aliases.
3024 delete aliases.
3016
3025
3017 * IPython/iplib.py (InteractiveShell.alias_table_update): make
3026 * IPython/iplib.py (InteractiveShell.alias_table_update): make
3018 sure that the alias table doesn't contain python keywords.
3027 sure that the alias table doesn't contain python keywords.
3019
3028
3020 2004-06-21 Fernando Perez <fperez@colorado.edu>
3029 2004-06-21 Fernando Perez <fperez@colorado.edu>
3021
3030
3022 * IPython/Magic.py (Magic.magic_rehash): Fix crash when
3031 * IPython/Magic.py (Magic.magic_rehash): Fix crash when
3023 non-existent items are found in $PATH. Reported by Thorsten.
3032 non-existent items are found in $PATH. Reported by Thorsten.
3024
3033
3025 2004-06-20 Fernando Perez <fperez@colorado.edu>
3034 2004-06-20 Fernando Perez <fperez@colorado.edu>
3026
3035
3027 * IPython/iplib.py (complete): modified the completer so that the
3036 * IPython/iplib.py (complete): modified the completer so that the
3028 order of priorities can be easily changed at runtime.
3037 order of priorities can be easily changed at runtime.
3029
3038
3030 * IPython/Extensions/InterpreterExec.py (prefilter_shell):
3039 * IPython/Extensions/InterpreterExec.py (prefilter_shell):
3031 Modified to auto-execute all lines beginning with '~', '/' or '.'.
3040 Modified to auto-execute all lines beginning with '~', '/' or '.'.
3032
3041
3033 * IPython/Magic.py (Magic.magic_sx): modified @sc and @sx to
3042 * IPython/Magic.py (Magic.magic_sx): modified @sc and @sx to
3034 expand Python variables prepended with $ in all system calls. The
3043 expand Python variables prepended with $ in all system calls. The
3035 same was done to InteractiveShell.handle_shell_escape. Now all
3044 same was done to InteractiveShell.handle_shell_escape. Now all
3036 system access mechanisms (!, !!, @sc, @sx and aliases) allow the
3045 system access mechanisms (!, !!, @sc, @sx and aliases) allow the
3037 expansion of python variables and expressions according to the
3046 expansion of python variables and expressions according to the
3038 syntax of PEP-215 - http://www.python.org/peps/pep-0215.html.
3047 syntax of PEP-215 - http://www.python.org/peps/pep-0215.html.
3039
3048
3040 Though PEP-215 has been rejected, a similar (but simpler) one
3049 Though PEP-215 has been rejected, a similar (but simpler) one
3041 seems like it will go into Python 2.4, PEP-292 -
3050 seems like it will go into Python 2.4, PEP-292 -
3042 http://www.python.org/peps/pep-0292.html.
3051 http://www.python.org/peps/pep-0292.html.
3043
3052
3044 I'll keep the full syntax of PEP-215, since IPython has since the
3053 I'll keep the full syntax of PEP-215, since IPython has since the
3045 start used Ka-Ping Yee's reference implementation discussed there
3054 start used Ka-Ping Yee's reference implementation discussed there
3046 (Itpl), and I actually like the powerful semantics it offers.
3055 (Itpl), and I actually like the powerful semantics it offers.
3047
3056
3048 In order to access normal shell variables, the $ has to be escaped
3057 In order to access normal shell variables, the $ has to be escaped
3049 via an extra $. For example:
3058 via an extra $. For example:
3050
3059
3051 In [7]: PATH='a python variable'
3060 In [7]: PATH='a python variable'
3052
3061
3053 In [8]: !echo $PATH
3062 In [8]: !echo $PATH
3054 a python variable
3063 a python variable
3055
3064
3056 In [9]: !echo $$PATH
3065 In [9]: !echo $$PATH
3057 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
3066 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
3058
3067
3059 (Magic.parse_options): escape $ so the shell doesn't evaluate
3068 (Magic.parse_options): escape $ so the shell doesn't evaluate
3060 things prematurely.
3069 things prematurely.
3061
3070
3062 * IPython/iplib.py (InteractiveShell.call_alias): added the
3071 * IPython/iplib.py (InteractiveShell.call_alias): added the
3063 ability for aliases to expand python variables via $.
3072 ability for aliases to expand python variables via $.
3064
3073
3065 * IPython/Magic.py (Magic.magic_rehash): based on the new alias
3074 * IPython/Magic.py (Magic.magic_rehash): based on the new alias
3066 system, now there's a @rehash/@rehashx pair of magics. These work
3075 system, now there's a @rehash/@rehashx pair of magics. These work
3067 like the csh rehash command, and can be invoked at any time. They
3076 like the csh rehash command, and can be invoked at any time. They
3068 build a table of aliases to everything in the user's $PATH
3077 build a table of aliases to everything in the user's $PATH
3069 (@rehash uses everything, @rehashx is slower but only adds
3078 (@rehash uses everything, @rehashx is slower but only adds
3070 executable files). With this, the pysh.py-based shell profile can
3079 executable files). With this, the pysh.py-based shell profile can
3071 now simply call rehash upon startup, and full access to all
3080 now simply call rehash upon startup, and full access to all
3072 programs in the user's path is obtained.
3081 programs in the user's path is obtained.
3073
3082
3074 * IPython/iplib.py (InteractiveShell.call_alias): The new alias
3083 * IPython/iplib.py (InteractiveShell.call_alias): The new alias
3075 functionality is now fully in place. I removed the old dynamic
3084 functionality is now fully in place. I removed the old dynamic
3076 code generation based approach, in favor of a much lighter one
3085 code generation based approach, in favor of a much lighter one
3077 based on a simple dict. The advantage is that this allows me to
3086 based on a simple dict. The advantage is that this allows me to
3078 now have thousands of aliases with negligible cost (unthinkable
3087 now have thousands of aliases with negligible cost (unthinkable
3079 with the old system).
3088 with the old system).
3080
3089
3081 2004-06-19 Fernando Perez <fperez@colorado.edu>
3090 2004-06-19 Fernando Perez <fperez@colorado.edu>
3082
3091
3083 * IPython/iplib.py (__init__): extended MagicCompleter class to
3092 * IPython/iplib.py (__init__): extended MagicCompleter class to
3084 also complete (last in priority) on user aliases.
3093 also complete (last in priority) on user aliases.
3085
3094
3086 * IPython/Itpl.py (Itpl.__str__): fixed order of globals/locals in
3095 * IPython/Itpl.py (Itpl.__str__): fixed order of globals/locals in
3087 call to eval.
3096 call to eval.
3088 (ItplNS.__init__): Added a new class which functions like Itpl,
3097 (ItplNS.__init__): Added a new class which functions like Itpl,
3089 but allows configuring the namespace for the evaluation to occur
3098 but allows configuring the namespace for the evaluation to occur
3090 in.
3099 in.
3091
3100
3092 2004-06-18 Fernando Perez <fperez@colorado.edu>
3101 2004-06-18 Fernando Perez <fperez@colorado.edu>
3093
3102
3094 * IPython/iplib.py (InteractiveShell.runcode): modify to print a
3103 * IPython/iplib.py (InteractiveShell.runcode): modify to print a
3095 better message when 'exit' or 'quit' are typed (a common newbie
3104 better message when 'exit' or 'quit' are typed (a common newbie
3096 confusion).
3105 confusion).
3097
3106
3098 * IPython/Magic.py (Magic.magic_colors): Added the runtime color
3107 * IPython/Magic.py (Magic.magic_colors): Added the runtime color
3099 check for Windows users.
3108 check for Windows users.
3100
3109
3101 * IPython/iplib.py (InteractiveShell.user_setup): removed
3110 * IPython/iplib.py (InteractiveShell.user_setup): removed
3102 disabling of colors for Windows. I'll test at runtime and issue a
3111 disabling of colors for Windows. I'll test at runtime and issue a
3103 warning if Gary's readline isn't found, as to nudge users to
3112 warning if Gary's readline isn't found, as to nudge users to
3104 download it.
3113 download it.
3105
3114
3106 2004-06-16 Fernando Perez <fperez@colorado.edu>
3115 2004-06-16 Fernando Perez <fperez@colorado.edu>
3107
3116
3108 * IPython/genutils.py (Stream.__init__): changed to print errors
3117 * IPython/genutils.py (Stream.__init__): changed to print errors
3109 to sys.stderr. I had a circular dependency here. Now it's
3118 to sys.stderr. I had a circular dependency here. Now it's
3110 possible to run ipython as IDLE's shell (consider this pre-alpha,
3119 possible to run ipython as IDLE's shell (consider this pre-alpha,
3111 since true stdout things end up in the starting terminal instead
3120 since true stdout things end up in the starting terminal instead
3112 of IDLE's out).
3121 of IDLE's out).
3113
3122
3114 * IPython/Prompts.py (Prompt2.set_colors): prevent crashes for
3123 * IPython/Prompts.py (Prompt2.set_colors): prevent crashes for
3115 users who haven't # updated their prompt_in2 definitions. Remove
3124 users who haven't # updated their prompt_in2 definitions. Remove
3116 eventually.
3125 eventually.
3117 (multiple_replace): added credit to original ASPN recipe.
3126 (multiple_replace): added credit to original ASPN recipe.
3118
3127
3119 2004-06-15 Fernando Perez <fperez@colorado.edu>
3128 2004-06-15 Fernando Perez <fperez@colorado.edu>
3120
3129
3121 * IPython/iplib.py (InteractiveShell.__init__): add 'cp' to the
3130 * IPython/iplib.py (InteractiveShell.__init__): add 'cp' to the
3122 list of auto-defined aliases.
3131 list of auto-defined aliases.
3123
3132
3124 2004-06-13 Fernando Perez <fperez@colorado.edu>
3133 2004-06-13 Fernando Perez <fperez@colorado.edu>
3125
3134
3126 * setup.py (scriptfiles): Don't trigger win_post_install unless an
3135 * setup.py (scriptfiles): Don't trigger win_post_install unless an
3127 install was really requested (so setup.py can be used for other
3136 install was really requested (so setup.py can be used for other
3128 things under Windows).
3137 things under Windows).
3129
3138
3130 2004-06-10 Fernando Perez <fperez@colorado.edu>
3139 2004-06-10 Fernando Perez <fperez@colorado.edu>
3131
3140
3132 * IPython/Logger.py (Logger.create_log): Manually remove any old
3141 * IPython/Logger.py (Logger.create_log): Manually remove any old
3133 backup, since os.remove may fail under Windows. Fixes bug
3142 backup, since os.remove may fail under Windows. Fixes bug
3134 reported by Thorsten.
3143 reported by Thorsten.
3135
3144
3136 2004-06-09 Fernando Perez <fperez@colorado.edu>
3145 2004-06-09 Fernando Perez <fperez@colorado.edu>
3137
3146
3138 * examples/example-embed.py: fixed all references to %n (replaced
3147 * examples/example-embed.py: fixed all references to %n (replaced
3139 with \\# for ps1/out prompts and with \\D for ps2 prompts). Done
3148 with \\# for ps1/out prompts and with \\D for ps2 prompts). Done
3140 for all examples and the manual as well.
3149 for all examples and the manual as well.
3141
3150
3142 2004-06-08 Fernando Perez <fperez@colorado.edu>
3151 2004-06-08 Fernando Perez <fperez@colorado.edu>
3143
3152
3144 * IPython/Prompts.py (Prompt2.set_p_str): fixed all prompt
3153 * IPython/Prompts.py (Prompt2.set_p_str): fixed all prompt
3145 alignment and color management. All 3 prompt subsystems now
3154 alignment and color management. All 3 prompt subsystems now
3146 inherit from BasePrompt.
3155 inherit from BasePrompt.
3147
3156
3148 * tools/release: updates for windows installer build and tag rpms
3157 * tools/release: updates for windows installer build and tag rpms
3149 with python version (since paths are fixed).
3158 with python version (since paths are fixed).
3150
3159
3151 * IPython/UserConfig/ipythonrc: modified to use \# instead of %n,
3160 * IPython/UserConfig/ipythonrc: modified to use \# instead of %n,
3152 which will become eventually obsolete. Also fixed the default
3161 which will become eventually obsolete. Also fixed the default
3153 prompt_in2 to use \D, so at least new users start with the correct
3162 prompt_in2 to use \D, so at least new users start with the correct
3154 defaults.
3163 defaults.
3155 WARNING: Users with existing ipythonrc files will need to apply
3164 WARNING: Users with existing ipythonrc files will need to apply
3156 this fix manually!
3165 this fix manually!
3157
3166
3158 * setup.py: make windows installer (.exe). This is finally the
3167 * setup.py: make windows installer (.exe). This is finally the
3159 integration of an old patch by Cory Dodt <dodt-AT-fcoe.k12.ca.us>,
3168 integration of an old patch by Cory Dodt <dodt-AT-fcoe.k12.ca.us>,
3160 which I hadn't included because it required Python 2.3 (or recent
3169 which I hadn't included because it required Python 2.3 (or recent
3161 distutils).
3170 distutils).
3162
3171
3163 * IPython/usage.py (__doc__): update docs (and manpage) to reflect
3172 * IPython/usage.py (__doc__): update docs (and manpage) to reflect
3164 usage of new '\D' escape.
3173 usage of new '\D' escape.
3165
3174
3166 * IPython/Prompts.py (ROOT_SYMBOL): Small fix for Windows (which
3175 * IPython/Prompts.py (ROOT_SYMBOL): Small fix for Windows (which
3167 lacks os.getuid())
3176 lacks os.getuid())
3168 (CachedOutput.set_colors): Added the ability to turn coloring
3177 (CachedOutput.set_colors): Added the ability to turn coloring
3169 on/off with @colors even for manually defined prompt colors. It
3178 on/off with @colors even for manually defined prompt colors. It
3170 uses a nasty global, but it works safely and via the generic color
3179 uses a nasty global, but it works safely and via the generic color
3171 handling mechanism.
3180 handling mechanism.
3172 (Prompt2.__init__): Introduced new escape '\D' for continuation
3181 (Prompt2.__init__): Introduced new escape '\D' for continuation
3173 prompts. It represents the counter ('\#') as dots.
3182 prompts. It represents the counter ('\#') as dots.
3174 *** NOTE *** THIS IS A BACKWARDS-INCOMPATIBLE CHANGE. Users will
3183 *** NOTE *** THIS IS A BACKWARDS-INCOMPATIBLE CHANGE. Users will
3175 need to update their ipythonrc files and replace '%n' with '\D' in
3184 need to update their ipythonrc files and replace '%n' with '\D' in
3176 their prompt_in2 settings everywhere. Sorry, but there's
3185 their prompt_in2 settings everywhere. Sorry, but there's
3177 otherwise no clean way to get all prompts to properly align. The
3186 otherwise no clean way to get all prompts to properly align. The
3178 ipythonrc shipped with IPython has been updated.
3187 ipythonrc shipped with IPython has been updated.
3179
3188
3180 2004-06-07 Fernando Perez <fperez@colorado.edu>
3189 2004-06-07 Fernando Perez <fperez@colorado.edu>
3181
3190
3182 * setup.py (isfile): Pass local_icons option to latex2html, so the
3191 * setup.py (isfile): Pass local_icons option to latex2html, so the
3183 resulting HTML file is self-contained. Thanks to
3192 resulting HTML file is self-contained. Thanks to
3184 dryice-AT-liu.com.cn for the tip.
3193 dryice-AT-liu.com.cn for the tip.
3185
3194
3186 * pysh.py: I created a new profile 'shell', which implements a
3195 * pysh.py: I created a new profile 'shell', which implements a
3187 _rudimentary_ IPython-based shell. This is in NO WAY a realy
3196 _rudimentary_ IPython-based shell. This is in NO WAY a realy
3188 system shell, nor will it become one anytime soon. It's mainly
3197 system shell, nor will it become one anytime soon. It's mainly
3189 meant to illustrate the use of the new flexible bash-like prompts.
3198 meant to illustrate the use of the new flexible bash-like prompts.
3190 I guess it could be used by hardy souls for true shell management,
3199 I guess it could be used by hardy souls for true shell management,
3191 but it's no tcsh/bash... pysh.py is loaded by the 'shell'
3200 but it's no tcsh/bash... pysh.py is loaded by the 'shell'
3192 profile. This uses the InterpreterExec extension provided by
3201 profile. This uses the InterpreterExec extension provided by
3193 W.J. van der Laan <gnufnork-AT-hetdigitalegat.nl>
3202 W.J. van der Laan <gnufnork-AT-hetdigitalegat.nl>
3194
3203
3195 * IPython/Prompts.py (PromptOut.__str__): now it will correctly
3204 * IPython/Prompts.py (PromptOut.__str__): now it will correctly
3196 auto-align itself with the length of the previous input prompt
3205 auto-align itself with the length of the previous input prompt
3197 (taking into account the invisible color escapes).
3206 (taking into account the invisible color escapes).
3198 (CachedOutput.__init__): Large restructuring of this class. Now
3207 (CachedOutput.__init__): Large restructuring of this class. Now
3199 all three prompts (primary1, primary2, output) are proper objects,
3208 all three prompts (primary1, primary2, output) are proper objects,
3200 managed by the 'parent' CachedOutput class. The code is still a
3209 managed by the 'parent' CachedOutput class. The code is still a
3201 bit hackish (all prompts share state via a pointer to the cache),
3210 bit hackish (all prompts share state via a pointer to the cache),
3202 but it's overall far cleaner than before.
3211 but it's overall far cleaner than before.
3203
3212
3204 * IPython/genutils.py (getoutputerror): modified to add verbose,
3213 * IPython/genutils.py (getoutputerror): modified to add verbose,
3205 debug and header options. This makes the interface of all getout*
3214 debug and header options. This makes the interface of all getout*
3206 functions uniform.
3215 functions uniform.
3207 (SystemExec.getoutputerror): added getoutputerror to SystemExec.
3216 (SystemExec.getoutputerror): added getoutputerror to SystemExec.
3208
3217
3209 * IPython/Magic.py (Magic.default_option): added a function to
3218 * IPython/Magic.py (Magic.default_option): added a function to
3210 allow registering default options for any magic command. This
3219 allow registering default options for any magic command. This
3211 makes it easy to have profiles which customize the magics globally
3220 makes it easy to have profiles which customize the magics globally
3212 for a certain use. The values set through this function are
3221 for a certain use. The values set through this function are
3213 picked up by the parse_options() method, which all magics should
3222 picked up by the parse_options() method, which all magics should
3214 use to parse their options.
3223 use to parse their options.
3215
3224
3216 * IPython/genutils.py (warn): modified the warnings framework to
3225 * IPython/genutils.py (warn): modified the warnings framework to
3217 use the Term I/O class. I'm trying to slowly unify all of
3226 use the Term I/O class. I'm trying to slowly unify all of
3218 IPython's I/O operations to pass through Term.
3227 IPython's I/O operations to pass through Term.
3219
3228
3220 * IPython/Prompts.py (Prompt2._str_other): Added functionality in
3229 * IPython/Prompts.py (Prompt2._str_other): Added functionality in
3221 the secondary prompt to correctly match the length of the primary
3230 the secondary prompt to correctly match the length of the primary
3222 one for any prompt. Now multi-line code will properly line up
3231 one for any prompt. Now multi-line code will properly line up
3223 even for path dependent prompts, such as the new ones available
3232 even for path dependent prompts, such as the new ones available
3224 via the prompt_specials.
3233 via the prompt_specials.
3225
3234
3226 2004-06-06 Fernando Perez <fperez@colorado.edu>
3235 2004-06-06 Fernando Perez <fperez@colorado.edu>
3227
3236
3228 * IPython/Prompts.py (prompt_specials): Added the ability to have
3237 * IPython/Prompts.py (prompt_specials): Added the ability to have
3229 bash-like special sequences in the prompts, which get
3238 bash-like special sequences in the prompts, which get
3230 automatically expanded. Things like hostname, current working
3239 automatically expanded. Things like hostname, current working
3231 directory and username are implemented already, but it's easy to
3240 directory and username are implemented already, but it's easy to
3232 add more in the future. Thanks to a patch by W.J. van der Laan
3241 add more in the future. Thanks to a patch by W.J. van der Laan
3233 <gnufnork-AT-hetdigitalegat.nl>
3242 <gnufnork-AT-hetdigitalegat.nl>
3234 (prompt_specials): Added color support for prompt strings, so
3243 (prompt_specials): Added color support for prompt strings, so
3235 users can define arbitrary color setups for their prompts.
3244 users can define arbitrary color setups for their prompts.
3236
3245
3237 2004-06-05 Fernando Perez <fperez@colorado.edu>
3246 2004-06-05 Fernando Perez <fperez@colorado.edu>
3238
3247
3239 * IPython/genutils.py (Term.reopen_all): Added Windows-specific
3248 * IPython/genutils.py (Term.reopen_all): Added Windows-specific
3240 code to load Gary Bishop's readline and configure it
3249 code to load Gary Bishop's readline and configure it
3241 automatically. Thanks to Gary for help on this.
3250 automatically. Thanks to Gary for help on this.
3242
3251
3243 2004-06-01 Fernando Perez <fperez@colorado.edu>
3252 2004-06-01 Fernando Perez <fperez@colorado.edu>
3244
3253
3245 * IPython/Logger.py (Logger.create_log): fix bug for logging
3254 * IPython/Logger.py (Logger.create_log): fix bug for logging
3246 with no filename (previous fix was incomplete).
3255 with no filename (previous fix was incomplete).
3247
3256
3248 2004-05-25 Fernando Perez <fperez@colorado.edu>
3257 2004-05-25 Fernando Perez <fperez@colorado.edu>
3249
3258
3250 * IPython/Magic.py (Magic.parse_options): fix bug where naked
3259 * IPython/Magic.py (Magic.parse_options): fix bug where naked
3251 parens would get passed to the shell.
3260 parens would get passed to the shell.
3252
3261
3253 2004-05-20 Fernando Perez <fperez@colorado.edu>
3262 2004-05-20 Fernando Perez <fperez@colorado.edu>
3254
3263
3255 * IPython/Magic.py (Magic.magic_prun): changed default profile
3264 * IPython/Magic.py (Magic.magic_prun): changed default profile
3256 sort order to 'time' (the more common profiling need).
3265 sort order to 'time' (the more common profiling need).
3257
3266
3258 * IPython/OInspect.py (Inspector.pinfo): flush the inspect cache
3267 * IPython/OInspect.py (Inspector.pinfo): flush the inspect cache
3259 so that source code shown is guaranteed in sync with the file on
3268 so that source code shown is guaranteed in sync with the file on
3260 disk (also changed in psource). Similar fix to the one for
3269 disk (also changed in psource). Similar fix to the one for
3261 ultraTB on 2004-05-06. Thanks to a bug report by Yann Le Du
3270 ultraTB on 2004-05-06. Thanks to a bug report by Yann Le Du
3262 <yann.ledu-AT-noos.fr>.
3271 <yann.ledu-AT-noos.fr>.
3263
3272
3264 * IPython/Magic.py (Magic.parse_options): Fixed bug where commands
3273 * IPython/Magic.py (Magic.parse_options): Fixed bug where commands
3265 with a single option would not be correctly parsed. Closes
3274 with a single option would not be correctly parsed. Closes
3266 http://www.scipy.net/roundup/ipython/issue14. This bug had been
3275 http://www.scipy.net/roundup/ipython/issue14. This bug had been
3267 introduced in 0.6.0 (on 2004-05-06).
3276 introduced in 0.6.0 (on 2004-05-06).
3268
3277
3269 2004-05-13 *** Released version 0.6.0
3278 2004-05-13 *** Released version 0.6.0
3270
3279
3271 2004-05-13 Fernando Perez <fperez@colorado.edu>
3280 2004-05-13 Fernando Perez <fperez@colorado.edu>
3272
3281
3273 * debian/: Added debian/ directory to CVS, so that debian support
3282 * debian/: Added debian/ directory to CVS, so that debian support
3274 is publicly accessible. The debian package is maintained by Jack
3283 is publicly accessible. The debian package is maintained by Jack
3275 Moffit <jack-AT-xiph.org>.
3284 Moffit <jack-AT-xiph.org>.
3276
3285
3277 * Documentation: included the notes about an ipython-based system
3286 * Documentation: included the notes about an ipython-based system
3278 shell (the hypothetical 'pysh') into the new_design.pdf document,
3287 shell (the hypothetical 'pysh') into the new_design.pdf document,
3279 so that these ideas get distributed to users along with the
3288 so that these ideas get distributed to users along with the
3280 official documentation.
3289 official documentation.
3281
3290
3282 2004-05-10 Fernando Perez <fperez@colorado.edu>
3291 2004-05-10 Fernando Perez <fperez@colorado.edu>
3283
3292
3284 * IPython/Logger.py (Logger.create_log): fix recently introduced
3293 * IPython/Logger.py (Logger.create_log): fix recently introduced
3285 bug (misindented line) where logstart would fail when not given an
3294 bug (misindented line) where logstart would fail when not given an
3286 explicit filename.
3295 explicit filename.
3287
3296
3288 2004-05-09 Fernando Perez <fperez@colorado.edu>
3297 2004-05-09 Fernando Perez <fperez@colorado.edu>
3289
3298
3290 * IPython/Magic.py (Magic.parse_options): skip system call when
3299 * IPython/Magic.py (Magic.parse_options): skip system call when
3291 there are no options to look for. Faster, cleaner for the common
3300 there are no options to look for. Faster, cleaner for the common
3292 case.
3301 case.
3293
3302
3294 * Documentation: many updates to the manual: describing Windows
3303 * Documentation: many updates to the manual: describing Windows
3295 support better, Gnuplot updates, credits, misc small stuff. Also
3304 support better, Gnuplot updates, credits, misc small stuff. Also
3296 updated the new_design doc a bit.
3305 updated the new_design doc a bit.
3297
3306
3298 2004-05-06 *** Released version 0.6.0.rc1
3307 2004-05-06 *** Released version 0.6.0.rc1
3299
3308
3300 2004-05-06 Fernando Perez <fperez@colorado.edu>
3309 2004-05-06 Fernando Perez <fperez@colorado.edu>
3301
3310
3302 * IPython/ultraTB.py (ListTB.text): modified a ton of string +=
3311 * IPython/ultraTB.py (ListTB.text): modified a ton of string +=
3303 operations to use the vastly more efficient list/''.join() method.
3312 operations to use the vastly more efficient list/''.join() method.
3304 (FormattedTB.text): Fix
3313 (FormattedTB.text): Fix
3305 http://www.scipy.net/roundup/ipython/issue12 - exception source
3314 http://www.scipy.net/roundup/ipython/issue12 - exception source
3306 extract not updated after reload. Thanks to Mike Salib
3315 extract not updated after reload. Thanks to Mike Salib
3307 <msalib-AT-mit.edu> for pinning the source of the problem.
3316 <msalib-AT-mit.edu> for pinning the source of the problem.
3308 Fortunately, the solution works inside ipython and doesn't require
3317 Fortunately, the solution works inside ipython and doesn't require
3309 any changes to python proper.
3318 any changes to python proper.
3310
3319
3311 * IPython/Magic.py (Magic.parse_options): Improved to process the
3320 * IPython/Magic.py (Magic.parse_options): Improved to process the
3312 argument list as a true shell would (by actually using the
3321 argument list as a true shell would (by actually using the
3313 underlying system shell). This way, all @magics automatically get
3322 underlying system shell). This way, all @magics automatically get
3314 shell expansion for variables. Thanks to a comment by Alex
3323 shell expansion for variables. Thanks to a comment by Alex
3315 Schmolck.
3324 Schmolck.
3316
3325
3317 2004-04-04 Fernando Perez <fperez@colorado.edu>
3326 2004-04-04 Fernando Perez <fperez@colorado.edu>
3318
3327
3319 * IPython/iplib.py (InteractiveShell.interact): Added a special
3328 * IPython/iplib.py (InteractiveShell.interact): Added a special
3320 trap for a debugger quit exception, which is basically impossible
3329 trap for a debugger quit exception, which is basically impossible
3321 to handle by normal mechanisms, given what pdb does to the stack.
3330 to handle by normal mechanisms, given what pdb does to the stack.
3322 This fixes a crash reported by <fgibbons-AT-llama.med.harvard.edu>.
3331 This fixes a crash reported by <fgibbons-AT-llama.med.harvard.edu>.
3323
3332
3324 2004-04-03 Fernando Perez <fperez@colorado.edu>
3333 2004-04-03 Fernando Perez <fperez@colorado.edu>
3325
3334
3326 * IPython/genutils.py (Term): Standardized the names of the Term
3335 * IPython/genutils.py (Term): Standardized the names of the Term
3327 class streams to cin/cout/cerr, following C++ naming conventions
3336 class streams to cin/cout/cerr, following C++ naming conventions
3328 (I can't use in/out/err because 'in' is not a valid attribute
3337 (I can't use in/out/err because 'in' is not a valid attribute
3329 name).
3338 name).
3330
3339
3331 * IPython/iplib.py (InteractiveShell.interact): don't increment
3340 * IPython/iplib.py (InteractiveShell.interact): don't increment
3332 the prompt if there's no user input. By Daniel 'Dang' Griffith
3341 the prompt if there's no user input. By Daniel 'Dang' Griffith
3333 <pythondev-dang-AT-lazytwinacres.net>, after a suggestion from
3342 <pythondev-dang-AT-lazytwinacres.net>, after a suggestion from
3334 Francois Pinard.
3343 Francois Pinard.
3335
3344
3336 2004-04-02 Fernando Perez <fperez@colorado.edu>
3345 2004-04-02 Fernando Perez <fperez@colorado.edu>
3337
3346
3338 * IPython/genutils.py (Stream.__init__): Modified to survive at
3347 * IPython/genutils.py (Stream.__init__): Modified to survive at
3339 least importing in contexts where stdin/out/err aren't true file
3348 least importing in contexts where stdin/out/err aren't true file
3340 objects, such as PyCrust (they lack fileno() and mode). However,
3349 objects, such as PyCrust (they lack fileno() and mode). However,
3341 the recovery facilities which rely on these things existing will
3350 the recovery facilities which rely on these things existing will
3342 not work.
3351 not work.
3343
3352
3344 2004-04-01 Fernando Perez <fperez@colorado.edu>
3353 2004-04-01 Fernando Perez <fperez@colorado.edu>
3345
3354
3346 * IPython/Magic.py (Magic.magic_sx): modified (as well as @sc) to
3355 * IPython/Magic.py (Magic.magic_sx): modified (as well as @sc) to
3347 use the new getoutputerror() function, so it properly
3356 use the new getoutputerror() function, so it properly
3348 distinguishes stdout/err.
3357 distinguishes stdout/err.
3349
3358
3350 * IPython/genutils.py (getoutputerror): added a function to
3359 * IPython/genutils.py (getoutputerror): added a function to
3351 capture separately the standard output and error of a command.
3360 capture separately the standard output and error of a command.
3352 After a comment from dang on the mailing lists. This code is
3361 After a comment from dang on the mailing lists. This code is
3353 basically a modified version of commands.getstatusoutput(), from
3362 basically a modified version of commands.getstatusoutput(), from
3354 the standard library.
3363 the standard library.
3355
3364
3356 * IPython/iplib.py (InteractiveShell.handle_shell_escape): added
3365 * IPython/iplib.py (InteractiveShell.handle_shell_escape): added
3357 '!!' as a special syntax (shorthand) to access @sx.
3366 '!!' as a special syntax (shorthand) to access @sx.
3358
3367
3359 * IPython/Magic.py (Magic.magic_sx): new magic, to execute a shell
3368 * IPython/Magic.py (Magic.magic_sx): new magic, to execute a shell
3360 command and return its output as a list split on '\n'.
3369 command and return its output as a list split on '\n'.
3361
3370
3362 2004-03-31 Fernando Perez <fperez@colorado.edu>
3371 2004-03-31 Fernando Perez <fperez@colorado.edu>
3363
3372
3364 * IPython/FakeModule.py (FakeModule.__init__): added __nonzero__
3373 * IPython/FakeModule.py (FakeModule.__init__): added __nonzero__
3365 method to dictionaries used as FakeModule instances if they lack
3374 method to dictionaries used as FakeModule instances if they lack
3366 it. At least pydoc in python2.3 breaks for runtime-defined
3375 it. At least pydoc in python2.3 breaks for runtime-defined
3367 functions without this hack. At some point I need to _really_
3376 functions without this hack. At some point I need to _really_
3368 understand what FakeModule is doing, because it's a gross hack.
3377 understand what FakeModule is doing, because it's a gross hack.
3369 But it solves Arnd's problem for now...
3378 But it solves Arnd's problem for now...
3370
3379
3371 2004-02-27 Fernando Perez <fperez@colorado.edu>
3380 2004-02-27 Fernando Perez <fperez@colorado.edu>
3372
3381
3373 * IPython/Logger.py (Logger.create_log): Fix bug where 'rotate'
3382 * IPython/Logger.py (Logger.create_log): Fix bug where 'rotate'
3374 mode would behave erratically. Also increased the number of
3383 mode would behave erratically. Also increased the number of
3375 possible logs in rotate mod to 999. Thanks to Rod Holland
3384 possible logs in rotate mod to 999. Thanks to Rod Holland
3376 <rhh@StructureLABS.com> for the report and fixes.
3385 <rhh@StructureLABS.com> for the report and fixes.
3377
3386
3378 2004-02-26 Fernando Perez <fperez@colorado.edu>
3387 2004-02-26 Fernando Perez <fperez@colorado.edu>
3379
3388
3380 * IPython/genutils.py (page): Check that the curses module really
3389 * IPython/genutils.py (page): Check that the curses module really
3381 has the initscr attribute before trying to use it. For some
3390 has the initscr attribute before trying to use it. For some
3382 reason, the Solaris curses module is missing this. I think this
3391 reason, the Solaris curses module is missing this. I think this
3383 should be considered a Solaris python bug, but I'm not sure.
3392 should be considered a Solaris python bug, but I'm not sure.
3384
3393
3385 2004-01-17 Fernando Perez <fperez@colorado.edu>
3394 2004-01-17 Fernando Perez <fperez@colorado.edu>
3386
3395
3387 * IPython/genutils.py (Stream.__init__): Changes to try to make
3396 * IPython/genutils.py (Stream.__init__): Changes to try to make
3388 ipython robust against stdin/out/err being closed by the user.
3397 ipython robust against stdin/out/err being closed by the user.
3389 This is 'user error' (and blocks a normal python session, at least
3398 This is 'user error' (and blocks a normal python session, at least
3390 the stdout case). However, Ipython should be able to survive such
3399 the stdout case). However, Ipython should be able to survive such
3391 instances of abuse as gracefully as possible. To simplify the
3400 instances of abuse as gracefully as possible. To simplify the
3392 coding and maintain compatibility with Gary Bishop's Term
3401 coding and maintain compatibility with Gary Bishop's Term
3393 contributions, I've made use of classmethods for this. I think
3402 contributions, I've made use of classmethods for this. I think
3394 this introduces a dependency on python 2.2.
3403 this introduces a dependency on python 2.2.
3395
3404
3396 2004-01-13 Fernando Perez <fperez@colorado.edu>
3405 2004-01-13 Fernando Perez <fperez@colorado.edu>
3397
3406
3398 * IPython/numutils.py (exp_safe): simplified the code a bit and
3407 * IPython/numutils.py (exp_safe): simplified the code a bit and
3399 removed the need for importing the kinds module altogether.
3408 removed the need for importing the kinds module altogether.
3400
3409
3401 2004-01-06 Fernando Perez <fperez@colorado.edu>
3410 2004-01-06 Fernando Perez <fperez@colorado.edu>
3402
3411
3403 * IPython/Magic.py (Magic.magic_sc): Made the shell capture system
3412 * IPython/Magic.py (Magic.magic_sc): Made the shell capture system
3404 a magic function instead, after some community feedback. No
3413 a magic function instead, after some community feedback. No
3405 special syntax will exist for it, but its name is deliberately
3414 special syntax will exist for it, but its name is deliberately
3406 very short.
3415 very short.
3407
3416
3408 2003-12-20 Fernando Perez <fperez@colorado.edu>
3417 2003-12-20 Fernando Perez <fperez@colorado.edu>
3409
3418
3410 * IPython/iplib.py (InteractiveShell.handle_shell_assign): Added
3419 * IPython/iplib.py (InteractiveShell.handle_shell_assign): Added
3411 new functionality, to automagically assign the result of a shell
3420 new functionality, to automagically assign the result of a shell
3412 command to a variable. I'll solicit some community feedback on
3421 command to a variable. I'll solicit some community feedback on
3413 this before making it permanent.
3422 this before making it permanent.
3414
3423
3415 * IPython/OInspect.py (Inspector.pinfo): Fix crash when info was
3424 * IPython/OInspect.py (Inspector.pinfo): Fix crash when info was
3416 requested about callables for which inspect couldn't obtain a
3425 requested about callables for which inspect couldn't obtain a
3417 proper argspec. Thanks to a crash report sent by Etienne
3426 proper argspec. Thanks to a crash report sent by Etienne
3418 Posthumus <etienne-AT-apple01.cs.vu.nl>.
3427 Posthumus <etienne-AT-apple01.cs.vu.nl>.
3419
3428
3420 2003-12-09 Fernando Perez <fperez@colorado.edu>
3429 2003-12-09 Fernando Perez <fperez@colorado.edu>
3421
3430
3422 * IPython/genutils.py (page): patch for the pager to work across
3431 * IPython/genutils.py (page): patch for the pager to work across
3423 various versions of Windows. By Gary Bishop.
3432 various versions of Windows. By Gary Bishop.
3424
3433
3425 2003-12-04 Fernando Perez <fperez@colorado.edu>
3434 2003-12-04 Fernando Perez <fperez@colorado.edu>
3426
3435
3427 * IPython/Gnuplot2.py (PlotItems): Fixes for working with
3436 * IPython/Gnuplot2.py (PlotItems): Fixes for working with
3428 Gnuplot.py version 1.7, whose internal names changed quite a bit.
3437 Gnuplot.py version 1.7, whose internal names changed quite a bit.
3429 While I tested this and it looks ok, there may still be corner
3438 While I tested this and it looks ok, there may still be corner
3430 cases I've missed.
3439 cases I've missed.
3431
3440
3432 2003-12-01 Fernando Perez <fperez@colorado.edu>
3441 2003-12-01 Fernando Perez <fperez@colorado.edu>
3433
3442
3434 * IPython/iplib.py (InteractiveShell._prefilter): Fixed a bug
3443 * IPython/iplib.py (InteractiveShell._prefilter): Fixed a bug
3435 where a line like 'p,q=1,2' would fail because the automagic
3444 where a line like 'p,q=1,2' would fail because the automagic
3436 system would be triggered for @p.
3445 system would be triggered for @p.
3437
3446
3438 * IPython/DPyGetOpt.py (DPyGetOpt.processArguments): Tab-related
3447 * IPython/DPyGetOpt.py (DPyGetOpt.processArguments): Tab-related
3439 cleanups, code unmodified.
3448 cleanups, code unmodified.
3440
3449
3441 * IPython/genutils.py (Term): added a class for IPython to handle
3450 * IPython/genutils.py (Term): added a class for IPython to handle
3442 output. In most cases it will just be a proxy for stdout/err, but
3451 output. In most cases it will just be a proxy for stdout/err, but
3443 having this allows modifications to be made for some platforms,
3452 having this allows modifications to be made for some platforms,
3444 such as handling color escapes under Windows. All of this code
3453 such as handling color escapes under Windows. All of this code
3445 was contributed by Gary Bishop, with minor modifications by me.
3454 was contributed by Gary Bishop, with minor modifications by me.
3446 The actual changes affect many files.
3455 The actual changes affect many files.
3447
3456
3448 2003-11-30 Fernando Perez <fperez@colorado.edu>
3457 2003-11-30 Fernando Perez <fperez@colorado.edu>
3449
3458
3450 * IPython/iplib.py (file_matches): new completion code, courtesy
3459 * IPython/iplib.py (file_matches): new completion code, courtesy
3451 of Jeff Collins. This enables filename completion again under
3460 of Jeff Collins. This enables filename completion again under
3452 python 2.3, which disabled it at the C level.
3461 python 2.3, which disabled it at the C level.
3453
3462
3454 2003-11-11 Fernando Perez <fperez@colorado.edu>
3463 2003-11-11 Fernando Perez <fperez@colorado.edu>
3455
3464
3456 * IPython/numutils.py (amap): Added amap() fn. Simple shorthand
3465 * IPython/numutils.py (amap): Added amap() fn. Simple shorthand
3457 for Numeric.array(map(...)), but often convenient.
3466 for Numeric.array(map(...)), but often convenient.
3458
3467
3459 2003-11-05 Fernando Perez <fperez@colorado.edu>
3468 2003-11-05 Fernando Perez <fperez@colorado.edu>
3460
3469
3461 * IPython/numutils.py (frange): Changed a call from int() to
3470 * IPython/numutils.py (frange): Changed a call from int() to
3462 int(round()) to prevent a problem reported with arange() in the
3471 int(round()) to prevent a problem reported with arange() in the
3463 numpy list.
3472 numpy list.
3464
3473
3465 2003-10-06 Fernando Perez <fperez@colorado.edu>
3474 2003-10-06 Fernando Perez <fperez@colorado.edu>
3466
3475
3467 * IPython/DPyGetOpt.py (DPyGetOpt.processArguments): changed to
3476 * IPython/DPyGetOpt.py (DPyGetOpt.processArguments): changed to
3468 prevent crashes if sys lacks an argv attribute (it happens with
3477 prevent crashes if sys lacks an argv attribute (it happens with
3469 embedded interpreters which build a bare-bones sys module).
3478 embedded interpreters which build a bare-bones sys module).
3470 Thanks to a report/bugfix by Adam Hupp <hupp-AT-cs.wisc.edu>.
3479 Thanks to a report/bugfix by Adam Hupp <hupp-AT-cs.wisc.edu>.
3471
3480
3472 2003-09-24 Fernando Perez <fperez@colorado.edu>
3481 2003-09-24 Fernando Perez <fperez@colorado.edu>
3473
3482
3474 * IPython/Magic.py (Magic._ofind): blanket except around getattr()
3483 * IPython/Magic.py (Magic._ofind): blanket except around getattr()
3475 to protect against poorly written user objects where __getattr__
3484 to protect against poorly written user objects where __getattr__
3476 raises exceptions other than AttributeError. Thanks to a bug
3485 raises exceptions other than AttributeError. Thanks to a bug
3477 report by Oliver Sander <osander-AT-gmx.de>.
3486 report by Oliver Sander <osander-AT-gmx.de>.
3478
3487
3479 * IPython/FakeModule.py (FakeModule.__repr__): this method was
3488 * IPython/FakeModule.py (FakeModule.__repr__): this method was
3480 missing. Thanks to bug report by Ralf Schmitt <ralf-AT-brainbot.com>.
3489 missing. Thanks to bug report by Ralf Schmitt <ralf-AT-brainbot.com>.
3481
3490
3482 2003-09-09 Fernando Perez <fperez@colorado.edu>
3491 2003-09-09 Fernando Perez <fperez@colorado.edu>
3483
3492
3484 * IPython/iplib.py (InteractiveShell._prefilter): fix bug where
3493 * IPython/iplib.py (InteractiveShell._prefilter): fix bug where
3485 unpacking a list whith a callable as first element would
3494 unpacking a list whith a callable as first element would
3486 mistakenly trigger autocalling. Thanks to a bug report by Jeffery
3495 mistakenly trigger autocalling. Thanks to a bug report by Jeffery
3487 Collins.
3496 Collins.
3488
3497
3489 2003-08-25 *** Released version 0.5.0
3498 2003-08-25 *** Released version 0.5.0
3490
3499
3491 2003-08-22 Fernando Perez <fperez@colorado.edu>
3500 2003-08-22 Fernando Perez <fperez@colorado.edu>
3492
3501
3493 * IPython/ultraTB.py (VerboseTB.linereader): Improved handling of
3502 * IPython/ultraTB.py (VerboseTB.linereader): Improved handling of
3494 improperly defined user exceptions. Thanks to feedback from Mark
3503 improperly defined user exceptions. Thanks to feedback from Mark
3495 Russell <mrussell-AT-verio.net>.
3504 Russell <mrussell-AT-verio.net>.
3496
3505
3497 2003-08-20 Fernando Perez <fperez@colorado.edu>
3506 2003-08-20 Fernando Perez <fperez@colorado.edu>
3498
3507
3499 * IPython/OInspect.py (Inspector.pinfo): changed String Form
3508 * IPython/OInspect.py (Inspector.pinfo): changed String Form
3500 printing so that it would print multi-line string forms starting
3509 printing so that it would print multi-line string forms starting
3501 with a new line. This way the formatting is better respected for
3510 with a new line. This way the formatting is better respected for
3502 objects which work hard to make nice string forms.
3511 objects which work hard to make nice string forms.
3503
3512
3504 * IPython/iplib.py (InteractiveShell.handle_auto): Fix bug where
3513 * IPython/iplib.py (InteractiveShell.handle_auto): Fix bug where
3505 autocall would overtake data access for objects with both
3514 autocall would overtake data access for objects with both
3506 __getitem__ and __call__.
3515 __getitem__ and __call__.
3507
3516
3508 2003-08-19 *** Released version 0.5.0-rc1
3517 2003-08-19 *** Released version 0.5.0-rc1
3509
3518
3510 2003-08-19 Fernando Perez <fperez@colorado.edu>
3519 2003-08-19 Fernando Perez <fperez@colorado.edu>
3511
3520
3512 * IPython/deep_reload.py (load_tail): single tiny change here
3521 * IPython/deep_reload.py (load_tail): single tiny change here
3513 seems to fix the long-standing bug of dreload() failing to work
3522 seems to fix the long-standing bug of dreload() failing to work
3514 for dotted names. But this module is pretty tricky, so I may have
3523 for dotted names. But this module is pretty tricky, so I may have
3515 missed some subtlety. Needs more testing!.
3524 missed some subtlety. Needs more testing!.
3516
3525
3517 * IPython/ultraTB.py (VerboseTB.linereader): harden against user
3526 * IPython/ultraTB.py (VerboseTB.linereader): harden against user
3518 exceptions which have badly implemented __str__ methods.
3527 exceptions which have badly implemented __str__ methods.
3519 (VerboseTB.text): harden against inspect.getinnerframes crashing,
3528 (VerboseTB.text): harden against inspect.getinnerframes crashing,
3520 which I've been getting reports about from Python 2.3 users. I
3529 which I've been getting reports about from Python 2.3 users. I
3521 wish I had a simple test case to reproduce the problem, so I could
3530 wish I had a simple test case to reproduce the problem, so I could
3522 either write a cleaner workaround or file a bug report if
3531 either write a cleaner workaround or file a bug report if
3523 necessary.
3532 necessary.
3524
3533
3525 * IPython/Magic.py (Magic.magic_edit): fixed bug where after
3534 * IPython/Magic.py (Magic.magic_edit): fixed bug where after
3526 making a class 'foo', file 'foo.py' couldn't be edited. Thanks to
3535 making a class 'foo', file 'foo.py' couldn't be edited. Thanks to
3527 a bug report by Tjabo Kloppenburg.
3536 a bug report by Tjabo Kloppenburg.
3528
3537
3529 * IPython/ultraTB.py (VerboseTB.debugger): hardened against pdb
3538 * IPython/ultraTB.py (VerboseTB.debugger): hardened against pdb
3530 crashes. Wrapped the pdb call in a blanket try/except, since pdb
3539 crashes. Wrapped the pdb call in a blanket try/except, since pdb
3531 seems rather unstable. Thanks to a bug report by Tjabo
3540 seems rather unstable. Thanks to a bug report by Tjabo
3532 Kloppenburg <tjabo.kloppenburg-AT-unix-ag.uni-siegen.de>.
3541 Kloppenburg <tjabo.kloppenburg-AT-unix-ag.uni-siegen.de>.
3533
3542
3534 * IPython/Release.py (version): release 0.5.0-rc1. I want to put
3543 * IPython/Release.py (version): release 0.5.0-rc1. I want to put
3535 this out soon because of the critical fixes in the inner loop for
3544 this out soon because of the critical fixes in the inner loop for
3536 generators.
3545 generators.
3537
3546
3538 * IPython/Magic.py (Magic.getargspec): removed. This (and
3547 * IPython/Magic.py (Magic.getargspec): removed. This (and
3539 _get_def) have been obsoleted by OInspect for a long time, I
3548 _get_def) have been obsoleted by OInspect for a long time, I
3540 hadn't noticed that they were dead code.
3549 hadn't noticed that they were dead code.
3541 (Magic._ofind): restored _ofind functionality for a few literals
3550 (Magic._ofind): restored _ofind functionality for a few literals
3542 (those in ["''",'""','[]','{}','()']). But it won't work anymore
3551 (those in ["''",'""','[]','{}','()']). But it won't work anymore
3543 for things like "hello".capitalize?, since that would require a
3552 for things like "hello".capitalize?, since that would require a
3544 potentially dangerous eval() again.
3553 potentially dangerous eval() again.
3545
3554
3546 * IPython/iplib.py (InteractiveShell._prefilter): reorganized the
3555 * IPython/iplib.py (InteractiveShell._prefilter): reorganized the
3547 logic a bit more to clean up the escapes handling and minimize the
3556 logic a bit more to clean up the escapes handling and minimize the
3548 use of _ofind to only necessary cases. The interactive 'feel' of
3557 use of _ofind to only necessary cases. The interactive 'feel' of
3549 IPython should have improved quite a bit with the changes in
3558 IPython should have improved quite a bit with the changes in
3550 _prefilter and _ofind (besides being far safer than before).
3559 _prefilter and _ofind (besides being far safer than before).
3551
3560
3552 * IPython/Magic.py (Magic.magic_edit): Fixed old bug (but rather
3561 * IPython/Magic.py (Magic.magic_edit): Fixed old bug (but rather
3553 obscure, never reported). Edit would fail to find the object to
3562 obscure, never reported). Edit would fail to find the object to
3554 edit under some circumstances.
3563 edit under some circumstances.
3555 (Magic._ofind): CRITICAL FIX. Finally removed the eval() calls
3564 (Magic._ofind): CRITICAL FIX. Finally removed the eval() calls
3556 which were causing double-calling of generators. Those eval calls
3565 which were causing double-calling of generators. Those eval calls
3557 were _very_ dangerous, since code with side effects could be
3566 were _very_ dangerous, since code with side effects could be
3558 triggered. As they say, 'eval is evil'... These were the
3567 triggered. As they say, 'eval is evil'... These were the
3559 nastiest evals in IPython. Besides, _ofind is now far simpler,
3568 nastiest evals in IPython. Besides, _ofind is now far simpler,
3560 and it should also be quite a bit faster. Its use of inspect is
3569 and it should also be quite a bit faster. Its use of inspect is
3561 also safer, so perhaps some of the inspect-related crashes I've
3570 also safer, so perhaps some of the inspect-related crashes I've
3562 seen lately with Python 2.3 might be taken care of. That will
3571 seen lately with Python 2.3 might be taken care of. That will
3563 need more testing.
3572 need more testing.
3564
3573
3565 2003-08-17 Fernando Perez <fperez@colorado.edu>
3574 2003-08-17 Fernando Perez <fperez@colorado.edu>
3566
3575
3567 * IPython/iplib.py (InteractiveShell._prefilter): significant
3576 * IPython/iplib.py (InteractiveShell._prefilter): significant
3568 simplifications to the logic for handling user escapes. Faster
3577 simplifications to the logic for handling user escapes. Faster
3569 and simpler code.
3578 and simpler code.
3570
3579
3571 2003-08-14 Fernando Perez <fperez@colorado.edu>
3580 2003-08-14 Fernando Perez <fperez@colorado.edu>
3572
3581
3573 * IPython/numutils.py (sum_flat): rewrote to be non-recursive.
3582 * IPython/numutils.py (sum_flat): rewrote to be non-recursive.
3574 Now it requires O(N) storage (N=size(a)) for non-contiguous input,
3583 Now it requires O(N) storage (N=size(a)) for non-contiguous input,
3575 but it should be quite a bit faster. And the recursive version
3584 but it should be quite a bit faster. And the recursive version
3576 generated O(log N) intermediate storage for all rank>1 arrays,
3585 generated O(log N) intermediate storage for all rank>1 arrays,
3577 even if they were contiguous.
3586 even if they were contiguous.
3578 (l1norm): Added this function.
3587 (l1norm): Added this function.
3579 (norm): Added this function for arbitrary norms (including
3588 (norm): Added this function for arbitrary norms (including
3580 l-infinity). l1 and l2 are still special cases for convenience
3589 l-infinity). l1 and l2 are still special cases for convenience
3581 and speed.
3590 and speed.
3582
3591
3583 2003-08-03 Fernando Perez <fperez@colorado.edu>
3592 2003-08-03 Fernando Perez <fperez@colorado.edu>
3584
3593
3585 * IPython/Magic.py (Magic.magic_edit): Removed all remaining string
3594 * IPython/Magic.py (Magic.magic_edit): Removed all remaining string
3586 exceptions, which now raise PendingDeprecationWarnings in Python
3595 exceptions, which now raise PendingDeprecationWarnings in Python
3587 2.3. There were some in Magic and some in Gnuplot2.
3596 2.3. There were some in Magic and some in Gnuplot2.
3588
3597
3589 2003-06-30 Fernando Perez <fperez@colorado.edu>
3598 2003-06-30 Fernando Perez <fperez@colorado.edu>
3590
3599
3591 * IPython/genutils.py (page): modified to call curses only for
3600 * IPython/genutils.py (page): modified to call curses only for
3592 terminals where TERM=='xterm'. After problems under many other
3601 terminals where TERM=='xterm'. After problems under many other
3593 terminals were reported by Keith Beattie <KSBeattie-AT-lbl.gov>.
3602 terminals were reported by Keith Beattie <KSBeattie-AT-lbl.gov>.
3594
3603
3595 * IPython/iplib.py (complete): removed spurious 'print "IE"' which
3604 * IPython/iplib.py (complete): removed spurious 'print "IE"' which
3596 would be triggered when readline was absent. This was just an old
3605 would be triggered when readline was absent. This was just an old
3597 debugging statement I'd forgotten to take out.
3606 debugging statement I'd forgotten to take out.
3598
3607
3599 2003-06-20 Fernando Perez <fperez@colorado.edu>
3608 2003-06-20 Fernando Perez <fperez@colorado.edu>
3600
3609
3601 * IPython/genutils.py (clock): modified to return only user time
3610 * IPython/genutils.py (clock): modified to return only user time
3602 (not counting system time), after a discussion on scipy. While
3611 (not counting system time), after a discussion on scipy. While
3603 system time may be a useful quantity occasionally, it may much
3612 system time may be a useful quantity occasionally, it may much
3604 more easily be skewed by occasional swapping or other similar
3613 more easily be skewed by occasional swapping or other similar
3605 activity.
3614 activity.
3606
3615
3607 2003-06-05 Fernando Perez <fperez@colorado.edu>
3616 2003-06-05 Fernando Perez <fperez@colorado.edu>
3608
3617
3609 * IPython/numutils.py (identity): new function, for building
3618 * IPython/numutils.py (identity): new function, for building
3610 arbitrary rank Kronecker deltas (mostly backwards compatible with
3619 arbitrary rank Kronecker deltas (mostly backwards compatible with
3611 Numeric.identity)
3620 Numeric.identity)
3612
3621
3613 2003-06-03 Fernando Perez <fperez@colorado.edu>
3622 2003-06-03 Fernando Perez <fperez@colorado.edu>
3614
3623
3615 * IPython/iplib.py (InteractiveShell.handle_magic): protect
3624 * IPython/iplib.py (InteractiveShell.handle_magic): protect
3616 arguments passed to magics with spaces, to allow trailing '\' to
3625 arguments passed to magics with spaces, to allow trailing '\' to
3617 work normally (mainly for Windows users).
3626 work normally (mainly for Windows users).
3618
3627
3619 2003-05-29 Fernando Perez <fperez@colorado.edu>
3628 2003-05-29 Fernando Perez <fperez@colorado.edu>
3620
3629
3621 * IPython/ipmaker.py (make_IPython): Load site._Helper() as help
3630 * IPython/ipmaker.py (make_IPython): Load site._Helper() as help
3622 instead of pydoc.help. This fixes a bizarre behavior where
3631 instead of pydoc.help. This fixes a bizarre behavior where
3623 printing '%s' % locals() would trigger the help system. Now
3632 printing '%s' % locals() would trigger the help system. Now
3624 ipython behaves like normal python does.
3633 ipython behaves like normal python does.
3625
3634
3626 Note that if one does 'from pydoc import help', the bizarre
3635 Note that if one does 'from pydoc import help', the bizarre
3627 behavior returns, but this will also happen in normal python, so
3636 behavior returns, but this will also happen in normal python, so
3628 it's not an ipython bug anymore (it has to do with how pydoc.help
3637 it's not an ipython bug anymore (it has to do with how pydoc.help
3629 is implemented).
3638 is implemented).
3630
3639
3631 2003-05-22 Fernando Perez <fperez@colorado.edu>
3640 2003-05-22 Fernando Perez <fperez@colorado.edu>
3632
3641
3633 * IPython/FlexCompleter.py (Completer.attr_matches): fixed to
3642 * IPython/FlexCompleter.py (Completer.attr_matches): fixed to
3634 return [] instead of None when nothing matches, also match to end
3643 return [] instead of None when nothing matches, also match to end
3635 of line. Patch by Gary Bishop.
3644 of line. Patch by Gary Bishop.
3636
3645
3637 * IPython/ipmaker.py (make_IPython): Added same sys.excepthook
3646 * IPython/ipmaker.py (make_IPython): Added same sys.excepthook
3638 protection as before, for files passed on the command line. This
3647 protection as before, for files passed on the command line. This
3639 prevents the CrashHandler from kicking in if user files call into
3648 prevents the CrashHandler from kicking in if user files call into
3640 sys.excepthook (such as PyQt and WxWindows have a nasty habit of
3649 sys.excepthook (such as PyQt and WxWindows have a nasty habit of
3641 doing). After a report by Kasper Souren <Kasper.Souren-AT-ircam.fr>
3650 doing). After a report by Kasper Souren <Kasper.Souren-AT-ircam.fr>
3642
3651
3643 2003-05-20 *** Released version 0.4.0
3652 2003-05-20 *** Released version 0.4.0
3644
3653
3645 2003-05-20 Fernando Perez <fperez@colorado.edu>
3654 2003-05-20 Fernando Perez <fperez@colorado.edu>
3646
3655
3647 * setup.py: added support for manpages. It's a bit hackish b/c of
3656 * setup.py: added support for manpages. It's a bit hackish b/c of
3648 a bug in the way the bdist_rpm distutils target handles gzipped
3657 a bug in the way the bdist_rpm distutils target handles gzipped
3649 manpages, but it works. After a patch by Jack.
3658 manpages, but it works. After a patch by Jack.
3650
3659
3651 2003-05-19 Fernando Perez <fperez@colorado.edu>
3660 2003-05-19 Fernando Perez <fperez@colorado.edu>
3652
3661
3653 * IPython/numutils.py: added a mockup of the kinds module, since
3662 * IPython/numutils.py: added a mockup of the kinds module, since
3654 it was recently removed from Numeric. This way, numutils will
3663 it was recently removed from Numeric. This way, numutils will
3655 work for all users even if they are missing kinds.
3664 work for all users even if they are missing kinds.
3656
3665
3657 * IPython/Magic.py (Magic._ofind): Harden against an inspect
3666 * IPython/Magic.py (Magic._ofind): Harden against an inspect
3658 failure, which can occur with SWIG-wrapped extensions. After a
3667 failure, which can occur with SWIG-wrapped extensions. After a
3659 crash report from Prabhu.
3668 crash report from Prabhu.
3660
3669
3661 2003-05-16 Fernando Perez <fperez@colorado.edu>
3670 2003-05-16 Fernando Perez <fperez@colorado.edu>
3662
3671
3663 * IPython/iplib.py (InteractiveShell.excepthook): New method to
3672 * IPython/iplib.py (InteractiveShell.excepthook): New method to
3664 protect ipython from user code which may call directly
3673 protect ipython from user code which may call directly
3665 sys.excepthook (this looks like an ipython crash to the user, even
3674 sys.excepthook (this looks like an ipython crash to the user, even
3666 when it isn't). After a patch by Gary Bishop <gb-AT-cs.unc.edu>.
3675 when it isn't). After a patch by Gary Bishop <gb-AT-cs.unc.edu>.
3667 This is especially important to help users of WxWindows, but may
3676 This is especially important to help users of WxWindows, but may
3668 also be useful in other cases.
3677 also be useful in other cases.
3669
3678
3670 * IPython/ultraTB.py (AutoFormattedTB.__call__): Changed to allow
3679 * IPython/ultraTB.py (AutoFormattedTB.__call__): Changed to allow
3671 an optional tb_offset to be specified, and to preserve exception
3680 an optional tb_offset to be specified, and to preserve exception
3672 info if given. After a patch by Gary Bishop <gb-AT-cs.unc.edu>.
3681 info if given. After a patch by Gary Bishop <gb-AT-cs.unc.edu>.
3673
3682
3674 * ipython.1 (Default): Thanks to Jack's work, we now have manpages!
3683 * ipython.1 (Default): Thanks to Jack's work, we now have manpages!
3675
3684
3676 2003-05-15 Fernando Perez <fperez@colorado.edu>
3685 2003-05-15 Fernando Perez <fperez@colorado.edu>
3677
3686
3678 * IPython/iplib.py (InteractiveShell.user_setup): Fix crash when
3687 * IPython/iplib.py (InteractiveShell.user_setup): Fix crash when
3679 installing for a new user under Windows.
3688 installing for a new user under Windows.
3680
3689
3681 2003-05-12 Fernando Perez <fperez@colorado.edu>
3690 2003-05-12 Fernando Perez <fperez@colorado.edu>
3682
3691
3683 * IPython/iplib.py (InteractiveShell.handle_emacs): New line
3692 * IPython/iplib.py (InteractiveShell.handle_emacs): New line
3684 handler for Emacs comint-based lines. Currently it doesn't do
3693 handler for Emacs comint-based lines. Currently it doesn't do
3685 much (but importantly, it doesn't update the history cache). In
3694 much (but importantly, it doesn't update the history cache). In
3686 the future it may be expanded if Alex needs more functionality
3695 the future it may be expanded if Alex needs more functionality
3687 there.
3696 there.
3688
3697
3689 * IPython/CrashHandler.py (CrashHandler.__call__): Added platform
3698 * IPython/CrashHandler.py (CrashHandler.__call__): Added platform
3690 info to crash reports.
3699 info to crash reports.
3691
3700
3692 * IPython/iplib.py (InteractiveShell.mainloop): Added -c option,
3701 * IPython/iplib.py (InteractiveShell.mainloop): Added -c option,
3693 just like Python's -c. Also fixed crash with invalid -color
3702 just like Python's -c. Also fixed crash with invalid -color
3694 option value at startup. Thanks to Will French
3703 option value at startup. Thanks to Will French
3695 <wfrench-AT-bestweb.net> for the bug report.
3704 <wfrench-AT-bestweb.net> for the bug report.
3696
3705
3697 2003-05-09 Fernando Perez <fperez@colorado.edu>
3706 2003-05-09 Fernando Perez <fperez@colorado.edu>
3698
3707
3699 * IPython/genutils.py (EvalDict.__getitem__): Renamed EvalString
3708 * IPython/genutils.py (EvalDict.__getitem__): Renamed EvalString
3700 to EvalDict (it's a mapping, after all) and simplified its code
3709 to EvalDict (it's a mapping, after all) and simplified its code
3701 quite a bit, after a nice discussion on c.l.py where Gustavo
3710 quite a bit, after a nice discussion on c.l.py where Gustavo
3702 CΓ³rdova <gcordova-AT-sismex.com> suggested the new version.
3711 CΓ³rdova <gcordova-AT-sismex.com> suggested the new version.
3703
3712
3704 2003-04-30 Fernando Perez <fperez@colorado.edu>
3713 2003-04-30 Fernando Perez <fperez@colorado.edu>
3705
3714
3706 * IPython/genutils.py (timings_out): modified it to reduce its
3715 * IPython/genutils.py (timings_out): modified it to reduce its
3707 overhead in the common reps==1 case.
3716 overhead in the common reps==1 case.
3708
3717
3709 2003-04-29 Fernando Perez <fperez@colorado.edu>
3718 2003-04-29 Fernando Perez <fperez@colorado.edu>
3710
3719
3711 * IPython/genutils.py (timings_out): Modified to use the resource
3720 * IPython/genutils.py (timings_out): Modified to use the resource
3712 module, which avoids the wraparound problems of time.clock().
3721 module, which avoids the wraparound problems of time.clock().
3713
3722
3714 2003-04-17 *** Released version 0.2.15pre4
3723 2003-04-17 *** Released version 0.2.15pre4
3715
3724
3716 2003-04-17 Fernando Perez <fperez@colorado.edu>
3725 2003-04-17 Fernando Perez <fperez@colorado.edu>
3717
3726
3718 * setup.py (scriptfiles): Split windows-specific stuff over to a
3727 * setup.py (scriptfiles): Split windows-specific stuff over to a
3719 separate file, in an attempt to have a Windows GUI installer.
3728 separate file, in an attempt to have a Windows GUI installer.
3720 That didn't work, but part of the groundwork is done.
3729 That didn't work, but part of the groundwork is done.
3721
3730
3722 * IPython/UserConfig/ipythonrc: Added M-i, M-o and M-I for
3731 * IPython/UserConfig/ipythonrc: Added M-i, M-o and M-I for
3723 indent/unindent with 4 spaces. Particularly useful in combination
3732 indent/unindent with 4 spaces. Particularly useful in combination
3724 with the new auto-indent option.
3733 with the new auto-indent option.
3725
3734
3726 2003-04-16 Fernando Perez <fperez@colorado.edu>
3735 2003-04-16 Fernando Perez <fperez@colorado.edu>
3727
3736
3728 * IPython/Magic.py: various replacements of self.rc for
3737 * IPython/Magic.py: various replacements of self.rc for
3729 self.shell.rc. A lot more remains to be done to fully disentangle
3738 self.shell.rc. A lot more remains to be done to fully disentangle
3730 this class from the main Shell class.
3739 this class from the main Shell class.
3731
3740
3732 * IPython/GnuplotRuntime.py: added checks for mouse support so
3741 * IPython/GnuplotRuntime.py: added checks for mouse support so
3733 that we don't try to enable it if the current gnuplot doesn't
3742 that we don't try to enable it if the current gnuplot doesn't
3734 really support it. Also added checks so that we don't try to
3743 really support it. Also added checks so that we don't try to
3735 enable persist under Windows (where Gnuplot doesn't recognize the
3744 enable persist under Windows (where Gnuplot doesn't recognize the
3736 option).
3745 option).
3737
3746
3738 * IPython/iplib.py (InteractiveShell.interact): Added optional
3747 * IPython/iplib.py (InteractiveShell.interact): Added optional
3739 auto-indenting code, after a patch by King C. Shu
3748 auto-indenting code, after a patch by King C. Shu
3740 <kingshu-AT-myrealbox.com>. It's off by default because it doesn't
3749 <kingshu-AT-myrealbox.com>. It's off by default because it doesn't
3741 get along well with pasting indented code. If I ever figure out
3750 get along well with pasting indented code. If I ever figure out
3742 how to make that part go well, it will become on by default.
3751 how to make that part go well, it will become on by default.
3743
3752
3744 * IPython/Prompts.py (Prompt1.auto_rewrite): Fixed bug which would
3753 * IPython/Prompts.py (Prompt1.auto_rewrite): Fixed bug which would
3745 crash ipython if there was an unmatched '%' in the user's prompt
3754 crash ipython if there was an unmatched '%' in the user's prompt
3746 string. Reported by Thorsten Kampe <thorsten-AT-thorstenkampe.de>.
3755 string. Reported by Thorsten Kampe <thorsten-AT-thorstenkampe.de>.
3747
3756
3748 * IPython/iplib.py (InteractiveShell.interact): removed the
3757 * IPython/iplib.py (InteractiveShell.interact): removed the
3749 ability to ask the user whether he wants to crash or not at the
3758 ability to ask the user whether he wants to crash or not at the
3750 'last line' exception handler. Calling functions at that point
3759 'last line' exception handler. Calling functions at that point
3751 changes the stack, and the error reports would have incorrect
3760 changes the stack, and the error reports would have incorrect
3752 tracebacks.
3761 tracebacks.
3753
3762
3754 * IPython/Magic.py (Magic.magic_page): Added new @page magic, to
3763 * IPython/Magic.py (Magic.magic_page): Added new @page magic, to
3755 pass through a peger a pretty-printed form of any object. After a
3764 pass through a peger a pretty-printed form of any object. After a
3756 contribution by Olivier Aubert <oaubert-AT-bat710.univ-lyon1.fr>
3765 contribution by Olivier Aubert <oaubert-AT-bat710.univ-lyon1.fr>
3757
3766
3758 2003-04-14 Fernando Perez <fperez@colorado.edu>
3767 2003-04-14 Fernando Perez <fperez@colorado.edu>
3759
3768
3760 * IPython/iplib.py (InteractiveShell.user_setup): Fixed bug where
3769 * IPython/iplib.py (InteractiveShell.user_setup): Fixed bug where
3761 all files in ~ would be modified at first install (instead of
3770 all files in ~ would be modified at first install (instead of
3762 ~/.ipython). This could be potentially disastrous, as the
3771 ~/.ipython). This could be potentially disastrous, as the
3763 modification (make line-endings native) could damage binary files.
3772 modification (make line-endings native) could damage binary files.
3764
3773
3765 2003-04-10 Fernando Perez <fperez@colorado.edu>
3774 2003-04-10 Fernando Perez <fperez@colorado.edu>
3766
3775
3767 * IPython/iplib.py (InteractiveShell.handle_help): Modified to
3776 * IPython/iplib.py (InteractiveShell.handle_help): Modified to
3768 handle only lines which are invalid python. This now means that
3777 handle only lines which are invalid python. This now means that
3769 lines like 'x=1 #?' execute properly. Thanks to Jeffery Collins
3778 lines like 'x=1 #?' execute properly. Thanks to Jeffery Collins
3770 for the bug report.
3779 for the bug report.
3771
3780
3772 2003-04-01 Fernando Perez <fperez@colorado.edu>
3781 2003-04-01 Fernando Perez <fperez@colorado.edu>
3773
3782
3774 * IPython/iplib.py (InteractiveShell.showtraceback): Fixed bug
3783 * IPython/iplib.py (InteractiveShell.showtraceback): Fixed bug
3775 where failing to set sys.last_traceback would crash pdb.pm().
3784 where failing to set sys.last_traceback would crash pdb.pm().
3776 Thanks to Jeffery D. Collins <Jeff.Collins-AT-vexcel.com> for the bug
3785 Thanks to Jeffery D. Collins <Jeff.Collins-AT-vexcel.com> for the bug
3777 report.
3786 report.
3778
3787
3779 2003-03-25 Fernando Perez <fperez@colorado.edu>
3788 2003-03-25 Fernando Perez <fperez@colorado.edu>
3780
3789
3781 * IPython/Magic.py (Magic.magic_prun): rstrip() output of profiler
3790 * IPython/Magic.py (Magic.magic_prun): rstrip() output of profiler
3782 before printing it (it had a lot of spurious blank lines at the
3791 before printing it (it had a lot of spurious blank lines at the
3783 end).
3792 end).
3784
3793
3785 * IPython/Gnuplot2.py (Gnuplot.hardcopy): fixed bug where lpr
3794 * IPython/Gnuplot2.py (Gnuplot.hardcopy): fixed bug where lpr
3786 output would be sent 21 times! Obviously people don't use this
3795 output would be sent 21 times! Obviously people don't use this
3787 too often, or I would have heard about it.
3796 too often, or I would have heard about it.
3788
3797
3789 2003-03-24 Fernando Perez <fperez@colorado.edu>
3798 2003-03-24 Fernando Perez <fperez@colorado.edu>
3790
3799
3791 * setup.py (scriptfiles): renamed the data_files parameter from
3800 * setup.py (scriptfiles): renamed the data_files parameter from
3792 'base' to 'data' to fix rpm build issues. Thanks to Ralf Ahlbrink
3801 'base' to 'data' to fix rpm build issues. Thanks to Ralf Ahlbrink
3793 for the patch.
3802 for the patch.
3794
3803
3795 2003-03-20 Fernando Perez <fperez@colorado.edu>
3804 2003-03-20 Fernando Perez <fperez@colorado.edu>
3796
3805
3797 * IPython/genutils.py (error): added error() and fatal()
3806 * IPython/genutils.py (error): added error() and fatal()
3798 functions.
3807 functions.
3799
3808
3800 2003-03-18 *** Released version 0.2.15pre3
3809 2003-03-18 *** Released version 0.2.15pre3
3801
3810
3802 2003-03-18 Fernando Perez <fperez@colorado.edu>
3811 2003-03-18 Fernando Perez <fperez@colorado.edu>
3803
3812
3804 * setupext/install_data_ext.py
3813 * setupext/install_data_ext.py
3805 (install_data_ext.initialize_options): Class contributed by Jack
3814 (install_data_ext.initialize_options): Class contributed by Jack
3806 Moffit for fixing the old distutils hack. He is sending this to
3815 Moffit for fixing the old distutils hack. He is sending this to
3807 the distutils folks so in the future we may not need it as a
3816 the distutils folks so in the future we may not need it as a
3808 private fix.
3817 private fix.
3809
3818
3810 * MANIFEST.in: Extensive reorganization, based on Jack Moffit's
3819 * MANIFEST.in: Extensive reorganization, based on Jack Moffit's
3811 changes for Debian packaging. See his patch for full details.
3820 changes for Debian packaging. See his patch for full details.
3812 The old distutils hack of making the ipythonrc* files carry a
3821 The old distutils hack of making the ipythonrc* files carry a
3813 bogus .py extension is gone, at last. Examples were moved to a
3822 bogus .py extension is gone, at last. Examples were moved to a
3814 separate subdir under doc/, and the separate executable scripts
3823 separate subdir under doc/, and the separate executable scripts
3815 now live in their own directory. Overall a great cleanup. The
3824 now live in their own directory. Overall a great cleanup. The
3816 manual was updated to use the new files, and setup.py has been
3825 manual was updated to use the new files, and setup.py has been
3817 fixed for this setup.
3826 fixed for this setup.
3818
3827
3819 * IPython/PyColorize.py (Parser.usage): made non-executable and
3828 * IPython/PyColorize.py (Parser.usage): made non-executable and
3820 created a pycolor wrapper around it to be included as a script.
3829 created a pycolor wrapper around it to be included as a script.
3821
3830
3822 2003-03-12 *** Released version 0.2.15pre2
3831 2003-03-12 *** Released version 0.2.15pre2
3823
3832
3824 2003-03-12 Fernando Perez <fperez@colorado.edu>
3833 2003-03-12 Fernando Perez <fperez@colorado.edu>
3825
3834
3826 * IPython/ColorANSI.py (make_color_table): Finally fixed the
3835 * IPython/ColorANSI.py (make_color_table): Finally fixed the
3827 long-standing problem with garbage characters in some terminals.
3836 long-standing problem with garbage characters in some terminals.
3828 The issue was really that the \001 and \002 escapes must _only_ be
3837 The issue was really that the \001 and \002 escapes must _only_ be
3829 passed to input prompts (which call readline), but _never_ to
3838 passed to input prompts (which call readline), but _never_ to
3830 normal text to be printed on screen. I changed ColorANSI to have
3839 normal text to be printed on screen. I changed ColorANSI to have
3831 two classes: TermColors and InputTermColors, each with the
3840 two classes: TermColors and InputTermColors, each with the
3832 appropriate escapes for input prompts or normal text. The code in
3841 appropriate escapes for input prompts or normal text. The code in
3833 Prompts.py got slightly more complicated, but this very old and
3842 Prompts.py got slightly more complicated, but this very old and
3834 annoying bug is finally fixed.
3843 annoying bug is finally fixed.
3835
3844
3836 All the credit for nailing down the real origin of this problem
3845 All the credit for nailing down the real origin of this problem
3837 and the correct solution goes to Jack Moffit <jack-AT-xiph.org>.
3846 and the correct solution goes to Jack Moffit <jack-AT-xiph.org>.
3838 *Many* thanks to him for spending quite a bit of effort on this.
3847 *Many* thanks to him for spending quite a bit of effort on this.
3839
3848
3840 2003-03-05 *** Released version 0.2.15pre1
3849 2003-03-05 *** Released version 0.2.15pre1
3841
3850
3842 2003-03-03 Fernando Perez <fperez@colorado.edu>
3851 2003-03-03 Fernando Perez <fperez@colorado.edu>
3843
3852
3844 * IPython/FakeModule.py: Moved the former _FakeModule to a
3853 * IPython/FakeModule.py: Moved the former _FakeModule to a
3845 separate file, because it's also needed by Magic (to fix a similar
3854 separate file, because it's also needed by Magic (to fix a similar
3846 pickle-related issue in @run).
3855 pickle-related issue in @run).
3847
3856
3848 2003-03-02 Fernando Perez <fperez@colorado.edu>
3857 2003-03-02 Fernando Perez <fperez@colorado.edu>
3849
3858
3850 * IPython/Magic.py (Magic.magic_autocall): new magic to control
3859 * IPython/Magic.py (Magic.magic_autocall): new magic to control
3851 the autocall option at runtime.
3860 the autocall option at runtime.
3852 (Magic.magic_dhist): changed self.user_ns to self.shell.user_ns
3861 (Magic.magic_dhist): changed self.user_ns to self.shell.user_ns
3853 across Magic.py to start separating Magic from InteractiveShell.
3862 across Magic.py to start separating Magic from InteractiveShell.
3854 (Magic._ofind): Fixed to return proper namespace for dotted
3863 (Magic._ofind): Fixed to return proper namespace for dotted
3855 names. Before, a dotted name would always return 'not currently
3864 names. Before, a dotted name would always return 'not currently
3856 defined', because it would find the 'parent'. s.x would be found,
3865 defined', because it would find the 'parent'. s.x would be found,
3857 but since 'x' isn't defined by itself, it would get confused.
3866 but since 'x' isn't defined by itself, it would get confused.
3858 (Magic.magic_run): Fixed pickling problems reported by Ralf
3867 (Magic.magic_run): Fixed pickling problems reported by Ralf
3859 Ahlbrink <RAhlbrink-AT-RosenInspection.net>. The fix was similar to
3868 Ahlbrink <RAhlbrink-AT-RosenInspection.net>. The fix was similar to
3860 that I'd used when Mike Heeter reported similar issues at the
3869 that I'd used when Mike Heeter reported similar issues at the
3861 top-level, but now for @run. It boils down to injecting the
3870 top-level, but now for @run. It boils down to injecting the
3862 namespace where code is being executed with something that looks
3871 namespace where code is being executed with something that looks
3863 enough like a module to fool pickle.dump(). Since a pickle stores
3872 enough like a module to fool pickle.dump(). Since a pickle stores
3864 a named reference to the importing module, we need this for
3873 a named reference to the importing module, we need this for
3865 pickles to save something sensible.
3874 pickles to save something sensible.
3866
3875
3867 * IPython/ipmaker.py (make_IPython): added an autocall option.
3876 * IPython/ipmaker.py (make_IPython): added an autocall option.
3868
3877
3869 * IPython/iplib.py (InteractiveShell._prefilter): reordered all of
3878 * IPython/iplib.py (InteractiveShell._prefilter): reordered all of
3870 the auto-eval code. Now autocalling is an option, and the code is
3879 the auto-eval code. Now autocalling is an option, and the code is
3871 also vastly safer. There is no more eval() involved at all.
3880 also vastly safer. There is no more eval() involved at all.
3872
3881
3873 2003-03-01 Fernando Perez <fperez@colorado.edu>
3882 2003-03-01 Fernando Perez <fperez@colorado.edu>
3874
3883
3875 * IPython/Magic.py (Magic._ofind): Changed interface to return a
3884 * IPython/Magic.py (Magic._ofind): Changed interface to return a
3876 dict with named keys instead of a tuple.
3885 dict with named keys instead of a tuple.
3877
3886
3878 * IPython: Started using CVS for IPython as of 0.2.15pre1.
3887 * IPython: Started using CVS for IPython as of 0.2.15pre1.
3879
3888
3880 * setup.py (make_shortcut): Fixed message about directories
3889 * setup.py (make_shortcut): Fixed message about directories
3881 created during Windows installation (the directories were ok, just
3890 created during Windows installation (the directories were ok, just
3882 the printed message was misleading). Thanks to Chris Liechti
3891 the printed message was misleading). Thanks to Chris Liechti
3883 <cliechti-AT-gmx.net> for the heads up.
3892 <cliechti-AT-gmx.net> for the heads up.
3884
3893
3885 2003-02-21 Fernando Perez <fperez@colorado.edu>
3894 2003-02-21 Fernando Perez <fperez@colorado.edu>
3886
3895
3887 * IPython/iplib.py (InteractiveShell._prefilter): Fixed catching
3896 * IPython/iplib.py (InteractiveShell._prefilter): Fixed catching
3888 of ValueError exception when checking for auto-execution. This
3897 of ValueError exception when checking for auto-execution. This
3889 one is raised by things like Numeric arrays arr.flat when the
3898 one is raised by things like Numeric arrays arr.flat when the
3890 array is non-contiguous.
3899 array is non-contiguous.
3891
3900
3892 2003-01-31 Fernando Perez <fperez@colorado.edu>
3901 2003-01-31 Fernando Perez <fperez@colorado.edu>
3893
3902
3894 * IPython/genutils.py (SystemExec.bq): Fixed bug where bq would
3903 * IPython/genutils.py (SystemExec.bq): Fixed bug where bq would
3895 not return any value at all (even though the command would get
3904 not return any value at all (even though the command would get
3896 executed).
3905 executed).
3897 (xsys): Flush stdout right after printing the command to ensure
3906 (xsys): Flush stdout right after printing the command to ensure
3898 proper ordering of commands and command output in the total
3907 proper ordering of commands and command output in the total
3899 output.
3908 output.
3900 (SystemExec/xsys/bq): Switched the names of xsys/bq and
3909 (SystemExec/xsys/bq): Switched the names of xsys/bq and
3901 system/getoutput as defaults. The old ones are kept for
3910 system/getoutput as defaults. The old ones are kept for
3902 compatibility reasons, so no code which uses this library needs
3911 compatibility reasons, so no code which uses this library needs
3903 changing.
3912 changing.
3904
3913
3905 2003-01-27 *** Released version 0.2.14
3914 2003-01-27 *** Released version 0.2.14
3906
3915
3907 2003-01-25 Fernando Perez <fperez@colorado.edu>
3916 2003-01-25 Fernando Perez <fperez@colorado.edu>
3908
3917
3909 * IPython/Magic.py (Magic.magic_edit): Fixed problem where
3918 * IPython/Magic.py (Magic.magic_edit): Fixed problem where
3910 functions defined in previous edit sessions could not be re-edited
3919 functions defined in previous edit sessions could not be re-edited
3911 (because the temp files were immediately removed). Now temp files
3920 (because the temp files were immediately removed). Now temp files
3912 are removed only at IPython's exit.
3921 are removed only at IPython's exit.
3913 (Magic.magic_run): Improved @run to perform shell-like expansions
3922 (Magic.magic_run): Improved @run to perform shell-like expansions
3914 on its arguments (~users and $VARS). With this, @run becomes more
3923 on its arguments (~users and $VARS). With this, @run becomes more
3915 like a normal command-line.
3924 like a normal command-line.
3916
3925
3917 * IPython/Shell.py (IPShellEmbed.__call__): Fixed a bunch of small
3926 * IPython/Shell.py (IPShellEmbed.__call__): Fixed a bunch of small
3918 bugs related to embedding and cleaned up that code. A fairly
3927 bugs related to embedding and cleaned up that code. A fairly
3919 important one was the impossibility to access the global namespace
3928 important one was the impossibility to access the global namespace
3920 through the embedded IPython (only local variables were visible).
3929 through the embedded IPython (only local variables were visible).
3921
3930
3922 2003-01-14 Fernando Perez <fperez@colorado.edu>
3931 2003-01-14 Fernando Perez <fperez@colorado.edu>
3923
3932
3924 * IPython/iplib.py (InteractiveShell._prefilter): Fixed
3933 * IPython/iplib.py (InteractiveShell._prefilter): Fixed
3925 auto-calling to be a bit more conservative. Now it doesn't get
3934 auto-calling to be a bit more conservative. Now it doesn't get
3926 triggered if any of '!=()<>' are in the rest of the input line, to
3935 triggered if any of '!=()<>' are in the rest of the input line, to
3927 allow comparing callables. Thanks to Alex for the heads up.
3936 allow comparing callables. Thanks to Alex for the heads up.
3928
3937
3929 2003-01-07 Fernando Perez <fperez@colorado.edu>
3938 2003-01-07 Fernando Perez <fperez@colorado.edu>
3930
3939
3931 * IPython/genutils.py (page): fixed estimation of the number of
3940 * IPython/genutils.py (page): fixed estimation of the number of
3932 lines in a string to be paged to simply count newlines. This
3941 lines in a string to be paged to simply count newlines. This
3933 prevents over-guessing due to embedded escape sequences. A better
3942 prevents over-guessing due to embedded escape sequences. A better
3934 long-term solution would involve stripping out the control chars
3943 long-term solution would involve stripping out the control chars
3935 for the count, but it's potentially so expensive I just don't
3944 for the count, but it's potentially so expensive I just don't
3936 think it's worth doing.
3945 think it's worth doing.
3937
3946
3938 2002-12-19 *** Released version 0.2.14pre50
3947 2002-12-19 *** Released version 0.2.14pre50
3939
3948
3940 2002-12-19 Fernando Perez <fperez@colorado.edu>
3949 2002-12-19 Fernando Perez <fperez@colorado.edu>
3941
3950
3942 * tools/release (version): Changed release scripts to inform
3951 * tools/release (version): Changed release scripts to inform
3943 Andrea and build a NEWS file with a list of recent changes.
3952 Andrea and build a NEWS file with a list of recent changes.
3944
3953
3945 * IPython/ColorANSI.py (__all__): changed terminal detection
3954 * IPython/ColorANSI.py (__all__): changed terminal detection
3946 code. Seems to work better for xterms without breaking
3955 code. Seems to work better for xterms without breaking
3947 konsole. Will need more testing to determine if WinXP and Mac OSX
3956 konsole. Will need more testing to determine if WinXP and Mac OSX
3948 also work ok.
3957 also work ok.
3949
3958
3950 2002-12-18 *** Released version 0.2.14pre49
3959 2002-12-18 *** Released version 0.2.14pre49
3951
3960
3952 2002-12-18 Fernando Perez <fperez@colorado.edu>
3961 2002-12-18 Fernando Perez <fperez@colorado.edu>
3953
3962
3954 * Docs: added new info about Mac OSX, from Andrea.
3963 * Docs: added new info about Mac OSX, from Andrea.
3955
3964
3956 * IPython/Gnuplot2.py (String): Added a String PlotItem class to
3965 * IPython/Gnuplot2.py (String): Added a String PlotItem class to
3957 allow direct plotting of python strings whose format is the same
3966 allow direct plotting of python strings whose format is the same
3958 of gnuplot data files.
3967 of gnuplot data files.
3959
3968
3960 2002-12-16 Fernando Perez <fperez@colorado.edu>
3969 2002-12-16 Fernando Perez <fperez@colorado.edu>
3961
3970
3962 * IPython/iplib.py (InteractiveShell.interact): fixed default (y)
3971 * IPython/iplib.py (InteractiveShell.interact): fixed default (y)
3963 value of exit question to be acknowledged.
3972 value of exit question to be acknowledged.
3964
3973
3965 2002-12-03 Fernando Perez <fperez@colorado.edu>
3974 2002-12-03 Fernando Perez <fperez@colorado.edu>
3966
3975
3967 * IPython/ipmaker.py: removed generators, which had been added
3976 * IPython/ipmaker.py: removed generators, which had been added
3968 by mistake in an earlier debugging run. This was causing trouble
3977 by mistake in an earlier debugging run. This was causing trouble
3969 to users of python 2.1.x. Thanks to Abel Daniel <abli-AT-freemail.hu>
3978 to users of python 2.1.x. Thanks to Abel Daniel <abli-AT-freemail.hu>
3970 for pointing this out.
3979 for pointing this out.
3971
3980
3972 2002-11-17 Fernando Perez <fperez@colorado.edu>
3981 2002-11-17 Fernando Perez <fperez@colorado.edu>
3973
3982
3974 * Manual: updated the Gnuplot section.
3983 * Manual: updated the Gnuplot section.
3975
3984
3976 * IPython/GnuplotRuntime.py: refactored a lot all this code, with
3985 * IPython/GnuplotRuntime.py: refactored a lot all this code, with
3977 a much better split of what goes in Runtime and what goes in
3986 a much better split of what goes in Runtime and what goes in
3978 Interactive.
3987 Interactive.
3979
3988
3980 * IPython/ipmaker.py: fixed bug where import_fail_info wasn't
3989 * IPython/ipmaker.py: fixed bug where import_fail_info wasn't
3981 being imported from iplib.
3990 being imported from iplib.
3982
3991
3983 * IPython/GnuplotInteractive.py (magic_gpc): renamed @gp to @gpc
3992 * IPython/GnuplotInteractive.py (magic_gpc): renamed @gp to @gpc
3984 for command-passing. Now the global Gnuplot instance is called
3993 for command-passing. Now the global Gnuplot instance is called
3985 'gp' instead of 'g', which was really a far too fragile and
3994 'gp' instead of 'g', which was really a far too fragile and
3986 common name.
3995 common name.
3987
3996
3988 * IPython/Gnuplot2.py (eps_fix_bbox): added this to fix broken
3997 * IPython/Gnuplot2.py (eps_fix_bbox): added this to fix broken
3989 bounding boxes generated by Gnuplot for square plots.
3998 bounding boxes generated by Gnuplot for square plots.
3990
3999
3991 * IPython/genutils.py (popkey): new function added. I should
4000 * IPython/genutils.py (popkey): new function added. I should
3992 suggest this on c.l.py as a dict method, it seems useful.
4001 suggest this on c.l.py as a dict method, it seems useful.
3993
4002
3994 * IPython/Gnuplot2.py (Gnuplot.plot): Overhauled plot and replot
4003 * IPython/Gnuplot2.py (Gnuplot.plot): Overhauled plot and replot
3995 to transparently handle PostScript generation. MUCH better than
4004 to transparently handle PostScript generation. MUCH better than
3996 the previous plot_eps/replot_eps (which I removed now). The code
4005 the previous plot_eps/replot_eps (which I removed now). The code
3997 is also fairly clean and well documented now (including
4006 is also fairly clean and well documented now (including
3998 docstrings).
4007 docstrings).
3999
4008
4000 2002-11-13 Fernando Perez <fperez@colorado.edu>
4009 2002-11-13 Fernando Perez <fperez@colorado.edu>
4001
4010
4002 * IPython/Magic.py (Magic.magic_edit): fixed docstring
4011 * IPython/Magic.py (Magic.magic_edit): fixed docstring
4003 (inconsistent with options).
4012 (inconsistent with options).
4004
4013
4005 * IPython/Gnuplot2.py (Gnuplot.hardcopy): hardcopy had been
4014 * IPython/Gnuplot2.py (Gnuplot.hardcopy): hardcopy had been
4006 manually disabled, I don't know why. Fixed it.
4015 manually disabled, I don't know why. Fixed it.
4007 (Gnuplot._plot_eps): added new plot_eps/replot_eps to get directly
4016 (Gnuplot._plot_eps): added new plot_eps/replot_eps to get directly
4008 eps output.
4017 eps output.
4009
4018
4010 2002-11-12 Fernando Perez <fperez@colorado.edu>
4019 2002-11-12 Fernando Perez <fperez@colorado.edu>
4011
4020
4012 * IPython/genutils.py (ask_yes_no): trap EOF and ^C so that they
4021 * IPython/genutils.py (ask_yes_no): trap EOF and ^C so that they
4013 don't propagate up to caller. Fixes crash reported by François
4022 don't propagate up to caller. Fixes crash reported by François
4014 Pinard.
4023 Pinard.
4015
4024
4016 2002-11-09 Fernando Perez <fperez@colorado.edu>
4025 2002-11-09 Fernando Perez <fperez@colorado.edu>
4017
4026
4018 * IPython/ipmaker.py (make_IPython): fixed problem with writing
4027 * IPython/ipmaker.py (make_IPython): fixed problem with writing
4019 history file for new users.
4028 history file for new users.
4020 (make_IPython): fixed bug where initial install would leave the
4029 (make_IPython): fixed bug where initial install would leave the
4021 user running in the .ipython dir.
4030 user running in the .ipython dir.
4022 (make_IPython): fixed bug where config dir .ipython would be
4031 (make_IPython): fixed bug where config dir .ipython would be
4023 created regardless of the given -ipythondir option. Thanks to Cory
4032 created regardless of the given -ipythondir option. Thanks to Cory
4024 Dodt <cdodt-AT-fcoe.k12.ca.us> for the bug report.
4033 Dodt <cdodt-AT-fcoe.k12.ca.us> for the bug report.
4025
4034
4026 * IPython/genutils.py (ask_yes_no): new function for asking yes/no
4035 * IPython/genutils.py (ask_yes_no): new function for asking yes/no
4027 type confirmations. Will need to use it in all of IPython's code
4036 type confirmations. Will need to use it in all of IPython's code
4028 consistently.
4037 consistently.
4029
4038
4030 * IPython/CrashHandler.py (CrashHandler.__call__): changed the
4039 * IPython/CrashHandler.py (CrashHandler.__call__): changed the
4031 context to print 31 lines instead of the default 5. This will make
4040 context to print 31 lines instead of the default 5. This will make
4032 the crash reports extremely detailed in case the problem is in
4041 the crash reports extremely detailed in case the problem is in
4033 libraries I don't have access to.
4042 libraries I don't have access to.
4034
4043
4035 * IPython/iplib.py (InteractiveShell.interact): changed the 'last
4044 * IPython/iplib.py (InteractiveShell.interact): changed the 'last
4036 line of defense' code to still crash, but giving users fair
4045 line of defense' code to still crash, but giving users fair
4037 warning. I don't want internal errors to go unreported: if there's
4046 warning. I don't want internal errors to go unreported: if there's
4038 an internal problem, IPython should crash and generate a full
4047 an internal problem, IPython should crash and generate a full
4039 report.
4048 report.
4040
4049
4041 2002-11-08 Fernando Perez <fperez@colorado.edu>
4050 2002-11-08 Fernando Perez <fperez@colorado.edu>
4042
4051
4043 * IPython/iplib.py (InteractiveShell.interact): added code to trap
4052 * IPython/iplib.py (InteractiveShell.interact): added code to trap
4044 otherwise uncaught exceptions which can appear if people set
4053 otherwise uncaught exceptions which can appear if people set
4045 sys.stdout to something badly broken. Thanks to a crash report
4054 sys.stdout to something badly broken. Thanks to a crash report
4046 from henni-AT-mail.brainbot.com.
4055 from henni-AT-mail.brainbot.com.
4047
4056
4048 2002-11-04 Fernando Perez <fperez@colorado.edu>
4057 2002-11-04 Fernando Perez <fperez@colorado.edu>
4049
4058
4050 * IPython/iplib.py (InteractiveShell.interact): added
4059 * IPython/iplib.py (InteractiveShell.interact): added
4051 __IPYTHON__active to the builtins. It's a flag which goes on when
4060 __IPYTHON__active to the builtins. It's a flag which goes on when
4052 the interaction starts and goes off again when it stops. This
4061 the interaction starts and goes off again when it stops. This
4053 allows embedding code to detect being inside IPython. Before this
4062 allows embedding code to detect being inside IPython. Before this
4054 was done via __IPYTHON__, but that only shows that an IPython
4063 was done via __IPYTHON__, but that only shows that an IPython
4055 instance has been created.
4064 instance has been created.
4056
4065
4057 * IPython/Magic.py (Magic.magic_env): I realized that in a
4066 * IPython/Magic.py (Magic.magic_env): I realized that in a
4058 UserDict, instance.data holds the data as a normal dict. So I
4067 UserDict, instance.data holds the data as a normal dict. So I
4059 modified @env to return os.environ.data instead of rebuilding a
4068 modified @env to return os.environ.data instead of rebuilding a
4060 dict by hand.
4069 dict by hand.
4061
4070
4062 2002-11-02 Fernando Perez <fperez@colorado.edu>
4071 2002-11-02 Fernando Perez <fperez@colorado.edu>
4063
4072
4064 * IPython/genutils.py (warn): changed so that level 1 prints no
4073 * IPython/genutils.py (warn): changed so that level 1 prints no
4065 header. Level 2 is now the default (with 'WARNING' header, as
4074 header. Level 2 is now the default (with 'WARNING' header, as
4066 before). I think I tracked all places where changes were needed in
4075 before). I think I tracked all places where changes were needed in
4067 IPython, but outside code using the old level numbering may have
4076 IPython, but outside code using the old level numbering may have
4068 broken.
4077 broken.
4069
4078
4070 * IPython/iplib.py (InteractiveShell.runcode): added this to
4079 * IPython/iplib.py (InteractiveShell.runcode): added this to
4071 handle the tracebacks in SystemExit traps correctly. The previous
4080 handle the tracebacks in SystemExit traps correctly. The previous
4072 code (through interact) was printing more of the stack than
4081 code (through interact) was printing more of the stack than
4073 necessary, showing IPython internal code to the user.
4082 necessary, showing IPython internal code to the user.
4074
4083
4075 * IPython/UserConfig/ipythonrc.py: Made confirm_exit 1 by
4084 * IPython/UserConfig/ipythonrc.py: Made confirm_exit 1 by
4076 default. Now that the default at the confirmation prompt is yes,
4085 default. Now that the default at the confirmation prompt is yes,
4077 it's not so intrusive. François' argument that ipython sessions
4086 it's not so intrusive. François' argument that ipython sessions
4078 tend to be complex enough not to lose them from an accidental C-d,
4087 tend to be complex enough not to lose them from an accidental C-d,
4079 is a valid one.
4088 is a valid one.
4080
4089
4081 * IPython/iplib.py (InteractiveShell.interact): added a
4090 * IPython/iplib.py (InteractiveShell.interact): added a
4082 showtraceback() call to the SystemExit trap, and modified the exit
4091 showtraceback() call to the SystemExit trap, and modified the exit
4083 confirmation to have yes as the default.
4092 confirmation to have yes as the default.
4084
4093
4085 * IPython/UserConfig/ipythonrc.py: removed 'session' option from
4094 * IPython/UserConfig/ipythonrc.py: removed 'session' option from
4086 this file. It's been gone from the code for a long time, this was
4095 this file. It's been gone from the code for a long time, this was
4087 simply leftover junk.
4096 simply leftover junk.
4088
4097
4089 2002-11-01 Fernando Perez <fperez@colorado.edu>
4098 2002-11-01 Fernando Perez <fperez@colorado.edu>
4090
4099
4091 * IPython/UserConfig/ipythonrc.py: new confirm_exit option
4100 * IPython/UserConfig/ipythonrc.py: new confirm_exit option
4092 added. If set, IPython now traps EOF and asks for
4101 added. If set, IPython now traps EOF and asks for
4093 confirmation. After a request by François Pinard.
4102 confirmation. After a request by François Pinard.
4094
4103
4095 * IPython/Magic.py (Magic.magic_Exit): New @Exit and @Quit instead
4104 * IPython/Magic.py (Magic.magic_Exit): New @Exit and @Quit instead
4096 of @abort, and with a new (better) mechanism for handling the
4105 of @abort, and with a new (better) mechanism for handling the
4097 exceptions.
4106 exceptions.
4098
4107
4099 2002-10-27 Fernando Perez <fperez@colorado.edu>
4108 2002-10-27 Fernando Perez <fperez@colorado.edu>
4100
4109
4101 * IPython/usage.py (__doc__): updated the --help information and
4110 * IPython/usage.py (__doc__): updated the --help information and
4102 the ipythonrc file to indicate that -log generates
4111 the ipythonrc file to indicate that -log generates
4103 ./ipython.log. Also fixed the corresponding info in @logstart.
4112 ./ipython.log. Also fixed the corresponding info in @logstart.
4104 This and several other fixes in the manuals thanks to reports by
4113 This and several other fixes in the manuals thanks to reports by
4105 François Pinard <pinard-AT-iro.umontreal.ca>.
4114 François Pinard <pinard-AT-iro.umontreal.ca>.
4106
4115
4107 * IPython/Logger.py (Logger.switch_log): Fixed error message to
4116 * IPython/Logger.py (Logger.switch_log): Fixed error message to
4108 refer to @logstart (instead of @log, which doesn't exist).
4117 refer to @logstart (instead of @log, which doesn't exist).
4109
4118
4110 * IPython/iplib.py (InteractiveShell._prefilter): fixed
4119 * IPython/iplib.py (InteractiveShell._prefilter): fixed
4111 AttributeError crash. Thanks to Christopher Armstrong
4120 AttributeError crash. Thanks to Christopher Armstrong
4112 <radix-AT-twistedmatrix.com> for the report/fix. This bug had been
4121 <radix-AT-twistedmatrix.com> for the report/fix. This bug had been
4113 introduced recently (in 0.2.14pre37) with the fix to the eval
4122 introduced recently (in 0.2.14pre37) with the fix to the eval
4114 problem mentioned below.
4123 problem mentioned below.
4115
4124
4116 2002-10-17 Fernando Perez <fperez@colorado.edu>
4125 2002-10-17 Fernando Perez <fperez@colorado.edu>
4117
4126
4118 * IPython/ConfigLoader.py (ConfigLoader.load): Fixes for Windows
4127 * IPython/ConfigLoader.py (ConfigLoader.load): Fixes for Windows
4119 installation. Thanks to Leonardo Santagada <retype-AT-terra.com.br>.
4128 installation. Thanks to Leonardo Santagada <retype-AT-terra.com.br>.
4120
4129
4121 * IPython/iplib.py (InteractiveShell._prefilter): Many changes to
4130 * IPython/iplib.py (InteractiveShell._prefilter): Many changes to
4122 this function to fix a problem reported by Alex Schmolck. He saw
4131 this function to fix a problem reported by Alex Schmolck. He saw
4123 it with list comprehensions and generators, which were getting
4132 it with list comprehensions and generators, which were getting
4124 called twice. The real problem was an 'eval' call in testing for
4133 called twice. The real problem was an 'eval' call in testing for
4125 automagic which was evaluating the input line silently.
4134 automagic which was evaluating the input line silently.
4126
4135
4127 This is a potentially very nasty bug, if the input has side
4136 This is a potentially very nasty bug, if the input has side
4128 effects which must not be repeated. The code is much cleaner now,
4137 effects which must not be repeated. The code is much cleaner now,
4129 without any blanket 'except' left and with a regexp test for
4138 without any blanket 'except' left and with a regexp test for
4130 actual function names.
4139 actual function names.
4131
4140
4132 But an eval remains, which I'm not fully comfortable with. I just
4141 But an eval remains, which I'm not fully comfortable with. I just
4133 don't know how to find out if an expression could be a callable in
4142 don't know how to find out if an expression could be a callable in
4134 the user's namespace without doing an eval on the string. However
4143 the user's namespace without doing an eval on the string. However
4135 that string is now much more strictly checked so that no code
4144 that string is now much more strictly checked so that no code
4136 slips by, so the eval should only happen for things that can
4145 slips by, so the eval should only happen for things that can
4137 really be only function/method names.
4146 really be only function/method names.
4138
4147
4139 2002-10-15 Fernando Perez <fperez@colorado.edu>
4148 2002-10-15 Fernando Perez <fperez@colorado.edu>
4140
4149
4141 * Updated LyX to 1.2.1 so I can work on the docs again. Added Mac
4150 * Updated LyX to 1.2.1 so I can work on the docs again. Added Mac
4142 OSX information to main manual, removed README_Mac_OSX file from
4151 OSX information to main manual, removed README_Mac_OSX file from
4143 distribution. Also updated credits for recent additions.
4152 distribution. Also updated credits for recent additions.
4144
4153
4145 2002-10-10 Fernando Perez <fperez@colorado.edu>
4154 2002-10-10 Fernando Perez <fperez@colorado.edu>
4146
4155
4147 * README_Mac_OSX: Added a README for Mac OSX users for fixing
4156 * README_Mac_OSX: Added a README for Mac OSX users for fixing
4148 terminal-related issues. Many thanks to Andrea Riciputi
4157 terminal-related issues. Many thanks to Andrea Riciputi
4149 <andrea.riciputi-AT-libero.it> for writing it.
4158 <andrea.riciputi-AT-libero.it> for writing it.
4150
4159
4151 * IPython/UserConfig/ipythonrc.py: Fixes to various small issues,
4160 * IPython/UserConfig/ipythonrc.py: Fixes to various small issues,
4152 thanks to Thorsten Kampe <thorsten-AT-thorstenkampe.de>.
4161 thanks to Thorsten Kampe <thorsten-AT-thorstenkampe.de>.
4153
4162
4154 * setup.py (make_shortcut): Fixes for Windows installation. Thanks
4163 * setup.py (make_shortcut): Fixes for Windows installation. Thanks
4155 to Fredrik Kant <fredrik.kant-AT-front.com> and Syver Enstad
4164 to Fredrik Kant <fredrik.kant-AT-front.com> and Syver Enstad
4156 <syver-en-AT-online.no> who both submitted patches for this problem.
4165 <syver-en-AT-online.no> who both submitted patches for this problem.
4157
4166
4158 * IPython/iplib.py (InteractiveShell.embed_mainloop): Patch for
4167 * IPython/iplib.py (InteractiveShell.embed_mainloop): Patch for
4159 global embedding to make sure that things don't overwrite user
4168 global embedding to make sure that things don't overwrite user
4160 globals accidentally. Thanks to Richard <rxe-AT-renre-europe.com>
4169 globals accidentally. Thanks to Richard <rxe-AT-renre-europe.com>
4161
4170
4162 * IPython/Gnuplot2.py (gp): Patch for Gnuplot.py 1.6
4171 * IPython/Gnuplot2.py (gp): Patch for Gnuplot.py 1.6
4163 compatibility. Thanks to Hayden Callow
4172 compatibility. Thanks to Hayden Callow
4164 <h.callow-AT-elec.canterbury.ac.nz>
4173 <h.callow-AT-elec.canterbury.ac.nz>
4165
4174
4166 2002-10-04 Fernando Perez <fperez@colorado.edu>
4175 2002-10-04 Fernando Perez <fperez@colorado.edu>
4167
4176
4168 * IPython/Gnuplot2.py (PlotItem): Added 'index' option for
4177 * IPython/Gnuplot2.py (PlotItem): Added 'index' option for
4169 Gnuplot.File objects.
4178 Gnuplot.File objects.
4170
4179
4171 2002-07-23 Fernando Perez <fperez@colorado.edu>
4180 2002-07-23 Fernando Perez <fperez@colorado.edu>
4172
4181
4173 * IPython/genutils.py (timing): Added timings() and timing() for
4182 * IPython/genutils.py (timing): Added timings() and timing() for
4174 quick access to the most commonly needed data, the execution
4183 quick access to the most commonly needed data, the execution
4175 times. Old timing() renamed to timings_out().
4184 times. Old timing() renamed to timings_out().
4176
4185
4177 2002-07-18 Fernando Perez <fperez@colorado.edu>
4186 2002-07-18 Fernando Perez <fperez@colorado.edu>
4178
4187
4179 * IPython/Shell.py (IPShellEmbed.restore_system_completer): fixed
4188 * IPython/Shell.py (IPShellEmbed.restore_system_completer): fixed
4180 bug with nested instances disrupting the parent's tab completion.
4189 bug with nested instances disrupting the parent's tab completion.
4181
4190
4182 * IPython/iplib.py (all_completions): Added Alex Schmolck's
4191 * IPython/iplib.py (all_completions): Added Alex Schmolck's
4183 all_completions code to begin the emacs integration.
4192 all_completions code to begin the emacs integration.
4184
4193
4185 * IPython/Gnuplot2.py (zip_items): Added optional 'titles'
4194 * IPython/Gnuplot2.py (zip_items): Added optional 'titles'
4186 argument to allow titling individual arrays when plotting.
4195 argument to allow titling individual arrays when plotting.
4187
4196
4188 2002-07-15 Fernando Perez <fperez@colorado.edu>
4197 2002-07-15 Fernando Perez <fperez@colorado.edu>
4189
4198
4190 * setup.py (make_shortcut): changed to retrieve the value of
4199 * setup.py (make_shortcut): changed to retrieve the value of
4191 'Program Files' directory from the registry (this value changes in
4200 'Program Files' directory from the registry (this value changes in
4192 non-english versions of Windows). Thanks to Thomas Fanslau
4201 non-english versions of Windows). Thanks to Thomas Fanslau
4193 <tfanslau-AT-gmx.de> for the report.
4202 <tfanslau-AT-gmx.de> for the report.
4194
4203
4195 2002-07-10 Fernando Perez <fperez@colorado.edu>
4204 2002-07-10 Fernando Perez <fperez@colorado.edu>
4196
4205
4197 * IPython/ultraTB.py (VerboseTB.debugger): enabled workaround for
4206 * IPython/ultraTB.py (VerboseTB.debugger): enabled workaround for
4198 a bug in pdb, which crashes if a line with only whitespace is
4207 a bug in pdb, which crashes if a line with only whitespace is
4199 entered. Bug report submitted to sourceforge.
4208 entered. Bug report submitted to sourceforge.
4200
4209
4201 2002-07-09 Fernando Perez <fperez@colorado.edu>
4210 2002-07-09 Fernando Perez <fperez@colorado.edu>
4202
4211
4203 * IPython/ultraTB.py (VerboseTB.nullrepr): fixed rare crash when
4212 * IPython/ultraTB.py (VerboseTB.nullrepr): fixed rare crash when
4204 reporting exceptions (it's a bug in inspect.py, I just set a
4213 reporting exceptions (it's a bug in inspect.py, I just set a
4205 workaround).
4214 workaround).
4206
4215
4207 2002-07-08 Fernando Perez <fperez@colorado.edu>
4216 2002-07-08 Fernando Perez <fperez@colorado.edu>
4208
4217
4209 * IPython/iplib.py (InteractiveShell.__init__): fixed reference to
4218 * IPython/iplib.py (InteractiveShell.__init__): fixed reference to
4210 __IPYTHON__ in __builtins__ to show up in user_ns.
4219 __IPYTHON__ in __builtins__ to show up in user_ns.
4211
4220
4212 2002-07-03 Fernando Perez <fperez@colorado.edu>
4221 2002-07-03 Fernando Perez <fperez@colorado.edu>
4213
4222
4214 * IPython/GnuplotInteractive.py (magic_gp_set_default): changed
4223 * IPython/GnuplotInteractive.py (magic_gp_set_default): changed
4215 name from @gp_set_instance to @gp_set_default.
4224 name from @gp_set_instance to @gp_set_default.
4216
4225
4217 * IPython/ipmaker.py (make_IPython): default editor value set to
4226 * IPython/ipmaker.py (make_IPython): default editor value set to
4218 '0' (a string), to match the rc file. Otherwise will crash when
4227 '0' (a string), to match the rc file. Otherwise will crash when
4219 .strip() is called on it.
4228 .strip() is called on it.
4220
4229
4221
4230
4222 2002-06-28 Fernando Perez <fperez@colorado.edu>
4231 2002-06-28 Fernando Perez <fperez@colorado.edu>
4223
4232
4224 * IPython/iplib.py (InteractiveShell.safe_execfile): fix importing
4233 * IPython/iplib.py (InteractiveShell.safe_execfile): fix importing
4225 of files in current directory when a file is executed via
4234 of files in current directory when a file is executed via
4226 @run. Patch also by RA <ralf_ahlbrink-AT-web.de>.
4235 @run. Patch also by RA <ralf_ahlbrink-AT-web.de>.
4227
4236
4228 * setup.py (manfiles): fix for rpm builds, submitted by RA
4237 * setup.py (manfiles): fix for rpm builds, submitted by RA
4229 <ralf_ahlbrink-AT-web.de>. Now we have RPMs!
4238 <ralf_ahlbrink-AT-web.de>. Now we have RPMs!
4230
4239
4231 * IPython/ipmaker.py (make_IPython): fixed lookup of default
4240 * IPython/ipmaker.py (make_IPython): fixed lookup of default
4232 editor when set to '0'. Problem was, '0' evaluates to True (it's a
4241 editor when set to '0'. Problem was, '0' evaluates to True (it's a
4233 string!). A. Schmolck caught this one.
4242 string!). A. Schmolck caught this one.
4234
4243
4235 2002-06-27 Fernando Perez <fperez@colorado.edu>
4244 2002-06-27 Fernando Perez <fperez@colorado.edu>
4236
4245
4237 * IPython/ipmaker.py (make_IPython): fixed bug when running user
4246 * IPython/ipmaker.py (make_IPython): fixed bug when running user
4238 defined files at the cmd line. __name__ wasn't being set to
4247 defined files at the cmd line. __name__ wasn't being set to
4239 __main__.
4248 __main__.
4240
4249
4241 * IPython/Gnuplot2.py (zip_items): improved it so it can plot also
4250 * IPython/Gnuplot2.py (zip_items): improved it so it can plot also
4242 regular lists and tuples besides Numeric arrays.
4251 regular lists and tuples besides Numeric arrays.
4243
4252
4244 * IPython/Prompts.py (CachedOutput.__call__): Added output
4253 * IPython/Prompts.py (CachedOutput.__call__): Added output
4245 supression for input ending with ';'. Similar to Mathematica and
4254 supression for input ending with ';'. Similar to Mathematica and
4246 Matlab. The _* vars and Out[] list are still updated, just like
4255 Matlab. The _* vars and Out[] list are still updated, just like
4247 Mathematica behaves.
4256 Mathematica behaves.
4248
4257
4249 2002-06-25 Fernando Perez <fperez@colorado.edu>
4258 2002-06-25 Fernando Perez <fperez@colorado.edu>
4250
4259
4251 * IPython/ConfigLoader.py (ConfigLoader.load): fixed checking of
4260 * IPython/ConfigLoader.py (ConfigLoader.load): fixed checking of
4252 .ini extensions for profiels under Windows.
4261 .ini extensions for profiels under Windows.
4253
4262
4254 * IPython/OInspect.py (Inspector.pinfo): improved alignment of
4263 * IPython/OInspect.py (Inspector.pinfo): improved alignment of
4255 string form. Fix contributed by Alexander Schmolck
4264 string form. Fix contributed by Alexander Schmolck
4256 <a.schmolck-AT-gmx.net>
4265 <a.schmolck-AT-gmx.net>
4257
4266
4258 * IPython/GnuplotRuntime.py (gp_new): new function. Returns a
4267 * IPython/GnuplotRuntime.py (gp_new): new function. Returns a
4259 pre-configured Gnuplot instance.
4268 pre-configured Gnuplot instance.
4260
4269
4261 2002-06-21 Fernando Perez <fperez@colorado.edu>
4270 2002-06-21 Fernando Perez <fperez@colorado.edu>
4262
4271
4263 * IPython/numutils.py (exp_safe): new function, works around the
4272 * IPython/numutils.py (exp_safe): new function, works around the
4264 underflow problems in Numeric.
4273 underflow problems in Numeric.
4265 (log2): New fn. Safe log in base 2: returns exact integer answer
4274 (log2): New fn. Safe log in base 2: returns exact integer answer
4266 for exact integer powers of 2.
4275 for exact integer powers of 2.
4267
4276
4268 * IPython/Magic.py (get_py_filename): fixed it not expanding '~'
4277 * IPython/Magic.py (get_py_filename): fixed it not expanding '~'
4269 properly.
4278 properly.
4270
4279
4271 2002-06-20 Fernando Perez <fperez@colorado.edu>
4280 2002-06-20 Fernando Perez <fperez@colorado.edu>
4272
4281
4273 * IPython/genutils.py (timing): new function like
4282 * IPython/genutils.py (timing): new function like
4274 Mathematica's. Similar to time_test, but returns more info.
4283 Mathematica's. Similar to time_test, but returns more info.
4275
4284
4276 2002-06-18 Fernando Perez <fperez@colorado.edu>
4285 2002-06-18 Fernando Perez <fperez@colorado.edu>
4277
4286
4278 * IPython/Magic.py (Magic.magic_save): modified @save and @r
4287 * IPython/Magic.py (Magic.magic_save): modified @save and @r
4279 according to Mike Heeter's suggestions.
4288 according to Mike Heeter's suggestions.
4280
4289
4281 2002-06-16 Fernando Perez <fperez@colorado.edu>
4290 2002-06-16 Fernando Perez <fperez@colorado.edu>
4282
4291
4283 * IPython/GnuplotRuntime.py: Massive overhaul to the Gnuplot
4292 * IPython/GnuplotRuntime.py: Massive overhaul to the Gnuplot
4284 system. GnuplotMagic is gone as a user-directory option. New files
4293 system. GnuplotMagic is gone as a user-directory option. New files
4285 make it easier to use all the gnuplot stuff both from external
4294 make it easier to use all the gnuplot stuff both from external
4286 programs as well as from IPython. Had to rewrite part of
4295 programs as well as from IPython. Had to rewrite part of
4287 hardcopy() b/c of a strange bug: often the ps files simply don't
4296 hardcopy() b/c of a strange bug: often the ps files simply don't
4288 get created, and require a repeat of the command (often several
4297 get created, and require a repeat of the command (often several
4289 times).
4298 times).
4290
4299
4291 * IPython/ultraTB.py (AutoFormattedTB.__call__): changed to
4300 * IPython/ultraTB.py (AutoFormattedTB.__call__): changed to
4292 resolve output channel at call time, so that if sys.stderr has
4301 resolve output channel at call time, so that if sys.stderr has
4293 been redirected by user this gets honored.
4302 been redirected by user this gets honored.
4294
4303
4295 2002-06-13 Fernando Perez <fperez@colorado.edu>
4304 2002-06-13 Fernando Perez <fperez@colorado.edu>
4296
4305
4297 * IPython/Shell.py (IPShell.__init__): Changed IPythonShell to
4306 * IPython/Shell.py (IPShell.__init__): Changed IPythonShell to
4298 IPShell. Kept a copy with the old names to avoid breaking people's
4307 IPShell. Kept a copy with the old names to avoid breaking people's
4299 embedded code.
4308 embedded code.
4300
4309
4301 * IPython/ipython: simplified it to the bare minimum after
4310 * IPython/ipython: simplified it to the bare minimum after
4302 Holger's suggestions. Added info about how to use it in
4311 Holger's suggestions. Added info about how to use it in
4303 PYTHONSTARTUP.
4312 PYTHONSTARTUP.
4304
4313
4305 * IPython/Shell.py (IPythonShell): changed the options passing
4314 * IPython/Shell.py (IPythonShell): changed the options passing
4306 from a string with funky %s replacements to a straight list. Maybe
4315 from a string with funky %s replacements to a straight list. Maybe
4307 a bit more typing, but it follows sys.argv conventions, so there's
4316 a bit more typing, but it follows sys.argv conventions, so there's
4308 less special-casing to remember.
4317 less special-casing to remember.
4309
4318
4310 2002-06-12 Fernando Perez <fperez@colorado.edu>
4319 2002-06-12 Fernando Perez <fperez@colorado.edu>
4311
4320
4312 * IPython/Magic.py (Magic.magic_r): new magic auto-repeat
4321 * IPython/Magic.py (Magic.magic_r): new magic auto-repeat
4313 command. Thanks to a suggestion by Mike Heeter.
4322 command. Thanks to a suggestion by Mike Heeter.
4314 (Magic.magic_pfile): added behavior to look at filenames if given
4323 (Magic.magic_pfile): added behavior to look at filenames if given
4315 arg is not a defined object.
4324 arg is not a defined object.
4316 (Magic.magic_save): New @save function to save code snippets. Also
4325 (Magic.magic_save): New @save function to save code snippets. Also
4317 a Mike Heeter idea.
4326 a Mike Heeter idea.
4318
4327
4319 * IPython/UserConfig/GnuplotMagic.py (plot): Improvements to
4328 * IPython/UserConfig/GnuplotMagic.py (plot): Improvements to
4320 plot() and replot(). Much more convenient now, especially for
4329 plot() and replot(). Much more convenient now, especially for
4321 interactive use.
4330 interactive use.
4322
4331
4323 * IPython/Magic.py (Magic.magic_run): Added .py automatically to
4332 * IPython/Magic.py (Magic.magic_run): Added .py automatically to
4324 filenames.
4333 filenames.
4325
4334
4326 2002-06-02 Fernando Perez <fperez@colorado.edu>
4335 2002-06-02 Fernando Perez <fperez@colorado.edu>
4327
4336
4328 * IPython/Struct.py (Struct.__init__): modified to admit
4337 * IPython/Struct.py (Struct.__init__): modified to admit
4329 initialization via another struct.
4338 initialization via another struct.
4330
4339
4331 * IPython/genutils.py (SystemExec.__init__): New stateful
4340 * IPython/genutils.py (SystemExec.__init__): New stateful
4332 interface to xsys and bq. Useful for writing system scripts.
4341 interface to xsys and bq. Useful for writing system scripts.
4333
4342
4334 2002-05-30 Fernando Perez <fperez@colorado.edu>
4343 2002-05-30 Fernando Perez <fperez@colorado.edu>
4335
4344
4336 * MANIFEST.in: Changed docfile selection to exclude all the lyx
4345 * MANIFEST.in: Changed docfile selection to exclude all the lyx
4337 documents. This will make the user download smaller (it's getting
4346 documents. This will make the user download smaller (it's getting
4338 too big).
4347 too big).
4339
4348
4340 2002-05-29 Fernando Perez <fperez@colorado.edu>
4349 2002-05-29 Fernando Perez <fperez@colorado.edu>
4341
4350
4342 * IPython/iplib.py (_FakeModule.__init__): New class introduced to
4351 * IPython/iplib.py (_FakeModule.__init__): New class introduced to
4343 fix problems with shelve and pickle. Seems to work, but I don't
4352 fix problems with shelve and pickle. Seems to work, but I don't
4344 know if corner cases break it. Thanks to Mike Heeter
4353 know if corner cases break it. Thanks to Mike Heeter
4345 <korora-AT-SDF.LONESTAR.ORG> for the bug reports and test cases.
4354 <korora-AT-SDF.LONESTAR.ORG> for the bug reports and test cases.
4346
4355
4347 2002-05-24 Fernando Perez <fperez@colorado.edu>
4356 2002-05-24 Fernando Perez <fperez@colorado.edu>
4348
4357
4349 * IPython/Magic.py (Macro.__init__): fixed magics embedded in
4358 * IPython/Magic.py (Macro.__init__): fixed magics embedded in
4350 macros having broken.
4359 macros having broken.
4351
4360
4352 2002-05-21 Fernando Perez <fperez@colorado.edu>
4361 2002-05-21 Fernando Perez <fperez@colorado.edu>
4353
4362
4354 * IPython/Magic.py (Magic.magic_logstart): fixed recently
4363 * IPython/Magic.py (Magic.magic_logstart): fixed recently
4355 introduced logging bug: all history before logging started was
4364 introduced logging bug: all history before logging started was
4356 being written one character per line! This came from the redesign
4365 being written one character per line! This came from the redesign
4357 of the input history as a special list which slices to strings,
4366 of the input history as a special list which slices to strings,
4358 not to lists.
4367 not to lists.
4359
4368
4360 2002-05-20 Fernando Perez <fperez@colorado.edu>
4369 2002-05-20 Fernando Perez <fperez@colorado.edu>
4361
4370
4362 * IPython/Prompts.py (CachedOutput.__init__): made the color table
4371 * IPython/Prompts.py (CachedOutput.__init__): made the color table
4363 be an attribute of all classes in this module. The design of these
4372 be an attribute of all classes in this module. The design of these
4364 classes needs some serious overhauling.
4373 classes needs some serious overhauling.
4365
4374
4366 * IPython/DPyGetOpt.py (DPyGetOpt.setPosixCompliance): fixed bug
4375 * IPython/DPyGetOpt.py (DPyGetOpt.setPosixCompliance): fixed bug
4367 which was ignoring '_' in option names.
4376 which was ignoring '_' in option names.
4368
4377
4369 * IPython/ultraTB.py (FormattedTB.__init__): Changed
4378 * IPython/ultraTB.py (FormattedTB.__init__): Changed
4370 'Verbose_novars' to 'Context' and made it the new default. It's a
4379 'Verbose_novars' to 'Context' and made it the new default. It's a
4371 bit more readable and also safer than verbose.
4380 bit more readable and also safer than verbose.
4372
4381
4373 * IPython/PyColorize.py (Parser.__call__): Fixed coloring of
4382 * IPython/PyColorize.py (Parser.__call__): Fixed coloring of
4374 triple-quoted strings.
4383 triple-quoted strings.
4375
4384
4376 * IPython/OInspect.py (__all__): new module exposing the object
4385 * IPython/OInspect.py (__all__): new module exposing the object
4377 introspection facilities. Now the corresponding magics are dummy
4386 introspection facilities. Now the corresponding magics are dummy
4378 wrappers around this. Having this module will make it much easier
4387 wrappers around this. Having this module will make it much easier
4379 to put these functions into our modified pdb.
4388 to put these functions into our modified pdb.
4380 This new object inspector system uses the new colorizing module,
4389 This new object inspector system uses the new colorizing module,
4381 so source code and other things are nicely syntax highlighted.
4390 so source code and other things are nicely syntax highlighted.
4382
4391
4383 2002-05-18 Fernando Perez <fperez@colorado.edu>
4392 2002-05-18 Fernando Perez <fperez@colorado.edu>
4384
4393
4385 * IPython/ColorANSI.py: Split the coloring tools into a separate
4394 * IPython/ColorANSI.py: Split the coloring tools into a separate
4386 module so I can use them in other code easier (they were part of
4395 module so I can use them in other code easier (they were part of
4387 ultraTB).
4396 ultraTB).
4388
4397
4389 2002-05-17 Fernando Perez <fperez@colorado.edu>
4398 2002-05-17 Fernando Perez <fperez@colorado.edu>
4390
4399
4391 * IPython/UserConfig/GnuplotMagic.py (magic_gp_set_instance):
4400 * IPython/UserConfig/GnuplotMagic.py (magic_gp_set_instance):
4392 fixed it to set the global 'g' also to the called instance, as
4401 fixed it to set the global 'g' also to the called instance, as
4393 long as 'g' was still a gnuplot instance (so it doesn't overwrite
4402 long as 'g' was still a gnuplot instance (so it doesn't overwrite
4394 user's 'g' variables).
4403 user's 'g' variables).
4395
4404
4396 * IPython/iplib.py (InteractiveShell.__init__): Added In/Out
4405 * IPython/iplib.py (InteractiveShell.__init__): Added In/Out
4397 global variables (aliases to _ih,_oh) so that users which expect
4406 global variables (aliases to _ih,_oh) so that users which expect
4398 In[5] or Out[7] to work aren't unpleasantly surprised.
4407 In[5] or Out[7] to work aren't unpleasantly surprised.
4399 (InputList.__getslice__): new class to allow executing slices of
4408 (InputList.__getslice__): new class to allow executing slices of
4400 input history directly. Very simple class, complements the use of
4409 input history directly. Very simple class, complements the use of
4401 macros.
4410 macros.
4402
4411
4403 2002-05-16 Fernando Perez <fperez@colorado.edu>
4412 2002-05-16 Fernando Perez <fperez@colorado.edu>
4404
4413
4405 * setup.py (docdirbase): make doc directory be just doc/IPython
4414 * setup.py (docdirbase): make doc directory be just doc/IPython
4406 without version numbers, it will reduce clutter for users.
4415 without version numbers, it will reduce clutter for users.
4407
4416
4408 * IPython/Magic.py (Magic.magic_run): Add explicit local dict to
4417 * IPython/Magic.py (Magic.magic_run): Add explicit local dict to
4409 execfile call to prevent possible memory leak. See for details:
4418 execfile call to prevent possible memory leak. See for details:
4410 http://mail.python.org/pipermail/python-list/2002-February/088476.html
4419 http://mail.python.org/pipermail/python-list/2002-February/088476.html
4411
4420
4412 2002-05-15 Fernando Perez <fperez@colorado.edu>
4421 2002-05-15 Fernando Perez <fperez@colorado.edu>
4413
4422
4414 * IPython/Magic.py (Magic.magic_psource): made the object
4423 * IPython/Magic.py (Magic.magic_psource): made the object
4415 introspection names be more standard: pdoc, pdef, pfile and
4424 introspection names be more standard: pdoc, pdef, pfile and
4416 psource. They all print/page their output, and it makes
4425 psource. They all print/page their output, and it makes
4417 remembering them easier. Kept old names for compatibility as
4426 remembering them easier. Kept old names for compatibility as
4418 aliases.
4427 aliases.
4419
4428
4420 2002-05-14 Fernando Perez <fperez@colorado.edu>
4429 2002-05-14 Fernando Perez <fperez@colorado.edu>
4421
4430
4422 * IPython/UserConfig/GnuplotMagic.py: I think I finally understood
4431 * IPython/UserConfig/GnuplotMagic.py: I think I finally understood
4423 what the mouse problem was. The trick is to use gnuplot with temp
4432 what the mouse problem was. The trick is to use gnuplot with temp
4424 files and NOT with pipes (for data communication), because having
4433 files and NOT with pipes (for data communication), because having
4425 both pipes and the mouse on is bad news.
4434 both pipes and the mouse on is bad news.
4426
4435
4427 2002-05-13 Fernando Perez <fperez@colorado.edu>
4436 2002-05-13 Fernando Perez <fperez@colorado.edu>
4428
4437
4429 * IPython/Magic.py (Magic._ofind): fixed namespace order search
4438 * IPython/Magic.py (Magic._ofind): fixed namespace order search
4430 bug. Information would be reported about builtins even when
4439 bug. Information would be reported about builtins even when
4431 user-defined functions overrode them.
4440 user-defined functions overrode them.
4432
4441
4433 2002-05-11 Fernando Perez <fperez@colorado.edu>
4442 2002-05-11 Fernando Perez <fperez@colorado.edu>
4434
4443
4435 * IPython/__init__.py (__all__): removed FlexCompleter from
4444 * IPython/__init__.py (__all__): removed FlexCompleter from
4436 __all__ so that things don't fail in platforms without readline.
4445 __all__ so that things don't fail in platforms without readline.
4437
4446
4438 2002-05-10 Fernando Perez <fperez@colorado.edu>
4447 2002-05-10 Fernando Perez <fperez@colorado.edu>
4439
4448
4440 * IPython/__init__.py (__all__): removed numutils from __all__ b/c
4449 * IPython/__init__.py (__all__): removed numutils from __all__ b/c
4441 it requires Numeric, effectively making Numeric a dependency for
4450 it requires Numeric, effectively making Numeric a dependency for
4442 IPython.
4451 IPython.
4443
4452
4444 * Released 0.2.13
4453 * Released 0.2.13
4445
4454
4446 * IPython/Magic.py (Magic.magic_prun): big overhaul to the
4455 * IPython/Magic.py (Magic.magic_prun): big overhaul to the
4447 profiler interface. Now all the major options from the profiler
4456 profiler interface. Now all the major options from the profiler
4448 module are directly supported in IPython, both for single
4457 module are directly supported in IPython, both for single
4449 expressions (@prun) and for full programs (@run -p).
4458 expressions (@prun) and for full programs (@run -p).
4450
4459
4451 2002-05-09 Fernando Perez <fperez@colorado.edu>
4460 2002-05-09 Fernando Perez <fperez@colorado.edu>
4452
4461
4453 * IPython/Magic.py (Magic.magic_doc): fixed to show docstrings of
4462 * IPython/Magic.py (Magic.magic_doc): fixed to show docstrings of
4454 magic properly formatted for screen.
4463 magic properly formatted for screen.
4455
4464
4456 * setup.py (make_shortcut): Changed things to put pdf version in
4465 * setup.py (make_shortcut): Changed things to put pdf version in
4457 doc/ instead of doc/manual (had to change lyxport a bit).
4466 doc/ instead of doc/manual (had to change lyxport a bit).
4458
4467
4459 * IPython/Magic.py (Profile.string_stats): made profile runs go
4468 * IPython/Magic.py (Profile.string_stats): made profile runs go
4460 through pager (they are long and a pager allows searching, saving,
4469 through pager (they are long and a pager allows searching, saving,
4461 etc.)
4470 etc.)
4462
4471
4463 2002-05-08 Fernando Perez <fperez@colorado.edu>
4472 2002-05-08 Fernando Perez <fperez@colorado.edu>
4464
4473
4465 * Released 0.2.12
4474 * Released 0.2.12
4466
4475
4467 2002-05-06 Fernando Perez <fperez@colorado.edu>
4476 2002-05-06 Fernando Perez <fperez@colorado.edu>
4468
4477
4469 * IPython/Magic.py (Magic.magic_hist): small bug fixed (recently
4478 * IPython/Magic.py (Magic.magic_hist): small bug fixed (recently
4470 introduced); 'hist n1 n2' was broken.
4479 introduced); 'hist n1 n2' was broken.
4471 (Magic.magic_pdb): added optional on/off arguments to @pdb
4480 (Magic.magic_pdb): added optional on/off arguments to @pdb
4472 (Magic.magic_run): added option -i to @run, which executes code in
4481 (Magic.magic_run): added option -i to @run, which executes code in
4473 the IPython namespace instead of a clean one. Also added @irun as
4482 the IPython namespace instead of a clean one. Also added @irun as
4474 an alias to @run -i.
4483 an alias to @run -i.
4475
4484
4476 * IPython/UserConfig/GnuplotMagic.py (magic_gp_set_instance):
4485 * IPython/UserConfig/GnuplotMagic.py (magic_gp_set_instance):
4477 fixed (it didn't really do anything, the namespaces were wrong).
4486 fixed (it didn't really do anything, the namespaces were wrong).
4478
4487
4479 * IPython/Debugger.py (__init__): Added workaround for python 2.1
4488 * IPython/Debugger.py (__init__): Added workaround for python 2.1
4480
4489
4481 * IPython/__init__.py (__all__): Fixed package namespace, now
4490 * IPython/__init__.py (__all__): Fixed package namespace, now
4482 'import IPython' does give access to IPython.<all> as
4491 'import IPython' does give access to IPython.<all> as
4483 expected. Also renamed __release__ to Release.
4492 expected. Also renamed __release__ to Release.
4484
4493
4485 * IPython/Debugger.py (__license__): created new Pdb class which
4494 * IPython/Debugger.py (__license__): created new Pdb class which
4486 functions like a drop-in for the normal pdb.Pdb but does NOT
4495 functions like a drop-in for the normal pdb.Pdb but does NOT
4487 import readline by default. This way it doesn't muck up IPython's
4496 import readline by default. This way it doesn't muck up IPython's
4488 readline handling, and now tab-completion finally works in the
4497 readline handling, and now tab-completion finally works in the
4489 debugger -- sort of. It completes things globally visible, but the
4498 debugger -- sort of. It completes things globally visible, but the
4490 completer doesn't track the stack as pdb walks it. That's a bit
4499 completer doesn't track the stack as pdb walks it. That's a bit
4491 tricky, and I'll have to implement it later.
4500 tricky, and I'll have to implement it later.
4492
4501
4493 2002-05-05 Fernando Perez <fperez@colorado.edu>
4502 2002-05-05 Fernando Perez <fperez@colorado.edu>
4494
4503
4495 * IPython/Magic.py (Magic.magic_oinfo): fixed formatting bug for
4504 * IPython/Magic.py (Magic.magic_oinfo): fixed formatting bug for
4496 magic docstrings when printed via ? (explicit \'s were being
4505 magic docstrings when printed via ? (explicit \'s were being
4497 printed).
4506 printed).
4498
4507
4499 * IPython/ipmaker.py (make_IPython): fixed namespace
4508 * IPython/ipmaker.py (make_IPython): fixed namespace
4500 identification bug. Now variables loaded via logs or command-line
4509 identification bug. Now variables loaded via logs or command-line
4501 files are recognized in the interactive namespace by @who.
4510 files are recognized in the interactive namespace by @who.
4502
4511
4503 * IPython/iplib.py (InteractiveShell.safe_execfile): Fixed bug in
4512 * IPython/iplib.py (InteractiveShell.safe_execfile): Fixed bug in
4504 log replay system stemming from the string form of Structs.
4513 log replay system stemming from the string form of Structs.
4505
4514
4506 * IPython/Magic.py (Macro.__init__): improved macros to properly
4515 * IPython/Magic.py (Macro.__init__): improved macros to properly
4507 handle magic commands in them.
4516 handle magic commands in them.
4508 (Magic.magic_logstart): usernames are now expanded so 'logstart
4517 (Magic.magic_logstart): usernames are now expanded so 'logstart
4509 ~/mylog' now works.
4518 ~/mylog' now works.
4510
4519
4511 * IPython/iplib.py (complete): fixed bug where paths starting with
4520 * IPython/iplib.py (complete): fixed bug where paths starting with
4512 '/' would be completed as magic names.
4521 '/' would be completed as magic names.
4513
4522
4514 2002-05-04 Fernando Perez <fperez@colorado.edu>
4523 2002-05-04 Fernando Perez <fperez@colorado.edu>
4515
4524
4516 * IPython/Magic.py (Magic.magic_run): added options -p and -f to
4525 * IPython/Magic.py (Magic.magic_run): added options -p and -f to
4517 allow running full programs under the profiler's control.
4526 allow running full programs under the profiler's control.
4518
4527
4519 * IPython/ultraTB.py (FormattedTB.__init__): Added Verbose_novars
4528 * IPython/ultraTB.py (FormattedTB.__init__): Added Verbose_novars
4520 mode to report exceptions verbosely but without formatting
4529 mode to report exceptions verbosely but without formatting
4521 variables. This addresses the issue of ipython 'freezing' (it's
4530 variables. This addresses the issue of ipython 'freezing' (it's
4522 not frozen, but caught in an expensive formatting loop) when huge
4531 not frozen, but caught in an expensive formatting loop) when huge
4523 variables are in the context of an exception.
4532 variables are in the context of an exception.
4524 (VerboseTB.text): Added '--->' markers at line where exception was
4533 (VerboseTB.text): Added '--->' markers at line where exception was
4525 triggered. Much clearer to read, especially in NoColor modes.
4534 triggered. Much clearer to read, especially in NoColor modes.
4526
4535
4527 * IPython/Magic.py (Magic.magic_run): bugfix: -n option had been
4536 * IPython/Magic.py (Magic.magic_run): bugfix: -n option had been
4528 implemented in reverse when changing to the new parse_options().
4537 implemented in reverse when changing to the new parse_options().
4529
4538
4530 2002-05-03 Fernando Perez <fperez@colorado.edu>
4539 2002-05-03 Fernando Perez <fperez@colorado.edu>
4531
4540
4532 * IPython/Magic.py (Magic.parse_options): new function so that
4541 * IPython/Magic.py (Magic.parse_options): new function so that
4533 magics can parse options easier.
4542 magics can parse options easier.
4534 (Magic.magic_prun): new function similar to profile.run(),
4543 (Magic.magic_prun): new function similar to profile.run(),
4535 suggested by Chris Hart.
4544 suggested by Chris Hart.
4536 (Magic.magic_cd): fixed behavior so that it only changes if
4545 (Magic.magic_cd): fixed behavior so that it only changes if
4537 directory actually is in history.
4546 directory actually is in history.
4538
4547
4539 * IPython/usage.py (__doc__): added information about potential
4548 * IPython/usage.py (__doc__): added information about potential
4540 slowness of Verbose exception mode when there are huge data
4549 slowness of Verbose exception mode when there are huge data
4541 structures to be formatted (thanks to Archie Paulson).
4550 structures to be formatted (thanks to Archie Paulson).
4542
4551
4543 * IPython/ipmaker.py (make_IPython): Changed default logging
4552 * IPython/ipmaker.py (make_IPython): Changed default logging
4544 (when simply called with -log) to use curr_dir/ipython.log in
4553 (when simply called with -log) to use curr_dir/ipython.log in
4545 rotate mode. Fixed crash which was occuring with -log before
4554 rotate mode. Fixed crash which was occuring with -log before
4546 (thanks to Jim Boyle).
4555 (thanks to Jim Boyle).
4547
4556
4548 2002-05-01 Fernando Perez <fperez@colorado.edu>
4557 2002-05-01 Fernando Perez <fperez@colorado.edu>
4549
4558
4550 * Released 0.2.11 for these fixes (mainly the ultraTB one which
4559 * Released 0.2.11 for these fixes (mainly the ultraTB one which
4551 was nasty -- though somewhat of a corner case).
4560 was nasty -- though somewhat of a corner case).
4552
4561
4553 * IPython/ultraTB.py (AutoFormattedTB.text): renamed __text to
4562 * IPython/ultraTB.py (AutoFormattedTB.text): renamed __text to
4554 text (was a bug).
4563 text (was a bug).
4555
4564
4556 2002-04-30 Fernando Perez <fperez@colorado.edu>
4565 2002-04-30 Fernando Perez <fperez@colorado.edu>
4557
4566
4558 * IPython/UserConfig/GnuplotMagic.py (magic_gp): Minor fix to add
4567 * IPython/UserConfig/GnuplotMagic.py (magic_gp): Minor fix to add
4559 a print after ^D or ^C from the user so that the In[] prompt
4568 a print after ^D or ^C from the user so that the In[] prompt
4560 doesn't over-run the gnuplot one.
4569 doesn't over-run the gnuplot one.
4561
4570
4562 2002-04-29 Fernando Perez <fperez@colorado.edu>
4571 2002-04-29 Fernando Perez <fperez@colorado.edu>
4563
4572
4564 * Released 0.2.10
4573 * Released 0.2.10
4565
4574
4566 * IPython/__release__.py (version): get date dynamically.
4575 * IPython/__release__.py (version): get date dynamically.
4567
4576
4568 * Misc. documentation updates thanks to Arnd's comments. Also ran
4577 * Misc. documentation updates thanks to Arnd's comments. Also ran
4569 a full spellcheck on the manual (hadn't been done in a while).
4578 a full spellcheck on the manual (hadn't been done in a while).
4570
4579
4571 2002-04-27 Fernando Perez <fperez@colorado.edu>
4580 2002-04-27 Fernando Perez <fperez@colorado.edu>
4572
4581
4573 * IPython/Magic.py (Magic.magic_logstart): Fixed bug where
4582 * IPython/Magic.py (Magic.magic_logstart): Fixed bug where
4574 starting a log in mid-session would reset the input history list.
4583 starting a log in mid-session would reset the input history list.
4575
4584
4576 2002-04-26 Fernando Perez <fperez@colorado.edu>
4585 2002-04-26 Fernando Perez <fperez@colorado.edu>
4577
4586
4578 * IPython/iplib.py (InteractiveShell.wait): Fixed bug where not
4587 * IPython/iplib.py (InteractiveShell.wait): Fixed bug where not
4579 all files were being included in an update. Now anything in
4588 all files were being included in an update. Now anything in
4580 UserConfig that matches [A-Za-z]*.py will go (this excludes
4589 UserConfig that matches [A-Za-z]*.py will go (this excludes
4581 __init__.py)
4590 __init__.py)
4582
4591
4583 2002-04-25 Fernando Perez <fperez@colorado.edu>
4592 2002-04-25 Fernando Perez <fperez@colorado.edu>
4584
4593
4585 * IPython/iplib.py (InteractiveShell.__init__): Added __IPYTHON__
4594 * IPython/iplib.py (InteractiveShell.__init__): Added __IPYTHON__
4586 to __builtins__ so that any form of embedded or imported code can
4595 to __builtins__ so that any form of embedded or imported code can
4587 test for being inside IPython.
4596 test for being inside IPython.
4588
4597
4589 * IPython/UserConfig/GnuplotMagic.py: (magic_gp_set_instance):
4598 * IPython/UserConfig/GnuplotMagic.py: (magic_gp_set_instance):
4590 changed to GnuplotMagic because it's now an importable module,
4599 changed to GnuplotMagic because it's now an importable module,
4591 this makes the name follow that of the standard Gnuplot module.
4600 this makes the name follow that of the standard Gnuplot module.
4592 GnuplotMagic can now be loaded at any time in mid-session.
4601 GnuplotMagic can now be loaded at any time in mid-session.
4593
4602
4594 2002-04-24 Fernando Perez <fperez@colorado.edu>
4603 2002-04-24 Fernando Perez <fperez@colorado.edu>
4595
4604
4596 * IPython/numutils.py: removed SIUnits. It doesn't properly set
4605 * IPython/numutils.py: removed SIUnits. It doesn't properly set
4597 the globals (IPython has its own namespace) and the
4606 the globals (IPython has its own namespace) and the
4598 PhysicalQuantity stuff is much better anyway.
4607 PhysicalQuantity stuff is much better anyway.
4599
4608
4600 * IPython/UserConfig/example-gnuplot.py (g2): Added gnuplot
4609 * IPython/UserConfig/example-gnuplot.py (g2): Added gnuplot
4601 embedding example to standard user directory for
4610 embedding example to standard user directory for
4602 distribution. Also put it in the manual.
4611 distribution. Also put it in the manual.
4603
4612
4604 * IPython/numutils.py (gnuplot_exec): Changed to take a gnuplot
4613 * IPython/numutils.py (gnuplot_exec): Changed to take a gnuplot
4605 instance as first argument (so it doesn't rely on some obscure
4614 instance as first argument (so it doesn't rely on some obscure
4606 hidden global).
4615 hidden global).
4607
4616
4608 * IPython/UserConfig/ipythonrc.py: put () back in accepted
4617 * IPython/UserConfig/ipythonrc.py: put () back in accepted
4609 delimiters. While it prevents ().TAB from working, it allows
4618 delimiters. While it prevents ().TAB from working, it allows
4610 completions in open (... expressions. This is by far a more common
4619 completions in open (... expressions. This is by far a more common
4611 case.
4620 case.
4612
4621
4613 2002-04-23 Fernando Perez <fperez@colorado.edu>
4622 2002-04-23 Fernando Perez <fperez@colorado.edu>
4614
4623
4615 * IPython/Extensions/InterpreterPasteInput.py: new
4624 * IPython/Extensions/InterpreterPasteInput.py: new
4616 syntax-processing module for pasting lines with >>> or ... at the
4625 syntax-processing module for pasting lines with >>> or ... at the
4617 start.
4626 start.
4618
4627
4619 * IPython/Extensions/PhysicalQ_Interactive.py
4628 * IPython/Extensions/PhysicalQ_Interactive.py
4620 (PhysicalQuantityInteractive.__int__): fixed to work with either
4629 (PhysicalQuantityInteractive.__int__): fixed to work with either
4621 Numeric or math.
4630 Numeric or math.
4622
4631
4623 * IPython/UserConfig/ipythonrc-numeric.py: reorganized the
4632 * IPython/UserConfig/ipythonrc-numeric.py: reorganized the
4624 provided profiles. Now we have:
4633 provided profiles. Now we have:
4625 -math -> math module as * and cmath with its own namespace.
4634 -math -> math module as * and cmath with its own namespace.
4626 -numeric -> Numeric as *, plus gnuplot & grace
4635 -numeric -> Numeric as *, plus gnuplot & grace
4627 -physics -> same as before
4636 -physics -> same as before
4628
4637
4629 * IPython/Magic.py (Magic.magic_magic): Fixed bug where
4638 * IPython/Magic.py (Magic.magic_magic): Fixed bug where
4630 user-defined magics wouldn't be found by @magic if they were
4639 user-defined magics wouldn't be found by @magic if they were
4631 defined as class methods. Also cleaned up the namespace search
4640 defined as class methods. Also cleaned up the namespace search
4632 logic and the string building (to use %s instead of many repeated
4641 logic and the string building (to use %s instead of many repeated
4633 string adds).
4642 string adds).
4634
4643
4635 * IPython/UserConfig/example-magic.py (magic_foo): updated example
4644 * IPython/UserConfig/example-magic.py (magic_foo): updated example
4636 of user-defined magics to operate with class methods (cleaner, in
4645 of user-defined magics to operate with class methods (cleaner, in
4637 line with the gnuplot code).
4646 line with the gnuplot code).
4638
4647
4639 2002-04-22 Fernando Perez <fperez@colorado.edu>
4648 2002-04-22 Fernando Perez <fperez@colorado.edu>
4640
4649
4641 * setup.py: updated dependency list so that manual is updated when
4650 * setup.py: updated dependency list so that manual is updated when
4642 all included files change.
4651 all included files change.
4643
4652
4644 * IPython/ipmaker.py (make_IPython): Fixed bug which was ignoring
4653 * IPython/ipmaker.py (make_IPython): Fixed bug which was ignoring
4645 the delimiter removal option (the fix is ugly right now).
4654 the delimiter removal option (the fix is ugly right now).
4646
4655
4647 * IPython/UserConfig/ipythonrc-physics.py: simplified not to load
4656 * IPython/UserConfig/ipythonrc-physics.py: simplified not to load
4648 all of the math profile (quicker loading, no conflict between
4657 all of the math profile (quicker loading, no conflict between
4649 g-9.8 and g-gnuplot).
4658 g-9.8 and g-gnuplot).
4650
4659
4651 * IPython/CrashHandler.py (CrashHandler.__call__): changed default
4660 * IPython/CrashHandler.py (CrashHandler.__call__): changed default
4652 name of post-mortem files to IPython_crash_report.txt.
4661 name of post-mortem files to IPython_crash_report.txt.
4653
4662
4654 * Cleanup/update of the docs. Added all the new readline info and
4663 * Cleanup/update of the docs. Added all the new readline info and
4655 formatted all lists as 'real lists'.
4664 formatted all lists as 'real lists'.
4656
4665
4657 * IPython/ipmaker.py (make_IPython): removed now-obsolete
4666 * IPython/ipmaker.py (make_IPython): removed now-obsolete
4658 tab-completion options, since the full readline parse_and_bind is
4667 tab-completion options, since the full readline parse_and_bind is
4659 now accessible.
4668 now accessible.
4660
4669
4661 * IPython/iplib.py (InteractiveShell.init_readline): Changed
4670 * IPython/iplib.py (InteractiveShell.init_readline): Changed
4662 handling of readline options. Now users can specify any string to
4671 handling of readline options. Now users can specify any string to
4663 be passed to parse_and_bind(), as well as the delimiters to be
4672 be passed to parse_and_bind(), as well as the delimiters to be
4664 removed.
4673 removed.
4665 (InteractiveShell.__init__): Added __name__ to the global
4674 (InteractiveShell.__init__): Added __name__ to the global
4666 namespace so that things like Itpl which rely on its existence
4675 namespace so that things like Itpl which rely on its existence
4667 don't crash.
4676 don't crash.
4668 (InteractiveShell._prefilter): Defined the default with a _ so
4677 (InteractiveShell._prefilter): Defined the default with a _ so
4669 that prefilter() is easier to override, while the default one
4678 that prefilter() is easier to override, while the default one
4670 remains available.
4679 remains available.
4671
4680
4672 2002-04-18 Fernando Perez <fperez@colorado.edu>
4681 2002-04-18 Fernando Perez <fperez@colorado.edu>
4673
4682
4674 * Added information about pdb in the docs.
4683 * Added information about pdb in the docs.
4675
4684
4676 2002-04-17 Fernando Perez <fperez@colorado.edu>
4685 2002-04-17 Fernando Perez <fperez@colorado.edu>
4677
4686
4678 * IPython/ipmaker.py (make_IPython): added rc_override option to
4687 * IPython/ipmaker.py (make_IPython): added rc_override option to
4679 allow passing config options at creation time which may override
4688 allow passing config options at creation time which may override
4680 anything set in the config files or command line. This is
4689 anything set in the config files or command line. This is
4681 particularly useful for configuring embedded instances.
4690 particularly useful for configuring embedded instances.
4682
4691
4683 2002-04-15 Fernando Perez <fperez@colorado.edu>
4692 2002-04-15 Fernando Perez <fperez@colorado.edu>
4684
4693
4685 * IPython/Logger.py (Logger.log): Fixed a nasty bug which could
4694 * IPython/Logger.py (Logger.log): Fixed a nasty bug which could
4686 crash embedded instances because of the input cache falling out of
4695 crash embedded instances because of the input cache falling out of
4687 sync with the output counter.
4696 sync with the output counter.
4688
4697
4689 * IPython/Shell.py (IPythonShellEmbed.__init__): added a debug
4698 * IPython/Shell.py (IPythonShellEmbed.__init__): added a debug
4690 mode which calls pdb after an uncaught exception in IPython itself.
4699 mode which calls pdb after an uncaught exception in IPython itself.
4691
4700
4692 2002-04-14 Fernando Perez <fperez@colorado.edu>
4701 2002-04-14 Fernando Perez <fperez@colorado.edu>
4693
4702
4694 * IPython/iplib.py (InteractiveShell.showtraceback): pdb mucks up
4703 * IPython/iplib.py (InteractiveShell.showtraceback): pdb mucks up
4695 readline, fix it back after each call.
4704 readline, fix it back after each call.
4696
4705
4697 * IPython/ultraTB.py (AutoFormattedTB.__text): made text a private
4706 * IPython/ultraTB.py (AutoFormattedTB.__text): made text a private
4698 method to force all access via __call__(), which guarantees that
4707 method to force all access via __call__(), which guarantees that
4699 traceback references are properly deleted.
4708 traceback references are properly deleted.
4700
4709
4701 * IPython/Prompts.py (CachedOutput._display): minor fixes to
4710 * IPython/Prompts.py (CachedOutput._display): minor fixes to
4702 improve printing when pprint is in use.
4711 improve printing when pprint is in use.
4703
4712
4704 2002-04-13 Fernando Perez <fperez@colorado.edu>
4713 2002-04-13 Fernando Perez <fperez@colorado.edu>
4705
4714
4706 * IPython/Shell.py (IPythonShellEmbed.__call__): SystemExit
4715 * IPython/Shell.py (IPythonShellEmbed.__call__): SystemExit
4707 exceptions aren't caught anymore. If the user triggers one, he
4716 exceptions aren't caught anymore. If the user triggers one, he
4708 should know why he's doing it and it should go all the way up,
4717 should know why he's doing it and it should go all the way up,
4709 just like any other exception. So now @abort will fully kill the
4718 just like any other exception. So now @abort will fully kill the
4710 embedded interpreter and the embedding code (unless that happens
4719 embedded interpreter and the embedding code (unless that happens
4711 to catch SystemExit).
4720 to catch SystemExit).
4712
4721
4713 * IPython/ultraTB.py (VerboseTB.__init__): added a call_pdb flag
4722 * IPython/ultraTB.py (VerboseTB.__init__): added a call_pdb flag
4714 and a debugger() method to invoke the interactive pdb debugger
4723 and a debugger() method to invoke the interactive pdb debugger
4715 after printing exception information. Also added the corresponding
4724 after printing exception information. Also added the corresponding
4716 -pdb option and @pdb magic to control this feature, and updated
4725 -pdb option and @pdb magic to control this feature, and updated
4717 the docs. After a suggestion from Christopher Hart
4726 the docs. After a suggestion from Christopher Hart
4718 (hart-AT-caltech.edu).
4727 (hart-AT-caltech.edu).
4719
4728
4720 2002-04-12 Fernando Perez <fperez@colorado.edu>
4729 2002-04-12 Fernando Perez <fperez@colorado.edu>
4721
4730
4722 * IPython/Shell.py (IPythonShellEmbed.__init__): modified to use
4731 * IPython/Shell.py (IPythonShellEmbed.__init__): modified to use
4723 the exception handlers defined by the user (not the CrashHandler)
4732 the exception handlers defined by the user (not the CrashHandler)
4724 so that user exceptions don't trigger an ipython bug report.
4733 so that user exceptions don't trigger an ipython bug report.
4725
4734
4726 * IPython/ultraTB.py (ColorTB.__init__): made the color scheme
4735 * IPython/ultraTB.py (ColorTB.__init__): made the color scheme
4727 configurable (it should have always been so).
4736 configurable (it should have always been so).
4728
4737
4729 2002-03-26 Fernando Perez <fperez@colorado.edu>
4738 2002-03-26 Fernando Perez <fperez@colorado.edu>
4730
4739
4731 * IPython/Shell.py (IPythonShellEmbed.__call__): many changes here
4740 * IPython/Shell.py (IPythonShellEmbed.__call__): many changes here
4732 and there to fix embedding namespace issues. This should all be
4741 and there to fix embedding namespace issues. This should all be
4733 done in a more elegant way.
4742 done in a more elegant way.
4734
4743
4735 2002-03-25 Fernando Perez <fperez@colorado.edu>
4744 2002-03-25 Fernando Perez <fperez@colorado.edu>
4736
4745
4737 * IPython/genutils.py (get_home_dir): Try to make it work under
4746 * IPython/genutils.py (get_home_dir): Try to make it work under
4738 win9x also.
4747 win9x also.
4739
4748
4740 2002-03-20 Fernando Perez <fperez@colorado.edu>
4749 2002-03-20 Fernando Perez <fperez@colorado.edu>
4741
4750
4742 * IPython/Shell.py (IPythonShellEmbed.__init__): leave
4751 * IPython/Shell.py (IPythonShellEmbed.__init__): leave
4743 sys.displayhook untouched upon __init__.
4752 sys.displayhook untouched upon __init__.
4744
4753
4745 2002-03-19 Fernando Perez <fperez@colorado.edu>
4754 2002-03-19 Fernando Perez <fperez@colorado.edu>
4746
4755
4747 * Released 0.2.9 (for embedding bug, basically).
4756 * Released 0.2.9 (for embedding bug, basically).
4748
4757
4749 * IPython/Shell.py (IPythonShellEmbed.__call__): Trap SystemExit
4758 * IPython/Shell.py (IPythonShellEmbed.__call__): Trap SystemExit
4750 exceptions so that enclosing shell's state can be restored.
4759 exceptions so that enclosing shell's state can be restored.
4751
4760
4752 * Changed magic_gnuplot.py to magic-gnuplot.py to standardize
4761 * Changed magic_gnuplot.py to magic-gnuplot.py to standardize
4753 naming conventions in the .ipython/ dir.
4762 naming conventions in the .ipython/ dir.
4754
4763
4755 * IPython/iplib.py (InteractiveShell.init_readline): removed '-'
4764 * IPython/iplib.py (InteractiveShell.init_readline): removed '-'
4756 from delimiters list so filenames with - in them get expanded.
4765 from delimiters list so filenames with - in them get expanded.
4757
4766
4758 * IPython/Shell.py (IPythonShellEmbed.__call__): fixed bug with
4767 * IPython/Shell.py (IPythonShellEmbed.__call__): fixed bug with
4759 sys.displayhook not being properly restored after an embedded call.
4768 sys.displayhook not being properly restored after an embedded call.
4760
4769
4761 2002-03-18 Fernando Perez <fperez@colorado.edu>
4770 2002-03-18 Fernando Perez <fperez@colorado.edu>
4762
4771
4763 * Released 0.2.8
4772 * Released 0.2.8
4764
4773
4765 * IPython/iplib.py (InteractiveShell.user_setup): fixed bug where
4774 * IPython/iplib.py (InteractiveShell.user_setup): fixed bug where
4766 some files weren't being included in a -upgrade.
4775 some files weren't being included in a -upgrade.
4767 (InteractiveShell.init_readline): Added 'set show-all-if-ambiguous
4776 (InteractiveShell.init_readline): Added 'set show-all-if-ambiguous
4768 on' so that the first tab completes.
4777 on' so that the first tab completes.
4769 (InteractiveShell.handle_magic): fixed bug with spaces around
4778 (InteractiveShell.handle_magic): fixed bug with spaces around
4770 quotes breaking many magic commands.
4779 quotes breaking many magic commands.
4771
4780
4772 * setup.py: added note about ignoring the syntax error messages at
4781 * setup.py: added note about ignoring the syntax error messages at
4773 installation.
4782 installation.
4774
4783
4775 * IPython/UserConfig/magic_gnuplot.py (magic_gp): finished
4784 * IPython/UserConfig/magic_gnuplot.py (magic_gp): finished
4776 streamlining the gnuplot interface, now there's only one magic @gp.
4785 streamlining the gnuplot interface, now there's only one magic @gp.
4777
4786
4778 2002-03-17 Fernando Perez <fperez@colorado.edu>
4787 2002-03-17 Fernando Perez <fperez@colorado.edu>
4779
4788
4780 * IPython/UserConfig/magic_gnuplot.py: new name for the
4789 * IPython/UserConfig/magic_gnuplot.py: new name for the
4781 example-magic_pm.py file. Much enhanced system, now with a shell
4790 example-magic_pm.py file. Much enhanced system, now with a shell
4782 for communicating directly with gnuplot, one command at a time.
4791 for communicating directly with gnuplot, one command at a time.
4783
4792
4784 * IPython/Magic.py (Magic.magic_run): added option -n to prevent
4793 * IPython/Magic.py (Magic.magic_run): added option -n to prevent
4785 setting __name__=='__main__'.
4794 setting __name__=='__main__'.
4786
4795
4787 * IPython/UserConfig/example-magic_pm.py (magic_pm): Added
4796 * IPython/UserConfig/example-magic_pm.py (magic_pm): Added
4788 mini-shell for accessing gnuplot from inside ipython. Should
4797 mini-shell for accessing gnuplot from inside ipython. Should
4789 extend it later for grace access too. Inspired by Arnd's
4798 extend it later for grace access too. Inspired by Arnd's
4790 suggestion.
4799 suggestion.
4791
4800
4792 * IPython/iplib.py (InteractiveShell.handle_magic): fixed bug when
4801 * IPython/iplib.py (InteractiveShell.handle_magic): fixed bug when
4793 calling magic functions with () in their arguments. Thanks to Arnd
4802 calling magic functions with () in their arguments. Thanks to Arnd
4794 Baecker for pointing this to me.
4803 Baecker for pointing this to me.
4795
4804
4796 * IPython/numutils.py (sum_flat): fixed bug. Would recurse
4805 * IPython/numutils.py (sum_flat): fixed bug. Would recurse
4797 infinitely for integer or complex arrays (only worked with floats).
4806 infinitely for integer or complex arrays (only worked with floats).
4798
4807
4799 2002-03-16 Fernando Perez <fperez@colorado.edu>
4808 2002-03-16 Fernando Perez <fperez@colorado.edu>
4800
4809
4801 * setup.py: Merged setup and setup_windows into a single script
4810 * setup.py: Merged setup and setup_windows into a single script
4802 which properly handles things for windows users.
4811 which properly handles things for windows users.
4803
4812
4804 2002-03-15 Fernando Perez <fperez@colorado.edu>
4813 2002-03-15 Fernando Perez <fperez@colorado.edu>
4805
4814
4806 * Big change to the manual: now the magics are all automatically
4815 * Big change to the manual: now the magics are all automatically
4807 documented. This information is generated from their docstrings
4816 documented. This information is generated from their docstrings
4808 and put in a latex file included by the manual lyx file. This way
4817 and put in a latex file included by the manual lyx file. This way
4809 we get always up to date information for the magics. The manual
4818 we get always up to date information for the magics. The manual
4810 now also has proper version information, also auto-synced.
4819 now also has proper version information, also auto-synced.
4811
4820
4812 For this to work, an undocumented --magic_docstrings option was added.
4821 For this to work, an undocumented --magic_docstrings option was added.
4813
4822
4814 2002-03-13 Fernando Perez <fperez@colorado.edu>
4823 2002-03-13 Fernando Perez <fperez@colorado.edu>
4815
4824
4816 * IPython/ultraTB.py (TermColors): fixed problem with dark colors
4825 * IPython/ultraTB.py (TermColors): fixed problem with dark colors
4817 under CDE terminals. An explicit ;2 color reset is needed in the escapes.
4826 under CDE terminals. An explicit ;2 color reset is needed in the escapes.
4818
4827
4819 2002-03-12 Fernando Perez <fperez@colorado.edu>
4828 2002-03-12 Fernando Perez <fperez@colorado.edu>
4820
4829
4821 * IPython/ultraTB.py (TermColors): changed color escapes again to
4830 * IPython/ultraTB.py (TermColors): changed color escapes again to
4822 fix the (old, reintroduced) line-wrapping bug. Basically, if
4831 fix the (old, reintroduced) line-wrapping bug. Basically, if
4823 \001..\002 aren't given in the color escapes, lines get wrapped
4832 \001..\002 aren't given in the color escapes, lines get wrapped
4824 weirdly. But giving those screws up old xterms and emacs terms. So
4833 weirdly. But giving those screws up old xterms and emacs terms. So
4825 I added some logic for emacs terms to be ok, but I can't identify old
4834 I added some logic for emacs terms to be ok, but I can't identify old
4826 xterms separately ($TERM=='xterm' for many terminals, like konsole).
4835 xterms separately ($TERM=='xterm' for many terminals, like konsole).
4827
4836
4828 2002-03-10 Fernando Perez <fperez@colorado.edu>
4837 2002-03-10 Fernando Perez <fperez@colorado.edu>
4829
4838
4830 * IPython/usage.py (__doc__): Various documentation cleanups and
4839 * IPython/usage.py (__doc__): Various documentation cleanups and
4831 updates, both in usage docstrings and in the manual.
4840 updates, both in usage docstrings and in the manual.
4832
4841
4833 * IPython/Prompts.py (CachedOutput.set_colors): cleanups for
4842 * IPython/Prompts.py (CachedOutput.set_colors): cleanups for
4834 handling of caching. Set minimum acceptabe value for having a
4843 handling of caching. Set minimum acceptabe value for having a
4835 cache at 20 values.
4844 cache at 20 values.
4836
4845
4837 * IPython/iplib.py (InteractiveShell.user_setup): moved the
4846 * IPython/iplib.py (InteractiveShell.user_setup): moved the
4838 install_first_time function to a method, renamed it and added an
4847 install_first_time function to a method, renamed it and added an
4839 'upgrade' mode. Now people can update their config directory with
4848 'upgrade' mode. Now people can update their config directory with
4840 a simple command line switch (-upgrade, also new).
4849 a simple command line switch (-upgrade, also new).
4841
4850
4842 * IPython/Magic.py (Magic.magic_pfile): Made @pfile an alias to
4851 * IPython/Magic.py (Magic.magic_pfile): Made @pfile an alias to
4843 @file (convenient for automagic users under Python >= 2.2).
4852 @file (convenient for automagic users under Python >= 2.2).
4844 Removed @files (it seemed more like a plural than an abbrev. of
4853 Removed @files (it seemed more like a plural than an abbrev. of
4845 'file show').
4854 'file show').
4846
4855
4847 * IPython/iplib.py (install_first_time): Fixed crash if there were
4856 * IPython/iplib.py (install_first_time): Fixed crash if there were
4848 backup files ('~') in .ipython/ install directory.
4857 backup files ('~') in .ipython/ install directory.
4849
4858
4850 * IPython/ipmaker.py (make_IPython): fixes for new prompt
4859 * IPython/ipmaker.py (make_IPython): fixes for new prompt
4851 system. Things look fine, but these changes are fairly
4860 system. Things look fine, but these changes are fairly
4852 intrusive. Test them for a few days.
4861 intrusive. Test them for a few days.
4853
4862
4854 * IPython/Prompts.py (CachedOutput.__init__): Massive rewrite of
4863 * IPython/Prompts.py (CachedOutput.__init__): Massive rewrite of
4855 the prompts system. Now all in/out prompt strings are user
4864 the prompts system. Now all in/out prompt strings are user
4856 controllable. This is particularly useful for embedding, as one
4865 controllable. This is particularly useful for embedding, as one
4857 can tag embedded instances with particular prompts.
4866 can tag embedded instances with particular prompts.
4858
4867
4859 Also removed global use of sys.ps1/2, which now allows nested
4868 Also removed global use of sys.ps1/2, which now allows nested
4860 embeddings without any problems. Added command-line options for
4869 embeddings without any problems. Added command-line options for
4861 the prompt strings.
4870 the prompt strings.
4862
4871
4863 2002-03-08 Fernando Perez <fperez@colorado.edu>
4872 2002-03-08 Fernando Perez <fperez@colorado.edu>
4864
4873
4865 * IPython/UserConfig/example-embed-short.py (ipshell): added
4874 * IPython/UserConfig/example-embed-short.py (ipshell): added
4866 example file with the bare minimum code for embedding.
4875 example file with the bare minimum code for embedding.
4867
4876
4868 * IPython/Shell.py (IPythonShellEmbed.set_dummy_mode): added
4877 * IPython/Shell.py (IPythonShellEmbed.set_dummy_mode): added
4869 functionality for the embeddable shell to be activated/deactivated
4878 functionality for the embeddable shell to be activated/deactivated
4870 either globally or at each call.
4879 either globally or at each call.
4871
4880
4872 * IPython/Prompts.py (Prompt1.auto_rewrite): Fixes the problem of
4881 * IPython/Prompts.py (Prompt1.auto_rewrite): Fixes the problem of
4873 rewriting the prompt with '--->' for auto-inputs with proper
4882 rewriting the prompt with '--->' for auto-inputs with proper
4874 coloring. Now the previous UGLY hack in handle_auto() is gone, and
4883 coloring. Now the previous UGLY hack in handle_auto() is gone, and
4875 this is handled by the prompts class itself, as it should.
4884 this is handled by the prompts class itself, as it should.
4876
4885
4877 2002-03-05 Fernando Perez <fperez@colorado.edu>
4886 2002-03-05 Fernando Perez <fperez@colorado.edu>
4878
4887
4879 * IPython/Magic.py (Magic.magic_logstart): Changed @log to
4888 * IPython/Magic.py (Magic.magic_logstart): Changed @log to
4880 @logstart to avoid name clashes with the math log function.
4889 @logstart to avoid name clashes with the math log function.
4881
4890
4882 * Big updates to X/Emacs section of the manual.
4891 * Big updates to X/Emacs section of the manual.
4883
4892
4884 * Removed ipython_emacs. Milan explained to me how to pass
4893 * Removed ipython_emacs. Milan explained to me how to pass
4885 arguments to ipython through Emacs. Some day I'm going to end up
4894 arguments to ipython through Emacs. Some day I'm going to end up
4886 learning some lisp...
4895 learning some lisp...
4887
4896
4888 2002-03-04 Fernando Perez <fperez@colorado.edu>
4897 2002-03-04 Fernando Perez <fperez@colorado.edu>
4889
4898
4890 * IPython/ipython_emacs: Created script to be used as the
4899 * IPython/ipython_emacs: Created script to be used as the
4891 py-python-command Emacs variable so we can pass IPython
4900 py-python-command Emacs variable so we can pass IPython
4892 parameters. I can't figure out how to tell Emacs directly to pass
4901 parameters. I can't figure out how to tell Emacs directly to pass
4893 parameters to IPython, so a dummy shell script will do it.
4902 parameters to IPython, so a dummy shell script will do it.
4894
4903
4895 Other enhancements made for things to work better under Emacs'
4904 Other enhancements made for things to work better under Emacs'
4896 various types of terminals. Many thanks to Milan Zamazal
4905 various types of terminals. Many thanks to Milan Zamazal
4897 <pdm-AT-zamazal.org> for all the suggestions and pointers.
4906 <pdm-AT-zamazal.org> for all the suggestions and pointers.
4898
4907
4899 2002-03-01 Fernando Perez <fperez@colorado.edu>
4908 2002-03-01 Fernando Perez <fperez@colorado.edu>
4900
4909
4901 * IPython/ipmaker.py (make_IPython): added a --readline! option so
4910 * IPython/ipmaker.py (make_IPython): added a --readline! option so
4902 that loading of readline is now optional. This gives better
4911 that loading of readline is now optional. This gives better
4903 control to emacs users.
4912 control to emacs users.
4904
4913
4905 * IPython/ultraTB.py (__date__): Modified color escape sequences
4914 * IPython/ultraTB.py (__date__): Modified color escape sequences
4906 and now things work fine under xterm and in Emacs' term buffers
4915 and now things work fine under xterm and in Emacs' term buffers
4907 (though not shell ones). Well, in emacs you get colors, but all
4916 (though not shell ones). Well, in emacs you get colors, but all
4908 seem to be 'light' colors (no difference between dark and light
4917 seem to be 'light' colors (no difference between dark and light
4909 ones). But the garbage chars are gone, and also in xterms. It
4918 ones). But the garbage chars are gone, and also in xterms. It
4910 seems that now I'm using 'cleaner' ansi sequences.
4919 seems that now I'm using 'cleaner' ansi sequences.
4911
4920
4912 2002-02-21 Fernando Perez <fperez@colorado.edu>
4921 2002-02-21 Fernando Perez <fperez@colorado.edu>
4913
4922
4914 * Released 0.2.7 (mainly to publish the scoping fix).
4923 * Released 0.2.7 (mainly to publish the scoping fix).
4915
4924
4916 * IPython/Logger.py (Logger.logstate): added. A corresponding
4925 * IPython/Logger.py (Logger.logstate): added. A corresponding
4917 @logstate magic was created.
4926 @logstate magic was created.
4918
4927
4919 * IPython/Magic.py: fixed nested scoping problem under Python
4928 * IPython/Magic.py: fixed nested scoping problem under Python
4920 2.1.x (automagic wasn't working).
4929 2.1.x (automagic wasn't working).
4921
4930
4922 2002-02-20 Fernando Perez <fperez@colorado.edu>
4931 2002-02-20 Fernando Perez <fperez@colorado.edu>
4923
4932
4924 * Released 0.2.6.
4933 * Released 0.2.6.
4925
4934
4926 * IPython/OutputTrap.py (OutputTrap.__init__): added a 'quiet'
4935 * IPython/OutputTrap.py (OutputTrap.__init__): added a 'quiet'
4927 option so that logs can come out without any headers at all.
4936 option so that logs can come out without any headers at all.
4928
4937
4929 * IPython/UserConfig/ipythonrc-scipy.py: created a profile for
4938 * IPython/UserConfig/ipythonrc-scipy.py: created a profile for
4930 SciPy.
4939 SciPy.
4931
4940
4932 * IPython/iplib.py (InteractiveShell.embed_mainloop): Changed so
4941 * IPython/iplib.py (InteractiveShell.embed_mainloop): Changed so
4933 that embedded IPython calls don't require vars() to be explicitly
4942 that embedded IPython calls don't require vars() to be explicitly
4934 passed. Now they are extracted from the caller's frame (code
4943 passed. Now they are extracted from the caller's frame (code
4935 snatched from Eric Jones' weave). Added better documentation to
4944 snatched from Eric Jones' weave). Added better documentation to
4936 the section on embedding and the example file.
4945 the section on embedding and the example file.
4937
4946
4938 * IPython/genutils.py (page): Changed so that under emacs, it just
4947 * IPython/genutils.py (page): Changed so that under emacs, it just
4939 prints the string. You can then page up and down in the emacs
4948 prints the string. You can then page up and down in the emacs
4940 buffer itself. This is how the builtin help() works.
4949 buffer itself. This is how the builtin help() works.
4941
4950
4942 * IPython/Prompts.py (CachedOutput.__call__): Fixed issue with
4951 * IPython/Prompts.py (CachedOutput.__call__): Fixed issue with
4943 macro scoping: macros need to be executed in the user's namespace
4952 macro scoping: macros need to be executed in the user's namespace
4944 to work as if they had been typed by the user.
4953 to work as if they had been typed by the user.
4945
4954
4946 * IPython/Magic.py (Magic.magic_macro): Changed macros so they
4955 * IPython/Magic.py (Magic.magic_macro): Changed macros so they
4947 execute automatically (no need to type 'exec...'). They then
4956 execute automatically (no need to type 'exec...'). They then
4948 behave like 'true macros'. The printing system was also modified
4957 behave like 'true macros'. The printing system was also modified
4949 for this to work.
4958 for this to work.
4950
4959
4951 2002-02-19 Fernando Perez <fperez@colorado.edu>
4960 2002-02-19 Fernando Perez <fperez@colorado.edu>
4952
4961
4953 * IPython/genutils.py (page_file): new function for paging files
4962 * IPython/genutils.py (page_file): new function for paging files
4954 in an OS-independent way. Also necessary for file viewing to work
4963 in an OS-independent way. Also necessary for file viewing to work
4955 well inside Emacs buffers.
4964 well inside Emacs buffers.
4956 (page): Added checks for being in an emacs buffer.
4965 (page): Added checks for being in an emacs buffer.
4957 (page): fixed bug for Windows ($TERM isn't set in Windows). Fixed
4966 (page): fixed bug for Windows ($TERM isn't set in Windows). Fixed
4958 same bug in iplib.
4967 same bug in iplib.
4959
4968
4960 2002-02-18 Fernando Perez <fperez@colorado.edu>
4969 2002-02-18 Fernando Perez <fperez@colorado.edu>
4961
4970
4962 * IPython/iplib.py (InteractiveShell.init_readline): modified use
4971 * IPython/iplib.py (InteractiveShell.init_readline): modified use
4963 of readline so that IPython can work inside an Emacs buffer.
4972 of readline so that IPython can work inside an Emacs buffer.
4964
4973
4965 * IPython/ultraTB.py (AutoFormattedTB.__call__): some fixes to
4974 * IPython/ultraTB.py (AutoFormattedTB.__call__): some fixes to
4966 method signatures (they weren't really bugs, but it looks cleaner
4975 method signatures (they weren't really bugs, but it looks cleaner
4967 and keeps PyChecker happy).
4976 and keeps PyChecker happy).
4968
4977
4969 * IPython/ipmaker.py (make_IPython): added hooks Struct to __IP
4978 * IPython/ipmaker.py (make_IPython): added hooks Struct to __IP
4970 for implementing various user-defined hooks. Currently only
4979 for implementing various user-defined hooks. Currently only
4971 display is done.
4980 display is done.
4972
4981
4973 * IPython/Prompts.py (CachedOutput._display): changed display
4982 * IPython/Prompts.py (CachedOutput._display): changed display
4974 functions so that they can be dynamically changed by users easily.
4983 functions so that they can be dynamically changed by users easily.
4975
4984
4976 * IPython/Extensions/numeric_formats.py (num_display): added an
4985 * IPython/Extensions/numeric_formats.py (num_display): added an
4977 extension for printing NumPy arrays in flexible manners. It
4986 extension for printing NumPy arrays in flexible manners. It
4978 doesn't do anything yet, but all the structure is in
4987 doesn't do anything yet, but all the structure is in
4979 place. Ultimately the plan is to implement output format control
4988 place. Ultimately the plan is to implement output format control
4980 like in Octave.
4989 like in Octave.
4981
4990
4982 * IPython/Magic.py (Magic.lsmagic): changed so that bound magic
4991 * IPython/Magic.py (Magic.lsmagic): changed so that bound magic
4983 methods are found at run-time by all the automatic machinery.
4992 methods are found at run-time by all the automatic machinery.
4984
4993
4985 2002-02-17 Fernando Perez <fperez@colorado.edu>
4994 2002-02-17 Fernando Perez <fperez@colorado.edu>
4986
4995
4987 * setup_Windows.py (make_shortcut): documented. Cleaned up the
4996 * setup_Windows.py (make_shortcut): documented. Cleaned up the
4988 whole file a little.
4997 whole file a little.
4989
4998
4990 * ToDo: closed this document. Now there's a new_design.lyx
4999 * ToDo: closed this document. Now there's a new_design.lyx
4991 document for all new ideas. Added making a pdf of it for the
5000 document for all new ideas. Added making a pdf of it for the
4992 end-user distro.
5001 end-user distro.
4993
5002
4994 * IPython/Logger.py (Logger.switch_log): Created this to replace
5003 * IPython/Logger.py (Logger.switch_log): Created this to replace
4995 logon() and logoff(). It also fixes a nasty crash reported by
5004 logon() and logoff(). It also fixes a nasty crash reported by
4996 Philip Hisley <compsys-AT-starpower.net>. Many thanks to him.
5005 Philip Hisley <compsys-AT-starpower.net>. Many thanks to him.
4997
5006
4998 * IPython/iplib.py (complete): got auto-completion to work with
5007 * IPython/iplib.py (complete): got auto-completion to work with
4999 automagic (I had wanted this for a long time).
5008 automagic (I had wanted this for a long time).
5000
5009
5001 * IPython/Magic.py (Magic.magic_files): Added @files as an alias
5010 * IPython/Magic.py (Magic.magic_files): Added @files as an alias
5002 to @file, since file() is now a builtin and clashes with automagic
5011 to @file, since file() is now a builtin and clashes with automagic
5003 for @file.
5012 for @file.
5004
5013
5005 * Made some new files: Prompts, CrashHandler, Magic, Logger. All
5014 * Made some new files: Prompts, CrashHandler, Magic, Logger. All
5006 of this was previously in iplib, which had grown to more than 2000
5015 of this was previously in iplib, which had grown to more than 2000
5007 lines, way too long. No new functionality, but it makes managing
5016 lines, way too long. No new functionality, but it makes managing
5008 the code a bit easier.
5017 the code a bit easier.
5009
5018
5010 * IPython/iplib.py (IPythonCrashHandler.__call__): Added version
5019 * IPython/iplib.py (IPythonCrashHandler.__call__): Added version
5011 information to crash reports.
5020 information to crash reports.
5012
5021
5013 2002-02-12 Fernando Perez <fperez@colorado.edu>
5022 2002-02-12 Fernando Perez <fperez@colorado.edu>
5014
5023
5015 * Released 0.2.5.
5024 * Released 0.2.5.
5016
5025
5017 2002-02-11 Fernando Perez <fperez@colorado.edu>
5026 2002-02-11 Fernando Perez <fperez@colorado.edu>
5018
5027
5019 * Wrote a relatively complete Windows installer. It puts
5028 * Wrote a relatively complete Windows installer. It puts
5020 everything in place, creates Start Menu entries and fixes the
5029 everything in place, creates Start Menu entries and fixes the
5021 color issues. Nothing fancy, but it works.
5030 color issues. Nothing fancy, but it works.
5022
5031
5023 2002-02-10 Fernando Perez <fperez@colorado.edu>
5032 2002-02-10 Fernando Perez <fperez@colorado.edu>
5024
5033
5025 * IPython/iplib.py (InteractiveShell.safe_execfile): added an
5034 * IPython/iplib.py (InteractiveShell.safe_execfile): added an
5026 os.path.expanduser() call so that we can type @run ~/myfile.py and
5035 os.path.expanduser() call so that we can type @run ~/myfile.py and
5027 have thigs work as expected.
5036 have thigs work as expected.
5028
5037
5029 * IPython/genutils.py (page): fixed exception handling so things
5038 * IPython/genutils.py (page): fixed exception handling so things
5030 work both in Unix and Windows correctly. Quitting a pager triggers
5039 work both in Unix and Windows correctly. Quitting a pager triggers
5031 an IOError/broken pipe in Unix, and in windows not finding a pager
5040 an IOError/broken pipe in Unix, and in windows not finding a pager
5032 is also an IOError, so I had to actually look at the return value
5041 is also an IOError, so I had to actually look at the return value
5033 of the exception, not just the exception itself. Should be ok now.
5042 of the exception, not just the exception itself. Should be ok now.
5034
5043
5035 * IPython/ultraTB.py (ColorSchemeTable.set_active_scheme):
5044 * IPython/ultraTB.py (ColorSchemeTable.set_active_scheme):
5036 modified to allow case-insensitive color scheme changes.
5045 modified to allow case-insensitive color scheme changes.
5037
5046
5038 2002-02-09 Fernando Perez <fperez@colorado.edu>
5047 2002-02-09 Fernando Perez <fperez@colorado.edu>
5039
5048
5040 * IPython/genutils.py (native_line_ends): new function to leave
5049 * IPython/genutils.py (native_line_ends): new function to leave
5041 user config files with os-native line-endings.
5050 user config files with os-native line-endings.
5042
5051
5043 * README and manual updates.
5052 * README and manual updates.
5044
5053
5045 * IPython/genutils.py: fixed unicode bug: use types.StringTypes
5054 * IPython/genutils.py: fixed unicode bug: use types.StringTypes
5046 instead of StringType to catch Unicode strings.
5055 instead of StringType to catch Unicode strings.
5047
5056
5048 * IPython/genutils.py (filefind): fixed bug for paths with
5057 * IPython/genutils.py (filefind): fixed bug for paths with
5049 embedded spaces (very common in Windows).
5058 embedded spaces (very common in Windows).
5050
5059
5051 * IPython/ipmaker.py (make_IPython): added a '.ini' to the rc
5060 * IPython/ipmaker.py (make_IPython): added a '.ini' to the rc
5052 files under Windows, so that they get automatically associated
5061 files under Windows, so that they get automatically associated
5053 with a text editor. Windows makes it a pain to handle
5062 with a text editor. Windows makes it a pain to handle
5054 extension-less files.
5063 extension-less files.
5055
5064
5056 * IPython/iplib.py (InteractiveShell.init_readline): Made the
5065 * IPython/iplib.py (InteractiveShell.init_readline): Made the
5057 warning about readline only occur for Posix. In Windows there's no
5066 warning about readline only occur for Posix. In Windows there's no
5058 way to get readline, so why bother with the warning.
5067 way to get readline, so why bother with the warning.
5059
5068
5060 * IPython/Struct.py (Struct.__str__): fixed to use self.__dict__
5069 * IPython/Struct.py (Struct.__str__): fixed to use self.__dict__
5061 for __str__ instead of dir(self), since dir() changed in 2.2.
5070 for __str__ instead of dir(self), since dir() changed in 2.2.
5062
5071
5063 * Ported to Windows! Tested on XP, I suspect it should work fine
5072 * Ported to Windows! Tested on XP, I suspect it should work fine
5064 on NT/2000, but I don't think it will work on 98 et al. That
5073 on NT/2000, but I don't think it will work on 98 et al. That
5065 series of Windows is such a piece of junk anyway that I won't try
5074 series of Windows is such a piece of junk anyway that I won't try
5066 porting it there. The XP port was straightforward, showed a few
5075 porting it there. The XP port was straightforward, showed a few
5067 bugs here and there (fixed all), in particular some string
5076 bugs here and there (fixed all), in particular some string
5068 handling stuff which required considering Unicode strings (which
5077 handling stuff which required considering Unicode strings (which
5069 Windows uses). This is good, but hasn't been too tested :) No
5078 Windows uses). This is good, but hasn't been too tested :) No
5070 fancy installer yet, I'll put a note in the manual so people at
5079 fancy installer yet, I'll put a note in the manual so people at
5071 least make manually a shortcut.
5080 least make manually a shortcut.
5072
5081
5073 * IPython/iplib.py (Magic.magic_colors): Unified the color options
5082 * IPython/iplib.py (Magic.magic_colors): Unified the color options
5074 into a single one, "colors". This now controls both prompt and
5083 into a single one, "colors". This now controls both prompt and
5075 exception color schemes, and can be changed both at startup
5084 exception color schemes, and can be changed both at startup
5076 (either via command-line switches or via ipythonrc files) and at
5085 (either via command-line switches or via ipythonrc files) and at
5077 runtime, with @colors.
5086 runtime, with @colors.
5078 (Magic.magic_run): renamed @prun to @run and removed the old
5087 (Magic.magic_run): renamed @prun to @run and removed the old
5079 @run. The two were too similar to warrant keeping both.
5088 @run. The two were too similar to warrant keeping both.
5080
5089
5081 2002-02-03 Fernando Perez <fperez@colorado.edu>
5090 2002-02-03 Fernando Perez <fperez@colorado.edu>
5082
5091
5083 * IPython/iplib.py (install_first_time): Added comment on how to
5092 * IPython/iplib.py (install_first_time): Added comment on how to
5084 configure the color options for first-time users. Put a <return>
5093 configure the color options for first-time users. Put a <return>
5085 request at the end so that small-terminal users get a chance to
5094 request at the end so that small-terminal users get a chance to
5086 read the startup info.
5095 read the startup info.
5087
5096
5088 2002-01-23 Fernando Perez <fperez@colorado.edu>
5097 2002-01-23 Fernando Perez <fperez@colorado.edu>
5089
5098
5090 * IPython/iplib.py (CachedOutput.update): Changed output memory
5099 * IPython/iplib.py (CachedOutput.update): Changed output memory
5091 variable names from _o,_oo,_ooo,_o<n> to simply _,__,___,_<n>. For
5100 variable names from _o,_oo,_ooo,_o<n> to simply _,__,___,_<n>. For
5092 input history we still use _i. Did this b/c these variable are
5101 input history we still use _i. Did this b/c these variable are
5093 very commonly used in interactive work, so the less we need to
5102 very commonly used in interactive work, so the less we need to
5094 type the better off we are.
5103 type the better off we are.
5095 (Magic.magic_prun): updated @prun to better handle the namespaces
5104 (Magic.magic_prun): updated @prun to better handle the namespaces
5096 the file will run in, including a fix for __name__ not being set
5105 the file will run in, including a fix for __name__ not being set
5097 before.
5106 before.
5098
5107
5099 2002-01-20 Fernando Perez <fperez@colorado.edu>
5108 2002-01-20 Fernando Perez <fperez@colorado.edu>
5100
5109
5101 * IPython/ultraTB.py (VerboseTB.linereader): Fixed printing of
5110 * IPython/ultraTB.py (VerboseTB.linereader): Fixed printing of
5102 extra garbage for Python 2.2. Need to look more carefully into
5111 extra garbage for Python 2.2. Need to look more carefully into
5103 this later.
5112 this later.
5104
5113
5105 2002-01-19 Fernando Perez <fperez@colorado.edu>
5114 2002-01-19 Fernando Perez <fperez@colorado.edu>
5106
5115
5107 * IPython/iplib.py (InteractiveShell.showtraceback): fixed to
5116 * IPython/iplib.py (InteractiveShell.showtraceback): fixed to
5108 display SyntaxError exceptions properly formatted when they occur
5117 display SyntaxError exceptions properly formatted when they occur
5109 (they can be triggered by imported code).
5118 (they can be triggered by imported code).
5110
5119
5111 2002-01-18 Fernando Perez <fperez@colorado.edu>
5120 2002-01-18 Fernando Perez <fperez@colorado.edu>
5112
5121
5113 * IPython/iplib.py (InteractiveShell.safe_execfile): now
5122 * IPython/iplib.py (InteractiveShell.safe_execfile): now
5114 SyntaxError exceptions are reported nicely formatted, instead of
5123 SyntaxError exceptions are reported nicely formatted, instead of
5115 spitting out only offset information as before.
5124 spitting out only offset information as before.
5116 (Magic.magic_prun): Added the @prun function for executing
5125 (Magic.magic_prun): Added the @prun function for executing
5117 programs with command line args inside IPython.
5126 programs with command line args inside IPython.
5118
5127
5119 2002-01-16 Fernando Perez <fperez@colorado.edu>
5128 2002-01-16 Fernando Perez <fperez@colorado.edu>
5120
5129
5121 * IPython/iplib.py (Magic.magic_hist): Changed @hist and @dhist
5130 * IPython/iplib.py (Magic.magic_hist): Changed @hist and @dhist
5122 to *not* include the last item given in a range. This brings their
5131 to *not* include the last item given in a range. This brings their
5123 behavior in line with Python's slicing:
5132 behavior in line with Python's slicing:
5124 a[n1:n2] -> a[n1]...a[n2-1]
5133 a[n1:n2] -> a[n1]...a[n2-1]
5125 It may be a bit less convenient, but I prefer to stick to Python's
5134 It may be a bit less convenient, but I prefer to stick to Python's
5126 conventions *everywhere*, so users never have to wonder.
5135 conventions *everywhere*, so users never have to wonder.
5127 (Magic.magic_macro): Added @macro function to ease the creation of
5136 (Magic.magic_macro): Added @macro function to ease the creation of
5128 macros.
5137 macros.
5129
5138
5130 2002-01-05 Fernando Perez <fperez@colorado.edu>
5139 2002-01-05 Fernando Perez <fperez@colorado.edu>
5131
5140
5132 * Released 0.2.4.
5141 * Released 0.2.4.
5133
5142
5134 * IPython/iplib.py (Magic.magic_pdef):
5143 * IPython/iplib.py (Magic.magic_pdef):
5135 (InteractiveShell.safe_execfile): report magic lines and error
5144 (InteractiveShell.safe_execfile): report magic lines and error
5136 lines without line numbers so one can easily copy/paste them for
5145 lines without line numbers so one can easily copy/paste them for
5137 re-execution.
5146 re-execution.
5138
5147
5139 * Updated manual with recent changes.
5148 * Updated manual with recent changes.
5140
5149
5141 * IPython/iplib.py (Magic.magic_oinfo): added constructor
5150 * IPython/iplib.py (Magic.magic_oinfo): added constructor
5142 docstring printing when class? is called. Very handy for knowing
5151 docstring printing when class? is called. Very handy for knowing
5143 how to create class instances (as long as __init__ is well
5152 how to create class instances (as long as __init__ is well
5144 documented, of course :)
5153 documented, of course :)
5145 (Magic.magic_doc): print both class and constructor docstrings.
5154 (Magic.magic_doc): print both class and constructor docstrings.
5146 (Magic.magic_pdef): give constructor info if passed a class and
5155 (Magic.magic_pdef): give constructor info if passed a class and
5147 __call__ info for callable object instances.
5156 __call__ info for callable object instances.
5148
5157
5149 2002-01-04 Fernando Perez <fperez@colorado.edu>
5158 2002-01-04 Fernando Perez <fperez@colorado.edu>
5150
5159
5151 * Made deep_reload() off by default. It doesn't always work
5160 * Made deep_reload() off by default. It doesn't always work
5152 exactly as intended, so it's probably safer to have it off. It's
5161 exactly as intended, so it's probably safer to have it off. It's
5153 still available as dreload() anyway, so nothing is lost.
5162 still available as dreload() anyway, so nothing is lost.
5154
5163
5155 2002-01-02 Fernando Perez <fperez@colorado.edu>
5164 2002-01-02 Fernando Perez <fperez@colorado.edu>
5156
5165
5157 * Released 0.2.3 (contacted R.Singh at CU about biopython course,
5166 * Released 0.2.3 (contacted R.Singh at CU about biopython course,
5158 so I wanted an updated release).
5167 so I wanted an updated release).
5159
5168
5160 2001-12-27 Fernando Perez <fperez@colorado.edu>
5169 2001-12-27 Fernando Perez <fperez@colorado.edu>
5161
5170
5162 * IPython/iplib.py (InteractiveShell.interact): Added the original
5171 * IPython/iplib.py (InteractiveShell.interact): Added the original
5163 code from 'code.py' for this module in order to change the
5172 code from 'code.py' for this module in order to change the
5164 handling of a KeyboardInterrupt. This was necessary b/c otherwise
5173 handling of a KeyboardInterrupt. This was necessary b/c otherwise
5165 the history cache would break when the user hit Ctrl-C, and
5174 the history cache would break when the user hit Ctrl-C, and
5166 interact() offers no way to add any hooks to it.
5175 interact() offers no way to add any hooks to it.
5167
5176
5168 2001-12-23 Fernando Perez <fperez@colorado.edu>
5177 2001-12-23 Fernando Perez <fperez@colorado.edu>
5169
5178
5170 * setup.py: added check for 'MANIFEST' before trying to remove
5179 * setup.py: added check for 'MANIFEST' before trying to remove
5171 it. Thanks to Sean Reifschneider.
5180 it. Thanks to Sean Reifschneider.
5172
5181
5173 2001-12-22 Fernando Perez <fperez@colorado.edu>
5182 2001-12-22 Fernando Perez <fperez@colorado.edu>
5174
5183
5175 * Released 0.2.2.
5184 * Released 0.2.2.
5176
5185
5177 * Finished (reasonably) writing the manual. Later will add the
5186 * Finished (reasonably) writing the manual. Later will add the
5178 python-standard navigation stylesheets, but for the time being
5187 python-standard navigation stylesheets, but for the time being
5179 it's fairly complete. Distribution will include html and pdf
5188 it's fairly complete. Distribution will include html and pdf
5180 versions.
5189 versions.
5181
5190
5182 * Bugfix: '.' wasn't being added to sys.path. Thanks to Prabhu
5191 * Bugfix: '.' wasn't being added to sys.path. Thanks to Prabhu
5183 (MayaVi author).
5192 (MayaVi author).
5184
5193
5185 2001-12-21 Fernando Perez <fperez@colorado.edu>
5194 2001-12-21 Fernando Perez <fperez@colorado.edu>
5186
5195
5187 * Released 0.2.1. Barring any nasty bugs, this is it as far as a
5196 * Released 0.2.1. Barring any nasty bugs, this is it as far as a
5188 good public release, I think (with the manual and the distutils
5197 good public release, I think (with the manual and the distutils
5189 installer). The manual can use some work, but that can go
5198 installer). The manual can use some work, but that can go
5190 slowly. Otherwise I think it's quite nice for end users. Next
5199 slowly. Otherwise I think it's quite nice for end users. Next
5191 summer, rewrite the guts of it...
5200 summer, rewrite the guts of it...
5192
5201
5193 * Changed format of ipythonrc files to use whitespace as the
5202 * Changed format of ipythonrc files to use whitespace as the
5194 separator instead of an explicit '='. Cleaner.
5203 separator instead of an explicit '='. Cleaner.
5195
5204
5196 2001-12-20 Fernando Perez <fperez@colorado.edu>
5205 2001-12-20 Fernando Perez <fperez@colorado.edu>
5197
5206
5198 * Started a manual in LyX. For now it's just a quick merge of the
5207 * Started a manual in LyX. For now it's just a quick merge of the
5199 various internal docstrings and READMEs. Later it may grow into a
5208 various internal docstrings and READMEs. Later it may grow into a
5200 nice, full-blown manual.
5209 nice, full-blown manual.
5201
5210
5202 * Set up a distutils based installer. Installation should now be
5211 * Set up a distutils based installer. Installation should now be
5203 trivially simple for end-users.
5212 trivially simple for end-users.
5204
5213
5205 2001-12-11 Fernando Perez <fperez@colorado.edu>
5214 2001-12-11 Fernando Perez <fperez@colorado.edu>
5206
5215
5207 * Released 0.2.0. First public release, announced it at
5216 * Released 0.2.0. First public release, announced it at
5208 comp.lang.python. From now on, just bugfixes...
5217 comp.lang.python. From now on, just bugfixes...
5209
5218
5210 * Went through all the files, set copyright/license notices and
5219 * Went through all the files, set copyright/license notices and
5211 cleaned up things. Ready for release.
5220 cleaned up things. Ready for release.
5212
5221
5213 2001-12-10 Fernando Perez <fperez@colorado.edu>
5222 2001-12-10 Fernando Perez <fperez@colorado.edu>
5214
5223
5215 * Changed the first-time installer not to use tarfiles. It's more
5224 * Changed the first-time installer not to use tarfiles. It's more
5216 robust now and less unix-dependent. Also makes it easier for
5225 robust now and less unix-dependent. Also makes it easier for
5217 people to later upgrade versions.
5226 people to later upgrade versions.
5218
5227
5219 * Changed @exit to @abort to reflect the fact that it's pretty
5228 * Changed @exit to @abort to reflect the fact that it's pretty
5220 brutal (a sys.exit()). The difference between @abort and Ctrl-D
5229 brutal (a sys.exit()). The difference between @abort and Ctrl-D
5221 becomes significant only when IPyhton is embedded: in that case,
5230 becomes significant only when IPyhton is embedded: in that case,
5222 C-D closes IPython only, but @abort kills the enclosing program
5231 C-D closes IPython only, but @abort kills the enclosing program
5223 too (unless it had called IPython inside a try catching
5232 too (unless it had called IPython inside a try catching
5224 SystemExit).
5233 SystemExit).
5225
5234
5226 * Created Shell module which exposes the actuall IPython Shell
5235 * Created Shell module which exposes the actuall IPython Shell
5227 classes, currently the normal and the embeddable one. This at
5236 classes, currently the normal and the embeddable one. This at
5228 least offers a stable interface we won't need to change when
5237 least offers a stable interface we won't need to change when
5229 (later) the internals are rewritten. That rewrite will be confined
5238 (later) the internals are rewritten. That rewrite will be confined
5230 to iplib and ipmaker, but the Shell interface should remain as is.
5239 to iplib and ipmaker, but the Shell interface should remain as is.
5231
5240
5232 * Added embed module which offers an embeddable IPShell object,
5241 * Added embed module which offers an embeddable IPShell object,
5233 useful to fire up IPython *inside* a running program. Great for
5242 useful to fire up IPython *inside* a running program. Great for
5234 debugging or dynamical data analysis.
5243 debugging or dynamical data analysis.
5235
5244
5236 2001-12-08 Fernando Perez <fperez@colorado.edu>
5245 2001-12-08 Fernando Perez <fperez@colorado.edu>
5237
5246
5238 * Fixed small bug preventing seeing info from methods of defined
5247 * Fixed small bug preventing seeing info from methods of defined
5239 objects (incorrect namespace in _ofind()).
5248 objects (incorrect namespace in _ofind()).
5240
5249
5241 * Documentation cleanup. Moved the main usage docstrings to a
5250 * Documentation cleanup. Moved the main usage docstrings to a
5242 separate file, usage.py (cleaner to maintain, and hopefully in the
5251 separate file, usage.py (cleaner to maintain, and hopefully in the
5243 future some perlpod-like way of producing interactive, man and
5252 future some perlpod-like way of producing interactive, man and
5244 html docs out of it will be found).
5253 html docs out of it will be found).
5245
5254
5246 * Added @profile to see your profile at any time.
5255 * Added @profile to see your profile at any time.
5247
5256
5248 * Added @p as an alias for 'print'. It's especially convenient if
5257 * Added @p as an alias for 'print'. It's especially convenient if
5249 using automagic ('p x' prints x).
5258 using automagic ('p x' prints x).
5250
5259
5251 * Small cleanups and fixes after a pychecker run.
5260 * Small cleanups and fixes after a pychecker run.
5252
5261
5253 * Changed the @cd command to handle @cd - and @cd -<n> for
5262 * Changed the @cd command to handle @cd - and @cd -<n> for
5254 visiting any directory in _dh.
5263 visiting any directory in _dh.
5255
5264
5256 * Introduced _dh, a history of visited directories. @dhist prints
5265 * Introduced _dh, a history of visited directories. @dhist prints
5257 it out with numbers.
5266 it out with numbers.
5258
5267
5259 2001-12-07 Fernando Perez <fperez@colorado.edu>
5268 2001-12-07 Fernando Perez <fperez@colorado.edu>
5260
5269
5261 * Released 0.1.22
5270 * Released 0.1.22
5262
5271
5263 * Made initialization a bit more robust against invalid color
5272 * Made initialization a bit more robust against invalid color
5264 options in user input (exit, not traceback-crash).
5273 options in user input (exit, not traceback-crash).
5265
5274
5266 * Changed the bug crash reporter to write the report only in the
5275 * Changed the bug crash reporter to write the report only in the
5267 user's .ipython directory. That way IPython won't litter people's
5276 user's .ipython directory. That way IPython won't litter people's
5268 hard disks with crash files all over the place. Also print on
5277 hard disks with crash files all over the place. Also print on
5269 screen the necessary mail command.
5278 screen the necessary mail command.
5270
5279
5271 * With the new ultraTB, implemented LightBG color scheme for light
5280 * With the new ultraTB, implemented LightBG color scheme for light
5272 background terminals. A lot of people like white backgrounds, so I
5281 background terminals. A lot of people like white backgrounds, so I
5273 guess we should at least give them something readable.
5282 guess we should at least give them something readable.
5274
5283
5275 2001-12-06 Fernando Perez <fperez@colorado.edu>
5284 2001-12-06 Fernando Perez <fperez@colorado.edu>
5276
5285
5277 * Modified the structure of ultraTB. Now there's a proper class
5286 * Modified the structure of ultraTB. Now there's a proper class
5278 for tables of color schemes which allow adding schemes easily and
5287 for tables of color schemes which allow adding schemes easily and
5279 switching the active scheme without creating a new instance every
5288 switching the active scheme without creating a new instance every
5280 time (which was ridiculous). The syntax for creating new schemes
5289 time (which was ridiculous). The syntax for creating new schemes
5281 is also cleaner. I think ultraTB is finally done, with a clean
5290 is also cleaner. I think ultraTB is finally done, with a clean
5282 class structure. Names are also much cleaner (now there's proper
5291 class structure. Names are also much cleaner (now there's proper
5283 color tables, no need for every variable to also have 'color' in
5292 color tables, no need for every variable to also have 'color' in
5284 its name).
5293 its name).
5285
5294
5286 * Broke down genutils into separate files. Now genutils only
5295 * Broke down genutils into separate files. Now genutils only
5287 contains utility functions, and classes have been moved to their
5296 contains utility functions, and classes have been moved to their
5288 own files (they had enough independent functionality to warrant
5297 own files (they had enough independent functionality to warrant
5289 it): ConfigLoader, OutputTrap, Struct.
5298 it): ConfigLoader, OutputTrap, Struct.
5290
5299
5291 2001-12-05 Fernando Perez <fperez@colorado.edu>
5300 2001-12-05 Fernando Perez <fperez@colorado.edu>
5292
5301
5293 * IPython turns 21! Released version 0.1.21, as a candidate for
5302 * IPython turns 21! Released version 0.1.21, as a candidate for
5294 public consumption. If all goes well, release in a few days.
5303 public consumption. If all goes well, release in a few days.
5295
5304
5296 * Fixed path bug (files in Extensions/ directory wouldn't be found
5305 * Fixed path bug (files in Extensions/ directory wouldn't be found
5297 unless IPython/ was explicitly in sys.path).
5306 unless IPython/ was explicitly in sys.path).
5298
5307
5299 * Extended the FlexCompleter class as MagicCompleter to allow
5308 * Extended the FlexCompleter class as MagicCompleter to allow
5300 completion of @-starting lines.
5309 completion of @-starting lines.
5301
5310
5302 * Created __release__.py file as a central repository for release
5311 * Created __release__.py file as a central repository for release
5303 info that other files can read from.
5312 info that other files can read from.
5304
5313
5305 * Fixed small bug in logging: when logging was turned on in
5314 * Fixed small bug in logging: when logging was turned on in
5306 mid-session, old lines with special meanings (!@?) were being
5315 mid-session, old lines with special meanings (!@?) were being
5307 logged without the prepended comment, which is necessary since
5316 logged without the prepended comment, which is necessary since
5308 they are not truly valid python syntax. This should make session
5317 they are not truly valid python syntax. This should make session
5309 restores produce less errors.
5318 restores produce less errors.
5310
5319
5311 * The namespace cleanup forced me to make a FlexCompleter class
5320 * The namespace cleanup forced me to make a FlexCompleter class
5312 which is nothing but a ripoff of rlcompleter, but with selectable
5321 which is nothing but a ripoff of rlcompleter, but with selectable
5313 namespace (rlcompleter only works in __main__.__dict__). I'll try
5322 namespace (rlcompleter only works in __main__.__dict__). I'll try
5314 to submit a note to the authors to see if this change can be
5323 to submit a note to the authors to see if this change can be
5315 incorporated in future rlcompleter releases (Dec.6: done)
5324 incorporated in future rlcompleter releases (Dec.6: done)
5316
5325
5317 * More fixes to namespace handling. It was a mess! Now all
5326 * More fixes to namespace handling. It was a mess! Now all
5318 explicit references to __main__.__dict__ are gone (except when
5327 explicit references to __main__.__dict__ are gone (except when
5319 really needed) and everything is handled through the namespace
5328 really needed) and everything is handled through the namespace
5320 dicts in the IPython instance. We seem to be getting somewhere
5329 dicts in the IPython instance. We seem to be getting somewhere
5321 with this, finally...
5330 with this, finally...
5322
5331
5323 * Small documentation updates.
5332 * Small documentation updates.
5324
5333
5325 * Created the Extensions directory under IPython (with an
5334 * Created the Extensions directory under IPython (with an
5326 __init__.py). Put the PhysicalQ stuff there. This directory should
5335 __init__.py). Put the PhysicalQ stuff there. This directory should
5327 be used for all special-purpose extensions.
5336 be used for all special-purpose extensions.
5328
5337
5329 * File renaming:
5338 * File renaming:
5330 ipythonlib --> ipmaker
5339 ipythonlib --> ipmaker
5331 ipplib --> iplib
5340 ipplib --> iplib
5332 This makes a bit more sense in terms of what these files actually do.
5341 This makes a bit more sense in terms of what these files actually do.
5333
5342
5334 * Moved all the classes and functions in ipythonlib to ipplib, so
5343 * Moved all the classes and functions in ipythonlib to ipplib, so
5335 now ipythonlib only has make_IPython(). This will ease up its
5344 now ipythonlib only has make_IPython(). This will ease up its
5336 splitting in smaller functional chunks later.
5345 splitting in smaller functional chunks later.
5337
5346
5338 * Cleaned up (done, I think) output of @whos. Better column
5347 * Cleaned up (done, I think) output of @whos. Better column
5339 formatting, and now shows str(var) for as much as it can, which is
5348 formatting, and now shows str(var) for as much as it can, which is
5340 typically what one gets with a 'print var'.
5349 typically what one gets with a 'print var'.
5341
5350
5342 2001-12-04 Fernando Perez <fperez@colorado.edu>
5351 2001-12-04 Fernando Perez <fperez@colorado.edu>
5343
5352
5344 * Fixed namespace problems. Now builtin/IPyhton/user names get
5353 * Fixed namespace problems. Now builtin/IPyhton/user names get
5345 properly reported in their namespace. Internal namespace handling
5354 properly reported in their namespace. Internal namespace handling
5346 is finally getting decent (not perfect yet, but much better than
5355 is finally getting decent (not perfect yet, but much better than
5347 the ad-hoc mess we had).
5356 the ad-hoc mess we had).
5348
5357
5349 * Removed -exit option. If people just want to run a python
5358 * Removed -exit option. If people just want to run a python
5350 script, that's what the normal interpreter is for. Less
5359 script, that's what the normal interpreter is for. Less
5351 unnecessary options, less chances for bugs.
5360 unnecessary options, less chances for bugs.
5352
5361
5353 * Added a crash handler which generates a complete post-mortem if
5362 * Added a crash handler which generates a complete post-mortem if
5354 IPython crashes. This will help a lot in tracking bugs down the
5363 IPython crashes. This will help a lot in tracking bugs down the
5355 road.
5364 road.
5356
5365
5357 * Fixed nasty bug in auto-evaluation part of prefilter(). Names
5366 * Fixed nasty bug in auto-evaluation part of prefilter(). Names
5358 which were boud to functions being reassigned would bypass the
5367 which were boud to functions being reassigned would bypass the
5359 logger, breaking the sync of _il with the prompt counter. This
5368 logger, breaking the sync of _il with the prompt counter. This
5360 would then crash IPython later when a new line was logged.
5369 would then crash IPython later when a new line was logged.
5361
5370
5362 2001-12-02 Fernando Perez <fperez@colorado.edu>
5371 2001-12-02 Fernando Perez <fperez@colorado.edu>
5363
5372
5364 * Made IPython a package. This means people don't have to clutter
5373 * Made IPython a package. This means people don't have to clutter
5365 their sys.path with yet another directory. Changed the INSTALL
5374 their sys.path with yet another directory. Changed the INSTALL
5366 file accordingly.
5375 file accordingly.
5367
5376
5368 * Cleaned up the output of @who_ls, @who and @whos. @who_ls now
5377 * Cleaned up the output of @who_ls, @who and @whos. @who_ls now
5369 sorts its output (so @who shows it sorted) and @whos formats the
5378 sorts its output (so @who shows it sorted) and @whos formats the
5370 table according to the width of the first column. Nicer, easier to
5379 table according to the width of the first column. Nicer, easier to
5371 read. Todo: write a generic table_format() which takes a list of
5380 read. Todo: write a generic table_format() which takes a list of
5372 lists and prints it nicely formatted, with optional row/column
5381 lists and prints it nicely formatted, with optional row/column
5373 separators and proper padding and justification.
5382 separators and proper padding and justification.
5374
5383
5375 * Released 0.1.20
5384 * Released 0.1.20
5376
5385
5377 * Fixed bug in @log which would reverse the inputcache list (a
5386 * Fixed bug in @log which would reverse the inputcache list (a
5378 copy operation was missing).
5387 copy operation was missing).
5379
5388
5380 * Code cleanup. @config was changed to use page(). Better, since
5389 * Code cleanup. @config was changed to use page(). Better, since
5381 its output is always quite long.
5390 its output is always quite long.
5382
5391
5383 * Itpl is back as a dependency. I was having too many problems
5392 * Itpl is back as a dependency. I was having too many problems
5384 getting the parametric aliases to work reliably, and it's just
5393 getting the parametric aliases to work reliably, and it's just
5385 easier to code weird string operations with it than playing %()s
5394 easier to code weird string operations with it than playing %()s
5386 games. It's only ~6k, so I don't think it's too big a deal.
5395 games. It's only ~6k, so I don't think it's too big a deal.
5387
5396
5388 * Found (and fixed) a very nasty bug with history. !lines weren't
5397 * Found (and fixed) a very nasty bug with history. !lines weren't
5389 getting cached, and the out of sync caches would crash
5398 getting cached, and the out of sync caches would crash
5390 IPython. Fixed it by reorganizing the prefilter/handlers/logger
5399 IPython. Fixed it by reorganizing the prefilter/handlers/logger
5391 division of labor a bit better. Bug fixed, cleaner structure.
5400 division of labor a bit better. Bug fixed, cleaner structure.
5392
5401
5393 2001-12-01 Fernando Perez <fperez@colorado.edu>
5402 2001-12-01 Fernando Perez <fperez@colorado.edu>
5394
5403
5395 * Released 0.1.19
5404 * Released 0.1.19
5396
5405
5397 * Added option -n to @hist to prevent line number printing. Much
5406 * Added option -n to @hist to prevent line number printing. Much
5398 easier to copy/paste code this way.
5407 easier to copy/paste code this way.
5399
5408
5400 * Created global _il to hold the input list. Allows easy
5409 * Created global _il to hold the input list. Allows easy
5401 re-execution of blocks of code by slicing it (inspired by Janko's
5410 re-execution of blocks of code by slicing it (inspired by Janko's
5402 comment on 'macros').
5411 comment on 'macros').
5403
5412
5404 * Small fixes and doc updates.
5413 * Small fixes and doc updates.
5405
5414
5406 * Rewrote @history function (was @h). Renamed it to @hist, @h is
5415 * Rewrote @history function (was @h). Renamed it to @hist, @h is
5407 much too fragile with automagic. Handles properly multi-line
5416 much too fragile with automagic. Handles properly multi-line
5408 statements and takes parameters.
5417 statements and takes parameters.
5409
5418
5410 2001-11-30 Fernando Perez <fperez@colorado.edu>
5419 2001-11-30 Fernando Perez <fperez@colorado.edu>
5411
5420
5412 * Version 0.1.18 released.
5421 * Version 0.1.18 released.
5413
5422
5414 * Fixed nasty namespace bug in initial module imports.
5423 * Fixed nasty namespace bug in initial module imports.
5415
5424
5416 * Added copyright/license notes to all code files (except
5425 * Added copyright/license notes to all code files (except
5417 DPyGetOpt). For the time being, LGPL. That could change.
5426 DPyGetOpt). For the time being, LGPL. That could change.
5418
5427
5419 * Rewrote a much nicer README, updated INSTALL, cleaned up
5428 * Rewrote a much nicer README, updated INSTALL, cleaned up
5420 ipythonrc-* samples.
5429 ipythonrc-* samples.
5421
5430
5422 * Overall code/documentation cleanup. Basically ready for
5431 * Overall code/documentation cleanup. Basically ready for
5423 release. Only remaining thing: licence decision (LGPL?).
5432 release. Only remaining thing: licence decision (LGPL?).
5424
5433
5425 * Converted load_config to a class, ConfigLoader. Now recursion
5434 * Converted load_config to a class, ConfigLoader. Now recursion
5426 control is better organized. Doesn't include the same file twice.
5435 control is better organized. Doesn't include the same file twice.
5427
5436
5428 2001-11-29 Fernando Perez <fperez@colorado.edu>
5437 2001-11-29 Fernando Perez <fperez@colorado.edu>
5429
5438
5430 * Got input history working. Changed output history variables from
5439 * Got input history working. Changed output history variables from
5431 _p to _o so that _i is for input and _o for output. Just cleaner
5440 _p to _o so that _i is for input and _o for output. Just cleaner
5432 convention.
5441 convention.
5433
5442
5434 * Implemented parametric aliases. This pretty much allows the
5443 * Implemented parametric aliases. This pretty much allows the
5435 alias system to offer full-blown shell convenience, I think.
5444 alias system to offer full-blown shell convenience, I think.
5436
5445
5437 * Version 0.1.17 released, 0.1.18 opened.
5446 * Version 0.1.17 released, 0.1.18 opened.
5438
5447
5439 * dot_ipython/ipythonrc (alias): added documentation.
5448 * dot_ipython/ipythonrc (alias): added documentation.
5440 (xcolor): Fixed small bug (xcolors -> xcolor)
5449 (xcolor): Fixed small bug (xcolors -> xcolor)
5441
5450
5442 * Changed the alias system. Now alias is a magic command to define
5451 * Changed the alias system. Now alias is a magic command to define
5443 aliases just like the shell. Rationale: the builtin magics should
5452 aliases just like the shell. Rationale: the builtin magics should
5444 be there for things deeply connected to IPython's
5453 be there for things deeply connected to IPython's
5445 architecture. And this is a much lighter system for what I think
5454 architecture. And this is a much lighter system for what I think
5446 is the really important feature: allowing users to define quickly
5455 is the really important feature: allowing users to define quickly
5447 magics that will do shell things for them, so they can customize
5456 magics that will do shell things for them, so they can customize
5448 IPython easily to match their work habits. If someone is really
5457 IPython easily to match their work habits. If someone is really
5449 desperate to have another name for a builtin alias, they can
5458 desperate to have another name for a builtin alias, they can
5450 always use __IP.magic_newname = __IP.magic_oldname. Hackish but
5459 always use __IP.magic_newname = __IP.magic_oldname. Hackish but
5451 works.
5460 works.
5452
5461
5453 2001-11-28 Fernando Perez <fperez@colorado.edu>
5462 2001-11-28 Fernando Perez <fperez@colorado.edu>
5454
5463
5455 * Changed @file so that it opens the source file at the proper
5464 * Changed @file so that it opens the source file at the proper
5456 line. Since it uses less, if your EDITOR environment is
5465 line. Since it uses less, if your EDITOR environment is
5457 configured, typing v will immediately open your editor of choice
5466 configured, typing v will immediately open your editor of choice
5458 right at the line where the object is defined. Not as quick as
5467 right at the line where the object is defined. Not as quick as
5459 having a direct @edit command, but for all intents and purposes it
5468 having a direct @edit command, but for all intents and purposes it
5460 works. And I don't have to worry about writing @edit to deal with
5469 works. And I don't have to worry about writing @edit to deal with
5461 all the editors, less does that.
5470 all the editors, less does that.
5462
5471
5463 * Version 0.1.16 released, 0.1.17 opened.
5472 * Version 0.1.16 released, 0.1.17 opened.
5464
5473
5465 * Fixed some nasty bugs in the page/page_dumb combo that could
5474 * Fixed some nasty bugs in the page/page_dumb combo that could
5466 crash IPython.
5475 crash IPython.
5467
5476
5468 2001-11-27 Fernando Perez <fperez@colorado.edu>
5477 2001-11-27 Fernando Perez <fperez@colorado.edu>
5469
5478
5470 * Version 0.1.15 released, 0.1.16 opened.
5479 * Version 0.1.15 released, 0.1.16 opened.
5471
5480
5472 * Finally got ? and ?? to work for undefined things: now it's
5481 * Finally got ? and ?? to work for undefined things: now it's
5473 possible to type {}.get? and get information about the get method
5482 possible to type {}.get? and get information about the get method
5474 of dicts, or os.path? even if only os is defined (so technically
5483 of dicts, or os.path? even if only os is defined (so technically
5475 os.path isn't). Works at any level. For example, after import os,
5484 os.path isn't). Works at any level. For example, after import os,
5476 os?, os.path?, os.path.abspath? all work. This is great, took some
5485 os?, os.path?, os.path.abspath? all work. This is great, took some
5477 work in _ofind.
5486 work in _ofind.
5478
5487
5479 * Fixed more bugs with logging. The sanest way to do it was to add
5488 * Fixed more bugs with logging. The sanest way to do it was to add
5480 to @log a 'mode' parameter. Killed two in one shot (this mode
5489 to @log a 'mode' parameter. Killed two in one shot (this mode
5481 option was a request of Janko's). I think it's finally clean
5490 option was a request of Janko's). I think it's finally clean
5482 (famous last words).
5491 (famous last words).
5483
5492
5484 * Added a page_dumb() pager which does a decent job of paging on
5493 * Added a page_dumb() pager which does a decent job of paging on
5485 screen, if better things (like less) aren't available. One less
5494 screen, if better things (like less) aren't available. One less
5486 unix dependency (someday maybe somebody will port this to
5495 unix dependency (someday maybe somebody will port this to
5487 windows).
5496 windows).
5488
5497
5489 * Fixed problem in magic_log: would lock of logging out if log
5498 * Fixed problem in magic_log: would lock of logging out if log
5490 creation failed (because it would still think it had succeeded).
5499 creation failed (because it would still think it had succeeded).
5491
5500
5492 * Improved the page() function using curses to auto-detect screen
5501 * Improved the page() function using curses to auto-detect screen
5493 size. Now it can make a much better decision on whether to print
5502 size. Now it can make a much better decision on whether to print
5494 or page a string. Option screen_length was modified: a value 0
5503 or page a string. Option screen_length was modified: a value 0
5495 means auto-detect, and that's the default now.
5504 means auto-detect, and that's the default now.
5496
5505
5497 * Version 0.1.14 released, 0.1.15 opened. I think this is ready to
5506 * Version 0.1.14 released, 0.1.15 opened. I think this is ready to
5498 go out. I'll test it for a few days, then talk to Janko about
5507 go out. I'll test it for a few days, then talk to Janko about
5499 licences and announce it.
5508 licences and announce it.
5500
5509
5501 * Fixed the length of the auto-generated ---> prompt which appears
5510 * Fixed the length of the auto-generated ---> prompt which appears
5502 for auto-parens and auto-quotes. Getting this right isn't trivial,
5511 for auto-parens and auto-quotes. Getting this right isn't trivial,
5503 with all the color escapes, different prompt types and optional
5512 with all the color escapes, different prompt types and optional
5504 separators. But it seems to be working in all the combinations.
5513 separators. But it seems to be working in all the combinations.
5505
5514
5506 2001-11-26 Fernando Perez <fperez@colorado.edu>
5515 2001-11-26 Fernando Perez <fperez@colorado.edu>
5507
5516
5508 * Wrote a regexp filter to get option types from the option names
5517 * Wrote a regexp filter to get option types from the option names
5509 string. This eliminates the need to manually keep two duplicate
5518 string. This eliminates the need to manually keep two duplicate
5510 lists.
5519 lists.
5511
5520
5512 * Removed the unneeded check_option_names. Now options are handled
5521 * Removed the unneeded check_option_names. Now options are handled
5513 in a much saner manner and it's easy to visually check that things
5522 in a much saner manner and it's easy to visually check that things
5514 are ok.
5523 are ok.
5515
5524
5516 * Updated version numbers on all files I modified to carry a
5525 * Updated version numbers on all files I modified to carry a
5517 notice so Janko and Nathan have clear version markers.
5526 notice so Janko and Nathan have clear version markers.
5518
5527
5519 * Updated docstring for ultraTB with my changes. I should send
5528 * Updated docstring for ultraTB with my changes. I should send
5520 this to Nathan.
5529 this to Nathan.
5521
5530
5522 * Lots of small fixes. Ran everything through pychecker again.
5531 * Lots of small fixes. Ran everything through pychecker again.
5523
5532
5524 * Made loading of deep_reload an cmd line option. If it's not too
5533 * Made loading of deep_reload an cmd line option. If it's not too
5525 kosher, now people can just disable it. With -nodeep_reload it's
5534 kosher, now people can just disable it. With -nodeep_reload it's
5526 still available as dreload(), it just won't overwrite reload().
5535 still available as dreload(), it just won't overwrite reload().
5527
5536
5528 * Moved many options to the no| form (-opt and -noopt
5537 * Moved many options to the no| form (-opt and -noopt
5529 accepted). Cleaner.
5538 accepted). Cleaner.
5530
5539
5531 * Changed magic_log so that if called with no parameters, it uses
5540 * Changed magic_log so that if called with no parameters, it uses
5532 'rotate' mode. That way auto-generated logs aren't automatically
5541 'rotate' mode. That way auto-generated logs aren't automatically
5533 over-written. For normal logs, now a backup is made if it exists
5542 over-written. For normal logs, now a backup is made if it exists
5534 (only 1 level of backups). A new 'backup' mode was added to the
5543 (only 1 level of backups). A new 'backup' mode was added to the
5535 Logger class to support this. This was a request by Janko.
5544 Logger class to support this. This was a request by Janko.
5536
5545
5537 * Added @logoff/@logon to stop/restart an active log.
5546 * Added @logoff/@logon to stop/restart an active log.
5538
5547
5539 * Fixed a lot of bugs in log saving/replay. It was pretty
5548 * Fixed a lot of bugs in log saving/replay. It was pretty
5540 broken. Now special lines (!@,/) appear properly in the command
5549 broken. Now special lines (!@,/) appear properly in the command
5541 history after a log replay.
5550 history after a log replay.
5542
5551
5543 * Tried and failed to implement full session saving via pickle. My
5552 * Tried and failed to implement full session saving via pickle. My
5544 idea was to pickle __main__.__dict__, but modules can't be
5553 idea was to pickle __main__.__dict__, but modules can't be
5545 pickled. This would be a better alternative to replaying logs, but
5554 pickled. This would be a better alternative to replaying logs, but
5546 seems quite tricky to get to work. Changed -session to be called
5555 seems quite tricky to get to work. Changed -session to be called
5547 -logplay, which more accurately reflects what it does. And if we
5556 -logplay, which more accurately reflects what it does. And if we
5548 ever get real session saving working, -session is now available.
5557 ever get real session saving working, -session is now available.
5549
5558
5550 * Implemented color schemes for prompts also. As for tracebacks,
5559 * Implemented color schemes for prompts also. As for tracebacks,
5551 currently only NoColor and Linux are supported. But now the
5560 currently only NoColor and Linux are supported. But now the
5552 infrastructure is in place, based on a generic ColorScheme
5561 infrastructure is in place, based on a generic ColorScheme
5553 class. So writing and activating new schemes both for the prompts
5562 class. So writing and activating new schemes both for the prompts
5554 and the tracebacks should be straightforward.
5563 and the tracebacks should be straightforward.
5555
5564
5556 * Version 0.1.13 released, 0.1.14 opened.
5565 * Version 0.1.13 released, 0.1.14 opened.
5557
5566
5558 * Changed handling of options for output cache. Now counter is
5567 * Changed handling of options for output cache. Now counter is
5559 hardwired starting at 1 and one specifies the maximum number of
5568 hardwired starting at 1 and one specifies the maximum number of
5560 entries *in the outcache* (not the max prompt counter). This is
5569 entries *in the outcache* (not the max prompt counter). This is
5561 much better, since many statements won't increase the cache
5570 much better, since many statements won't increase the cache
5562 count. It also eliminated some confusing options, now there's only
5571 count. It also eliminated some confusing options, now there's only
5563 one: cache_size.
5572 one: cache_size.
5564
5573
5565 * Added 'alias' magic function and magic_alias option in the
5574 * Added 'alias' magic function and magic_alias option in the
5566 ipythonrc file. Now the user can easily define whatever names he
5575 ipythonrc file. Now the user can easily define whatever names he
5567 wants for the magic functions without having to play weird
5576 wants for the magic functions without having to play weird
5568 namespace games. This gives IPython a real shell-like feel.
5577 namespace games. This gives IPython a real shell-like feel.
5569
5578
5570 * Fixed doc/?/?? for magics. Now all work, in all forms (explicit
5579 * Fixed doc/?/?? for magics. Now all work, in all forms (explicit
5571 @ or not).
5580 @ or not).
5572
5581
5573 This was one of the last remaining 'visible' bugs (that I know
5582 This was one of the last remaining 'visible' bugs (that I know
5574 of). I think if I can clean up the session loading so it works
5583 of). I think if I can clean up the session loading so it works
5575 100% I'll release a 0.2.0 version on c.p.l (talk to Janko first
5584 100% I'll release a 0.2.0 version on c.p.l (talk to Janko first
5576 about licensing).
5585 about licensing).
5577
5586
5578 2001-11-25 Fernando Perez <fperez@colorado.edu>
5587 2001-11-25 Fernando Perez <fperez@colorado.edu>
5579
5588
5580 * Rewrote somewhat oinfo (?/??). Nicer, now uses page() and
5589 * Rewrote somewhat oinfo (?/??). Nicer, now uses page() and
5581 there's a cleaner distinction between what ? and ?? show.
5590 there's a cleaner distinction between what ? and ?? show.
5582
5591
5583 * Added screen_length option. Now the user can define his own
5592 * Added screen_length option. Now the user can define his own
5584 screen size for page() operations.
5593 screen size for page() operations.
5585
5594
5586 * Implemented magic shell-like functions with automatic code
5595 * Implemented magic shell-like functions with automatic code
5587 generation. Now adding another function is just a matter of adding
5596 generation. Now adding another function is just a matter of adding
5588 an entry to a dict, and the function is dynamically generated at
5597 an entry to a dict, and the function is dynamically generated at
5589 run-time. Python has some really cool features!
5598 run-time. Python has some really cool features!
5590
5599
5591 * Renamed many options to cleanup conventions a little. Now all
5600 * Renamed many options to cleanup conventions a little. Now all
5592 are lowercase, and only underscores where needed. Also in the code
5601 are lowercase, and only underscores where needed. Also in the code
5593 option name tables are clearer.
5602 option name tables are clearer.
5594
5603
5595 * Changed prompts a little. Now input is 'In [n]:' instead of
5604 * Changed prompts a little. Now input is 'In [n]:' instead of
5596 'In[n]:='. This allows it the numbers to be aligned with the
5605 'In[n]:='. This allows it the numbers to be aligned with the
5597 Out[n] numbers, and removes usage of ':=' which doesn't exist in
5606 Out[n] numbers, and removes usage of ':=' which doesn't exist in
5598 Python (it was a Mathematica thing). The '...' continuation prompt
5607 Python (it was a Mathematica thing). The '...' continuation prompt
5599 was also changed a little to align better.
5608 was also changed a little to align better.
5600
5609
5601 * Fixed bug when flushing output cache. Not all _p<n> variables
5610 * Fixed bug when flushing output cache. Not all _p<n> variables
5602 exist, so their deletion needs to be wrapped in a try:
5611 exist, so their deletion needs to be wrapped in a try:
5603
5612
5604 * Figured out how to properly use inspect.formatargspec() (it
5613 * Figured out how to properly use inspect.formatargspec() (it
5605 requires the args preceded by *). So I removed all the code from
5614 requires the args preceded by *). So I removed all the code from
5606 _get_pdef in Magic, which was just replicating that.
5615 _get_pdef in Magic, which was just replicating that.
5607
5616
5608 * Added test to prefilter to allow redefining magic function names
5617 * Added test to prefilter to allow redefining magic function names
5609 as variables. This is ok, since the @ form is always available,
5618 as variables. This is ok, since the @ form is always available,
5610 but whe should allow the user to define a variable called 'ls' if
5619 but whe should allow the user to define a variable called 'ls' if
5611 he needs it.
5620 he needs it.
5612
5621
5613 * Moved the ToDo information from README into a separate ToDo.
5622 * Moved the ToDo information from README into a separate ToDo.
5614
5623
5615 * General code cleanup and small bugfixes. I think it's close to a
5624 * General code cleanup and small bugfixes. I think it's close to a
5616 state where it can be released, obviously with a big 'beta'
5625 state where it can be released, obviously with a big 'beta'
5617 warning on it.
5626 warning on it.
5618
5627
5619 * Got the magic function split to work. Now all magics are defined
5628 * Got the magic function split to work. Now all magics are defined
5620 in a separate class. It just organizes things a bit, and now
5629 in a separate class. It just organizes things a bit, and now
5621 Xemacs behaves nicer (it was choking on InteractiveShell b/c it
5630 Xemacs behaves nicer (it was choking on InteractiveShell b/c it
5622 was too long).
5631 was too long).
5623
5632
5624 * Changed @clear to @reset to avoid potential confusions with
5633 * Changed @clear to @reset to avoid potential confusions with
5625 the shell command clear. Also renamed @cl to @clear, which does
5634 the shell command clear. Also renamed @cl to @clear, which does
5626 exactly what people expect it to from their shell experience.
5635 exactly what people expect it to from their shell experience.
5627
5636
5628 Added a check to the @reset command (since it's so
5637 Added a check to the @reset command (since it's so
5629 destructive, it's probably a good idea to ask for confirmation).
5638 destructive, it's probably a good idea to ask for confirmation).
5630 But now reset only works for full namespace resetting. Since the
5639 But now reset only works for full namespace resetting. Since the
5631 del keyword is already there for deleting a few specific
5640 del keyword is already there for deleting a few specific
5632 variables, I don't see the point of having a redundant magic
5641 variables, I don't see the point of having a redundant magic
5633 function for the same task.
5642 function for the same task.
5634
5643
5635 2001-11-24 Fernando Perez <fperez@colorado.edu>
5644 2001-11-24 Fernando Perez <fperez@colorado.edu>
5636
5645
5637 * Updated the builtin docs (esp. the ? ones).
5646 * Updated the builtin docs (esp. the ? ones).
5638
5647
5639 * Ran all the code through pychecker. Not terribly impressed with
5648 * Ran all the code through pychecker. Not terribly impressed with
5640 it: lots of spurious warnings and didn't really find anything of
5649 it: lots of spurious warnings and didn't really find anything of
5641 substance (just a few modules being imported and not used).
5650 substance (just a few modules being imported and not used).
5642
5651
5643 * Implemented the new ultraTB functionality into IPython. New
5652 * Implemented the new ultraTB functionality into IPython. New
5644 option: xcolors. This chooses color scheme. xmode now only selects
5653 option: xcolors. This chooses color scheme. xmode now only selects
5645 between Plain and Verbose. Better orthogonality.
5654 between Plain and Verbose. Better orthogonality.
5646
5655
5647 * Large rewrite of ultraTB. Much cleaner now, with a separation of
5656 * Large rewrite of ultraTB. Much cleaner now, with a separation of
5648 mode and color scheme for the exception handlers. Now it's
5657 mode and color scheme for the exception handlers. Now it's
5649 possible to have the verbose traceback with no coloring.
5658 possible to have the verbose traceback with no coloring.
5650
5659
5651 2001-11-23 Fernando Perez <fperez@colorado.edu>
5660 2001-11-23 Fernando Perez <fperez@colorado.edu>
5652
5661
5653 * Version 0.1.12 released, 0.1.13 opened.
5662 * Version 0.1.12 released, 0.1.13 opened.
5654
5663
5655 * Removed option to set auto-quote and auto-paren escapes by
5664 * Removed option to set auto-quote and auto-paren escapes by
5656 user. The chances of breaking valid syntax are just too high. If
5665 user. The chances of breaking valid syntax are just too high. If
5657 someone *really* wants, they can always dig into the code.
5666 someone *really* wants, they can always dig into the code.
5658
5667
5659 * Made prompt separators configurable.
5668 * Made prompt separators configurable.
5660
5669
5661 2001-11-22 Fernando Perez <fperez@colorado.edu>
5670 2001-11-22 Fernando Perez <fperez@colorado.edu>
5662
5671
5663 * Small bugfixes in many places.
5672 * Small bugfixes in many places.
5664
5673
5665 * Removed the MyCompleter class from ipplib. It seemed redundant
5674 * Removed the MyCompleter class from ipplib. It seemed redundant
5666 with the C-p,C-n history search functionality. Less code to
5675 with the C-p,C-n history search functionality. Less code to
5667 maintain.
5676 maintain.
5668
5677
5669 * Moved all the original ipython.py code into ipythonlib.py. Right
5678 * Moved all the original ipython.py code into ipythonlib.py. Right
5670 now it's just one big dump into a function called make_IPython, so
5679 now it's just one big dump into a function called make_IPython, so
5671 no real modularity has been gained. But at least it makes the
5680 no real modularity has been gained. But at least it makes the
5672 wrapper script tiny, and since ipythonlib is a module, it gets
5681 wrapper script tiny, and since ipythonlib is a module, it gets
5673 compiled and startup is much faster.
5682 compiled and startup is much faster.
5674
5683
5675 This is a reasobably 'deep' change, so we should test it for a
5684 This is a reasobably 'deep' change, so we should test it for a
5676 while without messing too much more with the code.
5685 while without messing too much more with the code.
5677
5686
5678 2001-11-21 Fernando Perez <fperez@colorado.edu>
5687 2001-11-21 Fernando Perez <fperez@colorado.edu>
5679
5688
5680 * Version 0.1.11 released, 0.1.12 opened for further work.
5689 * Version 0.1.11 released, 0.1.12 opened for further work.
5681
5690
5682 * Removed dependency on Itpl. It was only needed in one place. It
5691 * Removed dependency on Itpl. It was only needed in one place. It
5683 would be nice if this became part of python, though. It makes life
5692 would be nice if this became part of python, though. It makes life
5684 *a lot* easier in some cases.
5693 *a lot* easier in some cases.
5685
5694
5686 * Simplified the prefilter code a bit. Now all handlers are
5695 * Simplified the prefilter code a bit. Now all handlers are
5687 expected to explicitly return a value (at least a blank string).
5696 expected to explicitly return a value (at least a blank string).
5688
5697
5689 * Heavy edits in ipplib. Removed the help system altogether. Now
5698 * Heavy edits in ipplib. Removed the help system altogether. Now
5690 obj?/?? is used for inspecting objects, a magic @doc prints
5699 obj?/?? is used for inspecting objects, a magic @doc prints
5691 docstrings, and full-blown Python help is accessed via the 'help'
5700 docstrings, and full-blown Python help is accessed via the 'help'
5692 keyword. This cleans up a lot of code (less to maintain) and does
5701 keyword. This cleans up a lot of code (less to maintain) and does
5693 the job. Since 'help' is now a standard Python component, might as
5702 the job. Since 'help' is now a standard Python component, might as
5694 well use it and remove duplicate functionality.
5703 well use it and remove duplicate functionality.
5695
5704
5696 Also removed the option to use ipplib as a standalone program. By
5705 Also removed the option to use ipplib as a standalone program. By
5697 now it's too dependent on other parts of IPython to function alone.
5706 now it's too dependent on other parts of IPython to function alone.
5698
5707
5699 * Fixed bug in genutils.pager. It would crash if the pager was
5708 * Fixed bug in genutils.pager. It would crash if the pager was
5700 exited immediately after opening (broken pipe).
5709 exited immediately after opening (broken pipe).
5701
5710
5702 * Trimmed down the VerboseTB reporting a little. The header is
5711 * Trimmed down the VerboseTB reporting a little. The header is
5703 much shorter now and the repeated exception arguments at the end
5712 much shorter now and the repeated exception arguments at the end
5704 have been removed. For interactive use the old header seemed a bit
5713 have been removed. For interactive use the old header seemed a bit
5705 excessive.
5714 excessive.
5706
5715
5707 * Fixed small bug in output of @whos for variables with multi-word
5716 * Fixed small bug in output of @whos for variables with multi-word
5708 types (only first word was displayed).
5717 types (only first word was displayed).
5709
5718
5710 2001-11-17 Fernando Perez <fperez@colorado.edu>
5719 2001-11-17 Fernando Perez <fperez@colorado.edu>
5711
5720
5712 * Version 0.1.10 released, 0.1.11 opened for further work.
5721 * Version 0.1.10 released, 0.1.11 opened for further work.
5713
5722
5714 * Modified dirs and friends. dirs now *returns* the stack (not
5723 * Modified dirs and friends. dirs now *returns* the stack (not
5715 prints), so one can manipulate it as a variable. Convenient to
5724 prints), so one can manipulate it as a variable. Convenient to
5716 travel along many directories.
5725 travel along many directories.
5717
5726
5718 * Fixed bug in magic_pdef: would only work with functions with
5727 * Fixed bug in magic_pdef: would only work with functions with
5719 arguments with default values.
5728 arguments with default values.
5720
5729
5721 2001-11-14 Fernando Perez <fperez@colorado.edu>
5730 2001-11-14 Fernando Perez <fperez@colorado.edu>
5722
5731
5723 * Added the PhysicsInput stuff to dot_ipython so it ships as an
5732 * Added the PhysicsInput stuff to dot_ipython so it ships as an
5724 example with IPython. Various other minor fixes and cleanups.
5733 example with IPython. Various other minor fixes and cleanups.
5725
5734
5726 * Version 0.1.9 released, 0.1.10 opened for further work.
5735 * Version 0.1.9 released, 0.1.10 opened for further work.
5727
5736
5728 * Added sys.path to the list of directories searched in the
5737 * Added sys.path to the list of directories searched in the
5729 execfile= option. It used to be the current directory and the
5738 execfile= option. It used to be the current directory and the
5730 user's IPYTHONDIR only.
5739 user's IPYTHONDIR only.
5731
5740
5732 2001-11-13 Fernando Perez <fperez@colorado.edu>
5741 2001-11-13 Fernando Perez <fperez@colorado.edu>
5733
5742
5734 * Reinstated the raw_input/prefilter separation that Janko had
5743 * Reinstated the raw_input/prefilter separation that Janko had
5735 initially. This gives a more convenient setup for extending the
5744 initially. This gives a more convenient setup for extending the
5736 pre-processor from the outside: raw_input always gets a string,
5745 pre-processor from the outside: raw_input always gets a string,
5737 and prefilter has to process it. We can then redefine prefilter
5746 and prefilter has to process it. We can then redefine prefilter
5738 from the outside and implement extensions for special
5747 from the outside and implement extensions for special
5739 purposes.
5748 purposes.
5740
5749
5741 Today I got one for inputting PhysicalQuantity objects
5750 Today I got one for inputting PhysicalQuantity objects
5742 (from Scientific) without needing any function calls at
5751 (from Scientific) without needing any function calls at
5743 all. Extremely convenient, and it's all done as a user-level
5752 all. Extremely convenient, and it's all done as a user-level
5744 extension (no IPython code was touched). Now instead of:
5753 extension (no IPython code was touched). Now instead of:
5745 a = PhysicalQuantity(4.2,'m/s**2')
5754 a = PhysicalQuantity(4.2,'m/s**2')
5746 one can simply say
5755 one can simply say
5747 a = 4.2 m/s**2
5756 a = 4.2 m/s**2
5748 or even
5757 or even
5749 a = 4.2 m/s^2
5758 a = 4.2 m/s^2
5750
5759
5751 I use this, but it's also a proof of concept: IPython really is
5760 I use this, but it's also a proof of concept: IPython really is
5752 fully user-extensible, even at the level of the parsing of the
5761 fully user-extensible, even at the level of the parsing of the
5753 command line. It's not trivial, but it's perfectly doable.
5762 command line. It's not trivial, but it's perfectly doable.
5754
5763
5755 * Added 'add_flip' method to inclusion conflict resolver. Fixes
5764 * Added 'add_flip' method to inclusion conflict resolver. Fixes
5756 the problem of modules being loaded in the inverse order in which
5765 the problem of modules being loaded in the inverse order in which
5757 they were defined in
5766 they were defined in
5758
5767
5759 * Version 0.1.8 released, 0.1.9 opened for further work.
5768 * Version 0.1.8 released, 0.1.9 opened for further work.
5760
5769
5761 * Added magics pdef, source and file. They respectively show the
5770 * Added magics pdef, source and file. They respectively show the
5762 definition line ('prototype' in C), source code and full python
5771 definition line ('prototype' in C), source code and full python
5763 file for any callable object. The object inspector oinfo uses
5772 file for any callable object. The object inspector oinfo uses
5764 these to show the same information.
5773 these to show the same information.
5765
5774
5766 * Version 0.1.7 released, 0.1.8 opened for further work.
5775 * Version 0.1.7 released, 0.1.8 opened for further work.
5767
5776
5768 * Separated all the magic functions into a class called Magic. The
5777 * Separated all the magic functions into a class called Magic. The
5769 InteractiveShell class was becoming too big for Xemacs to handle
5778 InteractiveShell class was becoming too big for Xemacs to handle
5770 (de-indenting a line would lock it up for 10 seconds while it
5779 (de-indenting a line would lock it up for 10 seconds while it
5771 backtracked on the whole class!)
5780 backtracked on the whole class!)
5772
5781
5773 FIXME: didn't work. It can be done, but right now namespaces are
5782 FIXME: didn't work. It can be done, but right now namespaces are
5774 all messed up. Do it later (reverted it for now, so at least
5783 all messed up. Do it later (reverted it for now, so at least
5775 everything works as before).
5784 everything works as before).
5776
5785
5777 * Got the object introspection system (magic_oinfo) working! I
5786 * Got the object introspection system (magic_oinfo) working! I
5778 think this is pretty much ready for release to Janko, so he can
5787 think this is pretty much ready for release to Janko, so he can
5779 test it for a while and then announce it. Pretty much 100% of what
5788 test it for a while and then announce it. Pretty much 100% of what
5780 I wanted for the 'phase 1' release is ready. Happy, tired.
5789 I wanted for the 'phase 1' release is ready. Happy, tired.
5781
5790
5782 2001-11-12 Fernando Perez <fperez@colorado.edu>
5791 2001-11-12 Fernando Perez <fperez@colorado.edu>
5783
5792
5784 * Version 0.1.6 released, 0.1.7 opened for further work.
5793 * Version 0.1.6 released, 0.1.7 opened for further work.
5785
5794
5786 * Fixed bug in printing: it used to test for truth before
5795 * Fixed bug in printing: it used to test for truth before
5787 printing, so 0 wouldn't print. Now checks for None.
5796 printing, so 0 wouldn't print. Now checks for None.
5788
5797
5789 * Fixed bug where auto-execs increase the prompt counter by 2 (b/c
5798 * Fixed bug where auto-execs increase the prompt counter by 2 (b/c
5790 they have to call len(str(sys.ps1)) ). But the fix is ugly, it
5799 they have to call len(str(sys.ps1)) ). But the fix is ugly, it
5791 reaches by hand into the outputcache. Think of a better way to do
5800 reaches by hand into the outputcache. Think of a better way to do
5792 this later.
5801 this later.
5793
5802
5794 * Various small fixes thanks to Nathan's comments.
5803 * Various small fixes thanks to Nathan's comments.
5795
5804
5796 * Changed magic_pprint to magic_Pprint. This way it doesn't
5805 * Changed magic_pprint to magic_Pprint. This way it doesn't
5797 collide with pprint() and the name is consistent with the command
5806 collide with pprint() and the name is consistent with the command
5798 line option.
5807 line option.
5799
5808
5800 * Changed prompt counter behavior to be fully like
5809 * Changed prompt counter behavior to be fully like
5801 Mathematica's. That is, even input that doesn't return a result
5810 Mathematica's. That is, even input that doesn't return a result
5802 raises the prompt counter. The old behavior was kind of confusing
5811 raises the prompt counter. The old behavior was kind of confusing
5803 (getting the same prompt number several times if the operation
5812 (getting the same prompt number several times if the operation
5804 didn't return a result).
5813 didn't return a result).
5805
5814
5806 * Fixed Nathan's last name in a couple of places (Gray, not Graham).
5815 * Fixed Nathan's last name in a couple of places (Gray, not Graham).
5807
5816
5808 * Fixed -Classic mode (wasn't working anymore).
5817 * Fixed -Classic mode (wasn't working anymore).
5809
5818
5810 * Added colored prompts using Nathan's new code. Colors are
5819 * Added colored prompts using Nathan's new code. Colors are
5811 currently hardwired, they can be user-configurable. For
5820 currently hardwired, they can be user-configurable. For
5812 developers, they can be chosen in file ipythonlib.py, at the
5821 developers, they can be chosen in file ipythonlib.py, at the
5813 beginning of the CachedOutput class def.
5822 beginning of the CachedOutput class def.
5814
5823
5815 2001-11-11 Fernando Perez <fperez@colorado.edu>
5824 2001-11-11 Fernando Perez <fperez@colorado.edu>
5816
5825
5817 * Version 0.1.5 released, 0.1.6 opened for further work.
5826 * Version 0.1.5 released, 0.1.6 opened for further work.
5818
5827
5819 * Changed magic_env to *return* the environment as a dict (not to
5828 * Changed magic_env to *return* the environment as a dict (not to
5820 print it). This way it prints, but it can also be processed.
5829 print it). This way it prints, but it can also be processed.
5821
5830
5822 * Added Verbose exception reporting to interactive
5831 * Added Verbose exception reporting to interactive
5823 exceptions. Very nice, now even 1/0 at the prompt gives a verbose
5832 exceptions. Very nice, now even 1/0 at the prompt gives a verbose
5824 traceback. Had to make some changes to the ultraTB file. This is
5833 traceback. Had to make some changes to the ultraTB file. This is
5825 probably the last 'big' thing in my mental todo list. This ties
5834 probably the last 'big' thing in my mental todo list. This ties
5826 in with the next entry:
5835 in with the next entry:
5827
5836
5828 * Changed -Xi and -Xf to a single -xmode option. Now all the user
5837 * Changed -Xi and -Xf to a single -xmode option. Now all the user
5829 has to specify is Plain, Color or Verbose for all exception
5838 has to specify is Plain, Color or Verbose for all exception
5830 handling.
5839 handling.
5831
5840
5832 * Removed ShellServices option. All this can really be done via
5841 * Removed ShellServices option. All this can really be done via
5833 the magic system. It's easier to extend, cleaner and has automatic
5842 the magic system. It's easier to extend, cleaner and has automatic
5834 namespace protection and documentation.
5843 namespace protection and documentation.
5835
5844
5836 2001-11-09 Fernando Perez <fperez@colorado.edu>
5845 2001-11-09 Fernando Perez <fperez@colorado.edu>
5837
5846
5838 * Fixed bug in output cache flushing (missing parameter to
5847 * Fixed bug in output cache flushing (missing parameter to
5839 __init__). Other small bugs fixed (found using pychecker).
5848 __init__). Other small bugs fixed (found using pychecker).
5840
5849
5841 * Version 0.1.4 opened for bugfixing.
5850 * Version 0.1.4 opened for bugfixing.
5842
5851
5843 2001-11-07 Fernando Perez <fperez@colorado.edu>
5852 2001-11-07 Fernando Perez <fperez@colorado.edu>
5844
5853
5845 * Version 0.1.3 released, mainly because of the raw_input bug.
5854 * Version 0.1.3 released, mainly because of the raw_input bug.
5846
5855
5847 * Fixed NASTY bug in raw_input: input line wasn't properly parsed
5856 * Fixed NASTY bug in raw_input: input line wasn't properly parsed
5848 and when testing for whether things were callable, a call could
5857 and when testing for whether things were callable, a call could
5849 actually be made to certain functions. They would get called again
5858 actually be made to certain functions. They would get called again
5850 once 'really' executed, with a resulting double call. A disaster
5859 once 'really' executed, with a resulting double call. A disaster
5851 in many cases (list.reverse() would never work!).
5860 in many cases (list.reverse() would never work!).
5852
5861
5853 * Removed prefilter() function, moved its code to raw_input (which
5862 * Removed prefilter() function, moved its code to raw_input (which
5854 after all was just a near-empty caller for prefilter). This saves
5863 after all was just a near-empty caller for prefilter). This saves
5855 a function call on every prompt, and simplifies the class a tiny bit.
5864 a function call on every prompt, and simplifies the class a tiny bit.
5856
5865
5857 * Fix _ip to __ip name in magic example file.
5866 * Fix _ip to __ip name in magic example file.
5858
5867
5859 * Changed 'tar -x -f' to 'tar xvf' in auto-installer. This should
5868 * Changed 'tar -x -f' to 'tar xvf' in auto-installer. This should
5860 work with non-gnu versions of tar.
5869 work with non-gnu versions of tar.
5861
5870
5862 2001-11-06 Fernando Perez <fperez@colorado.edu>
5871 2001-11-06 Fernando Perez <fperez@colorado.edu>
5863
5872
5864 * Version 0.1.2. Just to keep track of the recent changes.
5873 * Version 0.1.2. Just to keep track of the recent changes.
5865
5874
5866 * Fixed nasty bug in output prompt routine. It used to check 'if
5875 * Fixed nasty bug in output prompt routine. It used to check 'if
5867 arg != None...'. Problem is, this fails if arg implements a
5876 arg != None...'. Problem is, this fails if arg implements a
5868 special comparison (__cmp__) which disallows comparing to
5877 special comparison (__cmp__) which disallows comparing to
5869 None. Found it when trying to use the PhysicalQuantity module from
5878 None. Found it when trying to use the PhysicalQuantity module from
5870 ScientificPython.
5879 ScientificPython.
5871
5880
5872 2001-11-05 Fernando Perez <fperez@colorado.edu>
5881 2001-11-05 Fernando Perez <fperez@colorado.edu>
5873
5882
5874 * Also added dirs. Now the pushd/popd/dirs family functions
5883 * Also added dirs. Now the pushd/popd/dirs family functions
5875 basically like the shell, with the added convenience of going home
5884 basically like the shell, with the added convenience of going home
5876 when called with no args.
5885 when called with no args.
5877
5886
5878 * pushd/popd slightly modified to mimic shell behavior more
5887 * pushd/popd slightly modified to mimic shell behavior more
5879 closely.
5888 closely.
5880
5889
5881 * Added env,pushd,popd from ShellServices as magic functions. I
5890 * Added env,pushd,popd from ShellServices as magic functions. I
5882 think the cleanest will be to port all desired functions from
5891 think the cleanest will be to port all desired functions from
5883 ShellServices as magics and remove ShellServices altogether. This
5892 ShellServices as magics and remove ShellServices altogether. This
5884 will provide a single, clean way of adding functionality
5893 will provide a single, clean way of adding functionality
5885 (shell-type or otherwise) to IP.
5894 (shell-type or otherwise) to IP.
5886
5895
5887 2001-11-04 Fernando Perez <fperez@colorado.edu>
5896 2001-11-04 Fernando Perez <fperez@colorado.edu>
5888
5897
5889 * Added .ipython/ directory to sys.path. This way users can keep
5898 * Added .ipython/ directory to sys.path. This way users can keep
5890 customizations there and access them via import.
5899 customizations there and access them via import.
5891
5900
5892 2001-11-03 Fernando Perez <fperez@colorado.edu>
5901 2001-11-03 Fernando Perez <fperez@colorado.edu>
5893
5902
5894 * Opened version 0.1.1 for new changes.
5903 * Opened version 0.1.1 for new changes.
5895
5904
5896 * Changed version number to 0.1.0: first 'public' release, sent to
5905 * Changed version number to 0.1.0: first 'public' release, sent to
5897 Nathan and Janko.
5906 Nathan and Janko.
5898
5907
5899 * Lots of small fixes and tweaks.
5908 * Lots of small fixes and tweaks.
5900
5909
5901 * Minor changes to whos format. Now strings are shown, snipped if
5910 * Minor changes to whos format. Now strings are shown, snipped if
5902 too long.
5911 too long.
5903
5912
5904 * Changed ShellServices to work on __main__ so they show up in @who
5913 * Changed ShellServices to work on __main__ so they show up in @who
5905
5914
5906 * Help also works with ? at the end of a line:
5915 * Help also works with ? at the end of a line:
5907 ?sin and sin?
5916 ?sin and sin?
5908 both produce the same effect. This is nice, as often I use the
5917 both produce the same effect. This is nice, as often I use the
5909 tab-complete to find the name of a method, but I used to then have
5918 tab-complete to find the name of a method, but I used to then have
5910 to go to the beginning of the line to put a ? if I wanted more
5919 to go to the beginning of the line to put a ? if I wanted more
5911 info. Now I can just add the ? and hit return. Convenient.
5920 info. Now I can just add the ? and hit return. Convenient.
5912
5921
5913 2001-11-02 Fernando Perez <fperez@colorado.edu>
5922 2001-11-02 Fernando Perez <fperez@colorado.edu>
5914
5923
5915 * Python version check (>=2.1) added.
5924 * Python version check (>=2.1) added.
5916
5925
5917 * Added LazyPython documentation. At this point the docs are quite
5926 * Added LazyPython documentation. At this point the docs are quite
5918 a mess. A cleanup is in order.
5927 a mess. A cleanup is in order.
5919
5928
5920 * Auto-installer created. For some bizarre reason, the zipfiles
5929 * Auto-installer created. For some bizarre reason, the zipfiles
5921 module isn't working on my system. So I made a tar version
5930 module isn't working on my system. So I made a tar version
5922 (hopefully the command line options in various systems won't kill
5931 (hopefully the command line options in various systems won't kill
5923 me).
5932 me).
5924
5933
5925 * Fixes to Struct in genutils. Now all dictionary-like methods are
5934 * Fixes to Struct in genutils. Now all dictionary-like methods are
5926 protected (reasonably).
5935 protected (reasonably).
5927
5936
5928 * Added pager function to genutils and changed ? to print usage
5937 * Added pager function to genutils and changed ? to print usage
5929 note through it (it was too long).
5938 note through it (it was too long).
5930
5939
5931 * Added the LazyPython functionality. Works great! I changed the
5940 * Added the LazyPython functionality. Works great! I changed the
5932 auto-quote escape to ';', it's on home row and next to '. But
5941 auto-quote escape to ';', it's on home row and next to '. But
5933 both auto-quote and auto-paren (still /) escapes are command-line
5942 both auto-quote and auto-paren (still /) escapes are command-line
5934 parameters.
5943 parameters.
5935
5944
5936
5945
5937 2001-11-01 Fernando Perez <fperez@colorado.edu>
5946 2001-11-01 Fernando Perez <fperez@colorado.edu>
5938
5947
5939 * Version changed to 0.0.7. Fairly large change: configuration now
5948 * Version changed to 0.0.7. Fairly large change: configuration now
5940 is all stored in a directory, by default .ipython. There, all
5949 is all stored in a directory, by default .ipython. There, all
5941 config files have normal looking names (not .names)
5950 config files have normal looking names (not .names)
5942
5951
5943 * Version 0.0.6 Released first to Lucas and Archie as a test
5952 * Version 0.0.6 Released first to Lucas and Archie as a test
5944 run. Since it's the first 'semi-public' release, change version to
5953 run. Since it's the first 'semi-public' release, change version to
5945 > 0.0.6 for any changes now.
5954 > 0.0.6 for any changes now.
5946
5955
5947 * Stuff I had put in the ipplib.py changelog:
5956 * Stuff I had put in the ipplib.py changelog:
5948
5957
5949 Changes to InteractiveShell:
5958 Changes to InteractiveShell:
5950
5959
5951 - Made the usage message a parameter.
5960 - Made the usage message a parameter.
5952
5961
5953 - Require the name of the shell variable to be given. It's a bit
5962 - Require the name of the shell variable to be given. It's a bit
5954 of a hack, but allows the name 'shell' not to be hardwired in the
5963 of a hack, but allows the name 'shell' not to be hardwired in the
5955 magic (@) handler, which is problematic b/c it requires
5964 magic (@) handler, which is problematic b/c it requires
5956 polluting the global namespace with 'shell'. This in turn is
5965 polluting the global namespace with 'shell'. This in turn is
5957 fragile: if a user redefines a variable called shell, things
5966 fragile: if a user redefines a variable called shell, things
5958 break.
5967 break.
5959
5968
5960 - magic @: all functions available through @ need to be defined
5969 - magic @: all functions available through @ need to be defined
5961 as magic_<name>, even though they can be called simply as
5970 as magic_<name>, even though they can be called simply as
5962 @<name>. This allows the special command @magic to gather
5971 @<name>. This allows the special command @magic to gather
5963 information automatically about all existing magic functions,
5972 information automatically about all existing magic functions,
5964 even if they are run-time user extensions, by parsing the shell
5973 even if they are run-time user extensions, by parsing the shell
5965 instance __dict__ looking for special magic_ names.
5974 instance __dict__ looking for special magic_ names.
5966
5975
5967 - mainloop: added *two* local namespace parameters. This allows
5976 - mainloop: added *two* local namespace parameters. This allows
5968 the class to differentiate between parameters which were there
5977 the class to differentiate between parameters which were there
5969 before and after command line initialization was processed. This
5978 before and after command line initialization was processed. This
5970 way, later @who can show things loaded at startup by the
5979 way, later @who can show things loaded at startup by the
5971 user. This trick was necessary to make session saving/reloading
5980 user. This trick was necessary to make session saving/reloading
5972 really work: ideally after saving/exiting/reloading a session,
5981 really work: ideally after saving/exiting/reloading a session,
5973 *everything* should look the same, including the output of @who. I
5982 *everything* should look the same, including the output of @who. I
5974 was only able to make this work with this double namespace
5983 was only able to make this work with this double namespace
5975 trick.
5984 trick.
5976
5985
5977 - added a header to the logfile which allows (almost) full
5986 - added a header to the logfile which allows (almost) full
5978 session restoring.
5987 session restoring.
5979
5988
5980 - prepend lines beginning with @ or !, with a and log
5989 - prepend lines beginning with @ or !, with a and log
5981 them. Why? !lines: may be useful to know what you did @lines:
5990 them. Why? !lines: may be useful to know what you did @lines:
5982 they may affect session state. So when restoring a session, at
5991 they may affect session state. So when restoring a session, at
5983 least inform the user of their presence. I couldn't quite get
5992 least inform the user of their presence. I couldn't quite get
5984 them to properly re-execute, but at least the user is warned.
5993 them to properly re-execute, but at least the user is warned.
5985
5994
5986 * Started ChangeLog.
5995 * Started ChangeLog.
General Comments 0
You need to be logged in to leave comments. Login now