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