Show More
@@ -1,611 +1,612 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """ |
|
3 | 3 | Pdb debugger class. |
|
4 | 4 | |
|
5 | 5 | Modified from the standard pdb.Pdb class to avoid including readline, so that |
|
6 | 6 | the command line completion of other programs which include this isn't |
|
7 | 7 | damaged. |
|
8 | 8 | |
|
9 | 9 | In the future, this class will be expanded with improvements over the standard |
|
10 | 10 | pdb. |
|
11 | 11 | |
|
12 | 12 | The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor |
|
13 | 13 | changes. Licensing should therefore be under the standard Python terms. For |
|
14 | 14 | details on the PSF (Python Software Foundation) standard license, see: |
|
15 | 15 | |
|
16 |
http |
|
|
16 | https://docs.python.org/2/license.html | |
|
17 | """ | |
|
17 | 18 | |
|
18 | 19 | #***************************************************************************** |
|
19 | 20 | # |
|
20 | 21 | # This file is licensed under the PSF license. |
|
21 | 22 | # |
|
22 | 23 | # Copyright (C) 2001 Python Software Foundation, www.python.org |
|
23 | 24 | # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu> |
|
24 | 25 | # |
|
25 | 26 | # |
|
26 | 27 | #***************************************************************************** |
|
27 | 28 | |
|
28 | 29 | import bdb |
|
29 | 30 | import functools |
|
30 | 31 | import inspect |
|
31 | 32 | import linecache |
|
32 | 33 | import sys |
|
33 | 34 | import warnings |
|
34 | 35 | |
|
35 | 36 | from IPython import get_ipython |
|
36 | 37 | from IPython.utils import PyColorize |
|
37 | 38 | from IPython.utils import coloransi, py3compat |
|
38 | 39 | from IPython.core.excolors import exception_colors |
|
39 | 40 | from IPython.testing.skipdoctest import skip_doctest |
|
40 | 41 | |
|
41 | 42 | |
|
42 | 43 | prompt = 'ipdb> ' |
|
43 | 44 | |
|
44 | 45 | #We have to check this directly from sys.argv, config struct not yet available |
|
45 | 46 | from pdb import Pdb as OldPdb |
|
46 | 47 | |
|
47 | 48 | # Allow the set_trace code to operate outside of an ipython instance, even if |
|
48 | 49 | # it does so with some limitations. The rest of this support is implemented in |
|
49 | 50 | # the Tracer constructor. |
|
50 | 51 | |
|
51 | 52 | def make_arrow(pad): |
|
52 | 53 | """generate the leading arrow in front of traceback or debugger""" |
|
53 | 54 | if pad >= 2: |
|
54 | 55 | return '-'*(pad-2) + '> ' |
|
55 | 56 | elif pad == 1: |
|
56 | 57 | return '>' |
|
57 | 58 | return '' |
|
58 | 59 | |
|
59 | 60 | |
|
60 | 61 | def BdbQuit_excepthook(et, ev, tb, excepthook=None): |
|
61 | 62 | """Exception hook which handles `BdbQuit` exceptions. |
|
62 | 63 | |
|
63 | 64 | All other exceptions are processed using the `excepthook` |
|
64 | 65 | parameter. |
|
65 | 66 | """ |
|
66 | 67 | warnings.warn("`BdbQuit_excepthook` is deprecated since version 5.1", |
|
67 | 68 | DeprecationWarning, stacklevel=2) |
|
68 | 69 | if et==bdb.BdbQuit: |
|
69 | 70 | print('Exiting Debugger.') |
|
70 | 71 | elif excepthook is not None: |
|
71 | 72 | excepthook(et, ev, tb) |
|
72 | 73 | else: |
|
73 | 74 | # Backwards compatibility. Raise deprecation warning? |
|
74 | 75 | BdbQuit_excepthook.excepthook_ori(et,ev,tb) |
|
75 | 76 | |
|
76 | 77 | |
|
77 | 78 | def BdbQuit_IPython_excepthook(self,et,ev,tb,tb_offset=None): |
|
78 | 79 | warnings.warn( |
|
79 | 80 | "`BdbQuit_IPython_excepthook` is deprecated since version 5.1", |
|
80 | 81 | DeprecationWarning, stacklevel=2) |
|
81 | 82 | print('Exiting Debugger.') |
|
82 | 83 | |
|
83 | 84 | |
|
84 | 85 | class Tracer(object): |
|
85 | 86 | """ |
|
86 | 87 | DEPRECATED |
|
87 | 88 | |
|
88 | 89 | Class for local debugging, similar to pdb.set_trace. |
|
89 | 90 | |
|
90 | 91 | Instances of this class, when called, behave like pdb.set_trace, but |
|
91 | 92 | providing IPython's enhanced capabilities. |
|
92 | 93 | |
|
93 | 94 | This is implemented as a class which must be initialized in your own code |
|
94 | 95 | and not as a standalone function because we need to detect at runtime |
|
95 | 96 | whether IPython is already active or not. That detection is done in the |
|
96 | 97 | constructor, ensuring that this code plays nicely with a running IPython, |
|
97 | 98 | while functioning acceptably (though with limitations) if outside of it. |
|
98 | 99 | """ |
|
99 | 100 | |
|
100 | 101 | @skip_doctest |
|
101 | 102 | def __init__(self, colors=None): |
|
102 | 103 | """ |
|
103 | 104 | DEPRECATED |
|
104 | 105 | |
|
105 | 106 | Create a local debugger instance. |
|
106 | 107 | |
|
107 | 108 | Parameters |
|
108 | 109 | ---------- |
|
109 | 110 | |
|
110 | 111 | colors : str, optional |
|
111 | 112 | The name of the color scheme to use, it must be one of IPython's |
|
112 | 113 | valid color schemes. If not given, the function will default to |
|
113 | 114 | the current IPython scheme when running inside IPython, and to |
|
114 | 115 | 'NoColor' otherwise. |
|
115 | 116 | |
|
116 | 117 | Examples |
|
117 | 118 | -------- |
|
118 | 119 | :: |
|
119 | 120 | |
|
120 | 121 | from IPython.core.debugger import Tracer; debug_here = Tracer() |
|
121 | 122 | |
|
122 | 123 | Later in your code:: |
|
123 | 124 | |
|
124 | 125 | debug_here() # -> will open up the debugger at that point. |
|
125 | 126 | |
|
126 | 127 | Once the debugger activates, you can use all of its regular commands to |
|
127 | 128 | step through code, set breakpoints, etc. See the pdb documentation |
|
128 | 129 | from the Python standard library for usage details. |
|
129 | 130 | """ |
|
130 | 131 | warnings.warn("`Tracer` is deprecated since version 5.1, directly use " |
|
131 | 132 | "`IPython.core.debugger.Pdb.set_trace()`", |
|
132 | 133 | DeprecationWarning, stacklevel=2) |
|
133 | 134 | |
|
134 | 135 | ip = get_ipython() |
|
135 | 136 | if ip is None: |
|
136 | 137 | # Outside of ipython, we set our own exception hook manually |
|
137 | 138 | sys.excepthook = functools.partial(BdbQuit_excepthook, |
|
138 | 139 | excepthook=sys.excepthook) |
|
139 | 140 | def_colors = 'NoColor' |
|
140 | 141 | else: |
|
141 | 142 | # In ipython, we use its custom exception handler mechanism |
|
142 | 143 | def_colors = ip.colors |
|
143 | 144 | ip.set_custom_exc((bdb.BdbQuit,), BdbQuit_IPython_excepthook) |
|
144 | 145 | |
|
145 | 146 | if colors is None: |
|
146 | 147 | colors = def_colors |
|
147 | 148 | |
|
148 | 149 | # The stdlib debugger internally uses a modified repr from the `repr` |
|
149 | 150 | # module, that limits the length of printed strings to a hardcoded |
|
150 | 151 | # limit of 30 characters. That much trimming is too aggressive, let's |
|
151 | 152 | # at least raise that limit to 80 chars, which should be enough for |
|
152 | 153 | # most interactive uses. |
|
153 | 154 | try: |
|
154 | 155 | try: |
|
155 | 156 | from reprlib import aRepr # Py 3 |
|
156 | 157 | except ImportError: |
|
157 | 158 | from repr import aRepr # Py 2 |
|
158 | 159 | aRepr.maxstring = 80 |
|
159 | 160 | except: |
|
160 | 161 | # This is only a user-facing convenience, so any error we encounter |
|
161 | 162 | # here can be warned about but can be otherwise ignored. These |
|
162 | 163 | # printouts will tell us about problems if this API changes |
|
163 | 164 | import traceback |
|
164 | 165 | traceback.print_exc() |
|
165 | 166 | |
|
166 | 167 | self.debugger = Pdb(colors) |
|
167 | 168 | |
|
168 | 169 | def __call__(self): |
|
169 | 170 | """Starts an interactive debugger at the point where called. |
|
170 | 171 | |
|
171 | 172 | This is similar to the pdb.set_trace() function from the std lib, but |
|
172 | 173 | using IPython's enhanced debugger.""" |
|
173 | 174 | |
|
174 | 175 | self.debugger.set_trace(sys._getframe().f_back) |
|
175 | 176 | |
|
176 | 177 | |
|
177 | 178 | def decorate_fn_with_doc(new_fn, old_fn, additional_text=""): |
|
178 | 179 | """Make new_fn have old_fn's doc string. This is particularly useful |
|
179 | 180 | for the ``do_...`` commands that hook into the help system. |
|
180 | 181 | Adapted from from a comp.lang.python posting |
|
181 | 182 | by Duncan Booth.""" |
|
182 | 183 | def wrapper(*args, **kw): |
|
183 | 184 | return new_fn(*args, **kw) |
|
184 | 185 | if old_fn.__doc__: |
|
185 | 186 | wrapper.__doc__ = old_fn.__doc__ + additional_text |
|
186 | 187 | return wrapper |
|
187 | 188 | |
|
188 | 189 | |
|
189 | 190 | def _file_lines(fname): |
|
190 | 191 | """Return the contents of a named file as a list of lines. |
|
191 | 192 | |
|
192 | 193 | This function never raises an IOError exception: if the file can't be |
|
193 | 194 | read, it simply returns an empty list.""" |
|
194 | 195 | |
|
195 | 196 | try: |
|
196 | 197 | outfile = open(fname) |
|
197 | 198 | except IOError: |
|
198 | 199 | return [] |
|
199 | 200 | else: |
|
200 | 201 | out = outfile.readlines() |
|
201 | 202 | outfile.close() |
|
202 | 203 | return out |
|
203 | 204 | |
|
204 | 205 | |
|
205 | 206 | class Pdb(OldPdb): |
|
206 | 207 | """Modified Pdb class, does not load readline. |
|
207 | 208 | |
|
208 | 209 | for a standalone version that uses prompt_toolkit, see |
|
209 | 210 | `IPython.terminal.debugger.TerminalPdb` and |
|
210 | 211 | `IPython.terminal.debugger.set_trace()` |
|
211 | 212 | """ |
|
212 | 213 | |
|
213 | 214 | def __init__(self, color_scheme=None, completekey=None, |
|
214 | 215 | stdin=None, stdout=None, context=5): |
|
215 | 216 | |
|
216 | 217 | # Parent constructor: |
|
217 | 218 | try: |
|
218 | 219 | self.context = int(context) |
|
219 | 220 | if self.context <= 0: |
|
220 | 221 | raise ValueError("Context must be a positive integer") |
|
221 | 222 | except (TypeError, ValueError): |
|
222 | 223 | raise ValueError("Context must be a positive integer") |
|
223 | 224 | |
|
224 | 225 | OldPdb.__init__(self, completekey, stdin, stdout) |
|
225 | 226 | |
|
226 | 227 | # IPython changes... |
|
227 | 228 | self.shell = get_ipython() |
|
228 | 229 | |
|
229 | 230 | if self.shell is None: |
|
230 | 231 | save_main = sys.modules['__main__'] |
|
231 | 232 | # No IPython instance running, we must create one |
|
232 | 233 | from IPython.terminal.interactiveshell import \ |
|
233 | 234 | TerminalInteractiveShell |
|
234 | 235 | self.shell = TerminalInteractiveShell.instance() |
|
235 | 236 | # needed by any code which calls __import__("__main__") after |
|
236 | 237 | # the debugger was entered. See also #9941. |
|
237 | 238 | sys.modules['__main__'] = save_main |
|
238 | 239 | |
|
239 | 240 | if color_scheme is not None: |
|
240 | 241 | warnings.warn( |
|
241 | 242 | "The `color_scheme` argument is deprecated since version 5.1", |
|
242 | 243 | DeprecationWarning, stacklevel=2) |
|
243 | 244 | else: |
|
244 | 245 | color_scheme = self.shell.colors |
|
245 | 246 | |
|
246 | 247 | self.aliases = {} |
|
247 | 248 | |
|
248 | 249 | # Create color table: we copy the default one from the traceback |
|
249 | 250 | # module and add a few attributes needed for debugging |
|
250 | 251 | self.color_scheme_table = exception_colors() |
|
251 | 252 | |
|
252 | 253 | # shorthands |
|
253 | 254 | C = coloransi.TermColors |
|
254 | 255 | cst = self.color_scheme_table |
|
255 | 256 | |
|
256 | 257 | cst['NoColor'].colors.prompt = C.NoColor |
|
257 | 258 | cst['NoColor'].colors.breakpoint_enabled = C.NoColor |
|
258 | 259 | cst['NoColor'].colors.breakpoint_disabled = C.NoColor |
|
259 | 260 | |
|
260 | 261 | cst['Linux'].colors.prompt = C.Green |
|
261 | 262 | cst['Linux'].colors.breakpoint_enabled = C.LightRed |
|
262 | 263 | cst['Linux'].colors.breakpoint_disabled = C.Red |
|
263 | 264 | |
|
264 | 265 | cst['LightBG'].colors.prompt = C.Blue |
|
265 | 266 | cst['LightBG'].colors.breakpoint_enabled = C.LightRed |
|
266 | 267 | cst['LightBG'].colors.breakpoint_disabled = C.Red |
|
267 | 268 | |
|
268 | 269 | cst['Neutral'].colors.prompt = C.Blue |
|
269 | 270 | cst['Neutral'].colors.breakpoint_enabled = C.LightRed |
|
270 | 271 | cst['Neutral'].colors.breakpoint_disabled = C.Red |
|
271 | 272 | |
|
272 | 273 | |
|
273 | 274 | # Add a python parser so we can syntax highlight source while |
|
274 | 275 | # debugging. |
|
275 | 276 | self.parser = PyColorize.Parser(style=color_scheme) |
|
276 | 277 | self.set_colors(color_scheme) |
|
277 | 278 | |
|
278 | 279 | # Set the prompt - the default prompt is '(Pdb)' |
|
279 | 280 | self.prompt = prompt |
|
280 | 281 | |
|
281 | 282 | def set_colors(self, scheme): |
|
282 | 283 | """Shorthand access to the color table scheme selector method.""" |
|
283 | 284 | self.color_scheme_table.set_active_scheme(scheme) |
|
284 | 285 | self.parser.style = scheme |
|
285 | 286 | |
|
286 | 287 | def interaction(self, frame, traceback): |
|
287 | 288 | try: |
|
288 | 289 | OldPdb.interaction(self, frame, traceback) |
|
289 | 290 | except KeyboardInterrupt: |
|
290 | 291 | sys.stdout.write('\n' + self.shell.get_exception_only()) |
|
291 | 292 | |
|
292 | 293 | def new_do_up(self, arg): |
|
293 | 294 | OldPdb.do_up(self, arg) |
|
294 | 295 | do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up) |
|
295 | 296 | |
|
296 | 297 | def new_do_down(self, arg): |
|
297 | 298 | OldPdb.do_down(self, arg) |
|
298 | 299 | |
|
299 | 300 | do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down) |
|
300 | 301 | |
|
301 | 302 | def new_do_frame(self, arg): |
|
302 | 303 | OldPdb.do_frame(self, arg) |
|
303 | 304 | |
|
304 | 305 | def new_do_quit(self, arg): |
|
305 | 306 | |
|
306 | 307 | if hasattr(self, 'old_all_completions'): |
|
307 | 308 | self.shell.Completer.all_completions=self.old_all_completions |
|
308 | 309 | |
|
309 | 310 | return OldPdb.do_quit(self, arg) |
|
310 | 311 | |
|
311 | 312 | do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit) |
|
312 | 313 | |
|
313 | 314 | def new_do_restart(self, arg): |
|
314 | 315 | """Restart command. In the context of ipython this is exactly the same |
|
315 | 316 | thing as 'quit'.""" |
|
316 | 317 | self.msg("Restart doesn't make sense here. Using 'quit' instead.") |
|
317 | 318 | return self.do_quit(arg) |
|
318 | 319 | |
|
319 | 320 | def print_stack_trace(self, context=None): |
|
320 | 321 | if context is None: |
|
321 | 322 | context = self.context |
|
322 | 323 | try: |
|
323 | 324 | context=int(context) |
|
324 | 325 | if context <= 0: |
|
325 | 326 | raise ValueError("Context must be a positive integer") |
|
326 | 327 | except (TypeError, ValueError): |
|
327 | 328 | raise ValueError("Context must be a positive integer") |
|
328 | 329 | try: |
|
329 | 330 | for frame_lineno in self.stack: |
|
330 | 331 | self.print_stack_entry(frame_lineno, context=context) |
|
331 | 332 | except KeyboardInterrupt: |
|
332 | 333 | pass |
|
333 | 334 | |
|
334 | 335 | def print_stack_entry(self,frame_lineno, prompt_prefix='\n-> ', |
|
335 | 336 | context=None): |
|
336 | 337 | if context is None: |
|
337 | 338 | context = self.context |
|
338 | 339 | try: |
|
339 | 340 | context=int(context) |
|
340 | 341 | if context <= 0: |
|
341 | 342 | raise ValueError("Context must be a positive integer") |
|
342 | 343 | except (TypeError, ValueError): |
|
343 | 344 | raise ValueError("Context must be a positive integer") |
|
344 | 345 | print(self.format_stack_entry(frame_lineno, '', context)) |
|
345 | 346 | |
|
346 | 347 | # vds: >> |
|
347 | 348 | frame, lineno = frame_lineno |
|
348 | 349 | filename = frame.f_code.co_filename |
|
349 | 350 | self.shell.hooks.synchronize_with_editor(filename, lineno, 0) |
|
350 | 351 | # vds: << |
|
351 | 352 | |
|
352 | 353 | def format_stack_entry(self, frame_lineno, lprefix=': ', context=None): |
|
353 | 354 | if context is None: |
|
354 | 355 | context = self.context |
|
355 | 356 | try: |
|
356 | 357 | context=int(context) |
|
357 | 358 | if context <= 0: |
|
358 | 359 | print("Context must be a positive integer") |
|
359 | 360 | except (TypeError, ValueError): |
|
360 | 361 | print("Context must be a positive integer") |
|
361 | 362 | try: |
|
362 | 363 | import reprlib # Py 3 |
|
363 | 364 | except ImportError: |
|
364 | 365 | import repr as reprlib # Py 2 |
|
365 | 366 | |
|
366 | 367 | ret = [] |
|
367 | 368 | |
|
368 | 369 | Colors = self.color_scheme_table.active_colors |
|
369 | 370 | ColorsNormal = Colors.Normal |
|
370 | 371 | tpl_link = u'%s%%s%s' % (Colors.filenameEm, ColorsNormal) |
|
371 | 372 | tpl_call = u'%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal) |
|
372 | 373 | tpl_line = u'%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) |
|
373 | 374 | tpl_line_em = u'%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, |
|
374 | 375 | ColorsNormal) |
|
375 | 376 | |
|
376 | 377 | frame, lineno = frame_lineno |
|
377 | 378 | |
|
378 | 379 | return_value = '' |
|
379 | 380 | if '__return__' in frame.f_locals: |
|
380 | 381 | rv = frame.f_locals['__return__'] |
|
381 | 382 | #return_value += '->' |
|
382 | 383 | return_value += reprlib.repr(rv) + '\n' |
|
383 | 384 | ret.append(return_value) |
|
384 | 385 | |
|
385 | 386 | #s = filename + '(' + `lineno` + ')' |
|
386 | 387 | filename = self.canonic(frame.f_code.co_filename) |
|
387 | 388 | link = tpl_link % py3compat.cast_unicode(filename) |
|
388 | 389 | |
|
389 | 390 | if frame.f_code.co_name: |
|
390 | 391 | func = frame.f_code.co_name |
|
391 | 392 | else: |
|
392 | 393 | func = "<lambda>" |
|
393 | 394 | |
|
394 | 395 | call = '' |
|
395 | 396 | if func != '?': |
|
396 | 397 | if '__args__' in frame.f_locals: |
|
397 | 398 | args = reprlib.repr(frame.f_locals['__args__']) |
|
398 | 399 | else: |
|
399 | 400 | args = '()' |
|
400 | 401 | call = tpl_call % (func, args) |
|
401 | 402 | |
|
402 | 403 | # The level info should be generated in the same format pdb uses, to |
|
403 | 404 | # avoid breaking the pdbtrack functionality of python-mode in *emacs. |
|
404 | 405 | if frame is self.curframe: |
|
405 | 406 | ret.append('> ') |
|
406 | 407 | else: |
|
407 | 408 | ret.append(' ') |
|
408 | 409 | ret.append(u'%s(%s)%s\n' % (link,lineno,call)) |
|
409 | 410 | |
|
410 | 411 | start = lineno - 1 - context//2 |
|
411 | 412 | lines = linecache.getlines(filename) |
|
412 | 413 | start = min(start, len(lines) - context) |
|
413 | 414 | start = max(start, 0) |
|
414 | 415 | lines = lines[start : start + context] |
|
415 | 416 | |
|
416 | 417 | for i,line in enumerate(lines): |
|
417 | 418 | show_arrow = (start + 1 + i == lineno) |
|
418 | 419 | linetpl = (frame is self.curframe or show_arrow) \ |
|
419 | 420 | and tpl_line_em \ |
|
420 | 421 | or tpl_line |
|
421 | 422 | ret.append(self.__format_line(linetpl, filename, |
|
422 | 423 | start + 1 + i, line, |
|
423 | 424 | arrow = show_arrow) ) |
|
424 | 425 | return ''.join(ret) |
|
425 | 426 | |
|
426 | 427 | def __format_line(self, tpl_line, filename, lineno, line, arrow = False): |
|
427 | 428 | bp_mark = "" |
|
428 | 429 | bp_mark_color = "" |
|
429 | 430 | |
|
430 | 431 | new_line, err = self.parser.format2(line, 'str') |
|
431 | 432 | if not err: |
|
432 | 433 | line = new_line |
|
433 | 434 | |
|
434 | 435 | bp = None |
|
435 | 436 | if lineno in self.get_file_breaks(filename): |
|
436 | 437 | bps = self.get_breaks(filename, lineno) |
|
437 | 438 | bp = bps[-1] |
|
438 | 439 | |
|
439 | 440 | if bp: |
|
440 | 441 | Colors = self.color_scheme_table.active_colors |
|
441 | 442 | bp_mark = str(bp.number) |
|
442 | 443 | bp_mark_color = Colors.breakpoint_enabled |
|
443 | 444 | if not bp.enabled: |
|
444 | 445 | bp_mark_color = Colors.breakpoint_disabled |
|
445 | 446 | |
|
446 | 447 | numbers_width = 7 |
|
447 | 448 | if arrow: |
|
448 | 449 | # This is the line with the error |
|
449 | 450 | pad = numbers_width - len(str(lineno)) - len(bp_mark) |
|
450 | 451 | num = '%s%s' % (make_arrow(pad), str(lineno)) |
|
451 | 452 | else: |
|
452 | 453 | num = '%*s' % (numbers_width - len(bp_mark), str(lineno)) |
|
453 | 454 | |
|
454 | 455 | return tpl_line % (bp_mark_color + bp_mark, num, line) |
|
455 | 456 | |
|
456 | 457 | |
|
457 | 458 | def print_list_lines(self, filename, first, last): |
|
458 | 459 | """The printing (as opposed to the parsing part of a 'list' |
|
459 | 460 | command.""" |
|
460 | 461 | try: |
|
461 | 462 | Colors = self.color_scheme_table.active_colors |
|
462 | 463 | ColorsNormal = Colors.Normal |
|
463 | 464 | tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) |
|
464 | 465 | tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal) |
|
465 | 466 | src = [] |
|
466 | 467 | if filename == "<string>" and hasattr(self, "_exec_filename"): |
|
467 | 468 | filename = self._exec_filename |
|
468 | 469 | |
|
469 | 470 | for lineno in range(first, last+1): |
|
470 | 471 | line = linecache.getline(filename, lineno) |
|
471 | 472 | if not line: |
|
472 | 473 | break |
|
473 | 474 | |
|
474 | 475 | if lineno == self.curframe.f_lineno: |
|
475 | 476 | line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True) |
|
476 | 477 | else: |
|
477 | 478 | line = self.__format_line(tpl_line, filename, lineno, line, arrow = False) |
|
478 | 479 | |
|
479 | 480 | src.append(line) |
|
480 | 481 | self.lineno = lineno |
|
481 | 482 | |
|
482 | 483 | print(''.join(src)) |
|
483 | 484 | |
|
484 | 485 | except KeyboardInterrupt: |
|
485 | 486 | pass |
|
486 | 487 | |
|
487 | 488 | def do_list(self, arg): |
|
488 | 489 | self.lastcmd = 'list' |
|
489 | 490 | last = None |
|
490 | 491 | if arg: |
|
491 | 492 | try: |
|
492 | 493 | x = eval(arg, {}, {}) |
|
493 | 494 | if type(x) == type(()): |
|
494 | 495 | first, last = x |
|
495 | 496 | first = int(first) |
|
496 | 497 | last = int(last) |
|
497 | 498 | if last < first: |
|
498 | 499 | # Assume it's a count |
|
499 | 500 | last = first + last |
|
500 | 501 | else: |
|
501 | 502 | first = max(1, int(x) - 5) |
|
502 | 503 | except: |
|
503 | 504 | print('*** Error in argument:', repr(arg)) |
|
504 | 505 | return |
|
505 | 506 | elif self.lineno is None: |
|
506 | 507 | first = max(1, self.curframe.f_lineno - 5) |
|
507 | 508 | else: |
|
508 | 509 | first = self.lineno + 1 |
|
509 | 510 | if last is None: |
|
510 | 511 | last = first + 10 |
|
511 | 512 | self.print_list_lines(self.curframe.f_code.co_filename, first, last) |
|
512 | 513 | |
|
513 | 514 | # vds: >> |
|
514 | 515 | lineno = first |
|
515 | 516 | filename = self.curframe.f_code.co_filename |
|
516 | 517 | self.shell.hooks.synchronize_with_editor(filename, lineno, 0) |
|
517 | 518 | # vds: << |
|
518 | 519 | |
|
519 | 520 | do_l = do_list |
|
520 | 521 | |
|
521 | 522 | def getsourcelines(self, obj): |
|
522 | 523 | lines, lineno = inspect.findsource(obj) |
|
523 | 524 | if inspect.isframe(obj) and obj.f_globals is obj.f_locals: |
|
524 | 525 | # must be a module frame: do not try to cut a block out of it |
|
525 | 526 | return lines, 1 |
|
526 | 527 | elif inspect.ismodule(obj): |
|
527 | 528 | return lines, 1 |
|
528 | 529 | return inspect.getblock(lines[lineno:]), lineno+1 |
|
529 | 530 | |
|
530 | 531 | def do_longlist(self, arg): |
|
531 | 532 | self.lastcmd = 'longlist' |
|
532 | 533 | try: |
|
533 | 534 | lines, lineno = self.getsourcelines(self.curframe) |
|
534 | 535 | except OSError as err: |
|
535 | 536 | self.error(err) |
|
536 | 537 | return |
|
537 | 538 | last = lineno + len(lines) |
|
538 | 539 | self.print_list_lines(self.curframe.f_code.co_filename, lineno, last) |
|
539 | 540 | do_ll = do_longlist |
|
540 | 541 | |
|
541 | 542 | def do_pdef(self, arg): |
|
542 | 543 | """Print the call signature for any callable object. |
|
543 | 544 | |
|
544 | 545 | The debugger interface to %pdef""" |
|
545 | 546 | namespaces = [('Locals', self.curframe.f_locals), |
|
546 | 547 | ('Globals', self.curframe.f_globals)] |
|
547 | 548 | self.shell.find_line_magic('pdef')(arg, namespaces=namespaces) |
|
548 | 549 | |
|
549 | 550 | def do_pdoc(self, arg): |
|
550 | 551 | """Print the docstring for an object. |
|
551 | 552 | |
|
552 | 553 | The debugger interface to %pdoc.""" |
|
553 | 554 | namespaces = [('Locals', self.curframe.f_locals), |
|
554 | 555 | ('Globals', self.curframe.f_globals)] |
|
555 | 556 | self.shell.find_line_magic('pdoc')(arg, namespaces=namespaces) |
|
556 | 557 | |
|
557 | 558 | def do_pfile(self, arg): |
|
558 | 559 | """Print (or run through pager) the file where an object is defined. |
|
559 | 560 | |
|
560 | 561 | The debugger interface to %pfile. |
|
561 | 562 | """ |
|
562 | 563 | namespaces = [('Locals', self.curframe.f_locals), |
|
563 | 564 | ('Globals', self.curframe.f_globals)] |
|
564 | 565 | self.shell.find_line_magic('pfile')(arg, namespaces=namespaces) |
|
565 | 566 | |
|
566 | 567 | def do_pinfo(self, arg): |
|
567 | 568 | """Provide detailed information about an object. |
|
568 | 569 | |
|
569 | 570 | The debugger interface to %pinfo, i.e., obj?.""" |
|
570 | 571 | namespaces = [('Locals', self.curframe.f_locals), |
|
571 | 572 | ('Globals', self.curframe.f_globals)] |
|
572 | 573 | self.shell.find_line_magic('pinfo')(arg, namespaces=namespaces) |
|
573 | 574 | |
|
574 | 575 | def do_pinfo2(self, arg): |
|
575 | 576 | """Provide extra detailed information about an object. |
|
576 | 577 | |
|
577 | 578 | The debugger interface to %pinfo2, i.e., obj??.""" |
|
578 | 579 | namespaces = [('Locals', self.curframe.f_locals), |
|
579 | 580 | ('Globals', self.curframe.f_globals)] |
|
580 | 581 | self.shell.find_line_magic('pinfo2')(arg, namespaces=namespaces) |
|
581 | 582 | |
|
582 | 583 | def do_psource(self, arg): |
|
583 | 584 | """Print (or run through pager) the source code for an object.""" |
|
584 | 585 | namespaces = [('Locals', self.curframe.f_locals), |
|
585 | 586 | ('Globals', self.curframe.f_globals)] |
|
586 | 587 | self.shell.find_line_magic('psource')(arg, namespaces=namespaces) |
|
587 | 588 | |
|
588 | 589 | def do_where(self, arg): |
|
589 | 590 | """w(here) |
|
590 | 591 | Print a stack trace, with the most recent frame at the bottom. |
|
591 | 592 | An arrow indicates the "current frame", which determines the |
|
592 | 593 | context of most commands. 'bt' is an alias for this command. |
|
593 | 594 | |
|
594 | 595 | Take a number as argument as an (optional) number of context line to |
|
595 | 596 | print""" |
|
596 | 597 | if arg: |
|
597 | 598 | context = int(arg) |
|
598 | 599 | self.print_stack_trace(context) |
|
599 | 600 | else: |
|
600 | 601 | self.print_stack_trace() |
|
601 | 602 | |
|
602 | 603 | do_w = do_where |
|
603 | 604 | |
|
604 | 605 | |
|
605 | 606 | def set_trace(frame=None): |
|
606 | 607 | """ |
|
607 | 608 | Start debugging from `frame`. |
|
608 | 609 | |
|
609 | 610 | If frame is not specified, debugging starts from caller's frame. |
|
610 | 611 | """ |
|
611 | 612 | Pdb().set_trace(frame or sys._getframe().f_back) |
@@ -1,557 +1,557 b'' | |||
|
1 | 1 | """Various display related classes. |
|
2 | 2 | |
|
3 | 3 | Authors : MinRK, gregcaporaso, dannystaple |
|
4 | 4 | """ |
|
5 | 5 | from os.path import exists, isfile, splitext, abspath, join, isdir |
|
6 | 6 | from os import walk, sep |
|
7 | 7 | |
|
8 | 8 | from IPython.core.display import DisplayObject |
|
9 | 9 | |
|
10 | 10 | __all__ = ['Audio', 'IFrame', 'YouTubeVideo', 'VimeoVideo', 'ScribdDocument', |
|
11 | 11 | 'FileLink', 'FileLinks'] |
|
12 | 12 | |
|
13 | 13 | |
|
14 | 14 | class Audio(DisplayObject): |
|
15 | 15 | """Create an audio object. |
|
16 | 16 | |
|
17 | 17 | When this object is returned by an input cell or passed to the |
|
18 | 18 | display function, it will result in Audio controls being displayed |
|
19 | 19 | in the frontend (only works in the notebook). |
|
20 | 20 | |
|
21 | 21 | Parameters |
|
22 | 22 | ---------- |
|
23 | 23 | data : numpy array, list, unicode, str or bytes |
|
24 | 24 | Can be one of |
|
25 | 25 | |
|
26 | 26 | * Numpy 1d array containing the desired waveform (mono) |
|
27 | 27 | * Numpy 2d array containing waveforms for each channel. |
|
28 | 28 | Shape=(NCHAN, NSAMPLES). For the standard channel order, see |
|
29 | 29 | http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx |
|
30 | 30 | * List of float or integer representing the waveform (mono) |
|
31 | 31 | * String containing the filename |
|
32 | 32 | * Bytestring containing raw PCM data or |
|
33 | 33 | * URL pointing to a file on the web. |
|
34 | 34 | |
|
35 | 35 | If the array option is used the waveform will be normalized. |
|
36 | 36 | |
|
37 | 37 | If a filename or url is used the format support will be browser |
|
38 | 38 | dependent. |
|
39 | 39 | url : unicode |
|
40 | 40 | A URL to download the data from. |
|
41 | 41 | filename : unicode |
|
42 | 42 | Path to a local file to load the data from. |
|
43 | 43 | embed : boolean |
|
44 | 44 | Should the audio data be embedded using a data URI (True) or should |
|
45 | 45 | the original source be referenced. Set this to True if you want the |
|
46 | 46 | audio to playable later with no internet connection in the notebook. |
|
47 | 47 | |
|
48 | 48 | Default is `True`, unless the keyword argument `url` is set, then |
|
49 | 49 | default value is `False`. |
|
50 | 50 | rate : integer |
|
51 | 51 | The sampling rate of the raw data. |
|
52 | 52 | Only required when data parameter is being used as an array |
|
53 | 53 | autoplay : bool |
|
54 | 54 | Set to True if the audio should immediately start playing. |
|
55 | 55 | Default is `False`. |
|
56 | 56 | |
|
57 | 57 | Examples |
|
58 | 58 | -------- |
|
59 | 59 | :: |
|
60 | 60 | |
|
61 | 61 | # Generate a sound |
|
62 | 62 | import numpy as np |
|
63 | 63 | framerate = 44100 |
|
64 | 64 | t = np.linspace(0,5,framerate*5) |
|
65 | 65 | data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t)) |
|
66 | 66 | Audio(data,rate=framerate) |
|
67 | 67 | |
|
68 | 68 | # Can also do stereo or more channels |
|
69 | 69 | dataleft = np.sin(2*np.pi*220*t) |
|
70 | 70 | dataright = np.sin(2*np.pi*224*t) |
|
71 | 71 | Audio([dataleft, dataright],rate=framerate) |
|
72 | 72 | |
|
73 | 73 | Audio("http://www.nch.com.au/acm/8k16bitpcm.wav") # From URL |
|
74 | 74 | Audio(url="http://www.w3schools.com/html/horse.ogg") |
|
75 | 75 | |
|
76 | 76 | Audio('/path/to/sound.wav') # From file |
|
77 | 77 | Audio(filename='/path/to/sound.ogg') |
|
78 | 78 | |
|
79 | 79 | Audio(b'RAW_WAV_DATA..) # From bytes |
|
80 | 80 | Audio(data=b'RAW_WAV_DATA..) |
|
81 | 81 | |
|
82 | 82 | """ |
|
83 | 83 | _read_flags = 'rb' |
|
84 | 84 | |
|
85 | 85 | def __init__(self, data=None, filename=None, url=None, embed=None, rate=None, autoplay=False): |
|
86 | 86 | if filename is None and url is None and data is None: |
|
87 | 87 | raise ValueError("No image data found. Expecting filename, url, or data.") |
|
88 | 88 | if embed is False and url is None: |
|
89 | 89 | raise ValueError("No url found. Expecting url when embed=False") |
|
90 | 90 | |
|
91 | 91 | if url is not None and embed is not True: |
|
92 | 92 | self.embed = False |
|
93 | 93 | else: |
|
94 | 94 | self.embed = True |
|
95 | 95 | self.autoplay = autoplay |
|
96 | 96 | super(Audio, self).__init__(data=data, url=url, filename=filename) |
|
97 | 97 | |
|
98 | 98 | if self.data is not None and not isinstance(self.data, bytes): |
|
99 | 99 | self.data = self._make_wav(data,rate) |
|
100 | 100 | |
|
101 | 101 | def reload(self): |
|
102 | 102 | """Reload the raw data from file or URL.""" |
|
103 | 103 | import mimetypes |
|
104 | 104 | if self.embed: |
|
105 | 105 | super(Audio, self).reload() |
|
106 | 106 | |
|
107 | 107 | if self.filename is not None: |
|
108 | 108 | self.mimetype = mimetypes.guess_type(self.filename)[0] |
|
109 | 109 | elif self.url is not None: |
|
110 | 110 | self.mimetype = mimetypes.guess_type(self.url)[0] |
|
111 | 111 | else: |
|
112 | 112 | self.mimetype = "audio/wav" |
|
113 | 113 | |
|
114 | 114 | def _make_wav(self, data, rate): |
|
115 | 115 | """ Transform a numpy array to a PCM bytestring """ |
|
116 | 116 | import struct |
|
117 | 117 | from io import BytesIO |
|
118 | 118 | import wave |
|
119 | 119 | |
|
120 | 120 | try: |
|
121 | 121 | import numpy as np |
|
122 | 122 | |
|
123 | 123 | data = np.array(data, dtype=float) |
|
124 | 124 | if len(data.shape) == 1: |
|
125 | 125 | nchan = 1 |
|
126 | 126 | elif len(data.shape) == 2: |
|
127 | 127 | # In wave files,channels are interleaved. E.g., |
|
128 | 128 | # "L1R1L2R2..." for stereo. See |
|
129 | 129 | # http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx |
|
130 | 130 | # for channel ordering |
|
131 | 131 | nchan = data.shape[0] |
|
132 | 132 | data = data.T.ravel() |
|
133 | 133 | else: |
|
134 | 134 | raise ValueError('Array audio input must be a 1D or 2D array') |
|
135 | 135 | scaled = np.int16(data/np.max(np.abs(data))*32767).tolist() |
|
136 | 136 | except ImportError: |
|
137 | 137 | # check that it is a "1D" list |
|
138 | 138 | idata = iter(data) # fails if not an iterable |
|
139 | 139 | try: |
|
140 | 140 | iter(idata.next()) |
|
141 | 141 | raise TypeError('Only lists of mono audio are ' |
|
142 | 142 | 'supported if numpy is not installed') |
|
143 | 143 | except TypeError: |
|
144 | 144 | # this means it's not a nested list, which is what we want |
|
145 | 145 | pass |
|
146 | 146 | maxabsvalue = float(max([abs(x) for x in data])) |
|
147 | 147 | scaled = [int(x/maxabsvalue*32767) for x in data] |
|
148 | 148 | nchan = 1 |
|
149 | 149 | |
|
150 | 150 | fp = BytesIO() |
|
151 | 151 | waveobj = wave.open(fp,mode='wb') |
|
152 | 152 | waveobj.setnchannels(nchan) |
|
153 | 153 | waveobj.setframerate(rate) |
|
154 | 154 | waveobj.setsampwidth(2) |
|
155 | 155 | waveobj.setcomptype('NONE','NONE') |
|
156 | 156 | waveobj.writeframes(b''.join([struct.pack('<h',x) for x in scaled])) |
|
157 | 157 | val = fp.getvalue() |
|
158 | 158 | waveobj.close() |
|
159 | 159 | |
|
160 | 160 | return val |
|
161 | 161 | |
|
162 | 162 | def _data_and_metadata(self): |
|
163 | 163 | """shortcut for returning metadata with url information, if defined""" |
|
164 | 164 | md = {} |
|
165 | 165 | if self.url: |
|
166 | 166 | md['url'] = self.url |
|
167 | 167 | if md: |
|
168 | 168 | return self.data, md |
|
169 | 169 | else: |
|
170 | 170 | return self.data |
|
171 | 171 | |
|
172 | 172 | def _repr_html_(self): |
|
173 | 173 | src = """ |
|
174 | 174 | <audio controls="controls" {autoplay}> |
|
175 | 175 | <source src="{src}" type="{type}" /> |
|
176 | 176 | Your browser does not support the audio element. |
|
177 | 177 | </audio> |
|
178 | 178 | """ |
|
179 | 179 | return src.format(src=self.src_attr(),type=self.mimetype, autoplay=self.autoplay_attr()) |
|
180 | 180 | |
|
181 | 181 | def src_attr(self): |
|
182 | 182 | import base64 |
|
183 | 183 | if self.embed and (self.data is not None): |
|
184 | 184 | data = base64=base64.b64encode(self.data).decode('ascii') |
|
185 | 185 | return """data:{type};base64,{base64}""".format(type=self.mimetype, |
|
186 | 186 | base64=data) |
|
187 | 187 | elif self.url is not None: |
|
188 | 188 | return self.url |
|
189 | 189 | else: |
|
190 | 190 | return "" |
|
191 | 191 | |
|
192 | 192 | def autoplay_attr(self): |
|
193 | 193 | if(self.autoplay): |
|
194 | 194 | return 'autoplay="autoplay"' |
|
195 | 195 | else: |
|
196 | 196 | return '' |
|
197 | 197 | |
|
198 | 198 | class IFrame(object): |
|
199 | 199 | """ |
|
200 | 200 | Generic class to embed an iframe in an IPython notebook |
|
201 | 201 | """ |
|
202 | 202 | |
|
203 | 203 | iframe = """ |
|
204 | 204 | <iframe |
|
205 | 205 | width="{width}" |
|
206 | 206 | height="{height}" |
|
207 | 207 | src="{src}{params}" |
|
208 | 208 | frameborder="0" |
|
209 | 209 | allowfullscreen |
|
210 | 210 | ></iframe> |
|
211 | 211 | """ |
|
212 | 212 | |
|
213 | 213 | def __init__(self, src, width, height, **kwargs): |
|
214 | 214 | self.src = src |
|
215 | 215 | self.width = width |
|
216 | 216 | self.height = height |
|
217 | 217 | self.params = kwargs |
|
218 | 218 | |
|
219 | 219 | def _repr_html_(self): |
|
220 | 220 | """return the embed iframe""" |
|
221 | 221 | if self.params: |
|
222 | 222 | try: |
|
223 | 223 | from urllib.parse import urlencode # Py 3 |
|
224 | 224 | except ImportError: |
|
225 | 225 | from urllib import urlencode |
|
226 | 226 | params = "?" + urlencode(self.params) |
|
227 | 227 | else: |
|
228 | 228 | params = "" |
|
229 | 229 | return self.iframe.format(src=self.src, |
|
230 | 230 | width=self.width, |
|
231 | 231 | height=self.height, |
|
232 | 232 | params=params) |
|
233 | 233 | |
|
234 | 234 | class YouTubeVideo(IFrame): |
|
235 | 235 | """Class for embedding a YouTube Video in an IPython session, based on its video id. |
|
236 | 236 | |
|
237 | 237 | e.g. to embed the video from https://www.youtube.com/watch?v=foo , you would |
|
238 | 238 | do:: |
|
239 | 239 | |
|
240 | 240 | vid = YouTubeVideo("foo") |
|
241 | 241 | display(vid) |
|
242 | 242 | |
|
243 | 243 | To start from 30 seconds:: |
|
244 | 244 | |
|
245 | 245 | vid = YouTubeVideo("abc", start=30) |
|
246 | 246 | display(vid) |
|
247 | 247 | |
|
248 | 248 | To calculate seconds from time as hours, minutes, seconds use |
|
249 | 249 | :class:`datetime.timedelta`:: |
|
250 | 250 | |
|
251 | 251 | start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds()) |
|
252 | 252 | |
|
253 | 253 | Other parameters can be provided as documented at |
|
254 |
https://developers.google.com/youtube/player_parameters# |
|
|
254 | https://developers.google.com/youtube/player_parameters#Parameters | |
|
255 | 255 | |
|
256 | 256 | When converting the notebook using nbconvert, a jpeg representation of the video |
|
257 | 257 | will be inserted in the document. |
|
258 | 258 | """ |
|
259 | 259 | |
|
260 | 260 | def __init__(self, id, width=400, height=300, **kwargs): |
|
261 | 261 | self.id=id |
|
262 | 262 | src = "https://www.youtube.com/embed/{0}".format(id) |
|
263 | 263 | super(YouTubeVideo, self).__init__(src, width, height, **kwargs) |
|
264 | 264 | |
|
265 | 265 | def _repr_jpeg_(self): |
|
266 | 266 | # Deferred import |
|
267 | 267 | from urllib.request import urlopen |
|
268 | 268 | |
|
269 | 269 | try: |
|
270 | 270 | return urlopen("https://img.youtube.com/vi/{id}/hqdefault.jpg".format(id=self.id)).read() |
|
271 | 271 | except IOError: |
|
272 | 272 | return None |
|
273 | 273 | |
|
274 | 274 | class VimeoVideo(IFrame): |
|
275 | 275 | """ |
|
276 | 276 | Class for embedding a Vimeo video in an IPython session, based on its video id. |
|
277 | 277 | """ |
|
278 | 278 | |
|
279 | 279 | def __init__(self, id, width=400, height=300, **kwargs): |
|
280 | 280 | src="https://player.vimeo.com/video/{0}".format(id) |
|
281 | 281 | super(VimeoVideo, self).__init__(src, width, height, **kwargs) |
|
282 | 282 | |
|
283 | 283 | class ScribdDocument(IFrame): |
|
284 | 284 | """ |
|
285 | 285 | Class for embedding a Scribd document in an IPython session |
|
286 | 286 | |
|
287 | 287 | Use the start_page params to specify a starting point in the document |
|
288 | 288 | Use the view_mode params to specify display type one off scroll | slideshow | book |
|
289 | 289 | |
|
290 | 290 | e.g to Display Wes' foundational paper about PANDAS in book mode from page 3 |
|
291 | 291 | |
|
292 | 292 | ScribdDocument(71048089, width=800, height=400, start_page=3, view_mode="book") |
|
293 | 293 | """ |
|
294 | 294 | |
|
295 | 295 | def __init__(self, id, width=400, height=300, **kwargs): |
|
296 | 296 | src="https://www.scribd.com/embeds/{0}/content".format(id) |
|
297 | 297 | super(ScribdDocument, self).__init__(src, width, height, **kwargs) |
|
298 | 298 | |
|
299 | 299 | class FileLink(object): |
|
300 | 300 | """Class for embedding a local file link in an IPython session, based on path |
|
301 | 301 | |
|
302 | 302 | e.g. to embed a link that was generated in the IPython notebook as my/data.txt |
|
303 | 303 | |
|
304 | 304 | you would do:: |
|
305 | 305 | |
|
306 | 306 | local_file = FileLink("my/data.txt") |
|
307 | 307 | display(local_file) |
|
308 | 308 | |
|
309 | 309 | or in the HTML notebook, just:: |
|
310 | 310 | |
|
311 | 311 | FileLink("my/data.txt") |
|
312 | 312 | """ |
|
313 | 313 | |
|
314 | 314 | html_link_str = "<a href='%s' target='_blank'>%s</a>" |
|
315 | 315 | |
|
316 | 316 | def __init__(self, |
|
317 | 317 | path, |
|
318 | 318 | url_prefix='', |
|
319 | 319 | result_html_prefix='', |
|
320 | 320 | result_html_suffix='<br>'): |
|
321 | 321 | """ |
|
322 | 322 | Parameters |
|
323 | 323 | ---------- |
|
324 | 324 | path : str |
|
325 | 325 | path to the file or directory that should be formatted |
|
326 | 326 | directory_prefix : str |
|
327 | 327 | prefix to be prepended to all files to form a working link [default: |
|
328 | 328 | 'files'] |
|
329 | 329 | result_html_prefix : str |
|
330 | 330 | text to append to beginning to link [default: none] |
|
331 | 331 | result_html_suffix : str |
|
332 | 332 | text to append at the end of link [default: '<br>'] |
|
333 | 333 | """ |
|
334 | 334 | if isdir(path): |
|
335 | 335 | raise ValueError("Cannot display a directory using FileLink. " |
|
336 | 336 | "Use FileLinks to display '%s'." % path) |
|
337 | 337 | self.path = path |
|
338 | 338 | self.url_prefix = url_prefix |
|
339 | 339 | self.result_html_prefix = result_html_prefix |
|
340 | 340 | self.result_html_suffix = result_html_suffix |
|
341 | 341 | |
|
342 | 342 | def _format_path(self): |
|
343 | 343 | fp = ''.join([self.url_prefix,self.path]) |
|
344 | 344 | return ''.join([self.result_html_prefix, |
|
345 | 345 | self.html_link_str % (fp, self.path), |
|
346 | 346 | self.result_html_suffix]) |
|
347 | 347 | |
|
348 | 348 | def _repr_html_(self): |
|
349 | 349 | """return html link to file |
|
350 | 350 | """ |
|
351 | 351 | if not exists(self.path): |
|
352 | 352 | return ("Path (<tt>%s</tt>) doesn't exist. " |
|
353 | 353 | "It may still be in the process of " |
|
354 | 354 | "being generated, or you may have the " |
|
355 | 355 | "incorrect path." % self.path) |
|
356 | 356 | |
|
357 | 357 | return self._format_path() |
|
358 | 358 | |
|
359 | 359 | def __repr__(self): |
|
360 | 360 | """return absolute path to file |
|
361 | 361 | """ |
|
362 | 362 | return abspath(self.path) |
|
363 | 363 | |
|
364 | 364 | class FileLinks(FileLink): |
|
365 | 365 | """Class for embedding local file links in an IPython session, based on path |
|
366 | 366 | |
|
367 | 367 | e.g. to embed links to files that were generated in the IPython notebook |
|
368 | 368 | under ``my/data``, you would do:: |
|
369 | 369 | |
|
370 | 370 | local_files = FileLinks("my/data") |
|
371 | 371 | display(local_files) |
|
372 | 372 | |
|
373 | 373 | or in the HTML notebook, just:: |
|
374 | 374 | |
|
375 | 375 | FileLinks("my/data") |
|
376 | 376 | """ |
|
377 | 377 | def __init__(self, |
|
378 | 378 | path, |
|
379 | 379 | url_prefix='', |
|
380 | 380 | included_suffixes=None, |
|
381 | 381 | result_html_prefix='', |
|
382 | 382 | result_html_suffix='<br>', |
|
383 | 383 | notebook_display_formatter=None, |
|
384 | 384 | terminal_display_formatter=None, |
|
385 | 385 | recursive=True): |
|
386 | 386 | """ |
|
387 | 387 | See :class:`FileLink` for the ``path``, ``url_prefix``, |
|
388 | 388 | ``result_html_prefix`` and ``result_html_suffix`` parameters. |
|
389 | 389 | |
|
390 | 390 | included_suffixes : list |
|
391 | 391 | Filename suffixes to include when formatting output [default: include |
|
392 | 392 | all files] |
|
393 | 393 | |
|
394 | 394 | notebook_display_formatter : function |
|
395 | 395 | Used to format links for display in the notebook. See discussion of |
|
396 | 396 | formatter functions below. |
|
397 | 397 | |
|
398 | 398 | terminal_display_formatter : function |
|
399 | 399 | Used to format links for display in the terminal. See discussion of |
|
400 | 400 | formatter functions below. |
|
401 | 401 | |
|
402 | 402 | Formatter functions must be of the form:: |
|
403 | 403 | |
|
404 | 404 | f(dirname, fnames, included_suffixes) |
|
405 | 405 | |
|
406 | 406 | dirname : str |
|
407 | 407 | The name of a directory |
|
408 | 408 | fnames : list |
|
409 | 409 | The files in that directory |
|
410 | 410 | included_suffixes : list |
|
411 | 411 | The file suffixes that should be included in the output (passing None |
|
412 | 412 | meansto include all suffixes in the output in the built-in formatters) |
|
413 | 413 | recursive : boolean |
|
414 | 414 | Whether to recurse into subdirectories. Default is True. |
|
415 | 415 | |
|
416 | 416 | The function should return a list of lines that will be printed in the |
|
417 | 417 | notebook (if passing notebook_display_formatter) or the terminal (if |
|
418 | 418 | passing terminal_display_formatter). This function is iterated over for |
|
419 | 419 | each directory in self.path. Default formatters are in place, can be |
|
420 | 420 | passed here to support alternative formatting. |
|
421 | 421 | |
|
422 | 422 | """ |
|
423 | 423 | if isfile(path): |
|
424 | 424 | raise ValueError("Cannot display a file using FileLinks. " |
|
425 | 425 | "Use FileLink to display '%s'." % path) |
|
426 | 426 | self.included_suffixes = included_suffixes |
|
427 | 427 | # remove trailing slashs for more consistent output formatting |
|
428 | 428 | path = path.rstrip('/') |
|
429 | 429 | |
|
430 | 430 | self.path = path |
|
431 | 431 | self.url_prefix = url_prefix |
|
432 | 432 | self.result_html_prefix = result_html_prefix |
|
433 | 433 | self.result_html_suffix = result_html_suffix |
|
434 | 434 | |
|
435 | 435 | self.notebook_display_formatter = \ |
|
436 | 436 | notebook_display_formatter or self._get_notebook_display_formatter() |
|
437 | 437 | self.terminal_display_formatter = \ |
|
438 | 438 | terminal_display_formatter or self._get_terminal_display_formatter() |
|
439 | 439 | |
|
440 | 440 | self.recursive = recursive |
|
441 | 441 | |
|
442 | 442 | def _get_display_formatter(self, |
|
443 | 443 | dirname_output_format, |
|
444 | 444 | fname_output_format, |
|
445 | 445 | fp_format, |
|
446 | 446 | fp_cleaner=None): |
|
447 | 447 | """ generate built-in formatter function |
|
448 | 448 | |
|
449 | 449 | this is used to define both the notebook and terminal built-in |
|
450 | 450 | formatters as they only differ by some wrapper text for each entry |
|
451 | 451 | |
|
452 | 452 | dirname_output_format: string to use for formatting directory |
|
453 | 453 | names, dirname will be substituted for a single "%s" which |
|
454 | 454 | must appear in this string |
|
455 | 455 | fname_output_format: string to use for formatting file names, |
|
456 | 456 | if a single "%s" appears in the string, fname will be substituted |
|
457 | 457 | if two "%s" appear in the string, the path to fname will be |
|
458 | 458 | substituted for the first and fname will be substituted for the |
|
459 | 459 | second |
|
460 | 460 | fp_format: string to use for formatting filepaths, must contain |
|
461 | 461 | exactly two "%s" and the dirname will be subsituted for the first |
|
462 | 462 | and fname will be substituted for the second |
|
463 | 463 | """ |
|
464 | 464 | def f(dirname, fnames, included_suffixes=None): |
|
465 | 465 | result = [] |
|
466 | 466 | # begin by figuring out which filenames, if any, |
|
467 | 467 | # are going to be displayed |
|
468 | 468 | display_fnames = [] |
|
469 | 469 | for fname in fnames: |
|
470 | 470 | if (isfile(join(dirname,fname)) and |
|
471 | 471 | (included_suffixes is None or |
|
472 | 472 | splitext(fname)[1] in included_suffixes)): |
|
473 | 473 | display_fnames.append(fname) |
|
474 | 474 | |
|
475 | 475 | if len(display_fnames) == 0: |
|
476 | 476 | # if there are no filenames to display, don't print anything |
|
477 | 477 | # (not even the directory name) |
|
478 | 478 | pass |
|
479 | 479 | else: |
|
480 | 480 | # otherwise print the formatted directory name followed by |
|
481 | 481 | # the formatted filenames |
|
482 | 482 | dirname_output_line = dirname_output_format % dirname |
|
483 | 483 | result.append(dirname_output_line) |
|
484 | 484 | for fname in display_fnames: |
|
485 | 485 | fp = fp_format % (dirname,fname) |
|
486 | 486 | if fp_cleaner is not None: |
|
487 | 487 | fp = fp_cleaner(fp) |
|
488 | 488 | try: |
|
489 | 489 | # output can include both a filepath and a filename... |
|
490 | 490 | fname_output_line = fname_output_format % (fp, fname) |
|
491 | 491 | except TypeError: |
|
492 | 492 | # ... or just a single filepath |
|
493 | 493 | fname_output_line = fname_output_format % fname |
|
494 | 494 | result.append(fname_output_line) |
|
495 | 495 | return result |
|
496 | 496 | return f |
|
497 | 497 | |
|
498 | 498 | def _get_notebook_display_formatter(self, |
|
499 | 499 | spacer=" "): |
|
500 | 500 | """ generate function to use for notebook formatting |
|
501 | 501 | """ |
|
502 | 502 | dirname_output_format = \ |
|
503 | 503 | self.result_html_prefix + "%s/" + self.result_html_suffix |
|
504 | 504 | fname_output_format = \ |
|
505 | 505 | self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix |
|
506 | 506 | fp_format = self.url_prefix + '%s/%s' |
|
507 | 507 | if sep == "\\": |
|
508 | 508 | # Working on a platform where the path separator is "\", so |
|
509 | 509 | # must convert these to "/" for generating a URI |
|
510 | 510 | def fp_cleaner(fp): |
|
511 | 511 | # Replace all occurences of backslash ("\") with a forward |
|
512 | 512 | # slash ("/") - this is necessary on windows when a path is |
|
513 | 513 | # provided as input, but we must link to a URI |
|
514 | 514 | return fp.replace('\\','/') |
|
515 | 515 | else: |
|
516 | 516 | fp_cleaner = None |
|
517 | 517 | |
|
518 | 518 | return self._get_display_formatter(dirname_output_format, |
|
519 | 519 | fname_output_format, |
|
520 | 520 | fp_format, |
|
521 | 521 | fp_cleaner) |
|
522 | 522 | |
|
523 | 523 | def _get_terminal_display_formatter(self, |
|
524 | 524 | spacer=" "): |
|
525 | 525 | """ generate function to use for terminal formatting |
|
526 | 526 | """ |
|
527 | 527 | dirname_output_format = "%s/" |
|
528 | 528 | fname_output_format = spacer + "%s" |
|
529 | 529 | fp_format = '%s/%s' |
|
530 | 530 | |
|
531 | 531 | return self._get_display_formatter(dirname_output_format, |
|
532 | 532 | fname_output_format, |
|
533 | 533 | fp_format) |
|
534 | 534 | |
|
535 | 535 | def _format_path(self): |
|
536 | 536 | result_lines = [] |
|
537 | 537 | if self.recursive: |
|
538 | 538 | walked_dir = list(walk(self.path)) |
|
539 | 539 | else: |
|
540 | 540 | walked_dir = [next(walk(self.path))] |
|
541 | 541 | walked_dir.sort() |
|
542 | 542 | for dirname, subdirs, fnames in walked_dir: |
|
543 | 543 | result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes) |
|
544 | 544 | return '\n'.join(result_lines) |
|
545 | 545 | |
|
546 | 546 | def __repr__(self): |
|
547 | 547 | """return newline-separated absolute paths |
|
548 | 548 | """ |
|
549 | 549 | result_lines = [] |
|
550 | 550 | if self.recursive: |
|
551 | 551 | walked_dir = list(walk(self.path)) |
|
552 | 552 | else: |
|
553 | 553 | walked_dir = [next(walk(self.path))] |
|
554 | 554 | walked_dir.sort() |
|
555 | 555 | for dirname, subdirs, fnames in walked_dir: |
|
556 | 556 | result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes) |
|
557 | 557 | return '\n'.join(result_lines) |
@@ -1,103 +1,103 b'' | |||
|
1 | 1 | .. _extensions_overview: |
|
2 | 2 | |
|
3 | 3 | ================== |
|
4 | 4 | IPython extensions |
|
5 | 5 | ================== |
|
6 | 6 | |
|
7 | 7 | A level above configuration are IPython extensions, Python modules which modify |
|
8 | 8 | the behaviour of the shell. They are referred to by an importable module name, |
|
9 | 9 | and can be placed anywhere you'd normally import from, or in |
|
10 | 10 | ``.ipython/extensions/``. |
|
11 | 11 | |
|
12 | 12 | Getting extensions |
|
13 | 13 | ================== |
|
14 | 14 | |
|
15 | 15 | A few important extensions are :ref:`bundled with IPython <bundled_extensions>`. |
|
16 | 16 | Others can be found on the `extensions index |
|
17 | 17 | <https://github.com/ipython/ipython/wiki/Extensions-Index>`_ on the wiki, and |
|
18 | 18 | the `Framework :: IPython tag <https://pypi.python.org/pypi?:action=browse&c=586>`_ |
|
19 | 19 | on PyPI. |
|
20 | 20 | |
|
21 | 21 | Extensions on PyPI can be installed using ``pip``, like any other Python package. |
|
22 | 22 | |
|
23 | 23 | Using extensions |
|
24 | 24 | ================ |
|
25 | 25 | |
|
26 | 26 | To load an extension while IPython is running, use the ``%load_ext`` magic: |
|
27 | 27 | |
|
28 | 28 | .. sourcecode:: ipython |
|
29 | 29 | |
|
30 | 30 | In [1]: %load_ext myextension |
|
31 | 31 | |
|
32 | 32 | To load it each time IPython starts, list it in your configuration file:: |
|
33 | 33 | |
|
34 | 34 | c.InteractiveShellApp.extensions = [ |
|
35 | 35 | 'myextension' |
|
36 | 36 | ] |
|
37 | 37 | |
|
38 | 38 | Writing extensions |
|
39 | 39 | ================== |
|
40 | 40 | |
|
41 | 41 | An IPython extension is an importable Python module that has a couple of special |
|
42 | 42 | functions to load and unload it. Here is a template:: |
|
43 | 43 | |
|
44 | 44 | # myextension.py |
|
45 | 45 | |
|
46 | 46 | def load_ipython_extension(ipython): |
|
47 | 47 | # The `ipython` argument is the currently active `InteractiveShell` |
|
48 | 48 | # instance, which can be used in any way. This allows you to register |
|
49 | 49 | # new magics or aliases, for example. |
|
50 | 50 | |
|
51 | 51 | def unload_ipython_extension(ipython): |
|
52 | 52 | # If you want your extension to be unloadable, put that logic here. |
|
53 | 53 | |
|
54 | 54 | This :func:`load_ipython_extension` function is called after your extension is |
|
55 | 55 | imported, and the currently active :class:`~IPython.core.interactiveshell.InteractiveShell` |
|
56 | 56 | instance is passed as the only argument. You can do anything you want with |
|
57 | 57 | IPython at that point. |
|
58 | 58 | |
|
59 | 59 | :func:`load_ipython_extension` will not be called again if the user use |
|
60 | 60 | `%load_extension`. The user have to explicitly ask the extension to be |
|
61 | 61 | reloaded (with `%reload_extension`). In case where the use ask the extension to |
|
62 | 62 | be reloaded, , the extension will be unloaded (with |
|
63 | 63 | `unload_ipython_extension`), and loaded again. |
|
64 | 64 | |
|
65 | 65 | Useful :class:`InteractiveShell` methods include :meth:`~IPython.core.interactiveshell.InteractiveShell.register_magic_function`, |
|
66 | 66 | :meth:`~IPython.core.interactiveshell.InteractiveShell.push` (to add variables to the user namespace) and |
|
67 | 67 | :meth:`~IPython.core.interactiveshell.InteractiveShell.drop_by_id` (to remove variables on unloading). |
|
68 | 68 | |
|
69 | 69 | .. seealso:: |
|
70 | 70 | |
|
71 | 71 | :ref:`defining_magics` |
|
72 | 72 | |
|
73 | 73 | You can put your extension modules anywhere you want, as long as they can be |
|
74 | 74 | imported by Python's standard import mechanism. However, to make it easy to |
|
75 | 75 | write extensions, you can also put your extensions in :file:`extensions/` |
|
76 | 76 | within the :ref:`IPython directory <ipythondir>`. This directory is |
|
77 | 77 | added to :data:`sys.path` automatically. |
|
78 | 78 | |
|
79 | 79 | When your extension is ready for general use, please add it to the `extensions |
|
80 | 80 | index <https://github.com/ipython/ipython/wiki/Extensions-Index>`_. We also |
|
81 | 81 | encourage you to upload it to PyPI and use the ``Framework :: IPython`` |
|
82 | 82 | classifier, so that users can install it with standard packaging tools. |
|
83 | 83 | |
|
84 | 84 | .. _bundled_extensions: |
|
85 | 85 | |
|
86 | 86 | Extensions bundled with IPython |
|
87 | 87 | =============================== |
|
88 | 88 | |
|
89 | 89 | .. toctree:: |
|
90 | 90 | :maxdepth: 1 |
|
91 | 91 | |
|
92 | 92 | autoreload |
|
93 | 93 | storemagic |
|
94 | 94 | |
|
95 |
* ``octavemagic`` used to be bundled, but is now part of `oct2py <http://blink1073.github.io/oct2py |
|
|
95 | * ``octavemagic`` used to be bundled, but is now part of `oct2py <https://blink1073.github.io/oct2py/>`_. | |
|
96 | 96 | Use ``%load_ext oct2py.ipython`` to load it. |
|
97 | 97 | * ``rmagic`` is now part of `rpy2 <http://rpy.sourceforge.net/>`_. Use |
|
98 | 98 | ``%load_ext rpy2.ipython`` to load it, and see :mod:`rpy2.ipython.rmagic` for |
|
99 | 99 | details of how to use it. |
|
100 | 100 | * ``cythonmagic`` used to be bundled, but is now part of `cython <https://github.com/cython/cython/>`_ |
|
101 | 101 | Use ``%load_ext Cython`` to load it. |
|
102 | 102 | * ``sympyprinting`` used to be a bundled extension, but you should now use |
|
103 | 103 | :func:`sympy.init_printing` instead. |
@@ -1,252 +1,252 b'' | |||
|
1 | 1 | .. _release_process: |
|
2 | 2 | |
|
3 | 3 | ======================= |
|
4 | 4 | IPython release process |
|
5 | 5 | ======================= |
|
6 | 6 | |
|
7 | 7 | This document contains the process that is used to create an IPython release. |
|
8 | 8 | |
|
9 | 9 | Conveniently, the ``release`` script in the ``tools`` directory of the ``IPython`` |
|
10 | 10 | repository automates most of the release process. This document serves as a |
|
11 | 11 | handy reminder and checklist for the release manager. |
|
12 | 12 | |
|
13 | 13 | During the release process, you might need the extra following dependencies: |
|
14 | 14 | |
|
15 | 15 | - ``keyring`` to access your GitHub authentication tokens |
|
16 | 16 | - ``graphviz`` to generate some graphs in the documentation |
|
17 | 17 | |
|
18 | 18 | Make sure you have all the required dependencies to run the tests as well. |
|
19 | 19 | |
|
20 | 20 | |
|
21 | 21 | 1. Set Environment variables |
|
22 | 22 | ---------------------------- |
|
23 | 23 | |
|
24 | 24 | Set environment variables to document previous release tag, current |
|
25 | 25 | release milestone, current release version, and git tag. |
|
26 | 26 | |
|
27 | 27 | These variables may be used later to copy/paste as answers to the script |
|
28 | 28 | questions instead of typing the appropriate command when the time comes. These |
|
29 | 29 | variables are not used by the scripts directly; therefore, there is no need to |
|
30 | 30 | ``export`` them. The format for bash is as follows, but note that these values |
|
31 | 31 | are just an example valid only for the 5.0 release; you'll need to update them |
|
32 | 32 | for the release you are actually making:: |
|
33 | 33 | |
|
34 | 34 | PREV_RELEASE=4.2.1 |
|
35 | 35 | MILESTONE=5.0 |
|
36 | 36 | VERSION=5.0.0 |
|
37 | 37 | BRANCH=master |
|
38 | 38 | |
|
39 | 39 | |
|
40 | 40 | 2. Create GitHub stats and finish release note |
|
41 | 41 | ---------------------------------------------- |
|
42 | 42 | |
|
43 | 43 | .. note:: |
|
44 | 44 | |
|
45 | 45 | This step is optional if making a Beta or RC release. |
|
46 | 46 | |
|
47 | 47 | .. note:: |
|
48 | 48 | |
|
49 | 49 | Before generating the GitHub stats, verify that all closed issues and pull |
|
50 | 50 | requests have `appropriate milestones |
|
51 |
<https://github.com/ipython/ipython/wiki/Dev |
|
|
51 | <https://github.com/ipython/ipython/wiki/Dev:-GitHub-workflow#milestones>`_. | |
|
52 | 52 | `This search |
|
53 | 53 | <https://github.com/ipython/ipython/issues?q=is%3Aclosed+no%3Amilestone+is%3Aissue>`_ |
|
54 | 54 | should return no results before creating the GitHub stats. |
|
55 | 55 | |
|
56 | 56 | If a major release: |
|
57 | 57 | |
|
58 | 58 | - merge any pull request notes into what's new:: |
|
59 | 59 | |
|
60 | 60 | python tools/update_whatsnew.py |
|
61 | 61 | |
|
62 | 62 | - update ``docs/source/whatsnew/development.rst``, to ensure it covers |
|
63 | 63 | the major release features |
|
64 | 64 | |
|
65 | 65 | - move the contents of ``development.rst`` to ``versionX.rst`` where ``X`` is |
|
66 | 66 | the numerical release version |
|
67 | 67 | |
|
68 | 68 | - generate summary of GitHub contributions, which can be done with:: |
|
69 | 69 | |
|
70 | 70 | python tools/github_stats.py --milestone $MILESTONE > stats.rst |
|
71 | 71 | |
|
72 | 72 | which may need some manual cleanup of ``stats.rst``. Add the cleaned |
|
73 | 73 | ``stats.rst`` results to ``docs/source/whatsnew/github-stats-X.rst`` |
|
74 | 74 | where ``X`` is the numerical release version (don't forget to add it to |
|
75 | 75 | the git repo as well). If creating a major release, make a new |
|
76 | 76 | ``github-stats-X.rst`` file; if creating a minor release, the content |
|
77 | 77 | from ``stats.rst`` may simply be added to the top of an existing |
|
78 | 78 | ``github-stats-X.rst`` file. Finally, edit |
|
79 | 79 | ``docs/source/whatsnew/index.rst`` to list the new ``github-stats-X`` |
|
80 | 80 | file you just created and remove temporarily the first entry called |
|
81 | 81 | ``development`` (you'll need to add it back after release). |
|
82 | 82 | |
|
83 | 83 | Make sure that the stats file has a header or it won't be rendered in |
|
84 | 84 | the final documentation. |
|
85 | 85 | |
|
86 | 86 | To find duplicates and update `.mailmap`, use:: |
|
87 | 87 | |
|
88 | 88 | git log --format="%aN <%aE>" $PREV_RELEASE... | sort -u -f |
|
89 | 89 | |
|
90 | 90 | 3. Make sure the repository is clean |
|
91 | 91 | ------------------------------------ |
|
92 | 92 | |
|
93 | 93 | of any file that could be problematic. |
|
94 | 94 | Remove all non-tracked files with: |
|
95 | 95 | |
|
96 | 96 | .. code:: |
|
97 | 97 | |
|
98 | 98 | git clean -xfdi |
|
99 | 99 | |
|
100 | 100 | This will ask for confirmation before removing all untracked files. Make |
|
101 | 101 | sure the ``dist/`` folder is clean to avoid any stale builds from |
|
102 | 102 | previous build attempts. |
|
103 | 103 | |
|
104 | 104 | |
|
105 | 105 | 4. Update the release version number |
|
106 | 106 | ------------------------------------ |
|
107 | 107 | |
|
108 | 108 | Edit ``IPython/core/release.py`` to have the current version. |
|
109 | 109 | |
|
110 | 110 | in particular, update version number and ``_version_extra`` content in |
|
111 | 111 | ``IPython/core/release.py``. |
|
112 | 112 | |
|
113 | 113 | Step 5 will validate your changes automatically, but you might still want to |
|
114 | 114 | make sure the version number matches pep440. |
|
115 | 115 | |
|
116 | 116 | In particular, ``rc`` and ``beta`` are not separated by ``.`` or the ``sdist`` |
|
117 | 117 | and ``bdist`` will appear as different releases. For example, a valid version |
|
118 | 118 | number for a release candidate (rc) release is: ``1.3rc1``. Notice that there |
|
119 | 119 | is no separator between the '3' and the 'r'. Check the environment variable |
|
120 | 120 | ``$VERSION`` as well. |
|
121 | 121 | |
|
122 | 122 | You will likely just have to modify/comment/uncomment one of the lines setting |
|
123 | 123 | ``_version_extra`` |
|
124 | 124 | |
|
125 | 125 | |
|
126 | 126 | 5. Run the `tools/build_release` script |
|
127 | 127 | --------------------------------------- |
|
128 | 128 | |
|
129 | 129 | Running ``tools/build_release`` does all the file checking and building that |
|
130 | 130 | the real release script will do. This makes test installations, checks that |
|
131 | 131 | the build procedure runs OK, and tests other steps in the release process. |
|
132 | 132 | |
|
133 | 133 | The ``build_release`` script will in particular verify that the version number |
|
134 | 134 | match PEP 440, in order to avoid surprise at the time of build upload. |
|
135 | 135 | |
|
136 | 136 | We encourage creating a test build of the docs as well. |
|
137 | 137 | |
|
138 | 138 | 6. Create and push the new tag |
|
139 | 139 | ------------------------------ |
|
140 | 140 | |
|
141 | 141 | Commit the changes to release.py:: |
|
142 | 142 | |
|
143 | 143 | git commit -am "release $VERSION" |
|
144 | 144 | git push origin $BRANCH |
|
145 | 145 | |
|
146 | 146 | Create and push the tag:: |
|
147 | 147 | |
|
148 | 148 | git tag -am "release $VERSION" "$VERSION" |
|
149 | 149 | git push origin --tags |
|
150 | 150 | |
|
151 | 151 | Update release.py back to ``x.y-dev`` or ``x.y-maint``, and re-add the |
|
152 | 152 | ``development`` entry in ``docs/source/whatsnew/index.rst`` and push:: |
|
153 | 153 | |
|
154 | 154 | git commit -am "back to development" |
|
155 | 155 | git push origin $BRANCH |
|
156 | 156 | |
|
157 | 157 | 7. Get a fresh clone |
|
158 | 158 | -------------------- |
|
159 | 159 | |
|
160 | 160 | Get a fresh clone of the tag for building the release:: |
|
161 | 161 | |
|
162 | 162 | cd /tmp |
|
163 | 163 | git clone --depth 1 https://github.com/ipython/ipython.git -b "$VERSION" |
|
164 | 164 | cd ipython |
|
165 | 165 | |
|
166 | 166 | .. note:: |
|
167 | 167 | |
|
168 | 168 | You can aslo cleanup the current working repository with ``git clean -xfdi`` |
|
169 | 169 | |
|
170 | 170 | 8. Run the release script |
|
171 | 171 | ------------------------- |
|
172 | 172 | |
|
173 | 173 | .. important:: |
|
174 | 174 | |
|
175 | 175 | These steps cover instructions for creating releases of IPython 5.x LTS and |
|
176 | 176 | IPython 6.x. Ignore release steps for Python 2 when releasing IPython 6.x |
|
177 | 177 | which no longer supports Python 2. |
|
178 | 178 | |
|
179 | 179 | Run the ``release`` script, this step requires having a current wheel, Python |
|
180 | 180 | >=3.4 and Python 2.7.:: |
|
181 | 181 | |
|
182 | 182 | ./tools/release |
|
183 | 183 | |
|
184 | 184 | This makes the tarballs and wheels, and puts them under the ``dist/`` |
|
185 | 185 | folder. Be sure to test the ``wheels`` and the ``sdist`` locally before |
|
186 | 186 | uploading them to PyPI. We do not use an universal wheel as each wheel |
|
187 | 187 | installs an ``ipython2`` or ``ipython3`` script, depending on the version of |
|
188 | 188 | Python it is built for. Using an universal wheel would prevent this. |
|
189 | 189 | |
|
190 | 190 | Use the following to actually upload the result of the build:: |
|
191 | 191 | |
|
192 | 192 | ./tools/release upload |
|
193 | 193 | |
|
194 | 194 | It should posts them to ``archive.ipython.org``. |
|
195 | 195 | |
|
196 | 196 | You will need to use `twine <https://github.com/pypa/twine>`_ ) manually to |
|
197 | 197 | actually upload on PyPI. Unlike setuptools, twine is able to upload packages |
|
198 | 198 | over SSL:: |
|
199 | 199 | |
|
200 | 200 | twine upload dist/* |
|
201 | 201 | |
|
202 | 202 | |
|
203 | 203 | PyPI/Warehouse will automatically hide previous releases. If you are uploading |
|
204 | 204 | a non-stable version, make sure to log-in to PyPI and un-hide previous version. |
|
205 | 205 | |
|
206 | 206 | |
|
207 | 207 | 9. Draft a short release announcement |
|
208 | 208 | ------------------------------------- |
|
209 | 209 | |
|
210 | 210 | The announcement should include: |
|
211 | 211 | |
|
212 | 212 | - release highlights |
|
213 | 213 | - a link to the html version of the *What's new* section of the documentation |
|
214 | 214 | - a link to upgrade or installation tips (if necessary) |
|
215 | 215 | |
|
216 | 216 | Post the announcement to the mailing list and or blog, and link from Twitter. |
|
217 | 217 | |
|
218 | 218 | .. note:: |
|
219 | 219 | |
|
220 | 220 | If you are doing a RC or Beta, you can likely skip the next steps. |
|
221 | 221 | |
|
222 | 222 | 10. Update milestones on GitHub |
|
223 | 223 | ------------------------------- |
|
224 | 224 | |
|
225 | 225 | These steps will bring milestones up to date: |
|
226 | 226 | |
|
227 | 227 | - close the just released milestone |
|
228 | 228 | - open a new milestone for the next release (x, y+1), if the milestone doesn't |
|
229 | 229 | exist already |
|
230 | 230 | |
|
231 | 231 | 11. Update the IPython website |
|
232 | 232 | ------------------------------ |
|
233 | 233 | |
|
234 | 234 | The IPython website should document the new release: |
|
235 | 235 | |
|
236 | 236 | - add release announcement (news, announcements) |
|
237 | 237 | - update current version and download links |
|
238 | 238 | - update links on the documentation page (especially if a major release) |
|
239 | 239 | |
|
240 | 240 | 12. Update readthedocs |
|
241 | 241 | ---------------------- |
|
242 | 242 | |
|
243 | 243 | Make sure to update readthedocs and set the latest tag as stable, as well as |
|
244 | 244 | checking that previous release is still building under its own tag. |
|
245 | 245 | |
|
246 | 246 | |
|
247 | 247 | 13. Celebrate! |
|
248 | 248 | -------------- |
|
249 | 249 | |
|
250 | 250 | Celebrate the release and please thank the contributors for their work. Great |
|
251 | 251 | job! |
|
252 | 252 |
@@ -1,175 +1,175 b'' | |||
|
1 | 1 | Making simple Python wrapper kernels |
|
2 | 2 | ==================================== |
|
3 | 3 | |
|
4 | 4 | .. versionadded:: 3.0 |
|
5 | 5 | |
|
6 | 6 | You can now re-use the kernel machinery in IPython to easily make new kernels. |
|
7 | 7 | This is useful for languages that have Python bindings, such as `Octave |
|
8 | 8 | <http://www.gnu.org/software/octave/>`_ (via |
|
9 |
`Oct2Py <http://blink1073.github.io/oct2py/ |
|
|
9 | `Oct2Py <http://blink1073.github.io/oct2py/>`_), or languages | |
|
10 | 10 | where the REPL can be controlled in a tty using `pexpect <http://pexpect.readthedocs.io/en/latest/>`_, |
|
11 | 11 | such as bash. |
|
12 | 12 | |
|
13 | 13 | .. seealso:: |
|
14 | 14 | |
|
15 | 15 | `bash_kernel <https://github.com/takluyver/bash_kernel>`_ |
|
16 | 16 | A simple kernel for bash, written using this machinery |
|
17 | 17 | |
|
18 | 18 | Required steps |
|
19 | 19 | -------------- |
|
20 | 20 | |
|
21 | 21 | Subclass :class:`ipykernel.kernelbase.Kernel`, and implement the |
|
22 | 22 | following methods and attributes: |
|
23 | 23 | |
|
24 | 24 | .. class:: MyKernel |
|
25 | 25 | |
|
26 | 26 | .. attribute:: implementation |
|
27 | 27 | implementation_version |
|
28 | 28 | language |
|
29 | 29 | language_version |
|
30 | 30 | banner |
|
31 | 31 | |
|
32 | 32 | Information for :ref:`msging_kernel_info` replies. 'Implementation' refers |
|
33 | 33 | to the kernel (e.g. IPython), and 'language' refers to the language it |
|
34 | 34 | interprets (e.g. Python). The 'banner' is displayed to the user in console |
|
35 | 35 | UIs before the first prompt. All of these values are strings. |
|
36 | 36 | |
|
37 | 37 | .. attribute:: language_info |
|
38 | 38 | |
|
39 | 39 | Language information for :ref:`msging_kernel_info` replies, in a dictionary. |
|
40 | 40 | This should contain the key ``mimetype`` with the mimetype of code in the |
|
41 | 41 | target language (e.g. ``'text/x-python'``), and ``file_extension`` (e.g. |
|
42 | 42 | ``'py'``). |
|
43 | 43 | It may also contain keys ``codemirror_mode`` and ``pygments_lexer`` if they |
|
44 | 44 | need to differ from :attr:`language`. |
|
45 | 45 | |
|
46 | 46 | Other keys may be added to this later. |
|
47 | 47 | |
|
48 | 48 | .. method:: do_execute(code, silent, store_history=True, user_expressions=None, allow_stdin=False) |
|
49 | 49 | |
|
50 | 50 | Execute user code. |
|
51 | 51 | |
|
52 | 52 | :param str code: The code to be executed. |
|
53 | 53 | :param bool silent: Whether to display output. |
|
54 | 54 | :param bool store_history: Whether to record this code in history and |
|
55 | 55 | increase the execution count. If silent is True, this is implicitly |
|
56 | 56 | False. |
|
57 | 57 | :param dict user_expressions: Mapping of names to expressions to evaluate |
|
58 | 58 | after the code has run. You can ignore this if you need to. |
|
59 | 59 | :param bool allow_stdin: Whether the frontend can provide input on request |
|
60 | 60 | (e.g. for Python's :func:`raw_input`). |
|
61 | 61 | |
|
62 | 62 | Your method should return a dict containing the fields described in |
|
63 | 63 | :ref:`execution_results`. To display output, it can send messages |
|
64 | 64 | using :meth:`~ipykernel.kernelbase.Kernel.send_response`. |
|
65 | 65 | See :doc:`messaging` for details of the different message types. |
|
66 | 66 | |
|
67 | 67 | To launch your kernel, add this at the end of your module:: |
|
68 | 68 | |
|
69 | 69 | if __name__ == '__main__': |
|
70 | 70 | from ipykernel.kernelapp import IPKernelApp |
|
71 | 71 | IPKernelApp.launch_instance(kernel_class=MyKernel) |
|
72 | 72 | |
|
73 | 73 | Example |
|
74 | 74 | ------- |
|
75 | 75 | |
|
76 | 76 | ``echokernel.py`` will simply echo any input it's given to stdout:: |
|
77 | 77 | |
|
78 | 78 | from ipykernel.kernelbase import Kernel |
|
79 | 79 | |
|
80 | 80 | class EchoKernel(Kernel): |
|
81 | 81 | implementation = 'Echo' |
|
82 | 82 | implementation_version = '1.0' |
|
83 | 83 | language = 'no-op' |
|
84 | 84 | language_version = '0.1' |
|
85 | 85 | language_info = {'mimetype': 'text/plain'} |
|
86 | 86 | banner = "Echo kernel - as useful as a parrot" |
|
87 | 87 | |
|
88 | 88 | def do_execute(self, code, silent, store_history=True, user_expressions=None, |
|
89 | 89 | allow_stdin=False): |
|
90 | 90 | if not silent: |
|
91 | 91 | stream_content = {'name': 'stdout', 'text': code} |
|
92 | 92 | self.send_response(self.iopub_socket, 'stream', stream_content) |
|
93 | 93 | |
|
94 | 94 | return {'status': 'ok', |
|
95 | 95 | # The base class increments the execution count |
|
96 | 96 | 'execution_count': self.execution_count, |
|
97 | 97 | 'payload': [], |
|
98 | 98 | 'user_expressions': {}, |
|
99 | 99 | } |
|
100 | 100 | |
|
101 | 101 | if __name__ == '__main__': |
|
102 | 102 | from ipykernel.kernelapp import IPKernelApp |
|
103 | 103 | IPKernelApp.launch_instance(kernel_class=EchoKernel) |
|
104 | 104 | |
|
105 | 105 | Here's the Kernel spec ``kernel.json`` file for this:: |
|
106 | 106 | |
|
107 | 107 | {"argv":["python","-m","echokernel", "-f", "{connection_file}"], |
|
108 | 108 | "display_name":"Echo" |
|
109 | 109 | } |
|
110 | 110 | |
|
111 | 111 | |
|
112 | 112 | Optional steps |
|
113 | 113 | -------------- |
|
114 | 114 | |
|
115 | 115 | You can override a number of other methods to improve the functionality of your |
|
116 | 116 | kernel. All of these methods should return a dictionary as described in the |
|
117 | 117 | relevant section of the :doc:`messaging spec <messaging>`. |
|
118 | 118 | |
|
119 | 119 | .. class:: MyKernel |
|
120 | 120 | |
|
121 | 121 | .. method:: do_complete(code, cusor_pos) |
|
122 | 122 | |
|
123 | 123 | Code completion |
|
124 | 124 | |
|
125 | 125 | :param str code: The code already present |
|
126 | 126 | :param int cursor_pos: The position in the code where completion is requested |
|
127 | 127 | |
|
128 | 128 | .. seealso:: |
|
129 | 129 | |
|
130 | 130 | :ref:`msging_completion` messages |
|
131 | 131 | |
|
132 | 132 | .. method:: do_inspect(code, cusor_pos, detail_level=0) |
|
133 | 133 | |
|
134 | 134 | Object introspection |
|
135 | 135 | |
|
136 | 136 | :param str code: The code |
|
137 | 137 | :param int cursor_pos: The position in the code where introspection is requested |
|
138 | 138 | :param int detail_level: 0 or 1 for more or less detail. In IPython, 1 gets |
|
139 | 139 | the source code. |
|
140 | 140 | |
|
141 | 141 | .. seealso:: |
|
142 | 142 | |
|
143 | 143 | :ref:`msging_inspection` messages |
|
144 | 144 | |
|
145 | 145 | .. method:: do_history(hist_access_type, output, raw, session=None, start=None, stop=None, n=None, pattern=None, unique=False) |
|
146 | 146 | |
|
147 | 147 | History access. Only the relevant parameters for the type of history |
|
148 | 148 | request concerned will be passed, so your method definition must have defaults |
|
149 | 149 | for all the arguments shown with defaults here. |
|
150 | 150 | |
|
151 | 151 | .. seealso:: |
|
152 | 152 | |
|
153 | 153 | :ref:`msging_history` messages |
|
154 | 154 | |
|
155 | 155 | .. method:: do_is_complete(code) |
|
156 | 156 | |
|
157 | 157 | Is code entered in a console-like interface complete and ready to execute, |
|
158 | 158 | or should a continuation prompt be shown? |
|
159 | 159 | |
|
160 | 160 | :param str code: The code entered so far - possibly multiple lines |
|
161 | 161 | |
|
162 | 162 | .. seealso:: |
|
163 | 163 | |
|
164 | 164 | :ref:`msging_is_complete` messages |
|
165 | 165 | |
|
166 | 166 | .. method:: do_shutdown(restart) |
|
167 | 167 | |
|
168 | 168 | Shutdown the kernel. You only need to handle your own clean up - the kernel |
|
169 | 169 | machinery will take care of cleaning up its own things before stopping. |
|
170 | 170 | |
|
171 | 171 | :param bool restart: Whether the kernel will be started again afterwards |
|
172 | 172 | |
|
173 | 173 | .. seealso:: |
|
174 | 174 | |
|
175 | 175 | :ref:`msging_shutdown` messages |
@@ -1,1203 +1,1203 b'' | |||
|
1 | 1 | .. _issues_list_013: |
|
2 | 2 | |
|
3 | 3 | Issues closed in the 0.13 development cycle |
|
4 | 4 | =========================================== |
|
5 | 5 | |
|
6 | 6 | Issues closed in 0.13 |
|
7 | 7 | --------------------- |
|
8 | 8 | |
|
9 | 9 | GitHub stats since IPython 0.12 (2011/12/19 - 2012/06/30) |
|
10 | 10 | |
|
11 | 11 | These lists are automatically generated, and may be incomplete or contain |
|
12 | 12 | duplicates. |
|
13 | 13 | |
|
14 | 14 | The following 62 authors contributed 1760 commits. |
|
15 | 15 | |
|
16 | 16 | * Aaron Culich |
|
17 | 17 | * Aaron Meurer |
|
18 | 18 | * Alex Kramer |
|
19 | 19 | * Andrew Giessel |
|
20 | 20 | * Andrew Straw |
|
21 | 21 | * AndrΓ© Matos |
|
22 | 22 | * Aron Ahmadia |
|
23 | 23 | * Ben Edwards |
|
24 | 24 | * Benjamin Ragan-Kelley |
|
25 | 25 | * Bradley M. Froehle |
|
26 | 26 | * Brandon Parsons |
|
27 | 27 | * Brian E. Granger |
|
28 | 28 | * Carlos Cordoba |
|
29 | 29 | * David Hirschfeld |
|
30 | 30 | * David Zderic |
|
31 | 31 | * Ernie French |
|
32 | 32 | * Fernando Perez |
|
33 | 33 | * Ian Murray |
|
34 | 34 | * Jason Grout |
|
35 | 35 | * Jens H Nielsen |
|
36 | 36 | * Jez Ng |
|
37 | 37 | * Jonathan March |
|
38 | 38 | * Jonathan Taylor |
|
39 | 39 | * Julian Taylor |
|
40 | 40 | * JΓΆrgen Stenarson |
|
41 | 41 | * Kent Inverarity |
|
42 | 42 | * Marc Abramowitz |
|
43 | 43 | * Mark Wiebe |
|
44 | 44 | * Matthew Brett |
|
45 | 45 | * Matthias BUSSONNIER |
|
46 | 46 | * Michael Droettboom |
|
47 | 47 | * Mike Hansen |
|
48 | 48 | * Nathan Rice |
|
49 | 49 | * Pankaj Pandey |
|
50 | 50 | * Paul |
|
51 | 51 | * Paul Ivanov |
|
52 | 52 | * Piotr Zolnierczuk |
|
53 | 53 | * Piti Ongmongkolkul |
|
54 | 54 | * Puneeth Chaganti |
|
55 | 55 | * Robert Kern |
|
56 | 56 | * Ross Jones |
|
57 | 57 | * Roy Hyunjin Han |
|
58 | 58 | * Scott Tsai |
|
59 | 59 | * Skipper Seabold |
|
60 | 60 | * Stefan van der Walt |
|
61 | 61 | * Steven Johnson |
|
62 | 62 | * Takafumi Arakaki |
|
63 | 63 | * Ted Wright |
|
64 | 64 | * Thomas Hisch |
|
65 | 65 | * Thomas Kluyver |
|
66 | 66 | * Thomas Spura |
|
67 | 67 | * Thomi Richards |
|
68 | 68 | * Tim Couper |
|
69 | 69 | * Timo Paulssen |
|
70 | 70 | * Toby Gilham |
|
71 | 71 | * Tony S Yu |
|
72 | 72 | * W. Trevor King |
|
73 | 73 | * Walter Doerwald |
|
74 | 74 | * anatoly techtonik |
|
75 | 75 | * fawce |
|
76 | 76 | * mcelrath |
|
77 | 77 | * wilsaj |
|
78 | 78 | |
|
79 | 79 | |
|
80 | 80 | We closed a total of 1115 issues, 373 pull requests and 742 regular issues; |
|
81 | 81 | this is the full list (generated with the script |
|
82 | 82 | :file:`tools/github_stats.py`): |
|
83 | 83 | |
|
84 | 84 | Pull Requests (373): |
|
85 | 85 | |
|
86 | 86 | * :ghpull:`1943`: add screenshot and link into releasenotes |
|
87 | 87 | * :ghpull:`1954`: update some example notebooks |
|
88 | 88 | * :ghpull:`2048`: move _encode_binary to jsonutil.encode_images |
|
89 | 89 | * :ghpull:`2050`: only add quotes around xunit-file on Windows |
|
90 | 90 | * :ghpull:`2047`: disable auto-scroll on mozilla |
|
91 | 91 | * :ghpull:`2015`: Fixes for %paste with special transformations |
|
92 | 92 | * :ghpull:`2046`: Iptest unicode |
|
93 | 93 | * :ghpull:`1939`: Namespaces |
|
94 | 94 | * :ghpull:`2042`: increase auto-scroll threshold to 100 lines |
|
95 | 95 | * :ghpull:`2043`: move RemoteError import to top-level |
|
96 | 96 | * :ghpull:`2036`: %alias_magic |
|
97 | 97 | * :ghpull:`1968`: Proposal of icons for .ipynb files |
|
98 | 98 | * :ghpull:`2037`: remove `ipython-qtconsole` gui-script |
|
99 | 99 | * :ghpull:`2038`: add extra clear warning to shell doc |
|
100 | 100 | * :ghpull:`2029`: Ship unminified js |
|
101 | 101 | * :ghpull:`2007`: Add custom_control and custom_page_control variables to override the Qt widgets used by qtconsole |
|
102 | 102 | * :ghpull:`2034`: fix&test push/pull recarrays |
|
103 | 103 | * :ghpull:`2028`: Reduce unhelpful information shown by pinfo |
|
104 | 104 | * :ghpull:`2030`: check wxPython version in inputhook |
|
105 | 105 | * :ghpull:`2024`: Make interactive_usage a bit more rst friendly |
|
106 | 106 | * :ghpull:`2031`: disable ^C^C confirmation on Windows |
|
107 | 107 | * :ghpull:`2027`: match stdin encoding in frontend readline test |
|
108 | 108 | * :ghpull:`2025`: Fix parallel test on WinXP - wait for resource cleanup. |
|
109 | 109 | * :ghpull:`2016`: BUG: test runner fails in Windows if filenames contain spaces. |
|
110 | 110 | * :ghpull:`2020`: Fix home path expansion test in Windows. |
|
111 | 111 | * :ghpull:`2021`: Fix Windows pathname issue in 'odd encoding' test. |
|
112 | 112 | * :ghpull:`2022`: don't check writability in test for get_home_dir when HOME is undefined |
|
113 | 113 | * :ghpull:`1996`: frontend test tweaks |
|
114 | 114 | * :ghpull:`2014`: relax profile regex in notebook |
|
115 | 115 | * :ghpull:`2012`: Mono cursor offset |
|
116 | 116 | * :ghpull:`2004`: Clarify generic message spec vs. Python message API in docs |
|
117 | 117 | * :ghpull:`2010`: notebook: Print a warning (but do not abort) if no webbrowser can be found. |
|
118 | 118 | * :ghpull:`2002`: Refactor %magic into a lsmagic_docs API function. |
|
119 | 119 | * :ghpull:`1999`: `%magic` help: display line and cell magics in alphabetical order. |
|
120 | 120 | * :ghpull:`1981`: Clean BG processes created by %%script on kernel exit |
|
121 | 121 | * :ghpull:`1994`: Fix RST misformatting. |
|
122 | 122 | * :ghpull:`1951`: minor notebook startup/notebook-dir adjustments |
|
123 | 123 | * :ghpull:`1974`: Allow path completion on notebook. |
|
124 | 124 | * :ghpull:`1964`: allow multiple instances of a Magic |
|
125 | 125 | * :ghpull:`1991`: fix _ofind attr in %page |
|
126 | 126 | * :ghpull:`1988`: check for active frontend in update_restart_checkbox |
|
127 |
* :ghpull:`1979`: Add support for tox (http://tox.tes |
|
|
127 | * :ghpull:`1979`: Add support for tox (https://tox.readthedocs.io/) and Travis CI (http://travis-ci.org/) | |
|
128 | 128 | * :ghpull:`1970`: dblclick to restore size of images |
|
129 | 129 | * :ghpull:`1978`: Notebook names truncating at the first period |
|
130 | 130 | * :ghpull:`1825`: second attempt at scrolled long output |
|
131 | 131 | * :ghpull:`1934`: Cell/Worksheet metadata |
|
132 | 132 | * :ghpull:`1746`: Confirm restart (configuration option, and checkbox UI) |
|
133 | 133 | * :ghpull:`1944`: [qtconsole] take %,%% prefix into account for completion |
|
134 | 134 | * :ghpull:`1973`: fix another FreeBSD $HOME symlink issue |
|
135 | 135 | * :ghpull:`1967`: Fix psums example description in docs |
|
136 | 136 | * :ghpull:`1965`: fix for #1678, undo no longer clears cells |
|
137 | 137 | * :ghpull:`1952`: avoid duplicate "Websockets closed" dialog on ws close |
|
138 | 138 | * :ghpull:`1962`: Support unicode prompts |
|
139 | 139 | * :ghpull:`1955`: update to latest version of vim-ipython |
|
140 | 140 | * :ghpull:`1945`: Add --proc option to %%script |
|
141 | 141 | * :ghpull:`1956`: move import RemoteError after get_exc_info |
|
142 | 142 | * :ghpull:`1950`: Fix for copy action (Ctrl+C) when there is no pager defined in qtconsole |
|
143 | 143 | * :ghpull:`1948`: Fix help string for InteractiveShell.ast_node_interactivity |
|
144 | 144 | * :ghpull:`1942`: swallow stderr of which in utils.process.find_cmd |
|
145 | 145 | * :ghpull:`1940`: fix completer css on some Chrome versions |
|
146 | 146 | * :ghpull:`1938`: remove remaining references to deprecated XREP/XREQ names |
|
147 | 147 | * :ghpull:`1925`: Fix styling of superscripts and subscripts. Closes #1924. |
|
148 | 148 | * :ghpull:`1936`: increase duration of save messages |
|
149 | 149 | * :ghpull:`1937`: add %save -f |
|
150 | 150 | * :ghpull:`1935`: add version checking to pyreadline import test |
|
151 | 151 | * :ghpull:`1849`: Octave magics |
|
152 | 152 | * :ghpull:`1759`: github, merge PR(s) just by number(s) |
|
153 | 153 | * :ghpull:`1931`: Win py3fixes |
|
154 | 154 | * :ghpull:`1933`: oinspect.find_file: Additional safety if file cannot be found. |
|
155 | 155 | * :ghpull:`1932`: Fix adding functions to CommandChainDispatcher with equal priority on Py 3 |
|
156 | 156 | * :ghpull:`1928`: Select NoDB by default |
|
157 | 157 | * :ghpull:`1923`: Add IPython syntax support to the %timeit magic, in line and cell mode |
|
158 | 158 | * :ghpull:`1926`: Make completer recognize escaped quotes in strings. |
|
159 | 159 | * :ghpull:`1893`: Update Parallel Magics and Exception Display |
|
160 | 160 | * :ghpull:`1921`: magic_arguments: dedent but otherwise preserve indentation. |
|
161 | 161 | * :ghpull:`1919`: Use oinspect in CodeMagics._find_edit_target |
|
162 | 162 | * :ghpull:`1918`: don't warn in iptest if deathrow/quarantine are missing |
|
163 | 163 | * :ghpull:`1917`: Fix for %pdef on Python 3 |
|
164 | 164 | * :ghpull:`1913`: Fix for #1428 |
|
165 | 165 | * :ghpull:`1911`: temporarily skip autoreload tests |
|
166 | 166 | * :ghpull:`1909`: Fix for #1908, use os.path.normcase for safe filename comparisons |
|
167 | 167 | * :ghpull:`1907`: py3compat fixes for %%script and tests |
|
168 | 168 | * :ghpull:`1906`: ofind finds non-unique cell magics |
|
169 | 169 | * :ghpull:`1845`: Fixes to inspection machinery for magics |
|
170 | 170 | * :ghpull:`1902`: Workaround fix for gh-1632; minimal revert of gh-1424 |
|
171 | 171 | * :ghpull:`1900`: Cython libs |
|
172 | 172 | * :ghpull:`1899`: add ScriptMagics to class list for generated config |
|
173 | 173 | * :ghpull:`1898`: minimize manpages |
|
174 | 174 | * :ghpull:`1897`: use glob for bad exclusion warning |
|
175 | 175 | * :ghpull:`1855`: %%script and %%file magics |
|
176 | 176 | * :ghpull:`1870`: add %%capture for capturing stdout/err |
|
177 | 177 | * :ghpull:`1861`: Use dvipng to format sympy.Matrix |
|
178 | 178 | * :ghpull:`1867`: Fix 1px margin bouncing of selected menu item. |
|
179 | 179 | * :ghpull:`1889`: Reconnect when the websocket connection closes unexpectedly |
|
180 | 180 | * :ghpull:`1886`: Fix a bug in renaming notebook |
|
181 | 181 | * :ghpull:`1895`: Fix error in test suite with ip.system() |
|
182 | 182 | * :ghpull:`1762`: add `locate` entry points |
|
183 | 183 | * :ghpull:`1883`: Fix vertical offset due to bold/italics, and bad browser fonts. |
|
184 | 184 | * :ghpull:`1875`: re-write columnize, with intermediate step. |
|
185 | 185 | * :ghpull:`1851`: new completer for qtconsole. |
|
186 | 186 | * :ghpull:`1892`: Remove suspicious quotes in interactiveshell.py |
|
187 | 187 | * :ghpull:`1864`: Rmagic exceptions |
|
188 | 188 | * :ghpull:`1829`: [notebook] don't care about leading prct in completion |
|
189 | 189 | * :ghpull:`1832`: Make svg, jpeg and png images resizable in notebook. |
|
190 | 190 | * :ghpull:`1674`: HTML Notebook carriage-return handling, take 2 |
|
191 | 191 | * :ghpull:`1882`: Remove importlib dependency which not available in Python 2.6. |
|
192 | 192 | * :ghpull:`1879`: Correct stack depth for variable expansion in !system commands |
|
193 | 193 | * :ghpull:`1841`: [notebook] deduplicate completion results |
|
194 | 194 | * :ghpull:`1850`: Remove args/kwargs handling in TryNext, fix %paste error messages. |
|
195 | 195 | * :ghpull:`1663`: Keep line-endings in ipynb |
|
196 | 196 | * :ghpull:`1815`: Make : invalid in filenames in the Notebook JS code. |
|
197 | 197 | * :ghpull:`1819`: doc: cleanup the parallel psums example a little |
|
198 | 198 | * :ghpull:`1839`: External cleanup |
|
199 | 199 | * :ghpull:`1782`: fix Magic menu in qtconsole, split in groups |
|
200 | 200 | * :ghpull:`1862`: Minor bind_kernel improvements |
|
201 | 201 | * :ghpull:`1857`: Prevent jumping of window to input when output is clicked. |
|
202 | 202 | * :ghpull:`1856`: Fix 1px jumping of cells and menus in Notebook. |
|
203 | 203 | * :ghpull:`1852`: fix chained resubmissions |
|
204 | 204 | * :ghpull:`1780`: Rmagic extension |
|
205 | 205 | * :ghpull:`1847`: add InlineBackend to ConsoleApp class list |
|
206 | 206 | * :ghpull:`1836`: preserve header for resubmitted tasks |
|
207 | 207 | * :ghpull:`1828`: change default extension to .ipy for %save -r |
|
208 | 208 | * :ghpull:`1800`: Reintroduce recall |
|
209 | 209 | * :ghpull:`1830`: lsmagic lists magics in alphabetical order |
|
210 | 210 | * :ghpull:`1773`: Update SymPy profile: SymPy's latex() can now print set and frozenset |
|
211 | 211 | * :ghpull:`1761`: Edited documentation to use IPYTHONDIR in place of ~/.ipython |
|
212 | 212 | * :ghpull:`1822`: aesthetics pass on AsyncResult.display_outputs |
|
213 | 213 | * :ghpull:`1821`: ENTER submits the rename notebook dialog. |
|
214 | 214 | * :ghpull:`1820`: NotebookApp: Make the number of ports to retry user configurable. |
|
215 | 215 | * :ghpull:`1816`: Always use filename as the notebook name. |
|
216 | 216 | * :ghpull:`1813`: Add assert_in method to nose for Python 2.6 |
|
217 | 217 | * :ghpull:`1711`: New Tooltip, New Completer and JS Refactor |
|
218 | 218 | * :ghpull:`1798`: a few simple fixes for docs/parallel |
|
219 | 219 | * :ghpull:`1812`: Ensure AsyncResult.display_outputs doesn't display empty streams |
|
220 | 220 | * :ghpull:`1811`: warn on nonexistent exclusions in iptest |
|
221 | 221 | * :ghpull:`1810`: fix for #1809, failing tests in IPython.zmq |
|
222 | 222 | * :ghpull:`1808`: Reposition alternate upload for firefox [need cross browser/OS/language test] |
|
223 | 223 | * :ghpull:`1742`: Check for custom_exceptions only once |
|
224 | 224 | * :ghpull:`1807`: add missing cython exclusion in iptest |
|
225 | 225 | * :ghpull:`1805`: Fixed a vcvarsall.bat error on win32/Py2.7 when trying to compile with m... |
|
226 | 226 | * :ghpull:`1739`: Dashboard improvement (necessary merge of #1658 and #1676 + fix #1492) |
|
227 | 227 | * :ghpull:`1770`: Cython related magic functions |
|
228 | 228 | * :ghpull:`1707`: Accept --gui=<...> switch in IPython qtconsole. |
|
229 | 229 | * :ghpull:`1797`: Fix comment which breaks Emacs syntax highlighting. |
|
230 | 230 | * :ghpull:`1795`: fix %gui magic |
|
231 | 231 | * :ghpull:`1793`: Raise repr limit for strings to 80 characters (from 30). |
|
232 | 232 | * :ghpull:`1794`: don't use XDG path on OS X |
|
233 | 233 | * :ghpull:`1792`: Unicode-aware logger |
|
234 | 234 | * :ghpull:`1791`: update zmqshell magics |
|
235 | 235 | * :ghpull:`1787`: DOC: Remove regression from qt-console docs. |
|
236 | 236 | * :ghpull:`1758`: test_pr, fallback on http if git protocol fail, and SSL errors... |
|
237 | 237 | * :ghpull:`1748`: Fix some tests for Python 3.3 |
|
238 | 238 | * :ghpull:`1755`: test for pygments before running qt tests |
|
239 | 239 | * :ghpull:`1771`: Make default value of interactivity passed to run_ast_nodes configurable |
|
240 | 240 | * :ghpull:`1784`: restore loadpy to load |
|
241 | 241 | * :ghpull:`1768`: Update parallel magics |
|
242 | 242 | * :ghpull:`1779`: Tidy up error raising in magic decorators. |
|
243 | 243 | * :ghpull:`1769`: Allow cell mode timeit without setup code. |
|
244 | 244 | * :ghpull:`1716`: Fix for fake filenames in verbose traceback |
|
245 | 245 | * :ghpull:`1763`: [qtconsole] fix append_plain_html -> append_html |
|
246 | 246 | * :ghpull:`1732`: Refactoring of the magics system and implementation of cell magics |
|
247 | 247 | * :ghpull:`1630`: Merge divergent Kernel implementations |
|
248 | 248 | * :ghpull:`1705`: [notebook] Make pager resizable, and remember size... |
|
249 | 249 | * :ghpull:`1606`: Share code for %pycat and %loadpy, make %pycat aware of URLs |
|
250 | 250 | * :ghpull:`1757`: Open IPython notebook hyperlinks in a new window using target=_blank |
|
251 | 251 | * :ghpull:`1754`: Fix typo enconters->encounters |
|
252 | 252 | * :ghpull:`1753`: Clear window title when kernel is restarted |
|
253 | 253 | * :ghpull:`1449`: Fix for bug #735 : Images missing from XML/SVG export |
|
254 | 254 | * :ghpull:`1743`: Tooltip completer js refactor |
|
255 | 255 | * :ghpull:`1681`: add qt config option to clear_on_kernel_restart |
|
256 | 256 | * :ghpull:`1733`: Tooltip completer js refactor |
|
257 | 257 | * :ghpull:`1727`: terminate kernel after embed_kernel tests |
|
258 | 258 | * :ghpull:`1737`: add HistoryManager to ipapp class list |
|
259 | 259 | * :ghpull:`1686`: ENH: Open a notebook from the command line |
|
260 | 260 | * :ghpull:`1709`: fixes #1708, failing test in arg_split on windows |
|
261 | 261 | * :ghpull:`1718`: Use CRegExp trait for regular expressions. |
|
262 | 262 | * :ghpull:`1729`: Catch failure in repr() for %whos |
|
263 | 263 | * :ghpull:`1726`: use eval for command-line args instead of exec |
|
264 | 264 | * :ghpull:`1724`: fix scatter/gather with targets='all' |
|
265 | 265 | * :ghpull:`1725`: add --no-ff to git pull in test_pr |
|
266 | 266 | * :ghpull:`1721`: Tooltip completer js refactor |
|
267 | 267 | * :ghpull:`1657`: Add `wait` optional argument to `hooks.editor` |
|
268 | 268 | * :ghpull:`1717`: Define generic sys.ps{1,2,3}, for use by scripts. |
|
269 | 269 | * :ghpull:`1691`: Finish PR #1446 |
|
270 | 270 | * :ghpull:`1710`: update MathJax CDN url for https |
|
271 | 271 | * :ghpull:`1713`: Make autocall regexp's configurable. |
|
272 | 272 | * :ghpull:`1703`: Allow TryNext to have an error message without it affecting the command chain |
|
273 | 273 | * :ghpull:`1714`: minor adjustments to test_pr |
|
274 | 274 | * :ghpull:`1704`: ensure all needed qt parts can be imported before settling for one |
|
275 | 275 | * :ghpull:`1706`: Mark test_push_numpy_nocopy as a known failure for Python 3 |
|
276 | 276 | * :ghpull:`1698`: fix tooltip on token with number |
|
277 | 277 | * :ghpull:`1245`: pythonw py3k fixes for issue #1226 |
|
278 | 278 | * :ghpull:`1685`: Add script to test pull request |
|
279 | 279 | * :ghpull:`1693`: deprecate IPYTHON_DIR in favor of IPYTHONDIR |
|
280 | 280 | * :ghpull:`1695`: Avoid deprecated warnings from ipython-qtconsole.desktop. |
|
281 | 281 | * :ghpull:`1694`: Add quote to notebook to allow it to load |
|
282 | 282 | * :ghpull:`1689`: Fix sys.path missing '' as first entry in `ipython kernel`. |
|
283 | 283 | * :ghpull:`1687`: import Binary from bson instead of pymongo |
|
284 | 284 | * :ghpull:`1616`: Make IPython.core.display.Image less notebook-centric |
|
285 | 285 | * :ghpull:`1684`: CLN: Remove redundant function definition. |
|
286 | 286 | * :ghpull:`1670`: Point %pastebin to gist |
|
287 | 287 | * :ghpull:`1669`: handle pyout messages in test_message_spec |
|
288 | 288 | * :ghpull:`1295`: add binary-tree engine interconnect example |
|
289 | 289 | * :ghpull:`1642`: Cherry-picked commits from 0.12.1 release |
|
290 | 290 | * :ghpull:`1659`: Handle carriage return characters ("\r") in HTML notebook output. |
|
291 | 291 | * :ghpull:`1656`: ensure kernels are cleaned up in embed_kernel tests |
|
292 | 292 | * :ghpull:`1664`: InteractiveShell.run_code: Update docstring. |
|
293 | 293 | * :ghpull:`1662`: Delay flushing softspace until after cell finishes |
|
294 | 294 | * :ghpull:`1643`: handle jpg/jpeg in the qtconsole |
|
295 | 295 | * :ghpull:`1652`: add patch_pyzmq() for backporting a few changes from newer pyzmq |
|
296 | 296 | * :ghpull:`1650`: DOC: moving files with SSH launchers |
|
297 | 297 | * :ghpull:`1357`: add IPython.embed_kernel() |
|
298 | 298 | * :ghpull:`1640`: Finish up embed_kernel |
|
299 | 299 | * :ghpull:`1651`: Remove bundled Itpl module |
|
300 | 300 | * :ghpull:`1634`: incremental improvements to SSH launchers |
|
301 | 301 | * :ghpull:`1649`: move examples/test_embed into examples/tests/embed |
|
302 | 302 | * :ghpull:`1633`: Fix installing extension from local file on Windows |
|
303 | 303 | * :ghpull:`1645`: Exclude UserDict when deep reloading NumPy. |
|
304 | 304 | * :ghpull:`1637`: Removed a ':' which shouldn't have been there |
|
305 | 305 | * :ghpull:`1631`: TST: QApplication doesn't quit early enough with PySide. |
|
306 | 306 | * :ghpull:`1629`: evaluate a few dangling validate_message generators |
|
307 | 307 | * :ghpull:`1621`: clear In[] prompt numbers on "Clear All Output" |
|
308 | 308 | * :ghpull:`1627`: Test the Message Spec |
|
309 | 309 | * :ghpull:`1624`: Fixes for byte-compilation on Python 3 |
|
310 | 310 | * :ghpull:`1615`: Add show() method to figure objects. |
|
311 | 311 | * :ghpull:`1625`: Fix deepreload on Python 3 |
|
312 | 312 | * :ghpull:`1620`: pyin message now have execution_count |
|
313 | 313 | * :ghpull:`1457`: Update deepreload to use a rewritten knee.py. Fixes dreload(numpy). |
|
314 | 314 | * :ghpull:`1613`: allow map / parallel function for single-engine views |
|
315 | 315 | * :ghpull:`1609`: exit notebook cleanly on SIGINT, SIGTERM |
|
316 | 316 | * :ghpull:`1607`: cleanup sqlitedb temporary db file after tests |
|
317 | 317 | * :ghpull:`1608`: don't rely on timedelta.total_seconds in AsyncResult |
|
318 | 318 | * :ghpull:`1599`: Fix for %run -d on Python 3 |
|
319 | 319 | * :ghpull:`1602`: Fix %env magic on Python 3. |
|
320 | 320 | * :ghpull:`1603`: Remove python3 profile |
|
321 | 321 | * :ghpull:`1604`: Exclude IPython.quarantine from installation |
|
322 | 322 | * :ghpull:`1600`: Specify encoding for io.open in notebook_reformat tests |
|
323 | 323 | * :ghpull:`1605`: Small fixes for Animation and Progress notebook |
|
324 | 324 | * :ghpull:`1529`: __all__ feature, improvement to dir2, and tests for both |
|
325 | 325 | * :ghpull:`1548`: add sugar methods/properties to AsyncResult |
|
326 | 326 | * :ghpull:`1535`: Fix pretty printing dispatch |
|
327 | 327 | * :ghpull:`1399`: Use LaTeX to print various built-in types with the SymPy printing extension |
|
328 | 328 | * :ghpull:`1597`: re-enter kernel.eventloop after catching SIGINT |
|
329 | 329 | * :ghpull:`1490`: rename plaintext cell -> raw cell |
|
330 | 330 | * :ghpull:`1480`: Fix %notebook magic, etc. nbformat unicode tests and fixes |
|
331 | 331 | * :ghpull:`1588`: Gtk3 integration with ipython works. |
|
332 | 332 | * :ghpull:`1595`: Examples syntax (avoid errors installing on Python 3) |
|
333 | 333 | * :ghpull:`1526`: Find encoding for Python files |
|
334 | 334 | * :ghpull:`1594`: Fix writing git commit ID to a file on build with Python 3 |
|
335 | 335 | * :ghpull:`1556`: shallow-copy DictDB query results |
|
336 | 336 | * :ghpull:`1502`: small changes in response to pyflakes pass |
|
337 | 337 | * :ghpull:`1445`: Don't build sphinx docs for sdists |
|
338 | 338 | * :ghpull:`1538`: store git commit hash in utils._sysinfo instead of hidden data file |
|
339 | 339 | * :ghpull:`1546`: attempt to suppress exceptions in channel threads at shutdown |
|
340 | 340 | * :ghpull:`1559`: update tools/github_stats.py to use GitHub API v3 |
|
341 | 341 | * :ghpull:`1563`: clear_output improvements |
|
342 | 342 | * :ghpull:`1560`: remove obsolete discussion of Twisted/trial from testing docs |
|
343 | 343 | * :ghpull:`1569`: BUG: qtconsole -- non-standard handling of \a and \b. [Fixes #1561] |
|
344 | 344 | * :ghpull:`1573`: BUG: Ctrl+C crashes wx pylab kernel in qtconsole. |
|
345 | 345 | * :ghpull:`1568`: fix PR #1567 |
|
346 | 346 | * :ghpull:`1567`: Fix: openssh_tunnel did not parse port in `server` |
|
347 | 347 | * :ghpull:`1565`: fix AsyncResult.abort |
|
348 | 348 | * :ghpull:`1552`: use os.getcwdu in NotebookManager |
|
349 | 349 | * :ghpull:`1541`: display_pub flushes stdout/err |
|
350 | 350 | * :ghpull:`1544`: make MultiKernelManager.kernel_manager_class configurable |
|
351 | 351 | * :ghpull:`1517`: Fix indentation bug in IPython/lib/pretty.py |
|
352 | 352 | * :ghpull:`1519`: BUG: Include the name of the exception type in its pretty format. |
|
353 | 353 | * :ghpull:`1489`: Fix zero-copy push |
|
354 | 354 | * :ghpull:`1477`: fix dangling `buffer` in IPython.parallel.util |
|
355 | 355 | * :ghpull:`1514`: DOC: Fix references to IPython.lib.pretty instead of the old location |
|
356 | 356 | * :ghpull:`1481`: BUG: Improve placement of CallTipWidget |
|
357 | 357 | * :ghpull:`1496`: BUG: LBYL when clearing the output history on shutdown. |
|
358 | 358 | * :ghpull:`1508`: fix sorting profiles in clustermanager |
|
359 | 359 | * :ghpull:`1495`: BUG: Fix pretty-printing for overzealous objects |
|
360 | 360 | * :ghpull:`1472`: more general fix for #662 |
|
361 | 361 | * :ghpull:`1483`: updated magic_history docstring |
|
362 | 362 | * :ghpull:`1383`: First version of cluster web service. |
|
363 | 363 | * :ghpull:`1398`: fix %tb after SyntaxError |
|
364 | 364 | * :ghpull:`1440`: Fix for failing testsuite when using --with-xml-coverage on windows. |
|
365 | 365 | * :ghpull:`1419`: Add %install_ext magic function. |
|
366 | 366 | * :ghpull:`1424`: Win32 shell interactivity |
|
367 | 367 | * :ghpull:`1468`: Simplify structure of a Job in the TaskScheduler |
|
368 | 368 | * :ghpull:`1447`: 1107 - Tab autocompletion can suggest invalid syntax |
|
369 | 369 | * :ghpull:`1469`: Fix typo in comment (insert space) |
|
370 | 370 | * :ghpull:`1463`: Fix completion when importing modules in the cwd. |
|
371 | 371 | * :ghpull:`1466`: Fix for issue #1437, unfriendly windows qtconsole error handling |
|
372 | 372 | * :ghpull:`1432`: Fix ipython directive |
|
373 | 373 | * :ghpull:`1465`: allow `ipython help subcommand` syntax |
|
374 | 374 | * :ghpull:`1416`: Conditional import of ctypes in inputhook |
|
375 | 375 | * :ghpull:`1462`: expedite parallel tests |
|
376 | 376 | * :ghpull:`1410`: Add javascript library and css stylesheet loading to JS class. |
|
377 | 377 | * :ghpull:`1448`: Fix for #875 Never build unicode error messages |
|
378 | 378 | * :ghpull:`1458`: use eval to uncan References |
|
379 | 379 | * :ghpull:`1450`: load mathjax from CDN via https |
|
380 | 380 | * :ghpull:`1451`: include heading level in JSON |
|
381 | 381 | * :ghpull:`1444`: Fix pyhton -> python typos |
|
382 | 382 | * :ghpull:`1414`: ignore errors in shell.var_expand |
|
383 | 383 | * :ghpull:`1430`: Fix for tornado check for tornado < 1.1.0 |
|
384 | 384 | * :ghpull:`1413`: get_home_dir expands symlinks, adjust test accordingly |
|
385 | 385 | * :ghpull:`1385`: updated and prettified magic doc strings |
|
386 | 386 | * :ghpull:`1406`: Browser selection |
|
387 | 387 | * :ghpull:`1377`: Saving non-ascii history |
|
388 | 388 | * :ghpull:`1402`: fix symlinked /home issue for FreeBSD |
|
389 | 389 | * :ghpull:`1405`: Only monkeypatch xunit when the tests are run using it. |
|
390 | 390 | * :ghpull:`1395`: Xunit & KnownFailure |
|
391 | 391 | * :ghpull:`1396`: Fix for %tb magic. |
|
392 | 392 | * :ghpull:`1386`: Jsd3 |
|
393 | 393 | * :ghpull:`1388`: Add simple support for running inside a virtualenv |
|
394 | 394 | * :ghpull:`1391`: Improve Hub/Scheduler when no engines are registered |
|
395 | 395 | * :ghpull:`1369`: load header with engine id when engine dies in TaskScheduler |
|
396 | 396 | * :ghpull:`1353`: Save notebook as script using unicode file handle. |
|
397 | 397 | * :ghpull:`1352`: Add '-m mod : run library module as a script' option. |
|
398 | 398 | * :ghpull:`1363`: Fix some minor color/style config issues in the qtconsole |
|
399 | 399 | * :ghpull:`1371`: Adds a quiet keyword to sync_imports |
|
400 | 400 | * :ghpull:`1387`: Fixing Cell menu to update cell type select box. |
|
401 | 401 | * :ghpull:`1296`: Wx gui example: fixes the broken example for `%gui wx`. |
|
402 | 402 | * :ghpull:`1372`: ipcontroller cleans up connection files unless reuse=True |
|
403 | 403 | * :ghpull:`1374`: remove calls to meaningless ZMQStream.on_err |
|
404 | 404 | * :ghpull:`1370`: allow draft76 websockets (Safari) |
|
405 | 405 | * :ghpull:`1368`: Ensure handler patterns are str, not unicode |
|
406 | 406 | * :ghpull:`1361`: Notebook bug fix branch |
|
407 | 407 | * :ghpull:`1364`: avoid jsonlib returning Decimal |
|
408 | 408 | * :ghpull:`1362`: Don't log complete contents of history replies, even in debug |
|
409 | 409 | * :ghpull:`1347`: fix weird magic completion in notebook |
|
410 | 410 | * :ghpull:`1346`: fixups for alternate URL prefix stuff |
|
411 | 411 | * :ghpull:`1336`: crack at making notebook.html use the layout.html template |
|
412 | 412 | * :ghpull:`1331`: RST and heading cells |
|
413 | 413 | * :ghpull:`1247`: fixes a bug causing extra newlines after comments. |
|
414 | 414 | * :ghpull:`1332`: notebook - allow prefixes in URL path. |
|
415 | 415 | * :ghpull:`1341`: Don't attempt to tokenize binary files for tracebacks |
|
416 | 416 | * :ghpull:`1334`: added key handler for control-s to notebook, seems to work pretty well |
|
417 | 417 | * :ghpull:`1338`: Fix see also in docstrings so API docs build |
|
418 | 418 | * :ghpull:`1335`: Notebook toolbar UI |
|
419 | 419 | * :ghpull:`1299`: made notebook.html extend layout.html |
|
420 | 420 | * :ghpull:`1318`: make Ctrl-D in qtconsole act same as in terminal (ready to merge) |
|
421 | 421 | * :ghpull:`1328`: Coverage |
|
422 | 422 | * :ghpull:`1206`: don't preserve fixConsole output in json |
|
423 | 423 | * :ghpull:`1330`: Add linewrapping to text cells (new feature in CodeMirror). |
|
424 | 424 | * :ghpull:`1309`: Inoculate clearcmd extension into %reset functionality |
|
425 | 425 | * :ghpull:`1327`: Updatecm2 |
|
426 | 426 | * :ghpull:`1326`: Removing Ace edit capability. |
|
427 | 427 | * :ghpull:`1325`: forgotten selected_cell -> get_selected_cell |
|
428 | 428 | * :ghpull:`1316`: Pass subprocess test runners a suitable location for xunit output |
|
429 | 429 | * :ghpull:`1303`: Updatecm |
|
430 | 430 | * :ghpull:`1312`: minor heartbeat tweaks |
|
431 | 431 | * :ghpull:`1306`: Fix %prun input parsing for escaped characters (closes #1302) |
|
432 | 432 | * :ghpull:`1301`: New "Fix for issue #1202" based on current master. |
|
433 | 433 | * :ghpull:`1289`: Make autoreload extension work on Python 3. |
|
434 | 434 | * :ghpull:`1288`: Don't ask for confirmation when stdin isn't available |
|
435 | 435 | * :ghpull:`1294`: TaskScheduler.hwm default to 1 instead of 0 |
|
436 | 436 | * :ghpull:`1283`: HeartMonitor.period should be an Integer |
|
437 | 437 | * :ghpull:`1264`: Aceify |
|
438 | 438 | * :ghpull:`1284`: a fix for GH 1269 |
|
439 | 439 | * :ghpull:`1213`: BUG: Minor typo in history_console_widget.py |
|
440 | 440 | * :ghpull:`1267`: add NoDB for non-recording Hub |
|
441 | 441 | * :ghpull:`1222`: allow Reference as callable in map/apply |
|
442 | 442 | * :ghpull:`1257`: use self.kernel_manager_class in qtconsoleapp |
|
443 | 443 | * :ghpull:`1253`: set auto_create flag for notebook apps |
|
444 | 444 | * :ghpull:`1262`: Heartbeat no longer shares the app's Context |
|
445 | 445 | * :ghpull:`1229`: Fix display of SyntaxError in Python 3 |
|
446 | 446 | * :ghpull:`1256`: Dewijmoize |
|
447 | 447 | * :ghpull:`1246`: Skip tests that require X, when importing pylab results in RuntimeError. |
|
448 | 448 | * :ghpull:`1211`: serve local files in notebook-dir |
|
449 | 449 | * :ghpull:`1224`: edit text cells on double-click instead of single-click |
|
450 | 450 | * :ghpull:`1187`: misc notebook: connection file cleanup, first heartbeat, startup flush |
|
451 | 451 | * :ghpull:`1207`: fix loadpy duplicating newlines |
|
452 | 452 | * :ghpull:`1129`: Unified setup.py |
|
453 | 453 | * :ghpull:`1199`: Reduce IPython.external.* |
|
454 | 454 | * :ghpull:`1218`: Added -q option to %prun for suppression of the output, along with editing the dochelp string. |
|
455 | 455 | * :ghpull:`1217`: Added -q option to %prun for suppression of the output, along with editing the dochelp string |
|
456 | 456 | * :ghpull:`1175`: core.completer: Clean up excessive and unused code. |
|
457 | 457 | * :ghpull:`1196`: docs: looks like a file path might have been accidentally pasted in the middle of a word |
|
458 | 458 | * :ghpull:`1190`: Fix link to Chris Fonnesbeck blog post about 0.11 highlights. |
|
459 | 459 | |
|
460 | 460 | Issues (742): |
|
461 | 461 | |
|
462 | 462 | * :ghissue:`1943`: add screenshot and link into releasenotes |
|
463 | 463 | * :ghissue:`1570`: [notebook] remove 'left panel' references from example. |
|
464 | 464 | * :ghissue:`1954`: update some example notebooks |
|
465 | 465 | * :ghissue:`2048`: move _encode_binary to jsonutil.encode_images |
|
466 | 466 | * :ghissue:`2050`: only add quotes around xunit-file on Windows |
|
467 | 467 | * :ghissue:`2047`: disable auto-scroll on mozilla |
|
468 | 468 | * :ghissue:`1258`: Magic %paste error |
|
469 | 469 | * :ghissue:`2015`: Fixes for %paste with special transformations |
|
470 | 470 | * :ghissue:`760`: Windows: test runner fails if repo path contains spaces |
|
471 | 471 | * :ghissue:`2046`: Iptest unicode |
|
472 | 472 | * :ghissue:`1939`: Namespaces |
|
473 | 473 | * :ghissue:`2042`: increase auto-scroll threshold to 100 lines |
|
474 | 474 | * :ghissue:`2043`: move RemoteError import to top-level |
|
475 | 475 | * :ghissue:`641`: In %magic help, remove duplicate aliases |
|
476 | 476 | * :ghissue:`2036`: %alias_magic |
|
477 | 477 | * :ghissue:`1968`: Proposal of icons for .ipynb files |
|
478 | 478 | * :ghissue:`825`: keyboardinterrupt crashes gtk gui when gtk.set_interactive is not available |
|
479 | 479 | * :ghissue:`1971`: Remove duplicate magics docs |
|
480 | 480 | * :ghissue:`2040`: Namespaces for cleaner public APIs |
|
481 | 481 | * :ghissue:`2039`: ipython parallel import exception |
|
482 | 482 | * :ghissue:`2035`: Getdefaultencoding test error with sympy 0.7.1_git |
|
483 | 483 | * :ghissue:`2037`: remove `ipython-qtconsole` gui-script |
|
484 | 484 | * :ghissue:`1516`: ipython-qtconsole script isn't installed for Python 2.x |
|
485 | 485 | * :ghissue:`1297`: "ipython -p sh" is in documentation but doesn't work |
|
486 | 486 | * :ghissue:`2038`: add extra clear warning to shell doc |
|
487 | 487 | * :ghissue:`1265`: please ship unminified js and css sources |
|
488 | 488 | * :ghissue:`2029`: Ship unminified js |
|
489 | 489 | * :ghissue:`1920`: Provide an easy way to override the Qt widget used by qtconsole |
|
490 | 490 | * :ghissue:`2007`: Add custom_control and custom_page_control variables to override the Qt widgets used by qtconsole |
|
491 | 491 | * :ghissue:`2009`: In %magic help, remove duplicate aliases |
|
492 | 492 | * :ghissue:`2033`: ipython parallel pushing and pulling recarrays |
|
493 | 493 | * :ghissue:`2034`: fix&test push/pull recarrays |
|
494 | 494 | * :ghissue:`2028`: Reduce unhelpful information shown by pinfo |
|
495 | 495 | * :ghissue:`1992`: Tab completion fails with many spaces in filename |
|
496 | 496 | * :ghissue:`1885`: handle too old wx |
|
497 | 497 | * :ghissue:`2030`: check wxPython version in inputhook |
|
498 | 498 | * :ghissue:`2024`: Make interactive_usage a bit more rst friendly |
|
499 | 499 | * :ghissue:`2031`: disable ^C^C confirmation on Windows |
|
500 | 500 | * :ghissue:`2023`: Unicode test failure on OS X |
|
501 | 501 | * :ghissue:`2027`: match stdin encoding in frontend readline test |
|
502 | 502 | * :ghissue:`1901`: Windows: parallel test fails assert, leaves 14 python processes alive |
|
503 | 503 | * :ghissue:`2025`: Fix parallel test on WinXP - wait for resource cleanup. |
|
504 | 504 | * :ghissue:`1986`: Line magic function `%R` not found. (Rmagic) |
|
505 | 505 | * :ghissue:`1712`: test failure in ubuntu package daily build |
|
506 | 506 | * :ghissue:`1183`: 0.12 testsuite failures |
|
507 | 507 | * :ghissue:`2016`: BUG: test runner fails in Windows if filenames contain spaces. |
|
508 | 508 | * :ghissue:`1806`: Alternate upload methods in firefox |
|
509 | 509 | * :ghissue:`2019`: Windows: home directory expansion test fails |
|
510 | 510 | * :ghissue:`2020`: Fix home path expansion test in Windows. |
|
511 | 511 | * :ghissue:`2017`: Windows core test error - filename quoting |
|
512 | 512 | * :ghissue:`2021`: Fix Windows pathname issue in 'odd encoding' test. |
|
513 | 513 | * :ghissue:`1998`: call to nt.assert_true(path._writable_dir(home)) returns false in test_path.py |
|
514 | 514 | * :ghissue:`2022`: don't check writability in test for get_home_dir when HOME is undefined |
|
515 | 515 | * :ghissue:`1589`: Test failures and docs don't build on Mac OS X Lion |
|
516 | 516 | * :ghissue:`1996`: frontend test tweaks |
|
517 | 517 | * :ghissue:`2011`: Notebook server can't start cluster with hyphen-containing profile name |
|
518 | 518 | * :ghissue:`2014`: relax profile regex in notebook |
|
519 | 519 | * :ghissue:`2013`: brew install pyqt |
|
520 | 520 | * :ghissue:`2005`: Strange output artifacts in footer of notebook |
|
521 | 521 | * :ghissue:`2012`: Mono cursor offset |
|
522 | 522 | * :ghissue:`2004`: Clarify generic message spec vs. Python message API in docs |
|
523 | 523 | * :ghissue:`2006`: Don't crash when starting notebook server if runnable browser not found |
|
524 | 524 | * :ghissue:`2010`: notebook: Print a warning (but do not abort) if no webbrowser can be found. |
|
525 | 525 | * :ghissue:`2008`: pip install virtualenv |
|
526 | 526 | * :ghissue:`2003`: Wrong case of rmagic in docs |
|
527 | 527 | * :ghissue:`2002`: Refactor %magic into a lsmagic_docs API function. |
|
528 | 528 | * :ghissue:`2000`: kernel.js consistency with generic IPython message format. |
|
529 | 529 | * :ghissue:`1999`: `%magic` help: display line and cell magics in alphabetical order. |
|
530 | 530 | * :ghissue:`1635`: test_prun_quotes fails on Windows |
|
531 | 531 | * :ghissue:`1984`: Cannot restart Notebook when using `%%script --bg` |
|
532 | 532 | * :ghissue:`1981`: Clean BG processes created by %%script on kernel exit |
|
533 | 533 | * :ghissue:`1994`: Fix RST misformatting. |
|
534 | 534 | * :ghissue:`1949`: Introduce Notebook Magics |
|
535 | 535 | * :ghissue:`1985`: Kernels should start in notebook dir when manually specified |
|
536 | 536 | * :ghissue:`1980`: Notebook should check that --notebook-dir exists |
|
537 | 537 | * :ghissue:`1951`: minor notebook startup/notebook-dir adjustments |
|
538 | 538 | * :ghissue:`1969`: tab completion in notebook for paths not triggered |
|
539 | 539 | * :ghissue:`1974`: Allow path completion on notebook. |
|
540 | 540 | * :ghissue:`1964`: allow multiple instances of a Magic |
|
541 | 541 | * :ghissue:`1960`: %page not working |
|
542 | 542 | * :ghissue:`1991`: fix _ofind attr in %page |
|
543 | 543 | * :ghissue:`1982`: Shutdown qtconsole problem? |
|
544 | 544 | * :ghissue:`1988`: check for active frontend in update_restart_checkbox |
|
545 |
* :ghissue:`1979`: Add support for tox (http://tox.tes |
|
|
545 | * :ghissue:`1979`: Add support for tox (https://tox.readthedocs.io/) and Travis CI (http://travis-ci.org/) | |
|
546 | 546 | * :ghissue:`1989`: Parallel: output of %px and %px${suffix} is inconsistent |
|
547 | 547 | * :ghissue:`1966`: ValueError: packer could not serialize a simple message |
|
548 | 548 | * :ghissue:`1987`: Notebook: MathJax offline install not recognized |
|
549 | 549 | * :ghissue:`1970`: dblclick to restore size of images |
|
550 | 550 | * :ghissue:`1983`: Notebook does not save heading level |
|
551 | 551 | * :ghissue:`1978`: Notebook names truncating at the first period |
|
552 | 552 | * :ghissue:`1553`: Limited size of output cells and provide scroll bars for such output cells |
|
553 | 553 | * :ghissue:`1825`: second attempt at scrolled long output |
|
554 | 554 | * :ghissue:`1915`: add cell-level metadata |
|
555 | 555 | * :ghissue:`1934`: Cell/Worksheet metadata |
|
556 | 556 | * :ghissue:`1746`: Confirm restart (configuration option, and checkbox UI) |
|
557 | 557 | * :ghissue:`1790`: Commenting function. |
|
558 | 558 | * :ghissue:`1767`: Tab completion problems with cell magics |
|
559 | 559 | * :ghissue:`1944`: [qtconsole] take %,%% prefix into account for completion |
|
560 | 560 | * :ghissue:`1973`: fix another FreeBSD $HOME symlink issue |
|
561 | 561 | * :ghissue:`1972`: Fix completion of '%tim' in the Qt console |
|
562 | 562 | * :ghissue:`1887`: Make it easy to resize jpeg/png images back to original size. |
|
563 | 563 | * :ghissue:`1967`: Fix psums example description in docs |
|
564 | 564 | * :ghissue:`1678`: ctrl-z clears cell output in notebook when pressed enough times |
|
565 | 565 | * :ghissue:`1965`: fix for #1678, undo no longer clears cells |
|
566 | 566 | * :ghissue:`1952`: avoid duplicate "Websockets closed" dialog on ws close |
|
567 | 567 | * :ghissue:`1961`: UnicodeDecodeError on directory with unicode chars in prompt |
|
568 | 568 | * :ghissue:`1963`: styling prompt, {color.Normal} excepts |
|
569 | 569 | * :ghissue:`1962`: Support unicode prompts |
|
570 | 570 | * :ghissue:`1959`: %page not working on qtconsole for Windows XP 32-bit |
|
571 | 571 | * :ghissue:`1955`: update to latest version of vim-ipython |
|
572 | 572 | * :ghissue:`1945`: Add --proc option to %%script |
|
573 | 573 | * :ghissue:`1957`: fix indentation in kernel.js |
|
574 | 574 | * :ghissue:`1956`: move import RemoteError after get_exc_info |
|
575 | 575 | * :ghissue:`1950`: Fix for copy action (Ctrl+C) when there is no pager defined in qtconsole |
|
576 | 576 | * :ghissue:`1948`: Fix help string for InteractiveShell.ast_node_interactivity |
|
577 | 577 | * :ghissue:`1941`: script magics cause terminal spam |
|
578 | 578 | * :ghissue:`1942`: swallow stderr of which in utils.process.find_cmd |
|
579 | 579 | * :ghissue:`1833`: completer draws slightly too small on Chrome |
|
580 | 580 | * :ghissue:`1940`: fix completer css on some Chrome versions |
|
581 | 581 | * :ghissue:`1938`: remove remaining references to deprecated XREP/XREQ names |
|
582 | 582 | * :ghissue:`1924`: HTML superscripts not shown raised in the notebook |
|
583 | 583 | * :ghissue:`1925`: Fix styling of superscripts and subscripts. Closes #1924. |
|
584 | 584 | * :ghissue:`1461`: User notification if notebook saving fails |
|
585 | 585 | * :ghissue:`1936`: increase duration of save messages |
|
586 | 586 | * :ghissue:`1542`: %save magic fails in clients without stdin if file already exists |
|
587 | 587 | * :ghissue:`1937`: add %save -f |
|
588 | 588 | * :ghissue:`1572`: pyreadline version dependency not correctly checked |
|
589 | 589 | * :ghissue:`1935`: add version checking to pyreadline import test |
|
590 | 590 | * :ghissue:`1849`: Octave magics |
|
591 | 591 | * :ghissue:`1759`: github, merge PR(s) just by number(s) |
|
592 | 592 | * :ghissue:`1931`: Win py3fixes |
|
593 | 593 | * :ghissue:`1646`: Meaning of restart parameter in client.shutdown() unclear |
|
594 | 594 | * :ghissue:`1933`: oinspect.find_file: Additional safety if file cannot be found. |
|
595 | 595 | * :ghissue:`1916`: %paste doesn't work on py3 |
|
596 | 596 | * :ghissue:`1932`: Fix adding functions to CommandChainDispatcher with equal priority on Py 3 |
|
597 | 597 | * :ghissue:`1928`: Select NoDB by default |
|
598 | 598 | * :ghissue:`1923`: Add IPython syntax support to the %timeit magic, in line and cell mode |
|
599 | 599 | * :ghissue:`1926`: Make completer recognize escaped quotes in strings. |
|
600 | 600 | * :ghissue:`1929`: Ipython-qtconsole (0.12.1) hangs with Python 2.7.3, Windows 7 64 bit |
|
601 | 601 | * :ghissue:`1409`: [qtconsole] forward delete bring completion into current line |
|
602 | 602 | * :ghissue:`1922`: py3k compatibility for setupegg.py |
|
603 | 603 | * :ghissue:`1598`: document that sync_imports() can't handle "import foo as bar" |
|
604 | 604 | * :ghissue:`1893`: Update Parallel Magics and Exception Display |
|
605 | 605 | * :ghissue:`1890`: Docstrings for magics that use @magic_arguments are rendered wrong |
|
606 | 606 | * :ghissue:`1921`: magic_arguments: dedent but otherwise preserve indentation. |
|
607 | 607 | * :ghissue:`1919`: Use oinspect in CodeMagics._find_edit_target |
|
608 | 608 | * :ghissue:`1918`: don't warn in iptest if deathrow/quarantine are missing |
|
609 | 609 | * :ghissue:`1914`: %pdef failing on python3 |
|
610 | 610 | * :ghissue:`1917`: Fix for %pdef on Python 3 |
|
611 | 611 | * :ghissue:`1428`: Failing test that prun does not clobber string escapes |
|
612 | 612 | * :ghissue:`1913`: Fix for #1428 |
|
613 | 613 | * :ghissue:`1911`: temporarily skip autoreload tests |
|
614 | 614 | * :ghissue:`1549`: autoreload extension crashes ipython |
|
615 | 615 | * :ghissue:`1908`: find_file errors on windows |
|
616 | 616 | * :ghissue:`1909`: Fix for #1908, use os.path.normcase for safe filename comparisons |
|
617 | 617 | * :ghissue:`1907`: py3compat fixes for %%script and tests |
|
618 | 618 | * :ghissue:`1904`: %%px? doesn't work, shows info for %px, general cell magic problem |
|
619 | 619 | * :ghissue:`1906`: ofind finds non-unique cell magics |
|
620 | 620 | * :ghissue:`1894`: Win64 binary install fails |
|
621 | 621 | * :ghissue:`1799`: Source file not found for magics |
|
622 | 622 | * :ghissue:`1845`: Fixes to inspection machinery for magics |
|
623 | 623 | * :ghissue:`1774`: Some magics seems broken |
|
624 | 624 | * :ghissue:`1586`: Clean up tight coupling between Notebook, CodeCell and Kernel Javascript objects |
|
625 | 625 | * :ghissue:`1632`: Win32 shell interactivity apparently broke qtconsole "cd" magic |
|
626 | 626 | * :ghissue:`1902`: Workaround fix for gh-1632; minimal revert of gh-1424 |
|
627 | 627 | * :ghissue:`1900`: Cython libs |
|
628 | 628 | * :ghissue:`1503`: Cursor is offset in notebook in Chrome 17 on Linux |
|
629 | 629 | * :ghissue:`1426`: Qt console doesn't handle the `--gui` flag correctly. |
|
630 | 630 | * :ghissue:`1180`: Can't start IPython kernel in Spyder |
|
631 | 631 | * :ghissue:`581`: test IPython.zmq |
|
632 | 632 | * :ghissue:`1593`: Name embedded in notebook overrides filename |
|
633 | 633 | * :ghissue:`1899`: add ScriptMagics to class list for generated config |
|
634 | 634 | * :ghissue:`1618`: generate or minimize manpages |
|
635 | 635 | * :ghissue:`1898`: minimize manpages |
|
636 | 636 | * :ghissue:`1896`: Windows: apparently spurious warning 'Excluding nonexistent file' ... test_exampleip |
|
637 | 637 | * :ghissue:`1897`: use glob for bad exclusion warning |
|
638 | 638 | * :ghissue:`1215`: updated %quickref to show short-hand for %sc and %sx |
|
639 | 639 | * :ghissue:`1855`: %%script and %%file magics |
|
640 | 640 | * :ghissue:`1863`: Ability to silence a cell in the notebook |
|
641 | 641 | * :ghissue:`1870`: add %%capture for capturing stdout/err |
|
642 | 642 | * :ghissue:`1861`: Use dvipng to format sympy.Matrix |
|
643 | 643 | * :ghissue:`1867`: Fix 1px margin bouncing of selected menu item. |
|
644 | 644 | * :ghissue:`1889`: Reconnect when the websocket connection closes unexpectedly |
|
645 | 645 | * :ghissue:`1577`: If a notebook loses its network connection WebSockets won't reconnect |
|
646 | 646 | * :ghissue:`1886`: Fix a bug in renaming notebook |
|
647 | 647 | * :ghissue:`1895`: Fix error in test suite with ip.system() |
|
648 | 648 | * :ghissue:`1762`: add `locate` entry points |
|
649 | 649 | * :ghissue:`1883`: Fix vertical offset due to bold/italics, and bad browser fonts. |
|
650 | 650 | * :ghissue:`1875`: re-write columnize, with intermediate step. |
|
651 | 651 | * :ghissue:`1860`: IPython.utils.columnize sometime wrong... |
|
652 | 652 | * :ghissue:`1851`: new completer for qtconsole. |
|
653 | 653 | * :ghissue:`1892`: Remove suspicious quotes in interactiveshell.py |
|
654 | 654 | * :ghissue:`1854`: Class `%hierarchy` and graphiz `%%dot` magics |
|
655 | 655 | * :ghissue:`1827`: Sending tracebacks over ZMQ should protect against unicode failure |
|
656 | 656 | * :ghissue:`1864`: Rmagic exceptions |
|
657 | 657 | * :ghissue:`1829`: [notebook] don't care about leading prct in completion |
|
658 | 658 | * :ghissue:`1832`: Make svg, jpeg and png images resizable in notebook. |
|
659 | 659 | * :ghissue:`1674`: HTML Notebook carriage-return handling, take 2 |
|
660 | 660 | * :ghissue:`1874`: cython_magic uses importlib, which doesn't ship with py2.6 |
|
661 | 661 | * :ghissue:`1882`: Remove importlib dependency which not available in Python 2.6. |
|
662 | 662 | * :ghissue:`1878`: shell access using ! will not fill class or function scope vars |
|
663 | 663 | * :ghissue:`1879`: Correct stack depth for variable expansion in !system commands |
|
664 | 664 | * :ghissue:`1840`: New JS completer should merge completions before display |
|
665 | 665 | * :ghissue:`1841`: [notebook] deduplicate completion results |
|
666 | 666 | * :ghissue:`1736`: no good error message on missing tkinter and %paste |
|
667 | 667 | * :ghissue:`1741`: Display message from TryNext error in magic_paste |
|
668 | 668 | * :ghissue:`1850`: Remove args/kwargs handling in TryNext, fix %paste error messages. |
|
669 | 669 | * :ghissue:`1663`: Keep line-endings in ipynb |
|
670 | 670 | * :ghissue:`1872`: Matplotlib window freezes using intreractive plot in qtconsole |
|
671 | 671 | * :ghissue:`1869`: Improve CodeMagics._find_edit_target |
|
672 | 672 | * :ghissue:`1781`: Colons in notebook name causes notebook deletion without warning |
|
673 | 673 | * :ghissue:`1815`: Make : invalid in filenames in the Notebook JS code. |
|
674 | 674 | * :ghissue:`1819`: doc: cleanup the parallel psums example a little |
|
675 | 675 | * :ghissue:`1838`: externals cleanup |
|
676 | 676 | * :ghissue:`1839`: External cleanup |
|
677 | 677 | * :ghissue:`1782`: fix Magic menu in qtconsole, split in groups |
|
678 | 678 | * :ghissue:`1862`: Minor bind_kernel improvements |
|
679 | 679 | * :ghissue:`1859`: kernmagic during console startup |
|
680 | 680 | * :ghissue:`1857`: Prevent jumping of window to input when output is clicked. |
|
681 | 681 | * :ghissue:`1856`: Fix 1px jumping of cells and menus in Notebook. |
|
682 | 682 | * :ghissue:`1848`: task fails with "AssertionError: not enough buffers!" after second resubmit |
|
683 | 683 | * :ghissue:`1852`: fix chained resubmissions |
|
684 | 684 | * :ghissue:`1780`: Rmagic extension |
|
685 | 685 | * :ghissue:`1853`: Fix jumpy notebook behavior |
|
686 | 686 | * :ghissue:`1842`: task with UnmetDependency error still owned by engine |
|
687 | 687 | * :ghissue:`1847`: add InlineBackend to ConsoleApp class list |
|
688 | 688 | * :ghissue:`1846`: Exceptions within multiprocessing crash Ipython notebook kernel |
|
689 | 689 | * :ghissue:`1843`: Notebook does not exist and permalinks |
|
690 | 690 | * :ghissue:`1837`: edit magic broken in head |
|
691 | 691 | * :ghissue:`1834`: resubmitted tasks doesn't have same session name |
|
692 | 692 | * :ghissue:`1836`: preserve header for resubmitted tasks |
|
693 | 693 | * :ghissue:`1776`: fix magic menu in qtconsole |
|
694 | 694 | * :ghissue:`1828`: change default extension to .ipy for %save -r |
|
695 | 695 | * :ghissue:`1800`: Reintroduce recall |
|
696 | 696 | * :ghissue:`1671`: __future__ environments |
|
697 | 697 | * :ghissue:`1830`: lsmagic lists magics in alphabetical order |
|
698 | 698 | * :ghissue:`1835`: Use Python import in ipython profile config |
|
699 | 699 | * :ghissue:`1773`: Update SymPy profile: SymPy's latex() can now print set and frozenset |
|
700 | 700 | * :ghissue:`1761`: Edited documentation to use IPYTHONDIR in place of ~/.ipython |
|
701 | 701 | * :ghissue:`1772`: notebook autocomplete fail when typing number |
|
702 | 702 | * :ghissue:`1822`: aesthetics pass on AsyncResult.display_outputs |
|
703 | 703 | * :ghissue:`1460`: Redirect http to https for notebook |
|
704 | 704 | * :ghissue:`1287`: Refactor the notebook tab completion/tooltip |
|
705 | 705 | * :ghissue:`1596`: In rename dialog, <return> should submit |
|
706 | 706 | * :ghissue:`1821`: ENTER submits the rename notebook dialog. |
|
707 | 707 | * :ghissue:`1750`: Let the user disable random port selection |
|
708 | 708 | * :ghissue:`1820`: NotebookApp: Make the number of ports to retry user configurable. |
|
709 | 709 | * :ghissue:`1816`: Always use filename as the notebook name. |
|
710 | 710 | * :ghissue:`1775`: assert_in not present on Python 2.6 |
|
711 | 711 | * :ghissue:`1813`: Add assert_in method to nose for Python 2.6 |
|
712 | 712 | * :ghissue:`1498`: Add tooltip keyboard shortcuts |
|
713 | 713 | * :ghissue:`1711`: New Tooltip, New Completer and JS Refactor |
|
714 | 714 | * :ghissue:`1798`: a few simple fixes for docs/parallel |
|
715 | 715 | * :ghissue:`1818`: possible bug with latex / markdown |
|
716 | 716 | * :ghissue:`1647`: Aborted parallel tasks can't be resubmitted |
|
717 | 717 | * :ghissue:`1817`: Change behavior of ipython notebook --port=... |
|
718 | 718 | * :ghissue:`1738`: IPython.embed_kernel issues |
|
719 | 719 | * :ghissue:`1610`: Basic bold and italic in HTML output cells |
|
720 | 720 | * :ghissue:`1576`: Start and stop kernels from the notebook dashboard |
|
721 | 721 | * :ghissue:`1515`: impossible to shutdown notebook kernels |
|
722 | 722 | * :ghissue:`1812`: Ensure AsyncResult.display_outputs doesn't display empty streams |
|
723 | 723 | * :ghissue:`1811`: warn on nonexistent exclusions in iptest |
|
724 | 724 | * :ghissue:`1809`: test suite error in IPython.zmq on windows |
|
725 | 725 | * :ghissue:`1810`: fix for #1809, failing tests in IPython.zmq |
|
726 | 726 | * :ghissue:`1808`: Reposition alternate upload for firefox [need cross browser/OS/language test] |
|
727 | 727 | * :ghissue:`1742`: Check for custom_exceptions only once |
|
728 | 728 | * :ghissue:`1802`: cythonmagic tests should be skipped if Cython not available |
|
729 | 729 | * :ghissue:`1062`: warning message in IPython.extensions test |
|
730 | 730 | * :ghissue:`1807`: add missing cython exclusion in iptest |
|
731 | 731 | * :ghissue:`1805`: Fixed a vcvarsall.bat error on win32/Py2.7 when trying to compile with m... |
|
732 | 732 | * :ghissue:`1803`: MPI parallel %px bug |
|
733 | 733 | * :ghissue:`1804`: Fixed a vcvarsall.bat error on win32/Py2.7 when trying to compile with mingw. |
|
734 | 734 | * :ghissue:`1492`: Drag target very small if IPython Dashboard has no notebooks |
|
735 | 735 | * :ghissue:`1562`: Offer a method other than drag-n-drop to upload notebooks |
|
736 | 736 | * :ghissue:`1739`: Dashboard improvement (necessary merge of #1658 and #1676 + fix #1492) |
|
737 | 737 | * :ghissue:`1770`: Cython related magic functions |
|
738 | 738 | * :ghissue:`1532`: qtconsole does not accept --gui switch |
|
739 | 739 | * :ghissue:`1707`: Accept --gui=<...> switch in IPython qtconsole. |
|
740 | 740 | * :ghissue:`1797`: Fix comment which breaks Emacs syntax highlighting. |
|
741 | 741 | * :ghissue:`1796`: %gui magic broken |
|
742 | 742 | * :ghissue:`1795`: fix %gui magic |
|
743 | 743 | * :ghissue:`1788`: extreme truncating of return values |
|
744 | 744 | * :ghissue:`1793`: Raise repr limit for strings to 80 characters (from 30). |
|
745 | 745 | * :ghissue:`1794`: don't use XDG path on OS X |
|
746 | 746 | * :ghissue:`1777`: ipython crash on wrong encoding |
|
747 | 747 | * :ghissue:`1792`: Unicode-aware logger |
|
748 | 748 | * :ghissue:`1791`: update zmqshell magics |
|
749 | 749 | * :ghissue:`1787`: DOC: Remove regression from qt-console docs. |
|
750 | 750 | * :ghissue:`1785`: IPython.utils.tests.test_process.SubProcessTestCase |
|
751 | 751 | * :ghissue:`1758`: test_pr, fallback on http if git protocol fail, and SSL errors... |
|
752 | 752 | * :ghissue:`1786`: Make notebook save failures more salient |
|
753 | 753 | * :ghissue:`1748`: Fix some tests for Python 3.3 |
|
754 | 754 | * :ghissue:`1755`: test for pygments before running qt tests |
|
755 | 755 | * :ghissue:`1771`: Make default value of interactivity passed to run_ast_nodes configurable |
|
756 | 756 | * :ghissue:`1783`: part of PR #1606 (loadpy -> load) erased by magic refactoring. |
|
757 | 757 | * :ghissue:`1784`: restore loadpy to load |
|
758 | 758 | * :ghissue:`1768`: Update parallel magics |
|
759 | 759 | * :ghissue:`1778`: string exception in IPython/core/magic.py:232 |
|
760 | 760 | * :ghissue:`1779`: Tidy up error raising in magic decorators. |
|
761 | 761 | * :ghissue:`1769`: Allow cell mode timeit without setup code. |
|
762 | 762 | * :ghissue:`1716`: Fix for fake filenames in verbose traceback |
|
763 | 763 | * :ghissue:`1763`: [qtconsole] fix append_plain_html -> append_html |
|
764 | 764 | * :ghissue:`1766`: Test failure in IPython.parallel |
|
765 | 765 | * :ghissue:`1611`: IPEP1: Cell magics and general cleanup of the Magic system |
|
766 | 766 | * :ghissue:`1732`: Refactoring of the magics system and implementation of cell magics |
|
767 | 767 | * :ghissue:`1765`: test_pr should clearn PYTHONPATH for the subprocesses |
|
768 | 768 | * :ghissue:`1630`: Merge divergent Kernel implementations |
|
769 | 769 | * :ghissue:`1705`: [notebook] Make pager resizable, and remember size... |
|
770 | 770 | * :ghissue:`1606`: Share code for %pycat and %loadpy, make %pycat aware of URLs |
|
771 | 771 | * :ghissue:`1720`: Adding interactive inline plotting to notebooks with flot |
|
772 | 772 | * :ghissue:`1701`: [notebook] Open HTML links in a new window by default |
|
773 | 773 | * :ghissue:`1757`: Open IPython notebook hyperlinks in a new window using target=_blank |
|
774 | 774 | * :ghissue:`1735`: Open IPython notebook hyperlinks in a new window using target=_blank |
|
775 | 775 | * :ghissue:`1754`: Fix typo enconters->encounters |
|
776 | 776 | * :ghissue:`1753`: Clear window title when kernel is restarted |
|
777 | 777 | * :ghissue:`735`: Images missing from XML/SVG export (for me) |
|
778 | 778 | * :ghissue:`1449`: Fix for bug #735 : Images missing from XML/SVG export |
|
779 | 779 | * :ghissue:`1752`: Reconnect Websocket when it closes unexpectedly |
|
780 | 780 | * :ghissue:`1751`: Reconnect Websocket when it closes unexpectedly |
|
781 | 781 | * :ghissue:`1749`: Load MathJax.js using HTTPS when IPython notebook server is HTTPS |
|
782 | 782 | * :ghissue:`1743`: Tooltip completer js refactor |
|
783 | 783 | * :ghissue:`1700`: A module for sending custom user messages from the kernel. |
|
784 | 784 | * :ghissue:`1745`: htmlnotebook: Cursor is off |
|
785 | 785 | * :ghissue:`1728`: ipython crash with matplotlib during picking |
|
786 | 786 | * :ghissue:`1681`: add qt config option to clear_on_kernel_restart |
|
787 | 787 | * :ghissue:`1733`: Tooltip completer js refactor |
|
788 | 788 | * :ghissue:`1676`: Kernel status/shutdown from dashboard |
|
789 | 789 | * :ghissue:`1658`: Alternate notebook upload methods |
|
790 | 790 | * :ghissue:`1727`: terminate kernel after embed_kernel tests |
|
791 | 791 | * :ghissue:`1737`: add HistoryManager to ipapp class list |
|
792 | 792 | * :ghissue:`945`: Open a notebook from the command line |
|
793 | 793 | * :ghissue:`1686`: ENH: Open a notebook from the command line |
|
794 | 794 | * :ghissue:`1709`: fixes #1708, failing test in arg_split on windows |
|
795 | 795 | * :ghissue:`1718`: Use CRegExp trait for regular expressions. |
|
796 | 796 | * :ghissue:`1729`: Catch failure in repr() for %whos |
|
797 | 797 | * :ghissue:`1726`: use eval for command-line args instead of exec |
|
798 | 798 | * :ghissue:`1723`: scatter/gather fail with targets='all' |
|
799 | 799 | * :ghissue:`1724`: fix scatter/gather with targets='all' |
|
800 | 800 | * :ghissue:`1725`: add --no-ff to git pull in test_pr |
|
801 | 801 | * :ghissue:`1722`: unicode exception when evaluating expression with non-ascii characters |
|
802 | 802 | * :ghissue:`1721`: Tooltip completer js refactor |
|
803 | 803 | * :ghissue:`1657`: Add `wait` optional argument to `hooks.editor` |
|
804 | 804 | * :ghissue:`123`: Define sys.ps{1,2} |
|
805 | 805 | * :ghissue:`1717`: Define generic sys.ps{1,2,3}, for use by scripts. |
|
806 | 806 | * :ghissue:`1442`: cache-size issue in qtconsole |
|
807 | 807 | * :ghissue:`1691`: Finish PR #1446 |
|
808 | 808 | * :ghissue:`1446`: Fixing Issue #1442 |
|
809 | 809 | * :ghissue:`1710`: update MathJax CDN url for https |
|
810 | 810 | * :ghissue:`81`: Autocall fails if first function argument begins with "-" or "+ |
|
811 | 811 | * :ghissue:`1713`: Make autocall regexp's configurable. |
|
812 | 812 | * :ghissue:`211`: paste command not working |
|
813 | 813 | * :ghissue:`1703`: Allow TryNext to have an error message without it affecting the command chain |
|
814 | 814 | * :ghissue:`1714`: minor adjustments to test_pr |
|
815 | 815 | * :ghissue:`1509`: New tooltip for notebook |
|
816 | 816 | * :ghissue:`1697`: Major refactoring of the Notebook, Kernel and CodeCell JavaScript. |
|
817 | 817 | * :ghissue:`788`: Progress indicator in the notebook (and perhaps the Qt console) |
|
818 | 818 | * :ghissue:`1034`: Single process Qt console |
|
819 | 819 | * :ghissue:`1557`: magic function conflict while using --pylab |
|
820 | 820 | * :ghissue:`1476`: Pylab figure objects not properly updating |
|
821 | 821 | * :ghissue:`1704`: ensure all needed qt parts can be imported before settling for one |
|
822 | 822 | * :ghissue:`1708`: test failure in arg_split on windows |
|
823 | 823 | * :ghissue:`1706`: Mark test_push_numpy_nocopy as a known failure for Python 3 |
|
824 | 824 | * :ghissue:`1696`: notebook tooltip fail on function with number |
|
825 | 825 | * :ghissue:`1698`: fix tooltip on token with number |
|
826 | 826 | * :ghissue:`1226`: Windows GUI only (pythonw) bug for IPython on Python 3.x |
|
827 | 827 | * :ghissue:`1245`: pythonw py3k fixes for issue #1226 |
|
828 | 828 | * :ghissue:`1417`: Notebook Completer Class |
|
829 | 829 | * :ghissue:`1690`: [Bogus] Deliberately make a test fail |
|
830 | 830 | * :ghissue:`1685`: Add script to test pull request |
|
831 | 831 | * :ghissue:`1167`: Settle on a choice for $IPYTHONDIR |
|
832 | 832 | * :ghissue:`1693`: deprecate IPYTHON_DIR in favor of IPYTHONDIR |
|
833 | 833 | * :ghissue:`1672`: ipython-qtconsole.desktop is using a deprecated format |
|
834 | 834 | * :ghissue:`1695`: Avoid deprecated warnings from ipython-qtconsole.desktop. |
|
835 | 835 | * :ghissue:`1694`: Add quote to notebook to allow it to load |
|
836 | 836 | * :ghissue:`1240`: sys.path missing `''` as first entry when kernel launched without interface |
|
837 | 837 | * :ghissue:`1689`: Fix sys.path missing '' as first entry in `ipython kernel`. |
|
838 | 838 | * :ghissue:`1683`: Parallel controller failing with Pymongo 2.2 |
|
839 | 839 | * :ghissue:`1687`: import Binary from bson instead of pymongo |
|
840 | 840 | * :ghissue:`1614`: Display Image in Qtconsole |
|
841 | 841 | * :ghissue:`1616`: Make IPython.core.display.Image less notebook-centric |
|
842 | 842 | * :ghissue:`1684`: CLN: Remove redundant function definition. |
|
843 | 843 | * :ghissue:`1655`: Add %open magic command to open editor in non-blocking manner |
|
844 | 844 | * :ghissue:`1677`: middle-click paste broken in notebook |
|
845 | 845 | * :ghissue:`1670`: Point %pastebin to gist |
|
846 | 846 | * :ghissue:`1667`: Test failure in test_message_spec |
|
847 | 847 | * :ghissue:`1668`: Test failure in IPython.zmq.tests.test_message_spec.test_complete "'pyout' != 'status'" |
|
848 | 848 | * :ghissue:`1669`: handle pyout messages in test_message_spec |
|
849 | 849 | * :ghissue:`1295`: add binary-tree engine interconnect example |
|
850 | 850 | * :ghissue:`1642`: Cherry-picked commits from 0.12.1 release |
|
851 | 851 | * :ghissue:`1659`: Handle carriage return characters ("\r") in HTML notebook output. |
|
852 | 852 | * :ghissue:`1313`: Figure out MathJax 2 support |
|
853 | 853 | * :ghissue:`1653`: Test failure in IPython.zmq |
|
854 | 854 | * :ghissue:`1656`: ensure kernels are cleaned up in embed_kernel tests |
|
855 | 855 | * :ghissue:`1666`: pip install ipython==dev installs version 0.8 from an old svn repo |
|
856 | 856 | * :ghissue:`1664`: InteractiveShell.run_code: Update docstring. |
|
857 | 857 | * :ghissue:`1512`: `print stuff,` should avoid newline |
|
858 | 858 | * :ghissue:`1662`: Delay flushing softspace until after cell finishes |
|
859 | 859 | * :ghissue:`1643`: handle jpg/jpeg in the qtconsole |
|
860 | 860 | * :ghissue:`966`: dreload fails on Windows XP with iPython 0.11 "Unexpected Error" |
|
861 | 861 | * :ghissue:`1500`: dreload doesn't seem to exclude numpy |
|
862 | 862 | * :ghissue:`1520`: kernel crash when showing tooltip (?) |
|
863 | 863 | * :ghissue:`1652`: add patch_pyzmq() for backporting a few changes from newer pyzmq |
|
864 | 864 | * :ghissue:`1650`: DOC: moving files with SSH launchers |
|
865 | 865 | * :ghissue:`1357`: add IPython.embed_kernel() |
|
866 | 866 | * :ghissue:`1640`: Finish up embed_kernel |
|
867 | 867 | * :ghissue:`1651`: Remove bundled Itpl module |
|
868 | 868 | * :ghissue:`1634`: incremental improvements to SSH launchers |
|
869 | 869 | * :ghissue:`1649`: move examples/test_embed into examples/tests/embed |
|
870 | 870 | * :ghissue:`1171`: Recognise virtualenvs |
|
871 | 871 | * :ghissue:`1479`: test_extension failing in Windows |
|
872 | 872 | * :ghissue:`1633`: Fix installing extension from local file on Windows |
|
873 | 873 | * :ghissue:`1644`: Update copyright date to 2012 |
|
874 | 874 | * :ghissue:`1636`: Test_deepreload breaks pylab irunner tests |
|
875 | 875 | * :ghissue:`1645`: Exclude UserDict when deep reloading NumPy. |
|
876 | 876 | * :ghissue:`1454`: make it possible to start engine in 'disabled' mode and 'enable' later |
|
877 | 877 | * :ghissue:`1641`: Escape code for the current time in PromptManager |
|
878 | 878 | * :ghissue:`1638`: ipython console clobbers custom sys.path |
|
879 | 879 | * :ghissue:`1637`: Removed a ':' which shouldn't have been there |
|
880 | 880 | * :ghissue:`1536`: ipython 0.12 embed shell won't run startup scripts |
|
881 | 881 | * :ghissue:`1628`: error: QApplication already exists in TestKillRing |
|
882 | 882 | * :ghissue:`1631`: TST: QApplication doesn't quit early enough with PySide. |
|
883 | 883 | * :ghissue:`1629`: evaluate a few dangling validate_message generators |
|
884 | 884 | * :ghissue:`1621`: clear In[] prompt numbers on "Clear All Output" |
|
885 | 885 | * :ghissue:`1627`: Test the Message Spec |
|
886 | 886 | * :ghissue:`1470`: SyntaxError on setup.py install with Python 3 |
|
887 | 887 | * :ghissue:`1624`: Fixes for byte-compilation on Python 3 |
|
888 | 888 | * :ghissue:`1612`: pylab=inline fig.show() non-existent in notebook |
|
889 | 889 | * :ghissue:`1615`: Add show() method to figure objects. |
|
890 | 890 | * :ghissue:`1622`: deepreload fails on Python 3 |
|
891 | 891 | * :ghissue:`1625`: Fix deepreload on Python 3 |
|
892 | 892 | * :ghissue:`1626`: Failure in new `dreload` tests under Python 3.2 |
|
893 | 893 | * :ghissue:`1623`: iPython / matplotlib Memory error with imshow |
|
894 | 894 | * :ghissue:`1619`: pyin messages should have execution_count |
|
895 | 895 | * :ghissue:`1620`: pyin message now have execution_count |
|
896 | 896 | * :ghissue:`32`: dreload produces spurious traceback when numpy is involved |
|
897 | 897 | * :ghissue:`1457`: Update deepreload to use a rewritten knee.py. Fixes dreload(numpy). |
|
898 | 898 | * :ghissue:`1613`: allow map / parallel function for single-engine views |
|
899 | 899 | * :ghissue:`1609`: exit notebook cleanly on SIGINT, SIGTERM |
|
900 | 900 | * :ghissue:`1531`: Function keyword completion fails if cursor is in the middle of the complete parentheses |
|
901 | 901 | * :ghissue:`1607`: cleanup sqlitedb temporary db file after tests |
|
902 | 902 | * :ghissue:`1608`: don't rely on timedelta.total_seconds in AsyncResult |
|
903 | 903 | * :ghissue:`1421`: ipython32 %run -d breaks with NameError name 'execfile' is not defined |
|
904 | 904 | * :ghissue:`1599`: Fix for %run -d on Python 3 |
|
905 | 905 | * :ghissue:`1201`: %env magic fails with Python 3.2 |
|
906 | 906 | * :ghissue:`1602`: Fix %env magic on Python 3. |
|
907 | 907 | * :ghissue:`1603`: Remove python3 profile |
|
908 | 908 | * :ghissue:`1604`: Exclude IPython.quarantine from installation |
|
909 | 909 | * :ghissue:`1601`: Security file is not removed after shutdown by Ctrl+C or kill -INT |
|
910 | 910 | * :ghissue:`1600`: Specify encoding for io.open in notebook_reformat tests |
|
911 | 911 | * :ghissue:`1605`: Small fixes for Animation and Progress notebook |
|
912 | 912 | * :ghissue:`1452`: Bug fix for approval |
|
913 | 913 | * :ghissue:`13`: Improve robustness and debuggability of test suite |
|
914 | 914 | * :ghissue:`70`: IPython should prioritize __all__ during tab completion |
|
915 | 915 | * :ghissue:`1529`: __all__ feature, improvement to dir2, and tests for both |
|
916 | 916 | * :ghissue:`1475`: Custom namespace for %run |
|
917 | 917 | * :ghissue:`1564`: calling .abort on AsyncMapResult results in traceback |
|
918 | 918 | * :ghissue:`1548`: add sugar methods/properties to AsyncResult |
|
919 | 919 | * :ghissue:`1535`: Fix pretty printing dispatch |
|
920 | 920 | * :ghissue:`1522`: Discussion: some potential Qt console refactoring |
|
921 | 921 | * :ghissue:`1399`: Use LaTeX to print various built-in types with the SymPy printing extension |
|
922 | 922 | * :ghissue:`1597`: re-enter kernel.eventloop after catching SIGINT |
|
923 | 923 | * :ghissue:`1490`: rename plaintext cell -> raw cell |
|
924 | 924 | * :ghissue:`1487`: %notebook fails in qtconsole |
|
925 | 925 | * :ghissue:`1545`: trailing newline not preserved in splitline ipynb |
|
926 | 926 | * :ghissue:`1480`: Fix %notebook magic, etc. nbformat unicode tests and fixes |
|
927 | 927 | * :ghissue:`1588`: Gtk3 integration with ipython works. |
|
928 | 928 | * :ghissue:`1595`: Examples syntax (avoid errors installing on Python 3) |
|
929 | 929 | * :ghissue:`1526`: Find encoding for Python files |
|
930 | 930 | * :ghissue:`1594`: Fix writing git commit ID to a file on build with Python 3 |
|
931 | 931 | * :ghissue:`1556`: shallow-copy DictDB query results |
|
932 | 932 | * :ghissue:`1499`: various pyflakes issues |
|
933 | 933 | * :ghissue:`1502`: small changes in response to pyflakes pass |
|
934 | 934 | * :ghissue:`1445`: Don't build sphinx docs for sdists |
|
935 | 935 | * :ghissue:`1484`: unhide .git_commit_info.ini |
|
936 | 936 | * :ghissue:`1538`: store git commit hash in utils._sysinfo instead of hidden data file |
|
937 | 937 | * :ghissue:`1546`: attempt to suppress exceptions in channel threads at shutdown |
|
938 | 938 | * :ghissue:`1524`: unhide git_commit_info.ini |
|
939 | 939 | * :ghissue:`1559`: update tools/github_stats.py to use GitHub API v3 |
|
940 | 940 | * :ghissue:`1563`: clear_output improvements |
|
941 | 941 | * :ghissue:`1558`: Ipython testing documentation still mentions twisted and trial |
|
942 | 942 | * :ghissue:`1560`: remove obsolete discussion of Twisted/trial from testing docs |
|
943 | 943 | * :ghissue:`1561`: Qtconsole - nonstandard \a and \b |
|
944 | 944 | * :ghissue:`1569`: BUG: qtconsole -- non-standard handling of \a and \b. [Fixes #1561] |
|
945 | 945 | * :ghissue:`1574`: BUG: Ctrl+C crashes wx pylab kernel in qtconsole |
|
946 | 946 | * :ghissue:`1573`: BUG: Ctrl+C crashes wx pylab kernel in qtconsole. |
|
947 | 947 | * :ghissue:`1590`: 'iPython3 qtconsole' doesn't work in Windows 7 |
|
948 | 948 | * :ghissue:`602`: User test the html notebook |
|
949 | 949 | * :ghissue:`613`: Implement Namespace panel section |
|
950 | 950 | * :ghissue:`879`: How to handle Javascript output in the notebook |
|
951 | 951 | * :ghissue:`1255`: figure.show() raises an error with the inline backend |
|
952 | 952 | * :ghissue:`1467`: Document or bundle a git-integrated facility for stripping VCS-unfriendly binary data |
|
953 | 953 | * :ghissue:`1237`: Kernel status and logout button overlap |
|
954 | 954 | * :ghissue:`1319`: Running a cell with ctrl+Enter selects text in cell |
|
955 | 955 | * :ghissue:`1571`: module member autocomplete should respect __all__ |
|
956 | 956 | * :ghissue:`1566`: ipython3 doesn't run in Win7 with Python 3.2 |
|
957 | 957 | * :ghissue:`1568`: fix PR #1567 |
|
958 | 958 | * :ghissue:`1567`: Fix: openssh_tunnel did not parse port in `server` |
|
959 | 959 | * :ghissue:`1565`: fix AsyncResult.abort |
|
960 | 960 | * :ghissue:`1550`: Crash when starting notebook in a non-ascii path |
|
961 | 961 | * :ghissue:`1552`: use os.getcwdu in NotebookManager |
|
962 | 962 | * :ghissue:`1554`: wrong behavior of the all function on iterators |
|
963 | 963 | * :ghissue:`1541`: display_pub flushes stdout/err |
|
964 | 964 | * :ghissue:`1539`: Asynchrous issue when using clear_display and print x,y,z |
|
965 | 965 | * :ghissue:`1544`: make MultiKernelManager.kernel_manager_class configurable |
|
966 | 966 | * :ghissue:`1494`: Untrusted Secure Websocket broken on latest chrome dev |
|
967 | 967 | * :ghissue:`1521`: only install ipython-qtconsole gui script on Windows |
|
968 | 968 | * :ghissue:`1528`: Tab completion optionally respects __all__ (+ dir2() cleanup) |
|
969 | 969 | * :ghissue:`1527`: Making a progress bar work in IPython Notebook |
|
970 | 970 | * :ghissue:`1497`: __all__ functionality added to dir2(obj) |
|
971 | 971 | * :ghissue:`1518`: Pretty printing exceptions is broken |
|
972 | 972 | * :ghissue:`811`: Fixes for ipython unhandeled OSError exception on failure of os.getcwdu() |
|
973 | 973 | * :ghissue:`1517`: Fix indentation bug in IPython/lib/pretty.py |
|
974 | 974 | * :ghissue:`1519`: BUG: Include the name of the exception type in its pretty format. |
|
975 | 975 | * :ghissue:`1525`: A hack for auto-complete numpy recarray |
|
976 | 976 | * :ghissue:`1489`: Fix zero-copy push |
|
977 | 977 | * :ghissue:`1401`: numpy arrays cannot be used with View.apply() in Python 3 |
|
978 | 978 | * :ghissue:`1477`: fix dangling `buffer` in IPython.parallel.util |
|
979 | 979 | * :ghissue:`1514`: DOC: Fix references to IPython.lib.pretty instead of the old location |
|
980 | 980 | * :ghissue:`1511`: Version comparison error ( '2.1.11' < '2.1.4' ==> True) |
|
981 | 981 | * :ghissue:`1506`: "Fixing" the Notebook scroll to help in visually comparing outputs |
|
982 | 982 | * :ghissue:`1481`: BUG: Improve placement of CallTipWidget |
|
983 | 983 | * :ghissue:`1241`: When our debugger class is used standalone `_oh` key errors are thrown |
|
984 | 984 | * :ghissue:`676`: IPython.embed() from ipython crashes twice on exit |
|
985 | 985 | * :ghissue:`1496`: BUG: LBYL when clearing the output history on shutdown. |
|
986 | 986 | * :ghissue:`1507`: python3 notebook: TypeError: unorderable types |
|
987 | 987 | * :ghissue:`1508`: fix sorting profiles in clustermanager |
|
988 | 988 | * :ghissue:`1495`: BUG: Fix pretty-printing for overzealous objects |
|
989 | 989 | * :ghissue:`1505`: SQLite objects created in a thread can only be used in that same thread |
|
990 | 990 | * :ghissue:`1482`: %history documentation out of date? |
|
991 | 991 | * :ghissue:`1501`: dreload doesn't seem to exclude numpy |
|
992 | 992 | * :ghissue:`1472`: more general fix for #662 |
|
993 | 993 | * :ghissue:`1486`: save state of qtconsole |
|
994 | 994 | * :ghissue:`1485`: add history search to qtconsole |
|
995 | 995 | * :ghissue:`1483`: updated magic_history docstring |
|
996 | 996 | * :ghissue:`1383`: First version of cluster web service. |
|
997 | 997 | * :ghissue:`482`: test_run.test_tclass fails on Windows |
|
998 | 998 | * :ghissue:`1398`: fix %tb after SyntaxError |
|
999 | 999 | * :ghissue:`1478`: key function or lambda in sorted function doesn't find global variables |
|
1000 | 1000 | * :ghissue:`1415`: handle exit/quit/exit()/quit() variants in zmqconsole |
|
1001 | 1001 | * :ghissue:`1440`: Fix for failing testsuite when using --with-xml-coverage on windows. |
|
1002 | 1002 | * :ghissue:`1419`: Add %install_ext magic function. |
|
1003 | 1003 | * :ghissue:`1424`: Win32 shell interactivity |
|
1004 | 1004 | * :ghissue:`1434`: Controller should schedule tasks of multiple clients at the same time |
|
1005 | 1005 | * :ghissue:`1268`: notebook %reset magic fails with StdinNotImplementedError |
|
1006 | 1006 | * :ghissue:`1438`: from cherrypy import expose fails when running script form parent directory |
|
1007 | 1007 | * :ghissue:`1468`: Simplify structure of a Job in the TaskScheduler |
|
1008 | 1008 | * :ghissue:`875`: never build unicode error messages |
|
1009 | 1009 | * :ghissue:`1107`: Tab autocompletion can suggest invalid syntax |
|
1010 | 1010 | * :ghissue:`1447`: 1107 - Tab autocompletion can suggest invalid syntax |
|
1011 | 1011 | * :ghissue:`1469`: Fix typo in comment (insert space) |
|
1012 | 1012 | * :ghissue:`1463`: Fix completion when importing modules in the cwd. |
|
1013 | 1013 | * :ghissue:`1437`: unfriendly error handling with pythonw and ipython-qtconsole |
|
1014 | 1014 | * :ghissue:`1466`: Fix for issue #1437, unfriendly windows qtconsole error handling |
|
1015 | 1015 | * :ghissue:`1432`: Fix ipython directive |
|
1016 | 1016 | * :ghissue:`1465`: allow `ipython help subcommand` syntax |
|
1017 | 1017 | * :ghissue:`1394`: Wishlist: Remove hard dependency on ctypes |
|
1018 | 1018 | * :ghissue:`1416`: Conditional import of ctypes in inputhook |
|
1019 | 1019 | * :ghissue:`1462`: expedite parallel tests |
|
1020 | 1020 | * :ghissue:`1418`: Strict mode in javascript |
|
1021 | 1021 | * :ghissue:`1410`: Add javascript library and css stylesheet loading to JS class. |
|
1022 | 1022 | * :ghissue:`1427`: #922 again |
|
1023 | 1023 | * :ghissue:`1448`: Fix for #875 Never build unicode error messages |
|
1024 | 1024 | * :ghissue:`1458`: use eval to uncan References |
|
1025 | 1025 | * :ghissue:`1455`: Python3 install fails |
|
1026 | 1026 | * :ghissue:`1450`: load mathjax from CDN via https |
|
1027 | 1027 | * :ghissue:`1182`: Qtconsole, multiwindow |
|
1028 | 1028 | * :ghissue:`1439`: Notebook not storing heading celltype information |
|
1029 | 1029 | * :ghissue:`1451`: include heading level in JSON |
|
1030 | 1030 | * :ghissue:`1444`: Fix pyhton -> python typos |
|
1031 | 1031 | * :ghissue:`1412`: Input parsing issue with %prun |
|
1032 | 1032 | * :ghissue:`1414`: ignore errors in shell.var_expand |
|
1033 | 1033 | * :ghissue:`1441`: (1) Enable IPython.notebook.kernel.execute to publish display_* even it is not called with a code cell and (2) remove empty html element when execute "display_*" |
|
1034 | 1034 | * :ghissue:`1431`: Beginner Error: ipython qtconsole |
|
1035 | 1035 | * :ghissue:`1436`: "ipython-qtconsole --gui qt" hangs on 64-bit win7 |
|
1036 | 1036 | * :ghissue:`1433`: websocket connection fails on Chrome |
|
1037 | 1037 | * :ghissue:`1430`: Fix for tornado check for tornado < 1.1.0 |
|
1038 | 1038 | * :ghissue:`1408`: test_get_home_dir_3 failed on Mac OS X |
|
1039 | 1039 | * :ghissue:`1413`: get_home_dir expands symlinks, adjust test accordingly |
|
1040 | 1040 | * :ghissue:`1420`: fixes #922 |
|
1041 | 1041 | * :ghissue:`823`: KnownFailure tests appearing as errors |
|
1042 | 1042 | * :ghissue:`1385`: updated and prettified magic doc strings |
|
1043 | 1043 | * :ghissue:`1406`: Browser selection |
|
1044 | 1044 | * :ghissue:`1411`: ipcluster starts 8 engines "successfully" but Client only finds two |
|
1045 | 1045 | * :ghissue:`1375`: %history -g -f file encoding issue |
|
1046 | 1046 | * :ghissue:`1377`: Saving non-ascii history |
|
1047 | 1047 | * :ghissue:`797`: Source introspection needs to be smarter in python 3.2 |
|
1048 | 1048 | * :ghissue:`846`: Autoreload extension doesn't work with Python 3.2 |
|
1049 | 1049 | * :ghissue:`1360`: IPython notebook not starting on winXP |
|
1050 | 1050 | * :ghissue:`1407`: Qtconsole segfaults on OSX when displaying some pop-up function tooltips |
|
1051 | 1051 | * :ghissue:`1402`: fix symlinked /home issue for FreeBSD |
|
1052 | 1052 | * :ghissue:`1403`: pyreadline cyclic dependency with pdb++/pdbpp module |
|
1053 | 1053 | * :ghissue:`1405`: Only monkeypatch xunit when the tests are run using it. |
|
1054 | 1054 | * :ghissue:`1404`: Feature Request: List/Dictionary tab completion |
|
1055 | 1055 | * :ghissue:`1395`: Xunit & KnownFailure |
|
1056 | 1056 | * :ghissue:`1396`: Fix for %tb magic. |
|
1057 | 1057 | * :ghissue:`1397`: Stay or leave message not working, Safari session lost. |
|
1058 | 1058 | * :ghissue:`1389`: pylab=inline inoperant through ssh tunnelling? |
|
1059 | 1059 | * :ghissue:`1386`: Jsd3 |
|
1060 | 1060 | * :ghissue:`1388`: Add simple support for running inside a virtualenv |
|
1061 | 1061 | * :ghissue:`826`: Add support for creation of parallel task when no engine is running |
|
1062 | 1062 | * :ghissue:`1391`: Improve Hub/Scheduler when no engines are registered |
|
1063 | 1063 | * :ghissue:`1369`: load header with engine id when engine dies in TaskScheduler |
|
1064 | 1064 | * :ghissue:`1345`: notebook can't save unicode as script |
|
1065 | 1065 | * :ghissue:`1353`: Save notebook as script using unicode file handle. |
|
1066 | 1066 | * :ghissue:`1352`: Add '-m mod : run library module as a script' option. |
|
1067 | 1067 | * :ghissue:`1363`: Fix some minor color/style config issues in the qtconsole |
|
1068 | 1068 | * :ghissue:`1371`: Adds a quiet keyword to sync_imports |
|
1069 | 1069 | * :ghissue:`1390`: Blank screen for notebooks on Safari |
|
1070 | 1070 | * :ghissue:`1387`: Fixing Cell menu to update cell type select box. |
|
1071 | 1071 | * :ghissue:`645`: Standalone WX GUI support is broken |
|
1072 | 1072 | * :ghissue:`1296`: Wx gui example: fixes the broken example for `%gui wx`. |
|
1073 | 1073 | * :ghissue:`1254`: typo in notebooklist.js breaks links |
|
1074 | 1074 | * :ghissue:`781`: Users should be able to clone a notebook |
|
1075 | 1075 | * :ghissue:`1372`: ipcontroller cleans up connection files unless reuse=True |
|
1076 | 1076 | * :ghissue:`1374`: remove calls to meaningless ZMQStream.on_err |
|
1077 | 1077 | * :ghissue:`1382`: Update RO for Notebook |
|
1078 | 1078 | * :ghissue:`1370`: allow draft76 websockets (Safari) |
|
1079 | 1079 | * :ghissue:`1368`: Ensure handler patterns are str, not unicode |
|
1080 | 1080 | * :ghissue:`1379`: Sage link on website homepage broken |
|
1081 | 1081 | * :ghissue:`1376`: FWIW does not work with Chrome 16.0.912.77 Ubuntu 10.10 |
|
1082 | 1082 | * :ghissue:`1358`: Cannot install ipython on Windows 7 64-bit |
|
1083 | 1083 | * :ghissue:`1367`: Ctrl - m t does not toggle output in chrome |
|
1084 | 1084 | * :ghissue:`1359`: [sympyprinting] MathJax can't render \root{m}{n} |
|
1085 | 1085 | * :ghissue:`1337`: Tab in the notebook after `(` should not indent, only give a tooltip |
|
1086 | 1086 | * :ghissue:`1339`: Notebook printing broken |
|
1087 | 1087 | * :ghissue:`1344`: Ctrl + M + L does not toggle line numbering in htmlnotebook |
|
1088 | 1088 | * :ghissue:`1348`: Ctrl + M + M does not switch to markdown cell |
|
1089 | 1089 | * :ghissue:`1361`: Notebook bug fix branch |
|
1090 | 1090 | * :ghissue:`1364`: avoid jsonlib returning Decimal |
|
1091 | 1091 | * :ghissue:`1362`: Don't log complete contents of history replies, even in debug |
|
1092 | 1092 | * :ghissue:`888`: ReST support in notebooks |
|
1093 | 1093 | * :ghissue:`1205`: notebook stores HTML escaped text in the file |
|
1094 | 1094 | * :ghissue:`1351`: add IPython.embed_kernel() |
|
1095 | 1095 | * :ghissue:`1243`: magic commands without % are not completed properly in htmlnotebook |
|
1096 | 1096 | * :ghissue:`1347`: fix weird magic completion in notebook |
|
1097 | 1097 | * :ghissue:`1355`: notebook.html extends layout.html now |
|
1098 | 1098 | * :ghissue:`1354`: min and max in the notebook |
|
1099 | 1099 | * :ghissue:`1346`: fixups for alternate URL prefix stuff |
|
1100 | 1100 | * :ghissue:`1336`: crack at making notebook.html use the layout.html template |
|
1101 | 1101 | * :ghissue:`1331`: RST and heading cells |
|
1102 | 1102 | * :ghissue:`1350`: Add '-m mod : run library module as a script' option |
|
1103 | 1103 | * :ghissue:`1247`: fixes a bug causing extra newlines after comments. |
|
1104 | 1104 | * :ghissue:`1329`: add base_url to notebook configuration options |
|
1105 | 1105 | * :ghissue:`1332`: notebook - allow prefixes in URL path. |
|
1106 | 1106 | * :ghissue:`1317`: Very slow traceback construction from Cython extension |
|
1107 | 1107 | * :ghissue:`1341`: Don't attempt to tokenize binary files for tracebacks |
|
1108 | 1108 | * :ghissue:`1300`: Cell Input collapse |
|
1109 | 1109 | * :ghissue:`1334`: added key handler for control-s to notebook, seems to work pretty well |
|
1110 | 1110 | * :ghissue:`1338`: Fix see also in docstrings so API docs build |
|
1111 | 1111 | * :ghissue:`1335`: Notebook toolbar UI |
|
1112 | 1112 | * :ghissue:`1299`: made notebook.html extend layout.html |
|
1113 | 1113 | * :ghissue:`1318`: make Ctrl-D in qtconsole act same as in terminal (ready to merge) |
|
1114 | 1114 | * :ghissue:`873`: ReST support in notebook frontend |
|
1115 | 1115 | * :ghissue:`1139`: Notebook webkit notification |
|
1116 | 1116 | * :ghissue:`1314`: Insertcell |
|
1117 | 1117 | * :ghissue:`1328`: Coverage |
|
1118 | 1118 | * :ghissue:`1206`: don't preserve fixConsole output in json |
|
1119 | 1119 | * :ghissue:`1330`: Add linewrapping to text cells (new feature in CodeMirror). |
|
1120 | 1120 | * :ghissue:`1309`: Inoculate clearcmd extension into %reset functionality |
|
1121 | 1121 | * :ghissue:`1327`: Updatecm2 |
|
1122 | 1122 | * :ghissue:`1326`: Removing Ace edit capability. |
|
1123 | 1123 | * :ghissue:`1325`: forgotten selected_cell -> get_selected_cell |
|
1124 | 1124 | * :ghissue:`1316`: Pass subprocess test runners a suitable location for xunit output |
|
1125 | 1125 | * :ghissue:`1315`: Collect results from subprocess runners and spit out Xunit XML output. |
|
1126 | 1126 | * :ghissue:`1233`: Update CodeMirror to the latest version |
|
1127 | 1127 | * :ghissue:`1234`: Refactor how the notebook focuses cells |
|
1128 | 1128 | * :ghissue:`1235`: After upgrading CodeMirror check the status of some bugs |
|
1129 | 1129 | * :ghissue:`1236`: Review how select is called when notebook cells are inserted |
|
1130 | 1130 | * :ghissue:`1303`: Updatecm |
|
1131 | 1131 | * :ghissue:`1311`: Fixing CM related indentation problems. |
|
1132 | 1132 | * :ghissue:`1304`: controller/server load can disrupt heartbeat |
|
1133 | 1133 | * :ghissue:`1312`: minor heartbeat tweaks |
|
1134 | 1134 | * :ghissue:`1302`: Input parsing with %prun clobbers escapes |
|
1135 | 1135 | * :ghissue:`1306`: Fix %prun input parsing for escaped characters (closes #1302) |
|
1136 | 1136 | * :ghissue:`1251`: IPython-0.12 can't import map module on Python 3.1 |
|
1137 | 1137 | * :ghissue:`1202`: Pyreadline install exclusion for 64 bit windows no longer required, version dependency not correctly specified. |
|
1138 | 1138 | * :ghissue:`1301`: New "Fix for issue #1202" based on current master. |
|
1139 | 1139 | * :ghissue:`1242`: changed key map name to match changes to python mode |
|
1140 | 1140 | * :ghissue:`1203`: Fix for issue #1202 |
|
1141 | 1141 | * :ghissue:`1289`: Make autoreload extension work on Python 3. |
|
1142 | 1142 | * :ghissue:`1263`: Different 'C-x' for shortcut, 'C-m c' not toCodeCell anymore |
|
1143 | 1143 | * :ghissue:`1259`: Replace "from (.|..) import" with absolute imports. |
|
1144 | 1144 | * :ghissue:`1278`: took a crack at making notebook.html extend layout.html |
|
1145 | 1145 | * :ghissue:`1210`: Add 'quiet' option to suppress screen output during %prun calls, edited dochelp |
|
1146 | 1146 | * :ghissue:`1288`: Don't ask for confirmation when stdin isn't available |
|
1147 | 1147 | * :ghissue:`1290`: Cell-level cut & paste overwrites multiple cells |
|
1148 | 1148 | * :ghissue:`1291`: Minor, but important fixes to cut/copy/paste. |
|
1149 | 1149 | * :ghissue:`1293`: TaskScheduler.hwm default value |
|
1150 | 1150 | * :ghissue:`1294`: TaskScheduler.hwm default to 1 instead of 0 |
|
1151 | 1151 | * :ghissue:`1281`: in Hub: registration_timeout must be an integer, but heartmonitor.period is CFloat |
|
1152 | 1152 | * :ghissue:`1283`: HeartMonitor.period should be an Integer |
|
1153 | 1153 | * :ghissue:`1162`: Allow merge/split adjacent cells in notebook |
|
1154 | 1154 | * :ghissue:`1264`: Aceify |
|
1155 | 1155 | * :ghissue:`1261`: Mergesplit |
|
1156 | 1156 | * :ghissue:`1269`: Another strange input handling error |
|
1157 | 1157 | * :ghissue:`1284`: a fix for GH 1269 |
|
1158 | 1158 | * :ghissue:`1232`: Dead kernel loop |
|
1159 | 1159 | * :ghissue:`1279`: ImportError: cannot import name S1 (from logging) |
|
1160 | 1160 | * :ghissue:`1276`: notebook menu item to send a KeyboardInterrupt to the kernel |
|
1161 | 1161 | * :ghissue:`1213`: BUG: Minor typo in history_console_widget.py |
|
1162 | 1162 | * :ghissue:`1248`: IPython notebook doesn't work with lastest version of tornado |
|
1163 | 1163 | * :ghissue:`1267`: add NoDB for non-recording Hub |
|
1164 | 1164 | * :ghissue:`1222`: allow Reference as callable in map/apply |
|
1165 | 1165 | * :ghissue:`1257`: use self.kernel_manager_class in qtconsoleapp |
|
1166 | 1166 | * :ghissue:`1220`: Open a new notebook while connecting to an existing kernel (opened by qtconsole or terminal or standalone) |
|
1167 | 1167 | * :ghissue:`1253`: set auto_create flag for notebook apps |
|
1168 | 1168 | * :ghissue:`1260`: heartbeat failure on long gil-holding operation |
|
1169 | 1169 | * :ghissue:`1262`: Heartbeat no longer shares the app's Context |
|
1170 | 1170 | * :ghissue:`1225`: SyntaxError display broken in Python 3 |
|
1171 | 1171 | * :ghissue:`1229`: Fix display of SyntaxError in Python 3 |
|
1172 | 1172 | * :ghissue:`1256`: Dewijmoize |
|
1173 | 1173 | * :ghissue:`1246`: Skip tests that require X, when importing pylab results in RuntimeError. |
|
1174 | 1174 | * :ghissue:`1250`: Wijmoize |
|
1175 | 1175 | * :ghissue:`1244`: can not imput chinese word "ι " , exit right now |
|
1176 | 1176 | * :ghissue:`1194`: Adding Opera 11 as a compatible browser for ipython notebook |
|
1177 | 1177 | * :ghissue:`1198`: Kernel Has Died error in Notebook |
|
1178 | 1178 | * :ghissue:`1211`: serve local files in notebook-dir |
|
1179 | 1179 | * :ghissue:`1224`: edit text cells on double-click instead of single-click |
|
1180 | 1180 | * :ghissue:`1187`: misc notebook: connection file cleanup, first heartbeat, startup flush |
|
1181 | 1181 | * :ghissue:`1207`: fix loadpy duplicating newlines |
|
1182 | 1182 | * :ghissue:`1060`: Always save the .py file to disk next to the .ipynb |
|
1183 | 1183 | * :ghissue:`1066`: execute cell in place should preserve the current insertion-point in the notebook |
|
1184 | 1184 | * :ghissue:`1141`: "In" numbers are not invalidated when restarting kernel |
|
1185 | 1185 | * :ghissue:`1231`: pip on OSX tries to install files in /System directory. |
|
1186 | 1186 | * :ghissue:`1129`: Unified setup.py |
|
1187 | 1187 | * :ghissue:`1199`: Reduce IPython.external.* |
|
1188 | 1188 | * :ghissue:`1219`: Make all the static files path absolute. |
|
1189 | 1189 | * :ghissue:`1218`: Added -q option to %prun for suppression of the output, along with editing the dochelp string. |
|
1190 | 1190 | * :ghissue:`1217`: Added -q option to %prun for suppression of the output, along with editing the dochelp string |
|
1191 | 1191 | * :ghissue:`1216`: Pdb tab completion does not work in QtConsole |
|
1192 | 1192 | * :ghissue:`1197`: Interactive shell trying to: from ... import history |
|
1193 | 1193 | * :ghissue:`1175`: core.completer: Clean up excessive and unused code. |
|
1194 | 1194 | * :ghissue:`1208`: should dv.sync_import print failed imports ? |
|
1195 | 1195 | * :ghissue:`1186`: payloadpage.py not used by qtconsole |
|
1196 | 1196 | * :ghissue:`1204`: double newline from %loadpy in python notebook (at least on mac) |
|
1197 | 1197 | * :ghissue:`1192`: Invalid JSON data |
|
1198 | 1198 | * :ghissue:`1196`: docs: looks like a file path might have been accidentally pasted in the middle of a word |
|
1199 | 1199 | * :ghissue:`1189`: Right justify of 'in' prompt in variable prompt size configurations |
|
1200 | 1200 | * :ghissue:`1185`: ipython console not work proper with stdout... |
|
1201 | 1201 | * :ghissue:`1191`: profile/startup files not executed with "notebook" |
|
1202 | 1202 | * :ghissue:`1190`: Fix link to Chris Fonnesbeck blog post about 0.11 highlights. |
|
1203 | 1203 | * :ghissue:`1174`: Remove %install_default_config and %install_profiles |
@@ -1,178 +1,178 b'' | |||
|
1 | 1 | .. _issues_list_4: |
|
2 | 2 | |
|
3 | 3 | Issues closed in the 4.x development cycle |
|
4 | 4 | ========================================== |
|
5 | 5 | |
|
6 | 6 | |
|
7 | 7 | Issues closed in 4.2 |
|
8 | 8 | -------------------- |
|
9 | 9 | |
|
10 | 10 | GitHub stats for 2015/02/02 - 2016/04/20 (since 4.1) |
|
11 | 11 | |
|
12 | 12 | These lists are automatically generated, and may be incomplete or contain duplicates. |
|
13 | 13 | |
|
14 | 14 | We closed 10 issues and merged 22 pull requests. |
|
15 | 15 | The full list can be seen `on GitHub <https://github.com/ipython/ipython/issues?q=milestone%3A4.2+>`__ |
|
16 | 16 | |
|
17 | 17 | The following 10 authors contributed 27 commits. |
|
18 | 18 | |
|
19 | 19 | * Benjamin Ragan-Kelley |
|
20 | 20 | * Carlos Cordoba |
|
21 | 21 | * GΓΆkhan Karabulut |
|
22 | 22 | * Jonas Rauber |
|
23 | 23 | * Matthias Bussonnier |
|
24 | 24 | * Paul Ivanov |
|
25 | 25 | * Sebastian Bank |
|
26 | 26 | * Thomas A Caswell |
|
27 | 27 | * Thomas Kluyver |
|
28 | 28 | * Vincent Woo |
|
29 | 29 | |
|
30 | 30 | |
|
31 | 31 | Issues closed in 4.1 |
|
32 | 32 | -------------------- |
|
33 | 33 | |
|
34 | 34 | GitHub stats for 2015/08/12 - 2016/02/02 (since 4.0.0) |
|
35 | 35 | |
|
36 | 36 | These lists are automatically generated, and may be incomplete or contain duplicates. |
|
37 | 37 | |
|
38 | 38 | We closed 60 issues and merged 148 pull requests. |
|
39 | 39 | The full list can be seen `on GitHub <https://github.com/ipython/ipython/issues?q=milestone%3A4.1+>`__ |
|
40 | 40 | |
|
41 | 41 | The following 52 authors contributed 468 commits. |
|
42 | 42 | |
|
43 | 43 | * Aaron Meurer |
|
44 | 44 | * Alexandre Avanian |
|
45 | 45 | * Anthony Sottile |
|
46 | 46 | * Antony Lee |
|
47 | 47 | * Arthur Loder |
|
48 | 48 | * Ben Kasel |
|
49 | 49 | * Ben Rousch |
|
50 | 50 | * Benjamin Ragan-Kelley |
|
51 | 51 | * bollwyvl |
|
52 | 52 | * Carol Willing |
|
53 | 53 | * Christopher Roach |
|
54 | 54 | * Douglas La Rocca |
|
55 | 55 | * Fairly |
|
56 | 56 | * Fernando Perez |
|
57 | 57 | * Frank Sachsenheim |
|
58 | 58 | * Guillaume DOUMENC |
|
59 | 59 | * GΓ‘bor Luk |
|
60 | 60 | * Hoyt Koepke |
|
61 | 61 | * Ivan Timokhin |
|
62 | 62 | * Jacob Niehus |
|
63 | 63 | * JamshedVesuna |
|
64 | 64 | * Jan Schulz |
|
65 | 65 | * Jan-Philip Gehrcke |
|
66 | 66 | * jc |
|
67 | 67 | * Jessica B. Hamrick |
|
68 | 68 | * jferrara |
|
69 | 69 | * John Bohannon |
|
70 | 70 | * John Kirkham |
|
71 | 71 | * Jonathan Frederic |
|
72 | 72 | * Kyle Kelley |
|
73 | 73 | * Lev Givon |
|
74 | 74 | * Lilian Besson |
|
75 | 75 | * lingxz |
|
76 | 76 | * Matthias Bussonnier |
|
77 | 77 | * memeplex |
|
78 | 78 | * Michael Droettboom |
|
79 | 79 | * naught101 |
|
80 | 80 | * Peter Waller |
|
81 | 81 | * Pierre Gerold |
|
82 | 82 | * RΓ©my LΓ©one |
|
83 | 83 | * Scott Sanderson |
|
84 | 84 | * Shanzhuo Zhang |
|
85 | 85 | * Sylvain Corlay |
|
86 | 86 | * Tayfun Sen |
|
87 | 87 | * Thomas A Caswell |
|
88 | 88 | * Thomas Ballinger |
|
89 | 89 | * Thomas Kluyver |
|
90 | 90 | * Vincent Legoll |
|
91 | 91 | * Wouter Bolsterlee |
|
92 | 92 | * xconverge |
|
93 | 93 | * Yuri Numerov |
|
94 | 94 | * Zachary Pincus |
|
95 | 95 | |
|
96 | 96 | |
|
97 | 97 | Issues closed in 4.0 |
|
98 | 98 | -------------------- |
|
99 | 99 | |
|
100 | 100 | |
|
101 | 101 | GitHub stats for 2015/02/27 - 2015/08/11 (since 3.0) |
|
102 | 102 | |
|
103 | 103 | These lists are automatically generated, and may be incomplete or contain duplicates. |
|
104 | 104 | |
|
105 | 105 | We closed 35 issues and merged 125 pull requests. |
|
106 |
The full list can be seen `on GitHub <https://github.com/ipython/ipython/milestone/ |
|
|
106 | The full list can be seen `on GitHub <https://github.com/ipython/ipython/milestone/21>`__ | |
|
107 | 107 | |
|
108 | 108 | The following 69 authors contributed 1186 commits. |
|
109 | 109 | |
|
110 | 110 | * Abe Guerra |
|
111 | 111 | * Adal Chiriliuc |
|
112 | 112 | * Alexander Belopolsky |
|
113 | 113 | * Andrew Murray |
|
114 | 114 | * Antonio Russo |
|
115 | 115 | * Benjamin Ragan-Kelley |
|
116 | 116 | * BjΓΆrn Linse |
|
117 | 117 | * Brian Drawert |
|
118 | 118 | * chebee7i |
|
119 | 119 | * Daniel Rocco |
|
120 | 120 | * Donny Winston |
|
121 | 121 | * Drekin |
|
122 | 122 | * Erik Hvatum |
|
123 | 123 | * Fernando Perez |
|
124 | 124 | * Francisco de la PeΓ±a |
|
125 | 125 | * Frazer McLean |
|
126 | 126 | * Gareth Elston |
|
127 | 127 | * Gert-Ludwig Ingold |
|
128 | 128 | * Giuseppe Venturini |
|
129 | 129 | * Ian Barfield |
|
130 | 130 | * Ivan Pozdeev |
|
131 | 131 | * Jakob Gager |
|
132 | 132 | * Jan Schulz |
|
133 | 133 | * Jason Grout |
|
134 | 134 | * Jeff Hussmann |
|
135 | 135 | * Jessica B. Hamrick |
|
136 | 136 | * Joe Borg |
|
137 | 137 | * Joel Nothman |
|
138 | 138 | * Johan Forsberg |
|
139 | 139 | * Jonathan Frederic |
|
140 | 140 | * Justin Tyberg |
|
141 | 141 | * Koen van Besien |
|
142 | 142 | * Kyle Kelley |
|
143 | 143 | * Lorena Pantano |
|
144 | 144 | * Lucretiel |
|
145 | 145 | * Marin Gilles |
|
146 | 146 | * mashenjun |
|
147 | 147 | * Mathieu |
|
148 | 148 | * Matthias Bussonnier |
|
149 | 149 | * Merlijn van Deen |
|
150 | 150 | * Mikhail Korobov |
|
151 | 151 | * Naveen Nathan |
|
152 | 152 | * Nicholas Bollweg |
|
153 | 153 | * nottaanibot |
|
154 | 154 | * Omer Katz |
|
155 | 155 | * onesandzeroes |
|
156 | 156 | * Patrick Snape |
|
157 | 157 | * patter001 |
|
158 | 158 | * Peter Parente |
|
159 | 159 | * Pietro Battiston |
|
160 | 160 | * RickWinter |
|
161 | 161 | * Robert Smith |
|
162 | 162 | * Ryan Nelson |
|
163 | 163 | * Scott Sanderson |
|
164 | 164 | * Sebastiaan Mathot |
|
165 | 165 | * Sylvain Corlay |
|
166 | 166 | * thethomask |
|
167 | 167 | * Thomas A Caswell |
|
168 | 168 | * Thomas Adriaan Hellinger |
|
169 | 169 | * Thomas Kluyver |
|
170 | 170 | * Tianhui Michael Li |
|
171 | 171 | * tmtabor |
|
172 | 172 | * unknown |
|
173 | 173 | * Victor Ramirez |
|
174 | 174 | * Volker Braun |
|
175 | 175 | * Wieland Hoffmann |
|
176 | 176 | * Yuval Langer |
|
177 | 177 | * ZoltΓ‘n VΓΆrΓΆs |
|
178 | 178 | * Γlie Michel |
@@ -1,391 +1,391 b'' | |||
|
1 | 1 | ============ |
|
2 | 2 | 3.x Series |
|
3 | 3 | ============ |
|
4 | 4 | |
|
5 | 5 | IPython 3.2.3 |
|
6 | 6 | ============= |
|
7 | 7 | |
|
8 | 8 | Fixes compatibility with Python 3.4.4. |
|
9 | 9 | |
|
10 | 10 | IPython 3.2.2 |
|
11 | 11 | ============= |
|
12 | 12 | |
|
13 | 13 | Address vulnerabilities when files have maliciously crafted filenames (CVE-2015-6938), |
|
14 | 14 | or vulnerability when opening text files with malicious binary content (CVE pending). |
|
15 | 15 | |
|
16 | 16 | Users are **strongly** encouraged to upgrade immediately. |
|
17 | 17 | There are also a few small unicode and nbconvert-related fixes. |
|
18 | 18 | |
|
19 | 19 | |
|
20 | 20 | IPython 3.2.1 |
|
21 | 21 | ============= |
|
22 | 22 | |
|
23 | 23 | IPython 3.2.1 is a small bugfix release, primarily for cross-site security fixes in the notebook. |
|
24 | 24 | Users are **strongly** encouraged to upgrade immediately. |
|
25 | 25 | There are also a few small unicode and nbconvert-related fixes. |
|
26 | 26 | |
|
27 | 27 | See :ref:`issues_list_3` for details. |
|
28 | 28 | |
|
29 | 29 | |
|
30 | 30 | IPython 3.2 |
|
31 | 31 | =========== |
|
32 | 32 | |
|
33 | 33 | IPython 3.2 contains important security fixes. Users are **strongly** encouraged to upgrade immediately. |
|
34 | 34 | |
|
35 | 35 | Highlights: |
|
36 | 36 | |
|
37 | 37 | - Address cross-site scripting vulnerabilities CVE-2015-4706, CVE-2015-4707 |
|
38 | 38 | - A security improvement that set the secure attribute to login cookie to prevent them to be sent over http |
|
39 | 39 | - Revert the face color of matplotlib axes in the inline backend to not be transparent. |
|
40 | 40 | - Enable mathjax safe mode by default |
|
41 | 41 | - Fix XSS vulnerability in JSON error messages |
|
42 | 42 | - Various widget-related fixes |
|
43 | 43 | |
|
44 | 44 | See :ref:`issues_list_3` for details. |
|
45 | 45 | |
|
46 | 46 | |
|
47 | 47 | IPython 3.1 |
|
48 | 48 | =========== |
|
49 | 49 | |
|
50 | 50 | Released April 3, 2015 |
|
51 | 51 | |
|
52 | 52 | The first 3.x bugfix release, with 33 contributors and 344 commits. |
|
53 | 53 | This primarily includes bugfixes to notebook layout and focus problems. |
|
54 | 54 | |
|
55 | 55 | |
|
56 | 56 | Highlights: |
|
57 | 57 | |
|
58 | 58 | - Various focus jumping and scrolling fixes in the notebook. |
|
59 | 59 | - Various message ordering and widget fixes in the notebook. |
|
60 | 60 | - Images in markdown and output are confined to the notebook width. |
|
61 | 61 | An `.unconfined` CSS class is added to disable this behavior per-image. |
|
62 | 62 | The resize handle on output images is removed. |
|
63 | 63 | - Improved ordering of tooltip content for Python functions, putting the signature at the top. |
|
64 | 64 | - Fix UnicodeErrors when displaying some objects with unicode reprs on Python 2. |
|
65 | 65 | - Set the kernel's working directory to the notebook directory when running ``nbconvert --execute``, |
|
66 | 66 | so that behavior matches the live notebook. |
|
67 | 67 | - Allow setting custom SSL options for the tornado server with ``NotebookApp.ssl_options``, |
|
68 | 68 | and protect against POODLE with default settings by disabling SSLv3. |
|
69 | 69 | - Fix memory leak in the IPython.parallel Controller on Python 3. |
|
70 | 70 | |
|
71 | 71 | |
|
72 | 72 | See :ref:`issues_list_3` for details. |
|
73 | 73 | |
|
74 | 74 | |
|
75 | 75 | Release 3.0 |
|
76 | 76 | =========== |
|
77 | 77 | |
|
78 | 78 | Released February 27, 2015 |
|
79 | 79 | |
|
80 | 80 | This is a really big release. Over 150 contributors, and almost 6000 commits in a bit under a year. |
|
81 | 81 | Support for languages other than Python is greatly improved, |
|
82 | 82 | notebook UI has been significantly redesigned, |
|
83 | 83 | and a lot of improvement has happened in the experimental interactive widgets. |
|
84 | 84 | The message protocol and document format have both been updated, |
|
85 | 85 | while maintaining better compatibility with previous versions than prior updates. |
|
86 | 86 | The notebook webapp now enables editing of any text file, and even |
|
87 | 87 | a web-based terminal (on Unix platforms). |
|
88 | 88 | |
|
89 | 89 | 3.x will be the last monolithic release of IPython, |
|
90 | 90 | as the next release cycle will see the growing project split into its Python-specific and language-agnostic components. |
|
91 | 91 | Language-agnostic projects (notebook, qtconsole, etc.) will move under the umbrella of the new Project Jupyter name, |
|
92 | 92 | while Python-specific projects (interactive Python shell, Python kernel, IPython.parallel) |
|
93 | 93 | will remain under IPython, and be split into a few smaller packages. |
|
94 | 94 | To reflect this, IPython is in a bit of a transition state. |
|
95 | 95 | The logo on the notebook is now the Jupyter logo. |
|
96 | 96 | When installing kernels system-wide, they go in a `jupyter` directory. |
|
97 | 97 | We are going to do our best to ease this transition for users and developers. |
|
98 | 98 | |
|
99 | 99 | Big changes are ahead. |
|
100 | 100 | |
|
101 | 101 | |
|
102 | 102 | Using different kernels |
|
103 | 103 | ----------------------- |
|
104 | 104 | |
|
105 | 105 | .. image:: ../_images/kernel_selector_screenshot.png |
|
106 | 106 | :alt: Screenshot of 'new' dropdown showing different kernels |
|
107 | 107 | :align: center |
|
108 | 108 | |
|
109 | 109 | You can now choose a kernel for a notebook within the user interface, rather |
|
110 | 110 | than starting up a separate notebook server for each kernel you want to use. The |
|
111 | 111 | syntax highlighting adapts to match the language you're working in. |
|
112 | 112 | |
|
113 | 113 | Information about the kernel is stored in the notebook file, so when you open a |
|
114 | 114 | notebook, it will automatically start the correct kernel. |
|
115 | 115 | |
|
116 | 116 | It is also easier to use the Qt console and the terminal console with other |
|
117 | 117 | kernels, using the --kernel flag:: |
|
118 | 118 | |
|
119 | 119 | ipython qtconsole --kernel bash |
|
120 | 120 | ipython console --kernel bash |
|
121 | 121 | |
|
122 | 122 | # To list available kernels |
|
123 | 123 | ipython kernelspec list |
|
124 | 124 | |
|
125 | 125 | Kernel authors should see :ref:`kernelspecs` for how to register their kernels |
|
126 | 126 | with IPython so that these mechanisms work. |
|
127 | 127 | |
|
128 | 128 | Typing unicode identifiers |
|
129 | 129 | -------------------------- |
|
130 | 130 | |
|
131 | 131 | .. image:: /_images/unicode_completion.png |
|
132 | 132 | |
|
133 | 133 | Complex expressions can be much cleaner when written with a wider choice of |
|
134 | 134 | characters. Python 3 allows unicode identifiers, and IPython 3 makes it easier |
|
135 | 135 | to type those, using a feature from Julia. Type a backslash followed by a LaTeX |
|
136 | 136 | style short name, such as ``\alpha``. Press tab, and it will turn into Ξ±. |
|
137 | 137 | |
|
138 | 138 | Widget migration guide |
|
139 | 139 | ---------------------- |
|
140 | 140 | The widget framework has a lot of backwards incompatible changes. |
|
141 | 141 | For information about migrating widget notebooks and custom widgets to 3.0 refer |
|
142 | 142 | to the :doc:`widget migration guide<version3_widget_migration>`. |
|
143 | 143 | |
|
144 | 144 | Other new features |
|
145 | 145 | ------------------ |
|
146 | 146 | |
|
147 | 147 | * :class:`~.TextWidget` and :class:`~.TextareaWidget` objects now include a |
|
148 | 148 | ``placeholder`` attribute, for displaying placeholder text before the |
|
149 | 149 | user has typed anything. |
|
150 | 150 | |
|
151 | 151 | * The :magic:`load` magic can now find the source for objects in the user namespace. |
|
152 | 152 | To enable searching the namespace, use the ``-n`` option. |
|
153 | 153 | |
|
154 | 154 | .. sourcecode:: ipython |
|
155 | 155 | |
|
156 | 156 | In [1]: %load -n my_module.some_function |
|
157 | 157 | |
|
158 | 158 | * :class:`~.DirectView` objects have a new :meth:`~.DirectView.use_cloudpickle` |
|
159 | 159 | method, which works like ``view.use_dill()``, but causes the ``cloudpickle`` |
|
160 | 160 | module from PiCloud's `cloud`__ library to be used rather than dill or the |
|
161 | 161 | builtin pickle module. |
|
162 | 162 | |
|
163 | 163 | __ https://pypi.python.org/pypi/cloud |
|
164 | 164 | |
|
165 | 165 | * Added a .ipynb exporter to nbconvert. It can be used by passing `--to notebook` |
|
166 | 166 | as a commandline argument to nbconvert. |
|
167 | 167 | |
|
168 | 168 | * New nbconvert preprocessor called :class:`~.ClearOutputPreprocessor`. This |
|
169 | 169 | clears the output from IPython notebooks. |
|
170 | 170 | |
|
171 | 171 | * New preprocessor for nbconvert that executes all the code cells in a notebook. |
|
172 | 172 | To run a notebook and save its output in a new notebook:: |
|
173 | 173 | |
|
174 | 174 | ipython nbconvert InputNotebook --ExecutePreprocessor.enabled=True --to notebook --output Executed |
|
175 | 175 | |
|
176 | 176 | * Consecutive stream (stdout/stderr) output is merged into a single output |
|
177 | 177 | in the notebook document. |
|
178 | 178 | Previously, all output messages were preserved as separate output fields in the JSON. |
|
179 | 179 | Now, the same merge is applied to the stored output as the displayed output, |
|
180 | 180 | improving document load time for notebooks with many small outputs. |
|
181 | 181 | |
|
182 | 182 | * ``NotebookApp.webapp_settings`` is deprecated and replaced with |
|
183 | 183 | the more informatively named ``NotebookApp.tornado_settings``. |
|
184 | 184 | |
|
185 | 185 | * Using :magic:`timeit` prints warnings if there is atleast a 4x difference in timings |
|
186 | 186 | between the slowest and fastest runs, since this might meant that the multiple |
|
187 | 187 | runs are not independent of one another. |
|
188 | 188 | |
|
189 | 189 | * It's now possible to provide mechanisms to integrate IPython with other event |
|
190 | 190 | loops, in addition to the ones we already support. This lets you run GUI code |
|
191 | 191 | in IPython with an interactive prompt, and to embed the IPython |
|
192 | 192 | kernel in GUI applications. See :doc:`/config/eventloops` for details. As part |
|
193 | 193 | of this, the direct ``enable_*`` and ``disable_*`` functions for various GUIs |
|
194 | 194 | in :mod:`IPython.lib.inputhook` have been deprecated in favour of |
|
195 | 195 | :meth:`~.InputHookManager.enable_gui` and :meth:`~.InputHookManager.disable_gui`. |
|
196 | 196 | |
|
197 | 197 | * A ``ScrollManager`` was added to the notebook. The ``ScrollManager`` controls how the notebook document is scrolled using keyboard. Users can inherit from the ``ScrollManager`` or ``TargetScrollManager`` to customize how their notebook scrolls. The default ``ScrollManager`` is the ``SlideScrollManager``, which tries to scroll to the nearest slide or sub-slide cell. |
|
198 | 198 | |
|
199 | 199 | * The function :func:`~IPython.html.widgets.interaction.interact_manual` has been |
|
200 | 200 | added which behaves similarly to :func:`~IPython.html.widgets.interaction.interact`, |
|
201 | 201 | but adds a button to explicitly run the interacted-with function, rather than |
|
202 | 202 | doing it automatically for every change of the parameter widgets. This should |
|
203 | 203 | be useful for long-running functions. |
|
204 | 204 | |
|
205 | 205 | * The ``%cython`` magic is now part of the Cython module. Use `%load_ext Cython` with a version of Cython >= 0.21 to have access to the magic now. |
|
206 | 206 | |
|
207 | 207 | * The Notebook application now offers integrated terminals on Unix platforms, |
|
208 | 208 | intended for when it is used on a remote server. To enable these, install |
|
209 | 209 | the ``terminado`` Python package. |
|
210 | 210 | |
|
211 | 211 | * The Notebook application can now edit any plain text files, via a full-page CodeMirror instance. |
|
212 | 212 | |
|
213 | 213 | * Setting the default highlighting language for nbconvert with the config option |
|
214 | 214 | ``NbConvertBase.default_language`` is deprecated. Nbconvert now respects |
|
215 | 215 | metadata stored in the :ref:`kernel spec <kernelspecs>`. |
|
216 | 216 | |
|
217 | 217 | * IPython can now be configured systemwide, with files in :file:`/etc/ipython` |
|
218 | 218 | or :file:`/usr/local/etc/ipython` on Unix systems, |
|
219 | 219 | or :file:`{%PROGRAMDATA%}\\ipython` on Windows. |
|
220 | 220 | |
|
221 | 221 | * Added support for configurable user-supplied `Jinja |
|
222 | 222 | <http://jinja.pocoo.org/>`_ HTML templates for the notebook. Paths to |
|
223 | 223 | directories containing template files can be specified via |
|
224 | 224 | ``NotebookApp.extra_template_paths``. User-supplied template directories |
|
225 | 225 | searched first by the notebook, making it possible to replace existing |
|
226 | 226 | templates with your own files. |
|
227 | 227 | |
|
228 | 228 | For example, to replace the notebook's built-in ``error.html`` with your own, |
|
229 | 229 | create a directory like ``/home/my_templates`` and put your override template |
|
230 | 230 | at ``/home/my_templates/error.html``. To start the notebook with your custom |
|
231 | 231 | error page enabled, you would run:: |
|
232 | 232 | |
|
233 | 233 | ipython notebook '--extra_template_paths=["/home/my_templates/"]' |
|
234 | 234 | |
|
235 | 235 | It's also possible to override a template while also `inheriting |
|
236 | 236 | <http://jinja.pocoo.org/docs/dev/templates/#template-inheritance>`_ from that |
|
237 | 237 | template, by prepending ``templates/`` to the ``{% extends %}`` target of |
|
238 | 238 | your child template. This is useful when you only want to override a |
|
239 | 239 | specific block of a template. For example, to add additional CSS to the |
|
240 | 240 | built-in ``error.html``, you might create an override that looks like:: |
|
241 | 241 | |
|
242 | 242 | {% extends "templates/error.html" %} |
|
243 | 243 | |
|
244 | 244 | {% block stylesheet %} |
|
245 | 245 | {{super()}} |
|
246 | 246 | <style type="text/css"> |
|
247 | 247 | /* My Awesome CSS */ |
|
248 | 248 | </style> |
|
249 | 249 | {% endblock %} |
|
250 | 250 | |
|
251 | 251 | * Added a widget persistence API. This allows you to persist your notebooks interactive widgets. |
|
252 | 252 | Two levels of control are provided: |
|
253 | 253 | 1. Higher level- ``WidgetManager.set_state_callbacks`` allows you to register callbacks for loading and saving widget state. The callbacks you register are automatically called when necessary. |
|
254 | 254 | 2. Lower level- the ``WidgetManager`` Javascript class now has ``get_state`` and ``set_state`` methods that allow you to get and set the state of the widget runtime. |
|
255 | 255 | |
|
256 | 256 | Example code for persisting your widget state to session data:: |
|
257 | 257 | |
|
258 | 258 | %%javascript |
|
259 | 259 | require(['widgets/js/manager'], function(manager) { |
|
260 | 260 | manager.WidgetManager.set_state_callbacks(function() { // Load |
|
261 | 261 | return JSON.parse(sessionStorage.widgets_state || '{}'); |
|
262 | 262 | }, function(state) { // Save |
|
263 | 263 | sessionStorage.widgets_state = JSON.stringify(state); |
|
264 | 264 | }); |
|
265 | 265 | }); |
|
266 | 266 | |
|
267 | 267 | * Enhanced support for :magic:`env` magic. As before, :magic:`env` with no |
|
268 | 268 | arguments displays all environment variables and values. Additionally, |
|
269 | 269 | :magic:`env` can be used to get or set individual environment variables. To |
|
270 | 270 | display an individual value, use the `%env var` syntax. To set a value, use |
|
271 | 271 | `env var val` or `env var=val`. Python value expansion using `$` works as usual. |
|
272 | 272 | |
|
273 | 273 | |
|
274 | 274 | Backwards incompatible changes |
|
275 | 275 | ------------------------------ |
|
276 | 276 | |
|
277 | 277 | * The :ref:`message protocol <messaging>` has been updated from version 4 to version 5. |
|
278 | 278 | Adapters are included, so IPython frontends can still talk to kernels that |
|
279 | 279 | implement protocol version 4. |
|
280 | 280 | |
|
281 | 281 | * The notebook format has been updated from version 3 to version 4. |
|
282 | 282 | Read-only support for v4 notebooks has been backported to IPython 2.4. |
|
283 | 283 | Notable changes: |
|
284 | 284 | |
|
285 | 285 | * heading cells are removed in favor or markdown headings |
|
286 | 286 | * notebook outputs and output messages are more consistent with each other |
|
287 | 287 | * use :func:`IPython.nbformat.read` and :func:`~IPython.nbformat.write` |
|
288 | 288 | to read and write notebook files |
|
289 | 289 | instead of the deprecated :mod:`IPython.nbformat.current` APIs. |
|
290 | 290 | |
|
291 | 291 | You can downgrade a notebook to v3 via ``nbconvert``:: |
|
292 | 292 | |
|
293 | 293 | ipython nbconvert --to notebook --nbformat 3 <notebook> |
|
294 | 294 | |
|
295 | 295 | which will create :file:`notebook.v3.ipynb`, a copy of the notebook in v3 format. |
|
296 | 296 | |
|
297 | 297 | * :func:`IPython.core.oinspect.getsource` call specification has changed: |
|
298 | 298 | |
|
299 | 299 | * `oname` keyword argument has been added for property source formatting |
|
300 | 300 | * `is_binary` keyword argument has been dropped, passing ``True`` had |
|
301 | 301 | previously short-circuited the function to return ``None`` unconditionally |
|
302 | 302 | |
|
303 | 303 | * Removed the octavemagic extension: it is now available as ``oct2py.ipython``. |
|
304 | 304 | |
|
305 | 305 | * Creating PDFs with LaTeX no longer uses a post processor. |
|
306 | 306 | Use `nbconvert --to pdf` instead of `nbconvert --to latex --post pdf`. |
|
307 | 307 | |
|
308 | 308 | * Used https://github.com/jdfreder/bootstrap2to3 to migrate the Notebook to Bootstrap 3. |
|
309 | 309 | |
|
310 | 310 | Additional changes: |
|
311 | 311 | |
|
312 | 312 | - Set `.tab-content .row` `0px;` left and right margin (bootstrap default is `-15px;`) |
|
313 | 313 | - Removed `height: @btn_mini_height;` from `.list_header>div, .list_item>div` in `tree.less` |
|
314 | 314 | - Set `#header` div `margin-bottom: 0px;` |
|
315 | 315 | - Set `#menus` to `float: left;` |
|
316 | 316 | - Set `#maintoolbar .navbar-text` to `float: none;` |
|
317 | 317 | - Added no-padding convenience class. |
|
318 | 318 | - Set border of #maintoolbar to 0px |
|
319 | 319 | |
|
320 | 320 | * Accessing the `container` DOM object when displaying javascript has been |
|
321 | 321 | deprecated in IPython 2.0 in favor of accessing `element`. Starting with |
|
322 | 322 | IPython 3.0 trying to access `container` will raise an error in browser |
|
323 | 323 | javascript console. |
|
324 | 324 | |
|
325 | 325 | * ``IPython.utils.py3compat.open`` was removed: :func:`io.open` provides all |
|
326 | 326 | the same functionality. |
|
327 | 327 | |
|
328 | 328 | * The NotebookManager and ``/api/notebooks`` service has been replaced by |
|
329 | 329 | a more generic ContentsManager and ``/api/contents`` service, |
|
330 | 330 | which supports all kinds of files. |
|
331 | 331 | * The Dashboard now lists all files, not just notebooks and directories. |
|
332 | 332 | * The ``--script`` hook for saving notebooks to Python scripts is removed, |
|
333 | 333 | use :samp:`ipython nbconvert --to python {notebook}` instead. |
|
334 | 334 | |
|
335 | 335 | * The ``rmagic`` extension is deprecated, as it is now part of rpy2. See |
|
336 | 336 | :mod:`rpy2.ipython.rmagic`. |
|
337 | 337 | |
|
338 | 338 | * :meth:`~.KernelManager.start_kernel` and :meth:`~.KernelManager.format_kernel_cmd` |
|
339 | 339 | no longer accept a ``executable`` parameter. Use the kernelspec machinery instead. |
|
340 | 340 | |
|
341 | 341 | * The widget classes have been renamed from `*Widget` to `*`. The old names are |
|
342 | 342 | still functional, but are deprecated. i.e. `IntSliderWidget` has been renamed |
|
343 | 343 | to `IntSlider`. |
|
344 | 344 | * The ContainerWidget was renamed to Box and no longer defaults as a flexible |
|
345 | 345 | box in the web browser. A new FlexBox widget was added, which allows you to |
|
346 | 346 | use the flexible box model. |
|
347 | 347 | |
|
348 | 348 | * The notebook now uses a single websocket at `/kernels/<kernel-id>/channels` instead of separate |
|
349 | 349 | `/kernels/<kernel-id>/{shell|iopub|stdin}` channels. Messages on each channel are identified by a |
|
350 | 350 | `channel` key in the message dict, for both send and recv. |
|
351 | 351 | |
|
352 | 352 | |
|
353 | 353 | Content Security Policy |
|
354 | 354 | ``````````````````````` |
|
355 | 355 | |
|
356 | 356 | The Content Security Policy is a web standard for adding a layer of security to |
|
357 | 357 | detect and mitigate certain classes of attacks, including Cross Site Scripting |
|
358 | 358 | (XSS) and data injection attacks. This was introduced into the notebook to |
|
359 | 359 | ensure that the IPython Notebook and its APIs (by default) can only be embedded |
|
360 | 360 | in an iframe on the same origin. |
|
361 | 361 | |
|
362 | 362 | Override ``headers['Content-Security-Policy']`` within your notebook |
|
363 | 363 | configuration to extend for alternate domains and security settings.:: |
|
364 | 364 | |
|
365 | 365 | c.NotebookApp.tornado_settings = { |
|
366 | 366 | 'headers': { |
|
367 | 367 | 'Content-Security-Policy': "frame-ancestors 'self'" |
|
368 | 368 | } |
|
369 | 369 | } |
|
370 | 370 | |
|
371 | 371 | Example policies:: |
|
372 | 372 | |
|
373 | 373 | Content-Security-Policy: default-src 'self' https://*.jupyter.org |
|
374 | 374 | |
|
375 | 375 | Matches embeddings on any subdomain of jupyter.org, so long as they are served |
|
376 | 376 | over SSL. |
|
377 | 377 | |
|
378 |
There is a `report-uri <https://developer.mozilla.org/en-US/docs/Web/Security |
|
|
378 | There is a `report-uri <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-uri>`_ endpoint available for logging CSP violations, located at | |
|
379 | 379 | ``/api/security/csp-report``. To use it, set ``report-uri`` as part of the CSP:: |
|
380 | 380 | |
|
381 | 381 | c.NotebookApp.tornado_settings = { |
|
382 | 382 | 'headers': { |
|
383 | 383 | 'Content-Security-Policy': "frame-ancestors 'self'; report-uri /api/security/csp-report" |
|
384 | 384 | } |
|
385 | 385 | } |
|
386 | 386 | |
|
387 | 387 | It simply provides the CSP report as a warning in IPython's logs. The default |
|
388 | 388 | CSP sets this report-uri relative to the ``base_url`` (not shown above). |
|
389 | 389 | |
|
390 | 390 | For a more thorough and accurate guide on Content Security Policies, check out |
|
391 | 391 | `MDN's Using Content Security Policy <https://developer.mozilla.org/en-US/docs/Web/Security/CSP/Using_Content_Security_Policy>`_ for more examples. |
General Comments 0
You need to be logged in to leave comments.
Login now