ipython 9.9.0__tar.gz → 9.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ipython-9.9.0 → ipython-9.11.0}/IPython/__init__.py +2 -2
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/completer.py +2 -6
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/events.py +12 -5
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/guarded_eval.py +1 -4
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/history.py +41 -5
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/inputtransformer2.py +94 -27
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/interactiveshell.py +53 -7
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magic.py +104 -63
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/basic.py +1 -1
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/execution.py +4 -3
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/release.py +1 -1
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/ultratb.py +1 -5
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/autoreload.py +4 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/deduperreload/deduperreload.py +22 -6
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/decorators.py +4 -1
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_common.py +18 -15
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_win32.py +5 -6
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/contexts.py +14 -5
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/decorators.py +16 -12
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/dir2.py +6 -3
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/frame.py +7 -4
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/openpy.py +6 -4
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/py3compat.py +1 -1
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/text.py +1 -4
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/timing.py +18 -5
- {ipython-9.9.0/ipython.egg-info → ipython-9.11.0}/PKG-INFO +13 -13
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version9.rst +113 -5
- {ipython-9.9.0 → ipython-9.11.0/ipython.egg-info}/PKG-INFO +13 -13
- {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/requires.txt +11 -13
- {ipython-9.9.0 → ipython-9.11.0}/pyproject.toml +38 -18
- {ipython-9.9.0 → ipython-9.11.0}/setup.py +0 -51
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_completer.py +1 -1
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_guarded_eval.py +1 -4
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_inputtransformer2_line.py +57 -2
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_oinspect.py +1 -1
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_pretty.py +6 -1
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_shortcuts.py +1 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_zzz_autoreload.py +0 -2
- {ipython-9.9.0 → ipython-9.11.0}/.flake8 +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/.mailmap +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/.pre-commit-config.yaml +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/COPYING.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/__main__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/alias.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/application.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/async_helpers.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/autocall.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/compilerop.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/completerlib.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/crashhandler.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/debugger.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/debugger_backport.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/display.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/display_functions.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/display_trap.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/displayhook.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/displaypub.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/doctb.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/error.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/extensions.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/formatters.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/getipython.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/historyapp.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/hooks.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/logger.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/macro.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/auto.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/code.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/config.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/display.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/extension.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/history.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/logging.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/namespace.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/osm.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/packaging.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/script.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/oinspect.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/page.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/payload.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/payloadpage.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/prefilter.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/profileapp.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/profiledir.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/pylabtools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/shellapp.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/splitinput.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/tbtools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/tips.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/core/usage.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/display.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/deduperreload/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/external/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/external/pickleshare.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/external/qt_loaders.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/clipboard.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/deepreload.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/demo.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/display.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/guisupport.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/latextools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/lexers.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/pretty.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/paths.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/py.typed +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/debugger.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/embed.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/interactiveshell.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/magics.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/prompts.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/tools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/PyColorize.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_cli.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/capture.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/coloransi.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/data.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/docs.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/encoding.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/eventful.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/generics.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/importstring.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/io.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/log.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/module_paths.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/path.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/process.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/sentinel.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/sysinfo.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/tempdir.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/terminal.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/tokenutil.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/wildcard.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/LICENSE +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/MANIFEST.in +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/README.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/_build_meta.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/Makefile +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/README.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_api.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_config.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_magics.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/make.cmd +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/man/ipython.1 +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/requirements.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_static/logo.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/about/history.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/about/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/api/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/conf.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/details.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/integrating.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/intro.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/options/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/coredev/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/config.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/execution.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/kernels.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/messaging.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/install/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/install/install.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/magics.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/links.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/overview.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/parallel/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/sphinx.toml +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/sphinxext.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/development.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version8.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/docs/sphinxext/magics.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/auto_suggest_llm.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/SOURCES.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/long_description.rst +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/scripts/ipython.ico +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/scripts/ipython_nb.ico +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/setup.cfg +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/setupbase.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/2x2.jpg +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/2x2.png +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/bad_all.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/conftest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/fake_ext_dir/daft_extension.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/fake_llm.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/nonascii.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/nonascii2.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/print_argv.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/refbug.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/simpleerr.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/tclass.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test.wav +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_alias.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_application.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_async_helpers.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_autocall.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_backgroundjobs.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_capture.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_clipboard.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_compilerop.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_completerlib.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_cve.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_debug_magic.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_debugger.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_decorators.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_decorators_2.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_deepreload.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_dir2.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_display.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_display_2.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_displayhook.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_editorhooks.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_embed.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_events.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_extension.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_formatters.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_handlers.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_help.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_history.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_hooks.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_imports.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_importstring.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_inputtransformer2.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_interactiveshell.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_interactivshell.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_io.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_iplib.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_ipunittest.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_latextools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_logger.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_magic.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_magic_arguments.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_magic_terminal.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_module_paths.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_openpy.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_page.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_path.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_paths.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_prefilter.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_process.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_profile.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_pt_inputhooks.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_pycolorize.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_pylabtools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_qt_loaders.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_run.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_shellapp.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_splitinput.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_storemagic.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_sysinfo.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_tempdir.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_text.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_tips.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_tokenutil.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_tools.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_ultratb.py +0 -0
- {ipython-9.9.0 → ipython-9.11.0}/tests/test_wildcard.py +0 -0
|
@@ -27,13 +27,13 @@ import warnings
|
|
|
27
27
|
#-----------------------------------------------------------------------------
|
|
28
28
|
|
|
29
29
|
# Don't forget to also update setup.py when this changes!
|
|
30
|
-
if sys.version_info < (3,
|
|
30
|
+
if sys.version_info < (3, 12):
|
|
31
31
|
raise ImportError(
|
|
32
32
|
"""
|
|
33
|
+
IPython 9.x supports Python 3.12 and above, following SPEC0
|
|
33
34
|
IPython 8.31+ supports Python 3.11 and above, following SPEC0
|
|
34
35
|
IPython 8.19+ supports Python 3.10 and above, following SPEC0.
|
|
35
36
|
IPython 8.13+ supports Python 3.9 and above, following NEP 29.
|
|
36
|
-
IPython 8.0-8.12 supports Python 3.8 and above, following NEP 29.
|
|
37
37
|
When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
|
|
38
38
|
Python 3.3 and 3.4 were supported up to IPython 6.x.
|
|
39
39
|
Python 3.5 was supported with IPython 7.0 to 7.9.
|
|
@@ -243,11 +243,7 @@ import __main__
|
|
|
243
243
|
|
|
244
244
|
from typing import cast
|
|
245
245
|
|
|
246
|
-
|
|
247
|
-
from typing_extensions import TypedDict, Protocol
|
|
248
|
-
from typing import NotRequired, TypeAlias, TypeGuard
|
|
249
|
-
else:
|
|
250
|
-
from typing import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard
|
|
246
|
+
from typing import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard
|
|
251
247
|
|
|
252
248
|
|
|
253
249
|
# skip module docstests
|
|
@@ -274,7 +270,7 @@ except ImportError:
|
|
|
274
270
|
# write this). With below range we cover them all, with a density of ~67%
|
|
275
271
|
# biggest next gap we consider only adds up about 1% density and there are 600
|
|
276
272
|
# gaps that would need hard coding.
|
|
277
|
-
_UNICODE_RANGES = [(32,
|
|
273
|
+
_UNICODE_RANGES = [(32, 0x3347A), (0xE0001, 0xE01F0)]
|
|
278
274
|
|
|
279
275
|
# Public API
|
|
280
276
|
__all__ = ["Completer", "IPCompleter"]
|
|
@@ -15,10 +15,14 @@ events and the arguments which will be passed to them.
|
|
|
15
15
|
|
|
16
16
|
from __future__ import annotations
|
|
17
17
|
|
|
18
|
-
from typing import TYPE_CHECKING, Any, Callable, Iterable
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Callable, Iterable, TypeVar
|
|
19
19
|
|
|
20
20
|
if TYPE_CHECKING:
|
|
21
|
-
from IPython.core.interactiveshell import
|
|
21
|
+
from IPython.core.interactiveshell import (
|
|
22
|
+
ExecutionInfo,
|
|
23
|
+
ExecutionResult,
|
|
24
|
+
InteractiveShell,
|
|
25
|
+
)
|
|
22
26
|
|
|
23
27
|
|
|
24
28
|
class EventManager:
|
|
@@ -106,7 +110,10 @@ class EventManager:
|
|
|
106
110
|
# event_name -> prototype mapping
|
|
107
111
|
available_events: dict[str, Callable[..., Any]] = {}
|
|
108
112
|
|
|
109
|
-
|
|
113
|
+
_CallbackT = TypeVar("_CallbackT", bound=Callable[..., Any])
|
|
114
|
+
|
|
115
|
+
def _define_event(callback_function: _CallbackT) -> _CallbackT:
|
|
116
|
+
"""Decorator to register a function as an available event prototype."""
|
|
110
117
|
available_events[callback_function.__name__] = callback_function
|
|
111
118
|
return callback_function
|
|
112
119
|
|
|
@@ -127,7 +134,7 @@ def pre_execute() -> None:
|
|
|
127
134
|
pass
|
|
128
135
|
|
|
129
136
|
@_define_event
|
|
130
|
-
def pre_run_cell(info:
|
|
137
|
+
def pre_run_cell(info: ExecutionInfo) -> None:
|
|
131
138
|
"""Fires before user-entered code runs.
|
|
132
139
|
|
|
133
140
|
Parameters
|
|
@@ -147,7 +154,7 @@ def post_execute() -> None:
|
|
|
147
154
|
pass
|
|
148
155
|
|
|
149
156
|
@_define_event
|
|
150
|
-
def post_run_cell(result:
|
|
157
|
+
def post_run_cell(result: ExecutionResult) -> None:
|
|
151
158
|
"""Fires after user-entered code runs.
|
|
152
159
|
|
|
153
160
|
Parameters
|
|
@@ -32,10 +32,7 @@ from IPython.utils.decorators import undoc
|
|
|
32
32
|
import types
|
|
33
33
|
from typing import Self, LiteralString, get_type_hints
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
from typing_extensions import TypeAliasType
|
|
37
|
-
else:
|
|
38
|
-
from typing import TypeAliasType
|
|
35
|
+
from typing import TypeAliasType
|
|
39
36
|
|
|
40
37
|
|
|
41
38
|
@undoc
|
|
@@ -8,6 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import atexit
|
|
10
10
|
import datetime
|
|
11
|
+
import os
|
|
11
12
|
import re
|
|
12
13
|
|
|
13
14
|
|
|
@@ -38,6 +39,8 @@ from IPython.utils.decorators import undoc
|
|
|
38
39
|
from typing import Tuple, Optional, TYPE_CHECKING
|
|
39
40
|
from collections.abc import Iterable
|
|
40
41
|
import typing
|
|
42
|
+
import typing as t
|
|
43
|
+
from typing import cast
|
|
41
44
|
from warnings import warn
|
|
42
45
|
from weakref import ref, WeakSet
|
|
43
46
|
|
|
@@ -89,6 +92,9 @@ class DummyDB:
|
|
|
89
92
|
def __exit__(self, *args, **kwargs): # type: ignore [no-untyped-def]
|
|
90
93
|
pass
|
|
91
94
|
|
|
95
|
+
def close(self, *args, **kwargs): # type: ignore [no-untyped-def]
|
|
96
|
+
pass
|
|
97
|
+
|
|
92
98
|
|
|
93
99
|
@decorator
|
|
94
100
|
def only_when_enabled(f, self, *a, **kw): # type: ignore [no-untyped-def]
|
|
@@ -343,6 +349,10 @@ class HistoryAccessor(HistoryAccessorBase):
|
|
|
343
349
|
# success! reset corrupt db count
|
|
344
350
|
self._corrupt_db_counter = 0
|
|
345
351
|
|
|
352
|
+
def __del__(self) -> None:
|
|
353
|
+
if hasattr(self, "db"):
|
|
354
|
+
self.db.close()
|
|
355
|
+
|
|
346
356
|
def writeout_cache(self) -> None:
|
|
347
357
|
"""Overridden by HistoryManager to dump the cache before certain
|
|
348
358
|
database lookups."""
|
|
@@ -689,6 +699,7 @@ class HistoryManager(HistoryAccessor):
|
|
|
689
699
|
)
|
|
690
700
|
self.hist_file = ":memory:"
|
|
691
701
|
|
|
702
|
+
self.using_thread = False
|
|
692
703
|
if self.enabled and self.hist_file != ":memory:":
|
|
693
704
|
self.save_thread = HistorySavingThread(self)
|
|
694
705
|
try:
|
|
@@ -699,6 +710,8 @@ class HistoryManager(HistoryAccessor):
|
|
|
699
710
|
exc_info=True,
|
|
700
711
|
)
|
|
701
712
|
self.hist_file = ":memory:"
|
|
713
|
+
else:
|
|
714
|
+
self.using_thread = True
|
|
702
715
|
self._instances.add(self)
|
|
703
716
|
assert len(HistoryManager._instances) <= HistoryManager._max_inst, (
|
|
704
717
|
len(HistoryManager._instances),
|
|
@@ -708,6 +721,21 @@ class HistoryManager(HistoryAccessor):
|
|
|
708
721
|
def __del__(self) -> None:
|
|
709
722
|
if self.save_thread is not None:
|
|
710
723
|
self.save_thread.stop()
|
|
724
|
+
HistoryAccessor.__del__(self)
|
|
725
|
+
|
|
726
|
+
@classmethod
|
|
727
|
+
def _stop_thread(cls) -> None:
|
|
728
|
+
# Used before forking so the thread isn't running at fork
|
|
729
|
+
for inst in cls._instances:
|
|
730
|
+
if inst.save_thread is not None:
|
|
731
|
+
inst.save_thread.stop()
|
|
732
|
+
inst.save_thread = None
|
|
733
|
+
|
|
734
|
+
def _restart_thread_if_stopped(self) -> None:
|
|
735
|
+
# Start the thread again after it was stopped for forking
|
|
736
|
+
if self.save_thread is None and self.using_thread:
|
|
737
|
+
self.save_thread = HistorySavingThread(self)
|
|
738
|
+
self.save_thread.start()
|
|
711
739
|
|
|
712
740
|
def _get_hist_file_name(self, profile: Optional[str] = None) -> Path:
|
|
713
741
|
"""Get default history file name based on the Shell's profile.
|
|
@@ -970,8 +998,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
970
998
|
self.db_input_cache.append((line_num, source, source_raw))
|
|
971
999
|
# Trigger to flush cache and write to DB.
|
|
972
1000
|
if len(self.db_input_cache) >= self.db_cache_size:
|
|
973
|
-
if self.
|
|
974
|
-
self.
|
|
1001
|
+
if self.using_thread:
|
|
1002
|
+
self._restart_thread_if_stopped()
|
|
1003
|
+
if self.save_flag is not None:
|
|
1004
|
+
self.save_flag.set()
|
|
975
1005
|
|
|
976
1006
|
# update the auto _i variables
|
|
977
1007
|
self._iii = self._ii
|
|
@@ -1003,8 +1033,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
1003
1033
|
|
|
1004
1034
|
with self.db_output_cache_lock:
|
|
1005
1035
|
self.db_output_cache.append((line_num, output))
|
|
1006
|
-
if self.db_cache_size <= 1 and self.
|
|
1007
|
-
self.
|
|
1036
|
+
if self.db_cache_size <= 1 and self.using_thread:
|
|
1037
|
+
self._restart_thread_if_stopped()
|
|
1038
|
+
if self.save_flag is not None:
|
|
1039
|
+
self.save_flag.set()
|
|
1008
1040
|
|
|
1009
1041
|
def _writeout_input_cache(self, conn: sqlite3.Connection) -> None:
|
|
1010
1042
|
with conn:
|
|
@@ -1059,6 +1091,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
1059
1091
|
self.db_output_cache = []
|
|
1060
1092
|
|
|
1061
1093
|
|
|
1094
|
+
if hasattr(os, "register_at_fork"):
|
|
1095
|
+
os.register_at_fork(before=HistoryManager._stop_thread)
|
|
1096
|
+
|
|
1097
|
+
|
|
1062
1098
|
from collections.abc import Callable, Iterator
|
|
1063
1099
|
from weakref import ReferenceType
|
|
1064
1100
|
|
|
@@ -1105,7 +1141,7 @@ class HistorySavingThread(threading.Thread):
|
|
|
1105
1141
|
if hm() is not None:
|
|
1106
1142
|
self.db = sqlite3.connect(
|
|
1107
1143
|
str(hm().hist_file), # type: ignore [union-attr]
|
|
1108
|
-
**hm().connection_options, # type: ignore [union-attr]
|
|
1144
|
+
**cast(dict[str, t.Any], hm().connection_options), # type: ignore [union-attr]
|
|
1109
1145
|
)
|
|
1110
1146
|
while True:
|
|
1111
1147
|
self.save_flag.wait()
|
|
@@ -67,9 +67,47 @@ class PromptStripper:
|
|
|
67
67
|
If any prompt is found on the first two lines,
|
|
68
68
|
prompts will be stripped from the rest of the block.
|
|
69
69
|
"""
|
|
70
|
-
def __init__(self, prompt_re, initial_re=None):
|
|
70
|
+
def __init__(self, prompt_re, initial_re=None, *, doctest=False):
|
|
71
71
|
self.prompt_re = prompt_re
|
|
72
72
|
self.initial_re = initial_re or prompt_re
|
|
73
|
+
self.doctest = doctest
|
|
74
|
+
if doctest:
|
|
75
|
+
# Doctest/xdoctest prompts may be indented (e.g. " >>>").
|
|
76
|
+
# We only treat "..." as a continuation prompt when the same pasted
|
|
77
|
+
# block contains at least one ">>>" line, to avoid ambiguity with the
|
|
78
|
+
# Python Ellipsis literal.
|
|
79
|
+
self._doctest_initial_re = re.compile(r'^\s*>>>')
|
|
80
|
+
self._doctest_ps1_re = re.compile(r'^\s*>>>\s?')
|
|
81
|
+
self._doctest_ps2_re = re.compile(r'^\s*\.\.\.\s?')
|
|
82
|
+
|
|
83
|
+
# Very small state machine to detect triple-quoted strings in the
|
|
84
|
+
# *same* input block (e.g. user typed """ then pasted doctest).
|
|
85
|
+
# We preserve literal >>> / ... inside triple-quoted strings.
|
|
86
|
+
self._triple_quote_re = re.compile(r"(?<!\\)(\"\"\"|''')")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _triple_quote_mask(self, lines: List[str]) -> List[bool]:
|
|
90
|
+
"""
|
|
91
|
+
Return a boolean mask: True if the corresponding line is considered
|
|
92
|
+
inside a triple-quoted string literal.
|
|
93
|
+
|
|
94
|
+
This is intentionally heuristic (fast + good enough for paste handling).
|
|
95
|
+
"""
|
|
96
|
+
mask: List[bool] = []
|
|
97
|
+
in_triple: str | None = None # either ''' or """
|
|
98
|
+
for line in lines:
|
|
99
|
+
mask.append(in_triple is not None)
|
|
100
|
+
# Toggle state for each occurrence of """ or ''' in the line.
|
|
101
|
+
for m in self._triple_quote_re.finditer(line):
|
|
102
|
+
q = m.group(1)
|
|
103
|
+
if in_triple is None:
|
|
104
|
+
in_triple = q
|
|
105
|
+
mask[-1] = True # current line is inside triple quotes
|
|
106
|
+
elif in_triple == q:
|
|
107
|
+
in_triple = None
|
|
108
|
+
# else: ignore mismatched triple quote while inside
|
|
109
|
+
return mask
|
|
110
|
+
|
|
73
111
|
|
|
74
112
|
def _strip(self, lines):
|
|
75
113
|
return [self.prompt_re.sub('', l, count=1) for l in lines]
|
|
@@ -77,6 +115,57 @@ class PromptStripper:
|
|
|
77
115
|
def __call__(self, lines):
|
|
78
116
|
if not lines:
|
|
79
117
|
return lines
|
|
118
|
+
|
|
119
|
+
if self.doctest:
|
|
120
|
+
triple_mask = self._triple_quote_mask(lines)
|
|
121
|
+
|
|
122
|
+
# Detect doctest prompts only outside triple-quoted strings.
|
|
123
|
+
has_doctest_outside = any(
|
|
124
|
+
(not in_triple) and self._doctest_initial_re.match(l)
|
|
125
|
+
for l, in_triple in zip(lines, triple_mask)
|
|
126
|
+
)
|
|
127
|
+
if not has_doctest_outside:
|
|
128
|
+
return lines
|
|
129
|
+
|
|
130
|
+
out_lines: List[str] = []
|
|
131
|
+
stripped_mask: List[bool] = []
|
|
132
|
+
|
|
133
|
+
for l, in_triple in zip(lines, triple_mask):
|
|
134
|
+
if in_triple:
|
|
135
|
+
out_lines.append(l)
|
|
136
|
+
stripped_mask.append(False)
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
if self._doctest_ps1_re.match(l):
|
|
140
|
+
new_l = self._doctest_ps1_re.sub('', l, count=1)
|
|
141
|
+
elif self._doctest_ps2_re.match(l):
|
|
142
|
+
new_l = self._doctest_ps2_re.sub('', l, count=1)
|
|
143
|
+
else:
|
|
144
|
+
new_l = l
|
|
145
|
+
out_lines.append(new_l)
|
|
146
|
+
stripped_mask.append(new_l != l)
|
|
147
|
+
|
|
148
|
+
# Dedent only the non-triple-quoted segments where stripping occurred.
|
|
149
|
+
dedented: List[str] = []
|
|
150
|
+
i = 0
|
|
151
|
+
while i < len(out_lines):
|
|
152
|
+
j = i
|
|
153
|
+
in_triple = triple_mask[i]
|
|
154
|
+
while j < len(out_lines) and triple_mask[j] == in_triple:
|
|
155
|
+
j += 1
|
|
156
|
+
|
|
157
|
+
segment = out_lines[i:j]
|
|
158
|
+
seg_stripped = any(stripped_mask[i:j])
|
|
159
|
+
|
|
160
|
+
if (not in_triple) and seg_stripped:
|
|
161
|
+
dedented.extend(dedent(''.join(segment)).splitlines(keepends=True))
|
|
162
|
+
else:
|
|
163
|
+
dedented.extend(segment)
|
|
164
|
+
|
|
165
|
+
i = j
|
|
166
|
+
|
|
167
|
+
return dedented
|
|
168
|
+
|
|
80
169
|
if self.initial_re.match(lines[0]) or \
|
|
81
170
|
(len(lines) > 1 and self.prompt_re.match(lines[1])):
|
|
82
171
|
return self._strip(lines)
|
|
@@ -84,7 +173,8 @@ class PromptStripper:
|
|
|
84
173
|
|
|
85
174
|
classic_prompt = PromptStripper(
|
|
86
175
|
prompt_re=re.compile(r'^(>>>|\.\.\.)( |$)'),
|
|
87
|
-
initial_re=re.compile(r'^>>>( |$)')
|
|
176
|
+
initial_re=re.compile(r'^>>>( |$)'),
|
|
177
|
+
doctest=True,
|
|
88
178
|
)
|
|
89
179
|
|
|
90
180
|
ipython_prompt = PromptStripper(
|
|
@@ -266,24 +356,8 @@ class MagicAssign(TokenTransformBase):
|
|
|
266
356
|
class SystemAssign(TokenTransformBase):
|
|
267
357
|
"""Transformer for assignments from system commands (a = !foo)"""
|
|
268
358
|
@classmethod
|
|
269
|
-
def
|
|
270
|
-
|
|
271
|
-
assign_ix = _find_assign_op(line)
|
|
272
|
-
if (assign_ix is not None) \
|
|
273
|
-
and not line[assign_ix].line.strip().startswith('=') \
|
|
274
|
-
and (len(line) >= assign_ix + 2) \
|
|
275
|
-
and (line[assign_ix + 1].type == tokenize.ERRORTOKEN):
|
|
276
|
-
ix = assign_ix + 1
|
|
277
|
-
|
|
278
|
-
while ix < len(line) and line[ix].type == tokenize.ERRORTOKEN:
|
|
279
|
-
if line[ix].string == '!':
|
|
280
|
-
return cls(line[ix].start)
|
|
281
|
-
elif not line[ix].string.isspace():
|
|
282
|
-
break
|
|
283
|
-
ix += 1
|
|
284
|
-
|
|
285
|
-
@classmethod
|
|
286
|
-
def find_post_312(cls, tokens_by_line):
|
|
359
|
+
def find(cls, tokens_by_line):
|
|
360
|
+
"""Find the first system assignment (a = !foo) in the cell."""
|
|
287
361
|
for line in tokens_by_line:
|
|
288
362
|
assign_ix = _find_assign_op(line)
|
|
289
363
|
if (
|
|
@@ -295,13 +369,6 @@ class SystemAssign(TokenTransformBase):
|
|
|
295
369
|
):
|
|
296
370
|
return cls(line[assign_ix + 1].start)
|
|
297
371
|
|
|
298
|
-
@classmethod
|
|
299
|
-
def find(cls, tokens_by_line):
|
|
300
|
-
"""Find the first system assignment (a = !foo) in the cell."""
|
|
301
|
-
if sys.version_info < (3, 12):
|
|
302
|
-
return cls.find_pre_312(tokens_by_line)
|
|
303
|
-
return cls.find_post_312(tokens_by_line)
|
|
304
|
-
|
|
305
372
|
def transform(self, lines: List[str]):
|
|
306
373
|
"""Transform a system assignment found by the ``find()`` classmethod.
|
|
307
374
|
"""
|
|
@@ -22,6 +22,7 @@ import re
|
|
|
22
22
|
import runpy
|
|
23
23
|
import shutil
|
|
24
24
|
import subprocess
|
|
25
|
+
from subprocess import CalledProcessError
|
|
25
26
|
import sys
|
|
26
27
|
import tempfile
|
|
27
28
|
import traceback
|
|
@@ -37,6 +38,7 @@ from typing import List as ListType, Any as AnyType
|
|
|
37
38
|
from typing import Literal, Optional, Tuple
|
|
38
39
|
from collections.abc import Sequence
|
|
39
40
|
from warnings import warn
|
|
41
|
+
import textwrap
|
|
40
42
|
|
|
41
43
|
from IPython.external.pickleshare import PickleShareDB
|
|
42
44
|
|
|
@@ -90,7 +92,7 @@ from IPython.utils.decorators import undoc
|
|
|
90
92
|
from IPython.utils.io import ask_yes_no
|
|
91
93
|
from IPython.utils.ipstruct import Struct
|
|
92
94
|
from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename
|
|
93
|
-
from IPython.utils.process import getoutput, system
|
|
95
|
+
from IPython.utils.process import get_output_error_code, getoutput, system
|
|
94
96
|
from IPython.utils.strdispatch import StrDispatch
|
|
95
97
|
from IPython.utils.syspathcontext import prepended_to_syspath
|
|
96
98
|
from IPython.utils.text import DollarFormatter, LSString, SList, format_screen
|
|
@@ -538,6 +540,14 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
538
540
|
|
|
539
541
|
quiet = Bool(False).tag(config=True)
|
|
540
542
|
|
|
543
|
+
system_raise_on_error = Bool(False, help=
|
|
544
|
+
"""
|
|
545
|
+
Raise an exception on non-zero exit status from shell commands executed
|
|
546
|
+
via the `!` operator. When set to True, shell commands that fail will raise
|
|
547
|
+
CalledProcessError, similar to the behavior of %%script magics.
|
|
548
|
+
"""
|
|
549
|
+
).tag(config=True)
|
|
550
|
+
|
|
541
551
|
history_length = Integer(10000,
|
|
542
552
|
help='Total length of command history'
|
|
543
553
|
).tag(config=True)
|
|
@@ -1014,6 +1024,18 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
1014
1024
|
|
|
1015
1025
|
@property
|
|
1016
1026
|
def banner(self):
|
|
1027
|
+
if (when := os.environ.get("SOURCE_DATE_EPOCH", None)) is not None:
|
|
1028
|
+
from datetime import datetime
|
|
1029
|
+
|
|
1030
|
+
date = datetime.fromtimestamp(int(when))
|
|
1031
|
+
return textwrap.dedent(
|
|
1032
|
+
f"""
|
|
1033
|
+
Python 3.y.z | Packaged with love | (main, {date.strftime("%A, %d %B %Y")}) [Compiler]
|
|
1034
|
+
Type 'copyright', 'credits' or 'license' for more information
|
|
1035
|
+
IPython 9.y.z -- An enhanced Interactive Python. Type '?' for help.
|
|
1036
|
+
Tip: unset SOURCE_DATE_EPOCH to restore dynamic banner.
|
|
1037
|
+
"""
|
|
1038
|
+
).lstrip()
|
|
1017
1039
|
banner = self.banner1
|
|
1018
1040
|
if self.profile and self.profile != 'default':
|
|
1019
1041
|
banner += '\nIPython profile: %s\n' % self.profile
|
|
@@ -2118,8 +2140,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2118
2140
|
sys.last_type = etype
|
|
2119
2141
|
sys.last_value = value
|
|
2120
2142
|
sys.last_traceback = tb
|
|
2121
|
-
|
|
2122
|
-
sys.last_exc = value
|
|
2143
|
+
sys.last_exc = value
|
|
2123
2144
|
|
|
2124
2145
|
return etype, value, tb
|
|
2125
2146
|
|
|
@@ -2647,7 +2668,12 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2647
2668
|
# we explicitly do NOT return the subprocess status code, because
|
|
2648
2669
|
# a non-None value would trigger :func:`sys.displayhook` calls.
|
|
2649
2670
|
# Instead, we store the exit_code in user_ns.
|
|
2650
|
-
|
|
2671
|
+
exit_code = system(self.var_expand(cmd, depth=1))
|
|
2672
|
+
self.user_ns['_exit_code'] = exit_code
|
|
2673
|
+
|
|
2674
|
+
# Raise an exception if the command failed and system_raise_on_error is True
|
|
2675
|
+
if self.system_raise_on_error and exit_code != 0:
|
|
2676
|
+
raise CalledProcessError(exit_code, cmd)
|
|
2651
2677
|
|
|
2652
2678
|
def system_raw(self, cmd):
|
|
2653
2679
|
"""Call the given cmd in a subprocess using os.system on Windows or
|
|
@@ -2713,6 +2739,10 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2713
2739
|
# but raising SystemExit(_exit_code) will give status 254!
|
|
2714
2740
|
self.user_ns['_exit_code'] = ec
|
|
2715
2741
|
|
|
2742
|
+
# Raise an exception if the command failed and system_raise_on_error is True
|
|
2743
|
+
if self.system_raise_on_error and ec != 0:
|
|
2744
|
+
raise CalledProcessError(ec, cmd)
|
|
2745
|
+
|
|
2716
2746
|
# use piped system by default, because it is better behaved
|
|
2717
2747
|
system = system_piped
|
|
2718
2748
|
|
|
@@ -2738,11 +2768,27 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2738
2768
|
if cmd.rstrip().endswith('&'):
|
|
2739
2769
|
# this is *far* from a rigorous test
|
|
2740
2770
|
raise OSError("Background processes not supported.")
|
|
2741
|
-
|
|
2771
|
+
|
|
2772
|
+
# Get output and exit code
|
|
2773
|
+
expanded_cmd = self.var_expand(cmd, depth=depth+1)
|
|
2774
|
+
if self.system_raise_on_error:
|
|
2775
|
+
# Use get_output_error_code to get the exit code
|
|
2776
|
+
out_str, err_str, exit_code = get_output_error_code(expanded_cmd)
|
|
2777
|
+
# Combine stdout and stderr as getoutput does
|
|
2778
|
+
out_combined = out_str if not err_str else out_str + err_str
|
|
2779
|
+
self.user_ns['_exit_code'] = exit_code
|
|
2780
|
+
|
|
2781
|
+
# Raise an exception if the command failed
|
|
2782
|
+
if exit_code != 0:
|
|
2783
|
+
raise CalledProcessError(exit_code, cmd)
|
|
2784
|
+
else:
|
|
2785
|
+
# Use the original getoutput for backward compatibility
|
|
2786
|
+
out_combined = getoutput(expanded_cmd)
|
|
2787
|
+
|
|
2742
2788
|
if split:
|
|
2743
|
-
out = SList(
|
|
2789
|
+
out = SList(out_combined.splitlines())
|
|
2744
2790
|
else:
|
|
2745
|
-
out = LSString(
|
|
2791
|
+
out = LSString(out_combined)
|
|
2746
2792
|
return out
|
|
2747
2793
|
|
|
2748
2794
|
#-------------------------------------------------------------------------
|