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