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