Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-ipython for openSUSE:Factory checked in at 2023-06-12 15:24:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-ipython (Old) and /work/SRC/openSUSE:Factory/.python-ipython.new.15902 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-ipython" Mon Jun 12 15:24:59 2023 rev:41 rq:1092420 version:8.14.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-ipython/python-ipython.changes 2023-06-04 16:41:34.885765147 +0200 +++ /work/SRC/openSUSE:Factory/.python-ipython.new.15902/python-ipython.changes 2023-06-12 15:25:26.470693391 +0200 @@ -1,0 +2,46 @@ +Sun Jun 11 19:44:22 UTC 2023 - Ben Greiner <c...@bnavigator.de> + +- Update to 8.14.0 + * PR #14080 fixes some shortcuts issues. + * PR #14056 Add option to %autoreload to hide errors when + reloading code. + * PR #14039 (and PR #14040) to show exception notes in + tracebacks. + * PR #14076 Add option to EventManager to prevent printing + ## SPEC 0 and SPEC 4 + * Youâve heard about the NEPs, (NumPy enhancement Proposal), + having a NEP for something non-numpy specific was sometime + confusing. Long live the SPECs. + * We are now trying to follow SPEC 0 (aka old NEP 29) for of + support of upstream libraries. + * We also now try to follow SPEC 4 (test and publish nightly on a + centralized nightly repository). We encourage you to do so as + well in order to report breakage, and contribute to the SPEC + process ! + ## Python 3.12 compatibility ? + * Python 3.12 changed its tokenizer to have better support for + f-strings and allow arbitrary expression. This is a great new + feature and performance improvement in python 3.12. + * Unfortunately this means the new tokenizer does not support + incomplete or invalid Python which will break many features of + IPython. Thus compatibility of IPython with Python 3.12 is not + guarantied. It is unclear to which extent IPython is affected, + and whether we can/should try to still support magics, shell + escape (! ....), â¦, as well as how to do it if we can. + * In addition even if we there is technical feasibility to do so, + it is no clear we have the resources to do it. We are thus + looking for your help if you can _test_ on Python 3.12 to see + to which extent this affects users and which features are + critical. + * We are not going to pin IPython to Python <3.12 as otherwise on + install pip would downgrade/resolve to IPython 8.13, so if you + plan to update to Python 3.12 after its release, we encourage + for extra care. +- Skip potential future python312 because of the above + +------------------------------------------------------------------- +Sat Jun 10 12:18:34 UTC 2023 - ecsos <ec...@opensuse.org> + +- Add %{?sle15_python_module_pythons} + +------------------------------------------------------------------- Old: ---- ipython-8.13.2.tar.gz New: ---- ipython-8.14.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-ipython.spec ++++++ --- /var/tmp/diff_new_pack.asjCpY/_old 2023-06-12 15:25:27.826701413 +0200 +++ /var/tmp/diff_new_pack.asjCpY/_new 2023-06-12 15:25:27.834701461 +0200 @@ -31,8 +31,11 @@ %endif # extra tests are skipped automatically, don't require these packages for Ring1 %bcond_with localtest +%{?sle15_python_module_pythons} +# See whatsnew of 8.14 +%define skip_python312 1 Name: python-ipython%{psuffix} -Version: 8.13.2 +Version: 8.14.0 Release: 0 Summary: Rich architecture for interactive computing with Python License: BSD-3-Clause ++++++ ipython-8.13.2.tar.gz -> ipython-8.14.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/core/events.py new/ipython-8.14.0/IPython/core/events.py --- old/ipython-8.13.2/IPython/core/events.py 2023-04-18 14:28:39.000000000 +0200 +++ new/ipython-8.14.0/IPython/core/events.py 2023-06-02 15:24:47.000000000 +0200 @@ -26,7 +26,8 @@ This API is experimental in IPython 2.0, and may be revised in future versions. """ - def __init__(self, shell, available_events): + + def __init__(self, shell, available_events, print_on_error=True): """Initialise the :class:`CallbackManager`. Parameters @@ -35,9 +36,12 @@ The :class:`~IPython.core.interactiveshell.InteractiveShell` instance available_events An iterable of names for callback events. + print_on_error: + A boolean flag to set whether the EventManager will print a warning which a event errors. """ self.shell = shell self.callbacks = {n:[] for n in available_events} + self.print_on_error = print_on_error def register(self, event, function): """Register a new event callback. @@ -88,7 +92,8 @@ try: func(*args, **kwargs) except (Exception, KeyboardInterrupt): - print("Error in callback {} (for {}):".format(func, event)) + if self.print_on_error: + print("Error in callback {} (for {}):".format(func, event)) self.shell.showtraceback() # event_name -> prototype mapping diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/core/guarded_eval.py new/ipython-8.14.0/IPython/core/guarded_eval.py --- old/ipython-8.13.2/IPython/core/guarded_eval.py 2023-05-04 14:41:43.000000000 +0200 +++ new/ipython-8.14.0/IPython/core/guarded_eval.py 2023-06-02 15:24:47.000000000 +0200 @@ -18,6 +18,7 @@ import sys from functools import cached_property from dataclasses import dataclass, field +from types import MethodDescriptorType, ModuleType from IPython.utils.docs import GENERATING_DOCUMENTATION from IPython.utils.decorators import undoc @@ -630,8 +631,6 @@ dict_keys: Type[collections.abc.KeysView] = type({}.keys()) -method_descriptor: Any = type(list.copy) -module = type(builtins) NUMERICS = {int, float, complex} @@ -680,8 +679,8 @@ type, # `type` handles a lot of generic cases, e.g. numbers as in `int.real`. *NUMERICS, dict_keys, - method_descriptor, - module, + MethodDescriptorType, + ModuleType, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/core/release.py new/ipython-8.14.0/IPython/core/release.py --- old/ipython-8.13.2/IPython/core/release.py 2023-05-04 14:43:01.000000000 +0200 +++ new/ipython-8.14.0/IPython/core/release.py 2023-06-02 16:08:33.000000000 +0200 @@ -16,8 +16,8 @@ # release. 'dev' as a _version_extra string means this is a development # version _version_major = 8 -_version_minor = 13 -_version_patch = 2 +_version_minor = 14 +_version_patch = 0 _version_extra = ".dev" # _version_extra = "rc1" _version_extra = "" # Uncomment this for full releases diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/core/tests/test_ultratb.py new/ipython-8.14.0/IPython/core/tests/test_ultratb.py --- old/ipython-8.13.2/IPython/core/tests/test_ultratb.py 2023-05-04 14:41:43.000000000 +0200 +++ new/ipython-8.14.0/IPython/core/tests/test_ultratb.py 2023-06-02 15:24:47.000000000 +0200 @@ -51,24 +51,24 @@ class ChangedPyFileTest(unittest.TestCase): def test_changing_py_file(self): """Traceback produced if the line where the error occurred is missing? - + https://github.com/ipython/ipython/issues/1456 """ with TemporaryDirectory() as td: fname = os.path.join(td, "foo.py") with open(fname, "w", encoding="utf-8") as f: f.write(file_1) - + with prepended_to_syspath(td): ip.run_cell("import foo") - + with tt.AssertPrints("ZeroDivisionError"): ip.run_cell("foo.f()") - + # Make the file shorter, so the line of the error is missing. with open(fname, "w", encoding="utf-8") as f: f.write(file_2) - + # For some reason, this was failing on the *second* call after # changing the file, so we call f() twice. with tt.AssertNotPrints("Internal Python error", channel='stderr'): @@ -92,27 +92,27 @@ fname = os.path.join(td, u"fooé.py") with open(fname, "w", encoding="utf-8") as f: f.write(file_1) - + with prepended_to_syspath(td): ip.run_cell("import foo") - + with tt.AssertPrints("ZeroDivisionError"): ip.run_cell("foo.f()") - + def test_iso8859_5(self): with TemporaryDirectory() as td: fname = os.path.join(td, 'dfghjkl.py') with io.open(fname, 'w', encoding='iso-8859-5') as f: f.write(iso_8859_5_file) - + with prepended_to_syspath(td): ip.run_cell("from dfghjkl import fail") - + with tt.AssertPrints("ZeroDivisionError"): with tt.AssertPrints(u'дбÐÐ', suppress=False): ip.run_cell('fail()') - + def test_nonascii_msg(self): cell = u"raise Exception('é')" expected = u"Exception('é')" @@ -167,12 +167,12 @@ with tt.AssertPrints("IndentationError"): with tt.AssertPrints("zoon()", suppress=False): ip.run_cell(indentationerror_file) - + with TemporaryDirectory() as td: fname = os.path.join(td, "foo.py") with open(fname, "w", encoding="utf-8") as f: f.write(indentationerror_file) - + with tt.AssertPrints("IndentationError"): with tt.AssertPrints("zoon()", suppress=False): ip.magic('run %s' % fname) @@ -363,6 +363,29 @@ ip.run_cell("r3o2()") +class PEP678NotesReportingTest(unittest.TestCase): + ERROR_WITH_NOTE = """ +try: + raise AssertionError("Message") +except Exception as e: + try: + e.add_note("This is a PEP-678 note.") + except AttributeError: # Python <= 3.10 + e.__notes__ = ("This is a PEP-678 note.",) + raise + """ + + def test_verbose_reports_notes(self): + with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): + ip.run_cell(self.ERROR_WITH_NOTE) + + def test_plain_reports_notes(self): + with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): + ip.run_cell("%xmode Plain") + ip.run_cell(self.ERROR_WITH_NOTE) + ip.run_cell("%xmode Verbose") + + #---------------------------------------------------------------------------- # module testing (minimal) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/core/ultratb.py new/ipython-8.14.0/IPython/core/ultratb.py --- old/ipython-8.13.2/IPython/core/ultratb.py 2023-04-28 11:49:16.000000000 +0200 +++ new/ipython-8.14.0/IPython/core/ultratb.py 2023-06-02 15:24:47.000000000 +0200 @@ -89,6 +89,7 @@ #***************************************************************************** +from collections.abc import Sequence import functools import inspect import linecache @@ -183,6 +184,14 @@ return count_lines_in_py_file(filename) +def _safe_string(value, what, func=str): + # Copied from cpython/Lib/traceback.py + try: + return func(value) + except: + return f"<{what} {func.__name__}() failed>" + + def _format_traceback_lines(lines, Colors, has_colors: bool, lvals): """ Format tracebacks lines with pointing arrow, leading numbers... @@ -582,7 +591,7 @@ """ Colors = self.Colors - list = [] + output_list = [] for ind, (filename, lineno, name, line) in enumerate(extracted_list): normalCol, nameCol, fileCol, lineCol = ( # Emphasize the last entry @@ -600,9 +609,9 @@ item += "\n" if line: item += f"{lineCol} {line.strip()}{normalCol}\n" - list.append(item) + output_list.append(item) - return list + return output_list def _format_exception_only(self, etype, value): """Format the exception part of a traceback. @@ -619,11 +628,11 @@ """ have_filedata = False Colors = self.Colors - list = [] + output_list = [] stype = py3compat.cast_unicode(Colors.excName + etype.__name__ + Colors.Normal) if value is None: # Not sure if this can still happen in Python 2.6 and above - list.append(stype + '\n') + output_list.append(stype + "\n") else: if issubclass(etype, SyntaxError): have_filedata = True @@ -634,7 +643,7 @@ else: lineno = "unknown" textline = "" - list.append( + output_list.append( "%s %s%s\n" % ( Colors.normalEm, @@ -654,28 +663,33 @@ i = 0 while i < len(textline) and textline[i].isspace(): i += 1 - list.append('%s %s%s\n' % (Colors.line, - textline.strip(), - Colors.Normal)) + output_list.append( + "%s %s%s\n" % (Colors.line, textline.strip(), Colors.Normal) + ) if value.offset is not None: s = ' ' for c in textline[i:value.offset - 1]: if c.isspace(): s += c else: - s += ' ' - list.append('%s%s^%s\n' % (Colors.caret, s, - Colors.Normal)) + s += " " + output_list.append( + "%s%s^%s\n" % (Colors.caret, s, Colors.Normal) + ) try: s = value.msg except Exception: s = self._some_str(value) if s: - list.append('%s%s:%s %s\n' % (stype, Colors.excName, - Colors.Normal, s)) + output_list.append( + "%s%s:%s %s\n" % (stype, Colors.excName, Colors.Normal, s) + ) else: - list.append('%s\n' % stype) + output_list.append("%s\n" % stype) + + # PEP-678 notes + output_list.extend(f"{x}\n" for x in getattr(value, "__notes__", [])) # sync with user hooks if have_filedata: @@ -683,7 +697,7 @@ if ipinst is not None: ipinst.hooks.synchronize_with_editor(value.filename, value.lineno, 0) - return list + return output_list def get_exception_only(self, etype, value): """Only print the exception type and message, without a traceback. @@ -999,9 +1013,27 @@ # User exception is improperly defined. etype, evalue = str, sys.exc_info()[:2] etype_str, evalue_str = map(str, (etype, evalue)) + + # PEP-678 notes + notes = getattr(evalue, "__notes__", []) + if not isinstance(notes, Sequence) or isinstance(notes, (str, bytes)): + notes = [_safe_string(notes, "__notes__", func=repr)] + # ... and format it - return ['%s%s%s: %s' % (colors.excName, etype_str, - colorsnormal, py3compat.cast_unicode(evalue_str))] + return [ + "{}{}{}: {}".format( + colors.excName, + etype_str, + colorsnormal, + py3compat.cast_unicode(evalue_str), + ), + *( + "{}{}".format( + colorsnormal, _safe_string(py3compat.cast_unicode(n), "note") + ) + for n in notes + ), + ] def format_exception_as_a_whole( self, @@ -1068,7 +1100,7 @@ if ipinst is not None: ipinst.hooks.synchronize_with_editor(frame_info.filename, frame_info.lineno, 0) - return [[head] + frames + [''.join(formatted_exception[0])]] + return [[head] + frames + formatted_exception] def get_records( self, etb: TracebackType, number_of_lines_of_context: int, tb_offset: int diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/extensions/autoreload.py new/ipython-8.14.0/IPython/extensions/autoreload.py --- old/ipython-8.13.2/IPython/extensions/autoreload.py 2023-04-18 14:04:54.000000000 +0200 +++ new/ipython-8.14.0/IPython/extensions/autoreload.py 2023-06-02 15:24:47.000000000 +0200 @@ -170,6 +170,9 @@ # Cache module modification times self.check(check_all=True, do_reload=False) + # To hide autoreload errors + self.hide_errors = False + def mark_module_skipped(self, module_name): """Skip reloading the named module in the future""" try: @@ -274,12 +277,13 @@ if py_filename in self.failed: del self.failed[py_filename] except: - print( - "[autoreload of {} failed: {}]".format( - modname, traceback.format_exc(10) - ), - file=sys.stderr, - ) + if not self.hide_errors: + print( + "[autoreload of {} failed: {}]".format( + modname, traceback.format_exc(10) + ), + file=sys.stderr, + ) self.failed[py_filename] = pymtime @@ -553,6 +557,12 @@ default=False, help="Show autoreload activity using the logger", ) + @magic_arguments.argument( + "--hide-errors", + action="store_true", + default=False, + help="Hide autoreload errors", + ) def autoreload(self, line=""): r"""%autoreload => Reload modules automatically @@ -579,6 +589,9 @@ is to act silently; --print (or -p) will print out the names of modules that are being reloaded, and --log (or -l) outputs them to the log at INFO level. + The optional argument --hide-errors hides any errors that can happen when trying to + reload code. + Reloading Python modules in a reliable way is in general difficult, and unexpected things may occur. %autoreload tries to work around common pitfalls by replacing function code objects and @@ -628,6 +641,8 @@ elif args.log is True: self._reloader._report = l + self._reloader.hide_errors = args.hide_errors + if mode == "" or mode == "now": self._reloader.check(True) elif mode == "0" or mode == "off": diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/terminal/shortcuts/__init__.py new/ipython-8.14.0/IPython/terminal/shortcuts/__init__.py --- old/ipython-8.13.2/IPython/terminal/shortcuts/__init__.py 2023-05-04 14:41:48.000000000 +0200 +++ new/ipython-8.14.0/IPython/terminal/shortcuts/__init__.py 2023-06-02 15:24:47.000000000 +0200 @@ -279,7 +279,8 @@ ["right"], "is_cursor_at_the_end_of_line" " & default_buffer_focused" - " & emacs_like_insert_mode", + " & emacs_like_insert_mode" + " & pass_through", ), ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/terminal/shortcuts/auto_suggest.py new/ipython-8.14.0/IPython/terminal/shortcuts/auto_suggest.py --- old/ipython-8.13.2/IPython/terminal/shortcuts/auto_suggest.py 2023-04-21 11:31:59.000000000 +0200 +++ new/ipython-8.14.0/IPython/terminal/shortcuts/auto_suggest.py 2023-06-02 15:24:47.000000000 +0200 @@ -20,6 +20,8 @@ from IPython.core.getipython import get_ipython from IPython.utils.tokenutil import generate_tokens +from .filters import pass_through + def _get_query(document: Document): return document.lines[document.cursor_position_row] @@ -267,7 +269,10 @@ def resume_hinting(event: KeyPressEvent): """Resume autosuggestions""" - return _update_hint(event.current_buffer) + pass_through.reply(event) + # Order matters: if update happened first and event reply second, the + # suggestion would be auto-accepted if both actions are bound to same key. + _update_hint(event.current_buffer) def up_and_update_hint(event: KeyPressEvent): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/terminal/shortcuts/filters.py new/ipython-8.14.0/IPython/terminal/shortcuts/filters.py --- old/ipython-8.13.2/IPython/terminal/shortcuts/filters.py 2023-05-04 14:41:48.000000000 +0200 +++ new/ipython-8.14.0/IPython/terminal/shortcuts/filters.py 2023-06-02 15:24:47.000000000 +0200 @@ -13,7 +13,8 @@ from prompt_toolkit.application.current import get_app from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER -from prompt_toolkit.filters import Condition, emacs_insert_mode, has_completions +from prompt_toolkit.key_binding import KeyPressEvent +from prompt_toolkit.filters import Condition, Filter, emacs_insert_mode, has_completions from prompt_toolkit.filters import has_focus as has_focus_impl from prompt_toolkit.filters import ( Always, @@ -175,6 +176,36 @@ return sys.platform == "win32" +class PassThrough(Filter): + """A filter allowing to implement pass-through behaviour of keybindings. + + Prompt toolkit key processor dispatches only one event per binding match, + which means that adding a new shortcut will suppress the old shortcut + if the keybindings are the same (unless one is filtered out). + + To stop a shortcut binding from suppressing other shortcuts: + - add the `pass_through` filter to list of filter, and + - call `pass_through.reply(event)` in the shortcut handler. + """ + + def __init__(self): + self._is_replying = False + + def reply(self, event: KeyPressEvent): + self._is_replying = True + try: + event.key_processor.reset() + event.key_processor.feed_multiple(event.key_sequence) + event.key_processor.process_keys() + finally: + self._is_replying = False + + def __call__(self): + return not self._is_replying + + +pass_through = PassThrough() + # these one is callable and re-used multiple times hence needs to be # only defined once beforhand so that transforming back to human-readable # names works well in the documentation. @@ -248,6 +279,7 @@ "followed_by_single_quote": following_text("^'"), "navigable_suggestions": navigable_suggestions, "cursor_in_leading_ws": cursor_in_leading_ws, + "pass_through": pass_through, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/IPython/utils/_sysinfo.py new/ipython-8.14.0/IPython/utils/_sysinfo.py --- old/ipython-8.13.2/IPython/utils/_sysinfo.py 2023-05-04 14:43:01.000000000 +0200 +++ new/ipython-8.14.0/IPython/utils/_sysinfo.py 2023-06-02 16:08:33.000000000 +0200 @@ -1,2 +1,2 @@ # GENERATED BY setup.py -commit = "2c4c28a3a" +commit = "f11276427" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/PKG-INFO new/ipython-8.14.0/PKG-INFO --- old/ipython-8.13.2/PKG-INFO 2023-05-04 14:43:01.000000000 +0200 +++ new/ipython-8.14.0/PKG-INFO 2023-06-02 16:08:33.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: ipython -Version: 8.13.2 +Version: 8.14.0 Summary: IPython: Productive Interactive Computing Home-page: https://ipython.org Author: The IPython Development Team diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/docs/autogen_shortcuts.py new/ipython-8.14.0/docs/autogen_shortcuts.py --- old/ipython-8.13.2/docs/autogen_shortcuts.py 2023-04-18 14:04:54.000000000 +0200 +++ new/ipython-8.14.0/docs/autogen_shortcuts.py 2023-06-02 15:24:47.000000000 +0200 @@ -88,6 +88,8 @@ return result elif s in ["Never", "Always"]: return s.lower() + elif s == "PassThrough": + return "pass_through" else: raise ValueError(f"Unknown filter type: {filter_}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/docs/source/whatsnew/pr/pep678-notes.rst new/ipython-8.14.0/docs/source/whatsnew/pr/pep678-notes.rst --- old/ipython-8.13.2/docs/source/whatsnew/pr/pep678-notes.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/ipython-8.14.0/docs/source/whatsnew/pr/pep678-notes.rst 2023-06-02 15:24:47.000000000 +0200 @@ -0,0 +1,5 @@ +Support for PEP-678 Exception Notes +----------------------------------- + +Ultratb now shows :pep:`678` notes, improving your debugging experience on +Python 3.11+ or with libraries such as Pytest and Hypothesis. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/docs/source/whatsnew/version8.rst new/ipython-8.14.0/docs/source/whatsnew/version8.rst --- old/ipython-8.13.2/docs/source/whatsnew/version8.rst 2023-05-04 14:41:43.000000000 +0200 +++ new/ipython-8.14.0/docs/source/whatsnew/version8.rst 2023-06-02 15:43:57.000000000 +0200 @@ -1,6 +1,51 @@ ============ 8.x Series ============ +.. _version 8.14: + +IPython 8.14 +------------ + +Small release of IPython. + + - :ghpull:`14080` fixes some shortcuts issues. + - :ghpull:`14056` Add option to ``%autoreload`` to hide errors when reloading code. This will be the default for spyder + user is my understanding. + - :ghpull:`14039` (and :ghpull:`14040`) to show exception notes in tracebacks. + + - :ghpull:`14076` Add option to EventManager to prevent printing + + +SPEC 0 and SPEC 4 +~~~~~~~~~~~~~~~~~ + +You've heard about the NEPs, (NumPy enhancement Proposal), having a NEP for something non-numpy specific was sometime confusing. +Long live the `SPECs <https://scientific-python.org/specs/>`_. + +We are now trying to follow SPEC 0 (aka old NEP 29) for of support of upstream libraries. + +We also now try to follow SPEC 4 (test and publish nightly on a centralized nightly repository). +We encourage you to do so as well in order to report breakage, and contribute to the SPEC process ! + + +Python 3.12 compatibility ? +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Python 3.12 changed its tokenizer to have better support for f-strings and allow arbitrary expression. +This is a great new feature and performance improvement in python 3.12. + +Unfortunately this means the new tokenizer does not support incomplete or invalid Python which will +break many features of IPython. Thus compatibility of IPython with Python 3.12 is not guarantied. +It is unclear to which extent IPython is affected, and whether we can/should try to still support magics, shell +escape (``! ....``), ..., as well as how to do it if we can. + +In addition even if we there is technical feasibility to do so, it is no clear we have the resources to do it. +We are thus looking for your help if you can _test_ on Python 3.12 to see to which extent this affects users and which +features are critical. + +We are not going to pin IPython to Python ``<3.12`` as otherwise on install pip would downgrade/resolve to IPython 8.13, +so if you plan to update to Python 3.12 after its release, we encourage for extra care. + .. _version 8.13.1: .. _version 8.13.2: @@ -10,12 +55,12 @@ --------------------------------- 3 quick in succession patch release of IPython in addition to IPython 8.13.0 -having been yanked. +having been yanked. IPython 8.13.0 was improperly tagged as still compatible with Python 3.8, and still had some mention of compatibility woth 3.8. IPython 8.13.1 is identical to 8.13 but with the exception of being correctly tagged. This release and yank was -mostly done to fix CI. +mostly done to fix CI. IPython 8.12.2 and 8.13.2 contain UI fixes, with respect to right arrow not working in some case in the terminal, and 8.12.2 contain also a requested diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/ipython.egg-info/PKG-INFO new/ipython-8.14.0/ipython.egg-info/PKG-INFO --- old/ipython-8.13.2/ipython.egg-info/PKG-INFO 2023-05-04 14:43:01.000000000 +0200 +++ new/ipython-8.14.0/ipython.egg-info/PKG-INFO 2023-06-02 16:08:33.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: ipython -Version: 8.13.2 +Version: 8.14.0 Summary: IPython: Productive Interactive Computing Home-page: https://ipython.org Author: The IPython Development Team diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipython-8.13.2/ipython.egg-info/SOURCES.txt new/ipython-8.14.0/ipython.egg-info/SOURCES.txt --- old/ipython-8.13.2/ipython.egg-info/SOURCES.txt 2023-05-04 14:43:01.000000000 +0200 +++ new/ipython-8.14.0/ipython.egg-info/SOURCES.txt 2023-06-02 16:08:33.000000000 +0200 @@ -433,6 +433,7 @@ docs/source/whatsnew/pr/README.md docs/source/whatsnew/pr/antigravity-feature.rst docs/source/whatsnew/pr/incompat-switching-to-perl.rst +docs/source/whatsnew/pr/pep678-notes.rst docs/sphinxext/apigen.py docs/sphinxext/configtraits.py docs/sphinxext/github.py