##// END OF EJS Templates
Merge pull request #13686 from Carreau/wn84...
Matthias Bussonnier -
r27673:add1dce2 merge
parent child Browse files
Show More
@@ -1,1069 +1,1080 b''
1 1 ============
2 2 8.x Series
3 3 ============
4 4
5 .. _version 8.4.0:
6
7 IPython 8.4.0
8 -------------
9
10 As for 7.34, this version contains a single fix: fix uncaught BdbQuit exceptions on ipdb
11 exit :ghpull:`13668`, and a single typo fix in documentation: :ghpull:`13682`
12
13 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
14 work on IPython and related libraries.
15
5 16
6 17 .. _version 8.3.0:
7 18
8 19 IPython 8.3.0
9 20 -------------
10 21
11 22 - :ghpull:`13625`, using ``?``, ``??``, ``*?`` will not call
12 23 ``set_next_input`` as most frontend allow proper multiline editing and it was
13 24 causing issues for many users of multi-cell frontends. This has been backported to 7.33
14 25
15 26
16 27 - :ghpull:`13600`, ``pre_run_*``-hooks will now have a ``cell_id`` attribute on
17 28 the info object when frontend provide it. This has been backported to 7.33
18 29
19 30 - :ghpull:`13624`, fixed :kbd:`End` key being broken after accepting an
20 31 auto-suggestion.
21 32
22 33 - :ghpull:`13657` fix issue where history from different sessions would be mixed.
23 34
24 35 .. _version 8.2.0:
25 36
26 37 IPython 8.2.0
27 38 -------------
28 39
29 40 IPython 8.2 mostly bring bugfixes to IPython.
30 41
31 42 - Auto-suggestion can now be elected with the ``end`` key. :ghpull:`13566`
32 43 - Some traceback issues with ``assert etb is not None`` have been fixed. :ghpull:`13588`
33 44 - History is now pulled from the sqitel database and not from in-memory.
34 45 In particular when using the ``%paste`` magic, the content of the pasted text will
35 46 be part of the history and not the verbatim text ``%paste`` anymore. :ghpull:`13592`
36 47 - Fix ``Ctrl-\\`` exit cleanup :ghpull:`13603`
37 48 - Fixes to ``ultratb`` ipdb support when used outside of IPython. :ghpull:`13498`
38 49
39 50
40 51 I am still trying to fix and investigate :ghissue:`13598`, which seem to be
41 52 random, and would appreciate help if you find reproducible minimal case. I've
42 53 tried to make various changes to the codebase to mitigate it, but a proper fix
43 54 will be difficult without understanding the cause.
44 55
45 56
46 57 All the issues on pull-requests for this release can be found in the `8.2
47 58 milestone. <https://github.com/ipython/ipython/milestone/100>`__ . And some
48 59 documentation only PR can be found as part of the `7.33 milestone
49 60 <https://github.com/ipython/ipython/milestone/101>`__ (currently not released).
50 61
51 62 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
52 63 work on IPython and related libraries.
53 64
54 65 .. _version 8.1.1:
55 66
56 67 IPython 8.1.1
57 68 -------------
58 69
59 70 Fix an issue with virtualenv and Python 3.8 introduced in 8.1
60 71
61 72 Revert :ghpull:`13537` (fix an issue with symlinks in virtualenv) that raises an
62 73 error in Python 3.8, and fixed in a different way in :ghpull:`13559`.
63 74
64 75 .. _version 8.1:
65 76
66 77 IPython 8.1.0
67 78 -------------
68 79
69 80 IPython 8.1 is the first minor release after 8.0 and fixes a number of bugs and
70 81 Update a few behavior that were problematic with the 8.0 as with many new major
71 82 release.
72 83
73 84 Note that beyond the changes listed here, IPython 8.1.0 also contains all the
74 85 features listed in :ref:`version 7.32`.
75 86
76 87 - Misc and multiple fixes around quotation auto-closing. It is now disabled by
77 88 default. Run with ``TerminalInteractiveShell.auto_match=True`` to re-enabled
78 89 - Require pygments>=2.4.0 :ghpull:`13459`, this was implicit in the code, but
79 90 is now explicit in ``setup.cfg``/``setup.py``
80 91 - Docs improvement of ``core.magic_arguments`` examples. :ghpull:`13433`
81 92 - Multi-line edit executes too early with await. :ghpull:`13424`
82 93
83 94 - ``black`` is back as an optional dependency, and autoformatting disabled by
84 95 default until some fixes are implemented (black improperly reformat magics).
85 96 :ghpull:`13471` Additionally the ability to use ``yapf`` as a code
86 97 reformatter has been added :ghpull:`13528` . You can use
87 98 ``TerminalInteractiveShell.autoformatter="black"``,
88 99 ``TerminalInteractiveShell.autoformatter="yapf"`` to re-enable auto formating
89 100 with black, or switch to yapf.
90 101
91 102 - Fix and issue where ``display`` was not defined.
92 103
93 104 - Auto suggestions are now configurable. Currently only
94 105 ``AutoSuggestFromHistory`` (default) and ``None``. new provider contribution
95 106 welcomed. :ghpull:`13475`
96 107
97 108 - multiple packaging/testing improvement to simplify downstream packaging
98 109 (xfail with reasons, try to not access network...).
99 110
100 111 - Update deprecation. ``InteractiveShell.magic`` internal method has been
101 112 deprecated for many years but did not emit a warning until now.
102 113
103 114 - internal ``appended_to_syspath`` context manager has been deprecated.
104 115
105 116 - fix an issue with symlinks in virtualenv :ghpull:`13537` (Reverted in 8.1.1)
106 117
107 118 - Fix an issue with vim mode, where cursor would not be reset on exit :ghpull:`13472`
108 119
109 120 - ipython directive now remove only known pseudo-decorators :ghpull:`13532`
110 121
111 122 - ``IPython/lib/security`` which used to be used for jupyter notebook has been
112 123 removed.
113 124
114 125 - Fix an issue where ``async with`` would execute on new lines. :ghpull:`13436`
115 126
116 127
117 128 We want to remind users that IPython is part of the Jupyter organisations, and
118 129 thus governed by a Code of Conduct. Some of the behavior we have seen on GitHub is not acceptable.
119 130 Abuse and non-respectful comments on discussion will not be tolerated.
120 131
121 132 Many thanks to all the contributors to this release, many of the above fixed issue and
122 133 new features where done by first time contributors, showing there is still
123 134 plenty of easy contribution possible in IPython
124 135 . You can find all individual contributions
125 136 to this milestone `on github <https://github.com/ipython/ipython/milestone/91>`__.
126 137
127 138 Thanks as well to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
128 139 work on IPython and related libraries. In particular the Lazy autoloading of
129 140 magics that you will find described in the 7.32 release notes.
130 141
131 142
132 143 .. _version 8.0.1:
133 144
134 145 IPython 8.0.1 (CVE-2022-21699)
135 146 ------------------------------
136 147
137 148 IPython 8.0.1, 7.31.1 and 5.11 are security releases that change some default
138 149 values in order to prevent potential Execution with Unnecessary Privileges.
139 150
140 151 Almost all version of IPython looks for configuration and profiles in current
141 152 working directory. Since IPython was developed before pip and environments
142 153 existed it was used a convenient way to load code/packages in a project
143 154 dependant way.
144 155
145 156 In 2022, it is not necessary anymore, and can lead to confusing behavior where
146 157 for example cloning a repository and starting IPython or loading a notebook from
147 158 any Jupyter-Compatible interface that has ipython set as a kernel can lead to
148 159 code execution.
149 160
150 161
151 162 I did not find any standard way for packaged to advertise CVEs they fix, I'm
152 163 thus trying to add a ``__patched_cves__`` attribute to the IPython module that
153 164 list the CVEs that should have been fixed. This attribute is informational only
154 165 as if a executable has a flaw, this value can always be changed by an attacker.
155 166
156 167 .. code::
157 168
158 169 In [1]: import IPython
159 170
160 171 In [2]: IPython.__patched_cves__
161 172 Out[2]: {'CVE-2022-21699'}
162 173
163 174 In [3]: 'CVE-2022-21699' in IPython.__patched_cves__
164 175 Out[3]: True
165 176
166 177 Thus starting with this version:
167 178
168 179 - The current working directory is not searched anymore for profiles or
169 180 configurations files.
170 181 - Added a ``__patched_cves__`` attribute (set of strings) to IPython module that contain
171 182 the list of fixed CVE. This is informational only.
172 183
173 184 Further details can be read on the `GitHub Advisory <https://github.com/ipython/ipython/security/advisories/GHSA-pq7m-3gw7-gq5x>`__
174 185
175 186
176 187 .. _version 8.0:
177 188
178 189 IPython 8.0
179 190 -----------
180 191
181 192 IPython 8.0 is bringing a large number of new features and improvements to both the
182 193 user of the terminal and of the kernel via Jupyter. The removal of compatibility
183 194 with older version of Python is also the opportunity to do a couple of
184 195 performance improvements in particular with respect to startup time.
185 196 The 8.x branch started diverging from its predecessor around IPython 7.12
186 197 (January 2020).
187 198
188 199 This release contains 250+ pull requests, in addition to many of the features
189 200 and backports that have made it to the 7.x branch. Please see the
190 201 `8.0 milestone <https://github.com/ipython/ipython/milestone/73?closed=1>`__ for the full list of pull requests.
191 202
192 203 Please feel free to send pull requests to updates those notes after release,
193 204 I have likely forgotten a few things reviewing 250+ PRs.
194 205
195 206 Dependencies changes/downstream packaging
196 207 -----------------------------------------
197 208
198 209 Most of our building steps have been changed to be (mostly) declarative
199 210 and follow PEP 517. We are trying to completely remove ``setup.py`` (:ghpull:`13238`) and are
200 211 looking for help to do so.
201 212
202 213 - minimum supported ``traitlets`` version is now 5+
203 214 - we now require ``stack_data``
204 215 - minimal Python is now 3.8
205 216 - ``nose`` is not a testing requirement anymore
206 217 - ``pytest`` replaces nose.
207 218 - ``iptest``/``iptest3`` cli entrypoints do not exists anymore.
208 219 - minimum officially support ``numpy`` version has been bumped, but this should
209 220 not have much effect on packaging.
210 221
211 222
212 223 Deprecation and removal
213 224 -----------------------
214 225
215 226 We removed almost all features, arguments, functions, and modules that were
216 227 marked as deprecated between IPython 1.0 and 5.0. As a reminder, 5.0 was released
217 228 in 2016, and 1.0 in 2013. Last release of the 5 branch was 5.10.0, in May 2020.
218 229 The few remaining deprecated features we left have better deprecation warnings
219 230 or have been turned into explicit errors for better error messages.
220 231
221 232 I will use this occasion to add the following requests to anyone emitting a
222 233 deprecation warning:
223 234
224 235 - Please add at least ``stacklevel=2`` so that the warning is emitted into the
225 236 caller context, and not the callee one.
226 237 - Please add **since which version** something is deprecated.
227 238
228 239 As a side note, it is much easier to conditionally compare version
229 240 numbers rather than using ``try/except`` when functionality changes with a version.
230 241
231 242 I won't list all the removed features here, but modules like ``IPython.kernel``,
232 243 which was just a shim module around ``ipykernel`` for the past 8 years, have been
233 244 removed, and so many other similar things that pre-date the name **Jupyter**
234 245 itself.
235 246
236 247 We no longer need to add ``IPython.extensions`` to the PYTHONPATH because that is being
237 248 handled by ``load_extension``.
238 249
239 250 We are also removing ``Cythonmagic``, ``sympyprinting`` and ``rmagic`` as they are now in
240 251 other packages and no longer need to be inside IPython.
241 252
242 253
243 254 Documentation
244 255 -------------
245 256
246 257 The majority of our docstrings have now been reformatted and automatically fixed by
247 258 the experimental `VΓ©lin <https://pypi.org/project/velin/>`_ project to conform
248 259 to numpydoc.
249 260
250 261 Type annotations
251 262 ----------------
252 263
253 264 While IPython itself is highly dynamic and can't be completely typed, many of
254 265 the functions now have type annotations, and part of the codebase is now checked
255 266 by mypy.
256 267
257 268
258 269 Featured changes
259 270 ----------------
260 271
261 272 Here is a features list of changes in IPython 8.0. This is of course non-exhaustive.
262 273 Please note as well that many features have been added in the 7.x branch as well
263 274 (and hence why you want to read the 7.x what's new notes), in particular
264 275 features contributed by QuantStack (with respect to debugger protocol and Xeus
265 276 Python), as well as many debugger features that I was pleased to implement as
266 277 part of my work at QuanSight and sponsored by DE Shaw.
267 278
268 279 Traceback improvements
269 280 ~~~~~~~~~~~~~~~~~~~~~~
270 281
271 282 Previously, error tracebacks for errors happening in code cells were showing a
272 283 hash, the one used for compiling the Python AST::
273 284
274 285 In [1]: def foo():
275 286 ...: return 3 / 0
276 287 ...:
277 288
278 289 In [2]: foo()
279 290 ---------------------------------------------------------------------------
280 291 ZeroDivisionError Traceback (most recent call last)
281 292 <ipython-input-2-c19b6d9633cf> in <module>
282 293 ----> 1 foo()
283 294
284 295 <ipython-input-1-1595a74c32d5> in foo()
285 296 1 def foo():
286 297 ----> 2 return 3 / 0
287 298 3
288 299
289 300 ZeroDivisionError: division by zero
290 301
291 302 The error traceback is now correctly formatted, showing the cell number in which the error happened::
292 303
293 304 In [1]: def foo():
294 305 ...: return 3 / 0
295 306 ...:
296 307
297 308 Input In [2]: foo()
298 309 ---------------------------------------------------------------------------
299 310 ZeroDivisionError Traceback (most recent call last)
300 311 input In [2], in <module>
301 312 ----> 1 foo()
302 313
303 314 Input In [1], in foo()
304 315 1 def foo():
305 316 ----> 2 return 3 / 0
306 317
307 318 ZeroDivisionError: division by zero
308 319
309 320 The ``stack_data`` package has been integrated, which provides smarter information in the traceback;
310 321 in particular it will highlight the AST node where an error occurs which can help to quickly narrow down errors.
311 322
312 323 For example in the following snippet::
313 324
314 325 def foo(i):
315 326 x = [[[0]]]
316 327 return x[0][i][0]
317 328
318 329
319 330 def bar():
320 331 return foo(0) + foo(
321 332 1
322 333 ) + foo(2)
323 334
324 335
325 336 calling ``bar()`` would raise an ``IndexError`` on the return line of ``foo``,
326 337 and IPython 8.0 is capable of telling you where the index error occurs::
327 338
328 339
329 340 IndexError
330 341 Input In [2], in <module>
331 342 ----> 1 bar()
332 343 ^^^^^
333 344
334 345 Input In [1], in bar()
335 346 6 def bar():
336 347 ----> 7 return foo(0) + foo(
337 348 ^^^^
338 349 8 1
339 350 ^^^^^^^^
340 351 9 ) + foo(2)
341 352 ^^^^
342 353
343 354 Input In [1], in foo(i)
344 355 1 def foo(i):
345 356 2 x = [[[0]]]
346 357 ----> 3 return x[0][i][0]
347 358 ^^^^^^^
348 359
349 360 The corresponding locations marked here with ``^`` will show up highlighted in
350 361 the terminal and notebooks.
351 362
352 363 Finally, a colon ``::`` and line number is appended after a filename in
353 364 traceback::
354 365
355 366
356 367 ZeroDivisionError Traceback (most recent call last)
357 368 File ~/error.py:4, in <module>
358 369 1 def f():
359 370 2 1/0
360 371 ----> 4 f()
361 372
362 373 File ~/error.py:2, in f()
363 374 1 def f():
364 375 ----> 2 1/0
365 376
366 377 Many terminals and editors have integrations enabling you to directly jump to the
367 378 relevant file/line when this syntax is used, so this small addition may have a high
368 379 impact on productivity.
369 380
370 381
371 382 Autosuggestions
372 383 ~~~~~~~~~~~~~~~
373 384
374 385 Autosuggestion is a very useful feature available in `fish <https://fishshell.com/>`__, `zsh <https://en.wikipedia.org/wiki/Z_shell>`__, and `prompt-toolkit <https://python-prompt-toolkit.readthedocs.io/en/master/pages/asking_for_input.html#auto-suggestion>`__.
375 386
376 387 `Ptpython <https://github.com/prompt-toolkit/ptpython#ptpython>`__ allows users to enable this feature in
377 388 `ptpython/config.py <https://github.com/prompt-toolkit/ptpython/blob/master/examples/ptpython_config/config.py#L90>`__.
378 389
379 390 This feature allows users to accept autosuggestions with ctrl e, ctrl f,
380 391 or right arrow as described below.
381 392
382 393 1. Start ipython
383 394
384 395 .. image:: ../_images/8.0/auto_suggest_1_prompt_no_text.png
385 396
386 397 2. Run ``print("hello")``
387 398
388 399 .. image:: ../_images/8.0/auto_suggest_2_print_hello_suggest.png
389 400
390 401 3. start typing ``print`` again to see the autosuggestion
391 402
392 403 .. image:: ../_images/8.0/auto_suggest_3_print_hello_suggest.png
393 404
394 405 4. Press ``ctrl-f``, or ``ctrl-e``, or ``right-arrow`` to accept the suggestion
395 406
396 407 .. image:: ../_images/8.0/auto_suggest_4_print_hello.png
397 408
398 409 You can also complete word by word:
399 410
400 411 1. Run ``def say_hello(): print("hello")``
401 412
402 413 .. image:: ../_images/8.0/auto_suggest_second_prompt.png
403 414
404 415 2. Start typing the first letter if ``def`` to see the autosuggestion
405 416
406 417 .. image:: ../_images/8.0/auto_suggest_d_phantom.png
407 418
408 419 3. Press ``alt-f`` (or ``escape`` followed by ``f``), to accept the first word of the suggestion
409 420
410 421 .. image:: ../_images/8.0/auto_suggest_def_phantom.png
411 422
412 423 Importantly, this feature does not interfere with tab completion:
413 424
414 425 1. After running ``def say_hello(): print("hello")``, press d
415 426
416 427 .. image:: ../_images/8.0/auto_suggest_d_phantom.png
417 428
418 429 2. Press Tab to start tab completion
419 430
420 431 .. image:: ../_images/8.0/auto_suggest_d_completions.png
421 432
422 433 3A. Press Tab again to select the first option
423 434
424 435 .. image:: ../_images/8.0/auto_suggest_def_completions.png
425 436
426 437 3B. Press ``alt f`` (``escape``, ``f``) to accept to accept the first word of the suggestion
427 438
428 439 .. image:: ../_images/8.0/auto_suggest_def_phantom.png
429 440
430 441 3C. Press ``ctrl-f`` or ``ctrl-e`` to accept the entire suggestion
431 442
432 443 .. image:: ../_images/8.0/auto_suggest_match_parens.png
433 444
434 445
435 446 Currently, autosuggestions are only shown in the emacs or vi insert editing modes:
436 447
437 448 - The ctrl e, ctrl f, and alt f shortcuts work by default in emacs mode.
438 449 - To use these shortcuts in vi insert mode, you will have to create `custom keybindings in your config.py <https://github.com/mskar/setup/commit/2892fcee46f9f80ef7788f0749edc99daccc52f4/>`__.
439 450
440 451
441 452 Show pinfo information in ipdb using "?" and "??"
442 453 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
443 454
444 455 In IPDB, it is now possible to show the information about an object using "?"
445 456 and "??", in much the same way that it can be done when using the IPython prompt::
446 457
447 458 ipdb> partial?
448 459 Init signature: partial(self, /, *args, **kwargs)
449 460 Docstring:
450 461 partial(func, *args, **keywords) - new function with partial application
451 462 of the given arguments and keywords.
452 463 File: ~/.pyenv/versions/3.8.6/lib/python3.8/functools.py
453 464 Type: type
454 465 Subclasses:
455 466
456 467 Previously, ``pinfo`` or ``pinfo2`` command had to be used for this purpose.
457 468
458 469
459 470 Autoreload 3 feature
460 471 ~~~~~~~~~~~~~~~~~~~~
461 472
462 473 Example: When an IPython session is run with the 'autoreload' extension loaded,
463 474 you will now have the option '3' to select, which means the following:
464 475
465 476 1. replicate all functionality from option 2
466 477 2. autoload all new funcs/classes/enums/globals from the module when they are added
467 478 3. autoload all newly imported funcs/classes/enums/globals from external modules
468 479
469 480 Try ``%autoreload 3`` in an IPython session after running ``%load_ext autoreload``.
470 481
471 482 For more information please see the following unit test : ``extensions/tests/test_autoreload.py:test_autoload_newly_added_objects``
472 483
473 484 Auto formatting with black in the CLI
474 485 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
475 486
476 487 This feature was present in 7.x, but disabled by default.
477 488
478 489 In 8.0, input was automatically reformatted with Black when black was installed.
479 490 This feature has been reverted for the time being.
480 491 You can re-enable it by setting ``TerminalInteractiveShell.autoformatter`` to ``"black"``
481 492
482 493 History Range Glob feature
483 494 ~~~~~~~~~~~~~~~~~~~~~~~~~~
484 495
485 496 Previously, when using ``%history``, users could specify either
486 497 a range of sessions and lines, for example:
487 498
488 499 .. code-block:: python
489 500
490 501 ~8/1-~6/5 # see history from the first line of 8 sessions ago,
491 502 # to the fifth line of 6 sessions ago.``
492 503
493 504 Or users could specify a glob pattern:
494 505
495 506 .. code-block:: python
496 507
497 508 -g <pattern> # glob ALL history for the specified pattern.
498 509
499 510 However users could *not* specify both.
500 511
501 512 If a user *did* specify both a range and a glob pattern,
502 513 then the glob pattern would be used (globbing *all* history) *and the range would be ignored*.
503 514
504 515 With this enhancement, if a user specifies both a range and a glob pattern, then the glob pattern will be applied to the specified range of history.
505 516
506 517 Don't start a multi-line cell with sunken parenthesis
507 518 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
508 519
509 520 From now on, IPython will not ask for the next line of input when given a single
510 521 line with more closing than opening brackets. For example, this means that if
511 522 you (mis)type ``]]`` instead of ``[]``, a ``SyntaxError`` will show up, instead of
512 523 the ``...:`` prompt continuation.
513 524
514 525 IPython shell for ipdb interact
515 526 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
516 527
517 528 The ipdb ``interact`` starts an IPython shell instead of Python's built-in ``code.interact()``.
518 529
519 530 Automatic Vi prompt stripping
520 531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
521 532
522 533 When pasting code into IPython, it will strip the leading prompt characters if
523 534 there are any. For example, you can paste the following code into the console -
524 535 it will still work, even though each line is prefixed with prompts (``In``,
525 536 ``Out``)::
526 537
527 538 In [1]: 2 * 2 == 4
528 539 Out[1]: True
529 540
530 541 In [2]: print("This still works as pasted")
531 542
532 543
533 544 Previously, this was not the case for the Vi-mode prompts::
534 545
535 546 In [1]: [ins] In [13]: 2 * 2 == 4
536 547 ...: Out[13]: True
537 548 ...:
538 549 File "<ipython-input-1-727bb88eaf33>", line 1
539 550 [ins] In [13]: 2 * 2 == 4
540 551 ^
541 552 SyntaxError: invalid syntax
542 553
543 554 This is now fixed, and Vi prompt prefixes - ``[ins]`` and ``[nav]`` - are
544 555 skipped just as the normal ``In`` would be.
545 556
546 557 IPython shell can be started in the Vi mode using ``ipython --TerminalInteractiveShell.editing_mode=vi``,
547 558 You should be able to change mode dynamically with ``%config TerminalInteractiveShell.editing_mode='vi'``
548 559
549 560 Empty History Ranges
550 561 ~~~~~~~~~~~~~~~~~~~~
551 562
552 563 A number of magics that take history ranges can now be used with an empty
553 564 range. These magics are:
554 565
555 566 * ``%save``
556 567 * ``%load``
557 568 * ``%pastebin``
558 569 * ``%pycat``
559 570
560 571 Using them this way will make them take the history of the current session up
561 572 to the point of the magic call (such that the magic itself will not be
562 573 included).
563 574
564 575 Therefore it is now possible to save the whole history to a file using
565 576 ``%save <filename>``, load and edit it using ``%load`` (makes for a nice usage
566 577 when followed with :kbd:`F2`), send it to `dpaste.org <http://dpast.org>`_ using
567 578 ``%pastebin``, or view the whole thing syntax-highlighted with a single
568 579 ``%pycat``.
569 580
570 581
571 582 Windows timing implementation: Switch to process_time
572 583 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
573 584 Timing on Windows, for example with ``%%time``, was changed from being based on ``time.perf_counter``
574 585 (which counted time even when the process was sleeping) to being based on ``time.process_time`` instead
575 586 (which only counts CPU time). This brings it closer to the behavior on Linux. See :ghpull:`12984`.
576 587
577 588 Miscellaneous
578 589 ~~~~~~~~~~~~~
579 590 - Non-text formatters are not disabled in the terminal, which should simplify
580 591 writing extensions displaying images or other mimetypes in supporting terminals.
581 592 :ghpull:`12315`
582 593 - It is now possible to automatically insert matching brackets in Terminal IPython using the
583 594 ``TerminalInteractiveShell.auto_match=True`` option. :ghpull:`12586`
584 595 - We are thinking of deprecating the current ``%%javascript`` magic in favor of a better replacement. See :ghpull:`13376`.
585 596 - ``~`` is now expanded when part of a path in most magics :ghpull:`13385`
586 597 - ``%/%%timeit`` magic now adds a comma every thousands to make reading a long number easier :ghpull:`13379`
587 598 - ``"info"`` messages can now be customised to hide some fields :ghpull:`13343`
588 599 - ``collections.UserList`` now pretty-prints :ghpull:`13320`
589 600 - The debugger now has a persistent history, which should make it less
590 601 annoying to retype commands :ghpull:`13246`
591 602 - ``!pip`` ``!conda`` ``!cd`` or ``!ls`` are likely doing the wrong thing. We
592 603 now warn users if they use one of those commands. :ghpull:`12954`
593 604 - Make ``%precision`` work for ``numpy.float64`` type :ghpull:`12902`
594 605
595 606 Re-added support for XDG config directories
596 607 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
597 608
598 609 XDG support through the years comes and goes. There is a tension between having
599 610 an identical location for configuration in all platforms versus having simple instructions.
600 611 After initial failures a couple of years ago, IPython was modified to automatically migrate XDG
601 612 config files back into ``~/.ipython``. That migration code has now been removed.
602 613 IPython now checks the XDG locations, so if you _manually_ move your config
603 614 files to your preferred location, IPython will not move them back.
604 615
605 616
606 617 Preparing for Python 3.10
607 618 -------------------------
608 619
609 620 To prepare for Python 3.10, we have started working on removing reliance and
610 621 any dependency that is not compatible with Python 3.10. This includes migrating our
611 622 test suite to pytest and starting to remove nose. This also means that the
612 623 ``iptest`` command is now gone and all testing is via pytest.
613 624
614 625 This was in large part thanks to the NumFOCUS Small Developer grant, which enabled us to
615 626 allocate \$4000 to hire `Nikita Kniazev (@Kojoley) <https://github.com/Kojoley>`_,
616 627 who did a fantastic job at updating our code base, migrating to pytest, pushing
617 628 our coverage, and fixing a large number of bugs. I highly recommend contacting
618 629 them if you need help with C++ and Python projects.
619 630
620 631 You can find all relevant issues and PRs with `the SDG 2021 tag <https://github.com/ipython/ipython/issues?q=label%3A%22Numfocus+SDG+2021%22+>`__
621 632
622 633 Removing support for older Python versions
623 634 ------------------------------------------
624 635
625 636
626 637 We are removing support for Python up through 3.7, allowing internal code to use the more
627 638 efficient ``pathlib`` and to make better use of type annotations.
628 639
629 640 .. image:: ../_images/8.0/pathlib_pathlib_everywhere.jpg
630 641 :alt: "Meme image of Toy Story with Woody and Buzz, with the text 'pathlib, pathlib everywhere'"
631 642
632 643
633 644 We had about 34 PRs only to update some logic to update some functions from managing strings to
634 645 using Pathlib.
635 646
636 647 The completer has also seen significant updates and now makes use of newer Jedi APIs,
637 648 offering faster and more reliable tab completion.
638 649
639 650 Misc Statistics
640 651 ---------------
641 652
642 653 Here are some numbers::
643 654
644 655 7.x: 296 files, 12561 blank lines, 20282 comments, 35142 line of code.
645 656 8.0: 252 files, 12053 blank lines, 19232 comments, 34505 line of code.
646 657
647 658 $ git diff --stat 7.x...master | tail -1
648 659 340 files changed, 13399 insertions(+), 12421 deletions(-)
649 660
650 661 We have commits from 162 authors, who contributed 1916 commits in 23 month, excluding merges (to not bias toward
651 662 maintainers pushing buttons).::
652 663
653 664 $ git shortlog -s --no-merges 7.x...master | sort -nr
654 665 535 Matthias Bussonnier
655 666 86 Nikita Kniazev
656 667 69 Blazej Michalik
657 668 49 Samuel Gaist
658 669 27 Itamar Turner-Trauring
659 670 18 Spas Kalaydzhisyki
660 671 17 Thomas Kluyver
661 672 17 Quentin Peter
662 673 17 James Morris
663 674 17 Artur Svistunov
664 675 15 Bart Skowron
665 676 14 Alex Hall
666 677 13 rushabh-v
667 678 13 Terry Davis
668 679 13 Benjamin Ragan-Kelley
669 680 8 martinRenou
670 681 8 farisachugthai
671 682 7 dswij
672 683 7 Gal B
673 684 7 Corentin Cadiou
674 685 6 yuji96
675 686 6 Martin Skarzynski
676 687 6 Justin Palmer
677 688 6 Daniel Goldfarb
678 689 6 Ben Greiner
679 690 5 Sammy Al Hashemi
680 691 5 Paul Ivanov
681 692 5 Inception95
682 693 5 Eyenpi
683 694 5 Douglas Blank
684 695 5 Coco Mishra
685 696 5 Bibo Hao
686 697 5 AndrΓ© A. Gomes
687 698 5 Ahmed Fasih
688 699 4 takuya fujiwara
689 700 4 palewire
690 701 4 Thomas A Caswell
691 702 4 Talley Lambert
692 703 4 Scott Sanderson
693 704 4 Ram Rachum
694 705 4 Nick Muoh
695 706 4 Nathan Goldbaum
696 707 4 Mithil Poojary
697 708 4 Michael T
698 709 4 Jakub Klus
699 710 4 Ian Castleden
700 711 4 Eli Rykoff
701 712 4 Ashwin Vishnu
702 713 3 谭九鼎
703 714 3 sleeping
704 715 3 Sylvain Corlay
705 716 3 Peter Corke
706 717 3 Paul Bissex
707 718 3 Matthew Feickert
708 719 3 Fernando Perez
709 720 3 Eric Wieser
710 721 3 Daniel Mietchen
711 722 3 Aditya Sathe
712 723 3 007vedant
713 724 2 rchiodo
714 725 2 nicolaslazo
715 726 2 luttik
716 727 2 gorogoroumaru
717 728 2 foobarbyte
718 729 2 bar-hen
719 730 2 Theo Ouzhinski
720 731 2 Strawkage
721 732 2 Samreen Zarroug
722 733 2 Pete Blois
723 734 2 Meysam Azad
724 735 2 Matthieu Ancellin
725 736 2 Mark Schmitz
726 737 2 Maor Kleinberger
727 738 2 MRCWirtz
728 739 2 Lumir Balhar
729 740 2 Julien Rabinow
730 741 2 Juan Luis Cano RodrΓ­guez
731 742 2 Joyce Er
732 743 2 Jakub
733 744 2 Faris A Chugthai
734 745 2 Ethan Madden
735 746 2 Dimitri Papadopoulos
736 747 2 Diego Fernandez
737 748 2 Daniel Shimon
738 749 2 Coco Bennett
739 750 2 Carlos Cordoba
740 751 2 Boyuan Liu
741 752 2 BaoGiang HoangVu
742 753 2 Augusto
743 754 2 Arthur Svistunov
744 755 2 Arthur Moreira
745 756 2 Ali Nabipour
746 757 2 Adam Hackbarth
747 758 1 richard
748 759 1 linar-jether
749 760 1 lbennett
750 761 1 juacrumar
751 762 1 gpotter2
752 763 1 digitalvirtuoso
753 764 1 dalthviz
754 765 1 Yonatan Goldschmidt
755 766 1 Tomasz KΕ‚oczko
756 767 1 Tobias Bengfort
757 768 1 Timur Kushukov
758 769 1 Thomas
759 770 1 Snir Broshi
760 771 1 Shao Yang Hong
761 772 1 Sanjana-03
762 773 1 Romulo Filho
763 774 1 Rodolfo Carvalho
764 775 1 Richard Shadrach
765 776 1 Reilly Tucker Siemens
766 777 1 Rakessh Roshan
767 778 1 Piers Titus van der Torren
768 779 1 PhanatosZou
769 780 1 Pavel Safronov
770 781 1 Paulo S. Costa
771 782 1 Paul McCarthy
772 783 1 NotWearingPants
773 784 1 Naelson Douglas
774 785 1 Michael Tiemann
775 786 1 Matt Wozniski
776 787 1 Markus Wageringel
777 788 1 Marcus Wirtz
778 789 1 Marcio Mazza
779 790 1 LumΓ­r 'Frenzy' Balhar
780 791 1 Lightyagami1
781 792 1 Leon Anavi
782 793 1 LeafyLi
783 794 1 L0uisJ0shua
784 795 1 Kyle Cutler
785 796 1 Krzysztof Cybulski
786 797 1 Kevin Kirsche
787 798 1 KIU Shueng Chuan
788 799 1 Jonathan Slenders
789 800 1 Jay Qi
790 801 1 Jake VanderPlas
791 802 1 Iwan Briquemont
792 803 1 Hussaina Begum Nandyala
793 804 1 Gordon Ball
794 805 1 Gabriel Simonetto
795 806 1 Frank Tobia
796 807 1 Erik
797 808 1 Elliott Sales de Andrade
798 809 1 Daniel Hahler
799 810 1 Dan Green-Leipciger
800 811 1 Dan Green
801 812 1 Damian Yurzola
802 813 1 Coon, Ethan T
803 814 1 Carol Willing
804 815 1 Brian Lee
805 816 1 Brendan Gerrity
806 817 1 Blake Griffin
807 818 1 Bastian Ebeling
808 819 1 Bartosz Telenczuk
809 820 1 Ankitsingh6299
810 821 1 Andrew Port
811 822 1 Andrew J. Hesford
812 823 1 Albert Zhang
813 824 1 Adam Johnson
814 825
815 826 This does not, of course, represent non-code contributions, for which we are also grateful.
816 827
817 828
818 829 API Changes using Frappuccino
819 830 -----------------------------
820 831
821 832 This is an experimental exhaustive API difference using `Frappuccino <https://pypi.org/project/frappuccino/>`_
822 833
823 834
824 835 The following items are new in IPython 8.0 ::
825 836
826 837 + IPython.core.async_helpers.get_asyncio_loop()
827 838 + IPython.core.completer.Dict
828 839 + IPython.core.completer.Pattern
829 840 + IPython.core.completer.Sequence
830 841 + IPython.core.completer.__skip_doctest__
831 842 + IPython.core.debugger.Pdb.precmd(self, line)
832 843 + IPython.core.debugger.__skip_doctest__
833 844 + IPython.core.display.__getattr__(name)
834 845 + IPython.core.display.warn
835 846 + IPython.core.display_functions
836 847 + IPython.core.display_functions.DisplayHandle
837 848 + IPython.core.display_functions.DisplayHandle.display(self, obj, **kwargs)
838 849 + IPython.core.display_functions.DisplayHandle.update(self, obj, **kwargs)
839 850 + IPython.core.display_functions.__all__
840 851 + IPython.core.display_functions.__builtins__
841 852 + IPython.core.display_functions.__cached__
842 853 + IPython.core.display_functions.__doc__
843 854 + IPython.core.display_functions.__file__
844 855 + IPython.core.display_functions.__loader__
845 856 + IPython.core.display_functions.__name__
846 857 + IPython.core.display_functions.__package__
847 858 + IPython.core.display_functions.__spec__
848 859 + IPython.core.display_functions.b2a_hex
849 860 + IPython.core.display_functions.clear_output(wait=False)
850 861 + IPython.core.display_functions.display(*objs, include='None', exclude='None', metadata='None', transient='None', display_id='None', raw=False, clear=False, **kwargs)
851 862 + IPython.core.display_functions.publish_display_data(data, metadata='None', source='<deprecated>', *, transient='None', **kwargs)
852 863 + IPython.core.display_functions.update_display(obj, *, display_id, **kwargs)
853 864 + IPython.core.extensions.BUILTINS_EXTS
854 865 + IPython.core.inputtransformer2.has_sunken_brackets(tokens)
855 866 + IPython.core.interactiveshell.Callable
856 867 + IPython.core.interactiveshell.__annotations__
857 868 + IPython.core.ultratb.List
858 869 + IPython.core.ultratb.Tuple
859 870 + IPython.lib.pretty.CallExpression
860 871 + IPython.lib.pretty.CallExpression.factory(name)
861 872 + IPython.lib.pretty.RawStringLiteral
862 873 + IPython.lib.pretty.RawText
863 874 + IPython.terminal.debugger.TerminalPdb.do_interact(self, arg)
864 875 + IPython.terminal.embed.Set
865 876
866 877 The following items have been removed (or moved to superclass)::
867 878
868 879 - IPython.core.application.BaseIPythonApplication.initialize_subcommand
869 880 - IPython.core.completer.Sentinel
870 881 - IPython.core.completer.skip_doctest
871 882 - IPython.core.debugger.Tracer
872 883 - IPython.core.display.DisplayHandle
873 884 - IPython.core.display.DisplayHandle.display
874 885 - IPython.core.display.DisplayHandle.update
875 886 - IPython.core.display.b2a_hex
876 887 - IPython.core.display.clear_output
877 888 - IPython.core.display.display
878 889 - IPython.core.display.publish_display_data
879 890 - IPython.core.display.update_display
880 891 - IPython.core.excolors.Deprec
881 892 - IPython.core.excolors.ExceptionColors
882 893 - IPython.core.history.warn
883 894 - IPython.core.hooks.late_startup_hook
884 895 - IPython.core.hooks.pre_run_code_hook
885 896 - IPython.core.hooks.shutdown_hook
886 897 - IPython.core.interactiveshell.InteractiveShell.init_deprecation_warnings
887 898 - IPython.core.interactiveshell.InteractiveShell.init_readline
888 899 - IPython.core.interactiveshell.InteractiveShell.write
889 900 - IPython.core.interactiveshell.InteractiveShell.write_err
890 901 - IPython.core.interactiveshell.get_default_colors
891 902 - IPython.core.interactiveshell.removed_co_newlocals
892 903 - IPython.core.magics.execution.ExecutionMagics.profile_missing_notice
893 904 - IPython.core.magics.script.PIPE
894 905 - IPython.core.prefilter.PrefilterManager.init_transformers
895 906 - IPython.core.release.classifiers
896 907 - IPython.core.release.description
897 908 - IPython.core.release.keywords
898 909 - IPython.core.release.long_description
899 910 - IPython.core.release.name
900 911 - IPython.core.release.platforms
901 912 - IPython.core.release.url
902 913 - IPython.core.ultratb.VerboseTB.format_records
903 914 - IPython.core.ultratb.find_recursion
904 915 - IPython.core.ultratb.findsource
905 916 - IPython.core.ultratb.fix_frame_records_filenames
906 917 - IPython.core.ultratb.inspect_error
907 918 - IPython.core.ultratb.is_recursion_error
908 919 - IPython.core.ultratb.with_patch_inspect
909 920 - IPython.external.__all__
910 921 - IPython.external.__builtins__
911 922 - IPython.external.__cached__
912 923 - IPython.external.__doc__
913 924 - IPython.external.__file__
914 925 - IPython.external.__loader__
915 926 - IPython.external.__name__
916 927 - IPython.external.__package__
917 928 - IPython.external.__path__
918 929 - IPython.external.__spec__
919 930 - IPython.kernel.KernelConnectionInfo
920 931 - IPython.kernel.__builtins__
921 932 - IPython.kernel.__cached__
922 933 - IPython.kernel.__warningregistry__
923 934 - IPython.kernel.pkg
924 935 - IPython.kernel.protocol_version
925 936 - IPython.kernel.protocol_version_info
926 937 - IPython.kernel.src
927 938 - IPython.kernel.version_info
928 939 - IPython.kernel.warn
929 940 - IPython.lib.backgroundjobs
930 941 - IPython.lib.backgroundjobs.BackgroundJobBase
931 942 - IPython.lib.backgroundjobs.BackgroundJobBase.run
932 943 - IPython.lib.backgroundjobs.BackgroundJobBase.traceback
933 944 - IPython.lib.backgroundjobs.BackgroundJobExpr
934 945 - IPython.lib.backgroundjobs.BackgroundJobExpr.call
935 946 - IPython.lib.backgroundjobs.BackgroundJobFunc
936 947 - IPython.lib.backgroundjobs.BackgroundJobFunc.call
937 948 - IPython.lib.backgroundjobs.BackgroundJobManager
938 949 - IPython.lib.backgroundjobs.BackgroundJobManager.flush
939 950 - IPython.lib.backgroundjobs.BackgroundJobManager.new
940 951 - IPython.lib.backgroundjobs.BackgroundJobManager.remove
941 952 - IPython.lib.backgroundjobs.BackgroundJobManager.result
942 953 - IPython.lib.backgroundjobs.BackgroundJobManager.status
943 954 - IPython.lib.backgroundjobs.BackgroundJobManager.traceback
944 955 - IPython.lib.backgroundjobs.__builtins__
945 956 - IPython.lib.backgroundjobs.__cached__
946 957 - IPython.lib.backgroundjobs.__doc__
947 958 - IPython.lib.backgroundjobs.__file__
948 959 - IPython.lib.backgroundjobs.__loader__
949 960 - IPython.lib.backgroundjobs.__name__
950 961 - IPython.lib.backgroundjobs.__package__
951 962 - IPython.lib.backgroundjobs.__spec__
952 963 - IPython.lib.kernel.__builtins__
953 964 - IPython.lib.kernel.__cached__
954 965 - IPython.lib.kernel.__doc__
955 966 - IPython.lib.kernel.__file__
956 967 - IPython.lib.kernel.__loader__
957 968 - IPython.lib.kernel.__name__
958 969 - IPython.lib.kernel.__package__
959 970 - IPython.lib.kernel.__spec__
960 971 - IPython.lib.kernel.__warningregistry__
961 972 - IPython.paths.fs_encoding
962 973 - IPython.terminal.debugger.DEFAULT_BUFFER
963 974 - IPython.terminal.debugger.cursor_in_leading_ws
964 975 - IPython.terminal.debugger.emacs_insert_mode
965 976 - IPython.terminal.debugger.has_selection
966 977 - IPython.terminal.debugger.vi_insert_mode
967 978 - IPython.terminal.interactiveshell.DISPLAY_BANNER_DEPRECATED
968 979 - IPython.terminal.ipapp.TerminalIPythonApp.parse_command_line
969 980 - IPython.testing.test
970 981 - IPython.utils.contexts.NoOpContext
971 982 - IPython.utils.io.IOStream
972 983 - IPython.utils.io.IOStream.close
973 984 - IPython.utils.io.IOStream.write
974 985 - IPython.utils.io.IOStream.writelines
975 986 - IPython.utils.io.__warningregistry__
976 987 - IPython.utils.io.atomic_writing
977 988 - IPython.utils.io.stderr
978 989 - IPython.utils.io.stdin
979 990 - IPython.utils.io.stdout
980 991 - IPython.utils.io.unicode_std_stream
981 992 - IPython.utils.path.get_ipython_cache_dir
982 993 - IPython.utils.path.get_ipython_dir
983 994 - IPython.utils.path.get_ipython_module_path
984 995 - IPython.utils.path.get_ipython_package_dir
985 996 - IPython.utils.path.locate_profile
986 997 - IPython.utils.path.unquote_filename
987 998 - IPython.utils.py3compat.PY2
988 999 - IPython.utils.py3compat.PY3
989 1000 - IPython.utils.py3compat.buffer_to_bytes
990 1001 - IPython.utils.py3compat.builtin_mod_name
991 1002 - IPython.utils.py3compat.cast_bytes
992 1003 - IPython.utils.py3compat.getcwd
993 1004 - IPython.utils.py3compat.isidentifier
994 1005 - IPython.utils.py3compat.u_format
995 1006
996 1007 The following signatures differ between 7.x and 8.0::
997 1008
998 1009 - IPython.core.completer.IPCompleter.unicode_name_matches(self, text)
999 1010 + IPython.core.completer.IPCompleter.unicode_name_matches(text)
1000 1011
1001 1012 - IPython.core.completer.match_dict_keys(keys, prefix, delims)
1002 1013 + IPython.core.completer.match_dict_keys(keys, prefix, delims, extra_prefix='None')
1003 1014
1004 1015 - IPython.core.interactiveshell.InteractiveShell.object_inspect_mime(self, oname, detail_level=0)
1005 1016 + IPython.core.interactiveshell.InteractiveShell.object_inspect_mime(self, oname, detail_level=0, omit_sections='()')
1006 1017
1007 1018 - IPython.core.interactiveshell.InteractiveShell.set_hook(self, name, hook, priority=50, str_key='None', re_key='None', _warn_deprecated=True)
1008 1019 + IPython.core.interactiveshell.InteractiveShell.set_hook(self, name, hook, priority=50, str_key='None', re_key='None')
1009 1020
1010 1021 - IPython.core.oinspect.Inspector.info(self, obj, oname='', formatter='None', info='None', detail_level=0)
1011 1022 + IPython.core.oinspect.Inspector.info(self, obj, oname='', info='None', detail_level=0)
1012 1023
1013 1024 - IPython.core.oinspect.Inspector.pinfo(self, obj, oname='', formatter='None', info='None', detail_level=0, enable_html_pager=True)
1014 1025 + IPython.core.oinspect.Inspector.pinfo(self, obj, oname='', formatter='None', info='None', detail_level=0, enable_html_pager=True, omit_sections='()')
1015 1026
1016 1027 - IPython.core.profiledir.ProfileDir.copy_config_file(self, config_file, path='None', overwrite=False)
1017 1028 + IPython.core.profiledir.ProfileDir.copy_config_file(self, config_file, path, overwrite=False)
1018 1029
1019 1030 - IPython.core.ultratb.VerboseTB.format_record(self, frame, file, lnum, func, lines, index)
1020 1031 + IPython.core.ultratb.VerboseTB.format_record(self, frame_info)
1021 1032
1022 1033 - IPython.terminal.embed.InteractiveShellEmbed.mainloop(self, local_ns='None', module='None', stack_depth=0, display_banner='None', global_ns='None', compile_flags='None')
1023 1034 + IPython.terminal.embed.InteractiveShellEmbed.mainloop(self, local_ns='None', module='None', stack_depth=0, compile_flags='None')
1024 1035
1025 1036 - IPython.terminal.embed.embed(**kwargs)
1026 1037 + IPython.terminal.embed.embed(*, header='', compile_flags='None', **kwargs)
1027 1038
1028 1039 - IPython.terminal.interactiveshell.TerminalInteractiveShell.interact(self, display_banner='<object object at 0xffffff>')
1029 1040 + IPython.terminal.interactiveshell.TerminalInteractiveShell.interact(self)
1030 1041
1031 1042 - IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop(self, display_banner='<object object at 0xffffff>')
1032 1043 + IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop(self)
1033 1044
1034 1045 - IPython.utils.path.get_py_filename(name, force_win32='None')
1035 1046 + IPython.utils.path.get_py_filename(name)
1036 1047
1037 1048 The following are new attributes (that might be inherited)::
1038 1049
1039 1050 + IPython.core.completer.IPCompleter.unicode_names
1040 1051 + IPython.core.debugger.InterruptiblePdb.precmd
1041 1052 + IPython.core.debugger.Pdb.precmd
1042 1053 + IPython.core.ultratb.AutoFormattedTB.has_colors
1043 1054 + IPython.core.ultratb.ColorTB.has_colors
1044 1055 + IPython.core.ultratb.FormattedTB.has_colors
1045 1056 + IPython.core.ultratb.ListTB.has_colors
1046 1057 + IPython.core.ultratb.SyntaxTB.has_colors
1047 1058 + IPython.core.ultratb.TBTools.has_colors
1048 1059 + IPython.core.ultratb.VerboseTB.has_colors
1049 1060 + IPython.terminal.debugger.TerminalPdb.do_interact
1050 1061 + IPython.terminal.debugger.TerminalPdb.precmd
1051 1062
1052 1063 The following attribute/methods have been removed::
1053 1064
1054 1065 - IPython.core.application.BaseIPythonApplication.deprecated_subcommands
1055 1066 - IPython.core.ultratb.AutoFormattedTB.format_records
1056 1067 - IPython.core.ultratb.ColorTB.format_records
1057 1068 - IPython.core.ultratb.FormattedTB.format_records
1058 1069 - IPython.terminal.embed.InteractiveShellEmbed.init_deprecation_warnings
1059 1070 - IPython.terminal.embed.InteractiveShellEmbed.init_readline
1060 1071 - IPython.terminal.embed.InteractiveShellEmbed.write
1061 1072 - IPython.terminal.embed.InteractiveShellEmbed.write_err
1062 1073 - IPython.terminal.interactiveshell.TerminalInteractiveShell.init_deprecation_warnings
1063 1074 - IPython.terminal.interactiveshell.TerminalInteractiveShell.init_readline
1064 1075 - IPython.terminal.interactiveshell.TerminalInteractiveShell.write
1065 1076 - IPython.terminal.interactiveshell.TerminalInteractiveShell.write_err
1066 1077 - IPython.terminal.ipapp.LocateIPythonApp.deprecated_subcommands
1067 1078 - IPython.terminal.ipapp.LocateIPythonApp.initialize_subcommand
1068 1079 - IPython.terminal.ipapp.TerminalIPythonApp.deprecated_subcommands
1069 1080 - IPython.terminal.ipapp.TerminalIPythonApp.initialize_subcommand
General Comments 0
You need to be logged in to leave comments. Login now