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