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