ipython 9.9.0__tar.gz → 9.10.1__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.10.1}/IPython/core/application.py +3 -2
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/history.py +30 -4
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/inputtransformer2.py +92 -2
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/release.py +2 -2
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/autoreload.py +4 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/deduperreload/deduperreload.py +22 -6
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_sysinfo.py +1 -1
- {ipython-9.9.0/ipython.egg-info → ipython-9.10.1}/PKG-INFO +1 -1
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version9.rst +44 -5
- {ipython-9.9.0 → ipython-9.10.1/ipython.egg-info}/PKG-INFO +1 -1
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_inputtransformer2_line.py +57 -2
- {ipython-9.9.0 → ipython-9.10.1}/.flake8 +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/.mailmap +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/.pre-commit-config.yaml +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/COPYING.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/__main__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/alias.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/async_helpers.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/autocall.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/builtin_trap.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/compilerop.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/completer.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/completerlib.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/crashhandler.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/debugger.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/debugger_backport.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/display.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/display_functions.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/display_trap.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/displayhook.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/displaypub.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/doctb.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/error.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/events.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/extensions.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/formatters.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/getipython.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/guarded_eval.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/historyapp.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/hooks.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/interactiveshell.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/latex_symbols.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/logger.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/macro.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magic.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magic_arguments.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/auto.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/basic.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/code.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/config.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/display.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/execution.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/extension.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/history.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/logging.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/namespace.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/osm.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/packaging.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/pylab.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/magics/script.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/oinspect.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/page.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/payload.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/payloadpage.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/prefilter.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/profileapp.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/profiledir.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/pylabtools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/shellapp.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/splitinput.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/tbtools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/tips.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/ultratb.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/core/usage.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/display.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/deduperreload/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/storemagic.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/extensions/tests/test_deduperreload.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/external/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/external/pickleshare.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/external/qt_loaders.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/clipboard.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/deepreload.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/demo.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/display.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/editorhooks.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/guisupport.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/latextools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/lexers.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/lib/pretty.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/paths.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/py.typed +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/sphinxext/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/debugger.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/embed.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/interactiveshell.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/ipapp.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/magics.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/prompts.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/qt.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/ptutils.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/shortcuts/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/decorators.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/globalipapp.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/ipunittest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/Makefile +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/setup.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/simple.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/skipdoctest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/testing/tools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/PyColorize.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_process_cli.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_process_common.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_process_posix.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_process_win32.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/capture.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/coloransi.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/contexts.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/data.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/decorators.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/dir2.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/docs.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/encoding.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/eventful.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/frame.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/generics.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/importstring.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/io.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/ipstruct.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/jsonutil.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/log.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/module_paths.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/openpy.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/path.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/process.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/py3compat.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/sentinel.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/strdispatch.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/sysinfo.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/syspathcontext.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/tempdir.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/terminal.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/text.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/timing.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/tokenutil.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/IPython/utils/wildcard.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/LICENSE +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/MANIFEST.in +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/README.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/_build_meta.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/Makefile +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/README.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/autogen_api.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/autogen_config.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/autogen_magics.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/autogen_shortcuts.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/make.cmd +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/man/ipython.1 +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/requirements.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/2.0/running.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/qtconsole.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_static/favicon.ico +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_static/logo.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/about/history.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/about/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/api/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/conf.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/callbacks.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/custommagics.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/details.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/eventloops.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/extensions/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/integrating.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/intro.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/options/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/coredev/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/config.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/execution.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/kernels.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/messaging.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/install/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/install/install.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/install/kernel_install.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/magics.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/plotting.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/reference.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/shell.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/tips.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/links.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/overview.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/parallel/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/sphinx.toml +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/sphinxext.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/development.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/index.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/source/whatsnew/version8.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/sphinxext/apigen.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/sphinxext/configtraits.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/docs/sphinxext/magics.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/Embedding/embed_function.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/auto_suggest_llm.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/utils/cwd_prompt.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/ipython.egg-info/SOURCES.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/ipython.egg-info/requires.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/ipython.egg-info/top_level.txt +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/long_description.rst +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/pyproject.toml +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/scripts/ipython.ico +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/scripts/ipython_nb.ico +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/setup.cfg +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/setup.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/setupbase.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/2x2.jpg +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/2x2.png +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/__init__.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/bad_all.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/conftest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/fake_ext_dir/daft_extension.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/fake_llm.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/nonascii.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/nonascii2.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/print_argv.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/refbug.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/simpleerr.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/tclass.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test.wav +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_alias.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_application.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_async_helpers.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_autocall.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_backgroundjobs.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_capture.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_clipboard.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_compilerop.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_completer.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_completerlib.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_cve.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_debug_magic.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_debugger.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_decorators.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_decorators_2.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_deepreload.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_dir2.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_display.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_display_2.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_displayhook.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_editorhooks.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_embed.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_events.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_extension.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_formatters.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_guarded_eval.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_handlers.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_help.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_history.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_hooks.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_imports.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_importstring.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_inputtransformer2.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_interactiveshell.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_interactivshell.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_io.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_iplib.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_ipunittest.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_latextools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_logger.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_magic.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_magic_arguments.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_magic_terminal.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_module_paths.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_oinspect.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_openpy.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_page.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_path.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_paths.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_prefilter.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_pretty.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_process.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_profile.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_pt_inputhooks.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_pycolorize.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_pylabtools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_qt_loaders.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_run.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_shellapp.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_shortcuts.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_splitinput.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_storemagic.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_sysinfo.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_tempdir.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_text.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_tips.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_tokenutil.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_tools.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_ultratb.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_wildcard.py +0 -0
- {ipython-9.9.0 → ipython-9.10.1}/tests/test_zzz_autoreload.py +0 -0
|
@@ -33,10 +33,11 @@ from traitlets import (
|
|
|
33
33
|
)
|
|
34
34
|
|
|
35
35
|
if os.name == "nt":
|
|
36
|
+
# %PROGRAMDATA% is not safe by default, require opt-in to trust it
|
|
36
37
|
programdata = os.environ.get("PROGRAMDATA", None)
|
|
37
|
-
if programdata is not None:
|
|
38
|
+
if os.environ.get("IPYTHON_USE_PROGRAMDATA") == "1" and programdata is not None:
|
|
38
39
|
SYSTEM_CONFIG_DIRS = [str(Path(programdata) / "ipython")]
|
|
39
|
-
else:
|
|
40
|
+
else:
|
|
40
41
|
SYSTEM_CONFIG_DIRS = []
|
|
41
42
|
else:
|
|
42
43
|
SYSTEM_CONFIG_DIRS = [
|
|
@@ -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
|
|
|
@@ -689,6 +690,7 @@ class HistoryManager(HistoryAccessor):
|
|
|
689
690
|
)
|
|
690
691
|
self.hist_file = ":memory:"
|
|
691
692
|
|
|
693
|
+
self.using_thread = False
|
|
692
694
|
if self.enabled and self.hist_file != ":memory:":
|
|
693
695
|
self.save_thread = HistorySavingThread(self)
|
|
694
696
|
try:
|
|
@@ -699,6 +701,8 @@ class HistoryManager(HistoryAccessor):
|
|
|
699
701
|
exc_info=True,
|
|
700
702
|
)
|
|
701
703
|
self.hist_file = ":memory:"
|
|
704
|
+
else:
|
|
705
|
+
self.using_thread = True
|
|
702
706
|
self._instances.add(self)
|
|
703
707
|
assert len(HistoryManager._instances) <= HistoryManager._max_inst, (
|
|
704
708
|
len(HistoryManager._instances),
|
|
@@ -709,6 +713,20 @@ class HistoryManager(HistoryAccessor):
|
|
|
709
713
|
if self.save_thread is not None:
|
|
710
714
|
self.save_thread.stop()
|
|
711
715
|
|
|
716
|
+
@classmethod
|
|
717
|
+
def _stop_thread(cls) -> None:
|
|
718
|
+
# Used before forking so the thread isn't running at fork
|
|
719
|
+
for inst in cls._instances:
|
|
720
|
+
if inst.save_thread is not None:
|
|
721
|
+
inst.save_thread.stop()
|
|
722
|
+
inst.save_thread = None
|
|
723
|
+
|
|
724
|
+
def _restart_thread_if_stopped(self) -> None:
|
|
725
|
+
# Start the thread again after it was stopped for forking
|
|
726
|
+
if self.save_thread is None and self.using_thread:
|
|
727
|
+
self.save_thread = HistorySavingThread(self)
|
|
728
|
+
self.save_thread.start()
|
|
729
|
+
|
|
712
730
|
def _get_hist_file_name(self, profile: Optional[str] = None) -> Path:
|
|
713
731
|
"""Get default history file name based on the Shell's profile.
|
|
714
732
|
|
|
@@ -970,8 +988,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
970
988
|
self.db_input_cache.append((line_num, source, source_raw))
|
|
971
989
|
# Trigger to flush cache and write to DB.
|
|
972
990
|
if len(self.db_input_cache) >= self.db_cache_size:
|
|
973
|
-
if self.
|
|
974
|
-
self.
|
|
991
|
+
if self.using_thread:
|
|
992
|
+
self._restart_thread_if_stopped()
|
|
993
|
+
if self.save_flag is not None:
|
|
994
|
+
self.save_flag.set()
|
|
975
995
|
|
|
976
996
|
# update the auto _i variables
|
|
977
997
|
self._iii = self._ii
|
|
@@ -1003,8 +1023,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
1003
1023
|
|
|
1004
1024
|
with self.db_output_cache_lock:
|
|
1005
1025
|
self.db_output_cache.append((line_num, output))
|
|
1006
|
-
if self.db_cache_size <= 1 and self.
|
|
1007
|
-
self.
|
|
1026
|
+
if self.db_cache_size <= 1 and self.using_thread:
|
|
1027
|
+
self._restart_thread_if_stopped()
|
|
1028
|
+
if self.save_flag is not None:
|
|
1029
|
+
self.save_flag.set()
|
|
1008
1030
|
|
|
1009
1031
|
def _writeout_input_cache(self, conn: sqlite3.Connection) -> None:
|
|
1010
1032
|
with conn:
|
|
@@ -1059,6 +1081,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
1059
1081
|
self.db_output_cache = []
|
|
1060
1082
|
|
|
1061
1083
|
|
|
1084
|
+
if hasattr(os, "register_at_fork"):
|
|
1085
|
+
os.register_at_fork(before=HistoryManager._stop_thread)
|
|
1086
|
+
|
|
1087
|
+
|
|
1062
1088
|
from collections.abc import Callable, Iterator
|
|
1063
1089
|
from weakref import ReferenceType
|
|
1064
1090
|
|
|
@@ -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(
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
# release. 'dev' as a _version_extra string means this is a development
|
|
17
17
|
# version
|
|
18
18
|
_version_major = 9
|
|
19
|
-
_version_minor =
|
|
20
|
-
_version_patch =
|
|
19
|
+
_version_minor = 10
|
|
20
|
+
_version_patch = 1
|
|
21
21
|
_version_extra = ".dev"
|
|
22
22
|
# _version_extra = "b2"
|
|
23
23
|
_version_extra = "" # Uncomment this for full releases
|
|
@@ -327,6 +327,10 @@ class ModuleReloader:
|
|
|
327
327
|
del self.failed[py_filename]
|
|
328
328
|
except:
|
|
329
329
|
if not self.hide_errors:
|
|
330
|
+
logger = logging.getLogger("autoreload")
|
|
331
|
+
logger.exception(
|
|
332
|
+
f"Failed to reload module '{modname}' from file '{py_filename}'"
|
|
333
|
+
)
|
|
330
334
|
print(
|
|
331
335
|
"[autoreload of {} failed: {}]".format(
|
|
332
336
|
modname, traceback.format_exc(10)
|
|
@@ -3,6 +3,7 @@ import ast
|
|
|
3
3
|
import builtins
|
|
4
4
|
import contextlib
|
|
5
5
|
import itertools
|
|
6
|
+
import logging
|
|
6
7
|
import os
|
|
7
8
|
import pickle
|
|
8
9
|
import platform
|
|
@@ -209,11 +210,19 @@ class DeduperReloader(DeduperReloaderPatchingMixin):
|
|
|
209
210
|
):
|
|
210
211
|
self.source_by_modname[new_modname] = ""
|
|
211
212
|
continue
|
|
212
|
-
|
|
213
|
-
|
|
213
|
+
# Skip binary files (e.g., .so, .pyd, .pyo)
|
|
214
|
+
if not fname.endswith(".py"):
|
|
215
|
+
self.source_by_modname[new_modname] = ""
|
|
216
|
+
continue
|
|
217
|
+
try:
|
|
218
|
+
with open(fname, "r", encoding="utf8") as f:
|
|
214
219
|
self.source_by_modname[new_modname] = f.read()
|
|
215
|
-
|
|
216
|
-
|
|
220
|
+
except Exception as e:
|
|
221
|
+
logger = logging.getLogger("autoreload")
|
|
222
|
+
logger.exception(
|
|
223
|
+
f"Failed to read module file '{fname}' for module '{new_modname}': {type(e).__name__}"
|
|
224
|
+
)
|
|
225
|
+
self.source_by_modname[new_modname] = ""
|
|
217
226
|
|
|
218
227
|
constexpr_detector = ConstexprDetector()
|
|
219
228
|
|
|
@@ -542,8 +551,15 @@ class DeduperReloader(DeduperReloaderPatchingMixin):
|
|
|
542
551
|
return False
|
|
543
552
|
if (fname := get_module_file_name(module)) is None:
|
|
544
553
|
return False
|
|
545
|
-
|
|
546
|
-
|
|
554
|
+
try:
|
|
555
|
+
with open(fname, "r", encoding="utf8") as f:
|
|
556
|
+
new_source_code = f.read()
|
|
557
|
+
except Exception as e:
|
|
558
|
+
logger = logging.getLogger("autoreload")
|
|
559
|
+
logger.exception(
|
|
560
|
+
f"Failed to read module file '{fname}' for module '{modname}': {type(e).__name__}"
|
|
561
|
+
)
|
|
562
|
+
return False
|
|
547
563
|
patched_flag = False
|
|
548
564
|
if old_source_code := self.source_by_modname.get(modname):
|
|
549
565
|
# get old/new module ast
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# GENERATED BY setup.py
|
|
2
|
-
commit = "
|
|
2
|
+
commit = "b97293b"
|
|
@@ -3,12 +3,44 @@
|
|
|
3
3
|
============
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
.. _version 9.10:
|
|
7
|
+
|
|
8
|
+
IPython 9.10
|
|
9
|
+
============
|
|
10
|
+
|
|
11
|
+
This release includes improvements to history management during forking and formatting fixes.
|
|
12
|
+
|
|
13
|
+
- :ghpull:`15110` Fix Removing leading indentation when stripping prompt
|
|
14
|
+
- :ghpull:`15115` Stop HistorySavingThread before fork
|
|
15
|
+
- :ghpull:`15118` Add debug info for autoreload
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
History Thread Management Improvements
|
|
19
|
+
---------------------------------------
|
|
20
|
+
|
|
21
|
+
The `HistorySavingThread` is now properly stopped before process forking,
|
|
22
|
+
preventing threading issues in child processes. This ensures that history
|
|
23
|
+
operations work correctly when IPython is used in applications that perform
|
|
24
|
+
process forking.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Thanks
|
|
28
|
+
------
|
|
29
|
+
|
|
30
|
+
Thanks as well to the `D. E. Shaw group <https://deshaw.com/>`_ for sponsoring
|
|
31
|
+
work on IPython.
|
|
32
|
+
|
|
33
|
+
As usual, you can find the full list of PRs on GitHub under `the 9.10
|
|
34
|
+
<https://github.com/ipython/ipython/milestone/159?closed=1>`__ milestone.
|
|
35
|
+
|
|
36
|
+
|
|
6
37
|
.. _version 9.9:
|
|
7
38
|
|
|
8
39
|
IPython 9.9
|
|
9
40
|
===========
|
|
10
41
|
|
|
11
|
-
This release includes several bug fixes and improvements across completions,
|
|
42
|
+
This release includes several bug fixes and improvements across completions,
|
|
43
|
+
type annotations, and developer experience.
|
|
12
44
|
|
|
13
45
|
- :ghpull:`15092` Fix formatting for completion suggestions section
|
|
14
46
|
- :ghpull:`15057` Reduce types in splitinput.py
|
|
@@ -27,19 +59,25 @@ This release includes several bug fixes and improvements across completions, typ
|
|
|
27
59
|
Improvements to PEP-649 Support
|
|
28
60
|
-------------------------------
|
|
29
61
|
|
|
30
|
-
IPython now properly pretty-prints functions with PEP-649 style annotations.
|
|
62
|
+
IPython now properly pretty-prints functions with PEP-649 style annotations.
|
|
63
|
+
This improves the display of functions in interactive sessions when using Python
|
|
64
|
+
3.14+ annotation semantics.
|
|
31
65
|
|
|
32
66
|
|
|
33
67
|
Shell Shortcuts Enhancement
|
|
34
68
|
-----------------------------
|
|
35
69
|
|
|
36
|
-
The ``unix_word_rubout`` command from prompt_toolkit is now available as an
|
|
70
|
+
The ``unix_word_rubout`` command from prompt_toolkit is now available as an
|
|
71
|
+
assignable command for terminal shortcuts, giving users more flexibility in
|
|
72
|
+
customizing their keybindings.
|
|
37
73
|
|
|
38
74
|
|
|
39
75
|
Type Annotation Improvements
|
|
40
76
|
----------------------------
|
|
41
77
|
|
|
42
|
-
Various type annotation improvements have been made throughout the codebase for
|
|
78
|
+
Various type annotation improvements have been made throughout the codebase for
|
|
79
|
+
better static analysis support, including fixes for tracebacks and improved type
|
|
80
|
+
inference in the completion engine.
|
|
43
81
|
|
|
44
82
|
|
|
45
83
|
Thanks
|
|
@@ -57,7 +95,8 @@ As usual, you can find the full list of PRs on GitHub under `the 9.9
|
|
|
57
95
|
IPython 9.8
|
|
58
96
|
===========
|
|
59
97
|
|
|
60
|
-
This release brings improvements to concurrent execution, history commands, tab
|
|
98
|
+
This release brings improvements to concurrent execution, history commands, tab
|
|
99
|
+
completion, and debugger performance.
|
|
61
100
|
|
|
62
101
|
|
|
63
102
|
- :ghpull:`15037` Fix some ruff issues with import
|
|
@@ -45,15 +45,70 @@ for a in range(5):
|
|
|
45
45
|
... print(a ** 2)
|
|
46
46
|
""",
|
|
47
47
|
"""\
|
|
48
|
+
for a in range(5):
|
|
49
|
+
... print(a)
|
|
50
|
+
... print(a ** 2)
|
|
51
|
+
""",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
CLASSIC_PROMPT_L3 = (
|
|
55
|
+
"""\
|
|
56
|
+
>>> \"\"\"
|
|
57
|
+
... This code is inside a triple-quoted string.
|
|
58
|
+
... >>> for a in range(5):
|
|
59
|
+
... ... print(a)
|
|
60
|
+
... \"\"\"
|
|
61
|
+
>>> for a in range(5):
|
|
62
|
+
... print(a)
|
|
63
|
+
""",
|
|
64
|
+
"""\
|
|
65
|
+
>>> \"\"\"
|
|
66
|
+
... This code is inside a triple-quoted string.
|
|
67
|
+
... >>> for a in range(5):
|
|
68
|
+
... ... print(a)
|
|
69
|
+
... \"\"\"
|
|
48
70
|
for a in range(5):
|
|
49
71
|
print(a)
|
|
50
|
-
print(a ** 2)
|
|
51
72
|
""",
|
|
52
73
|
)
|
|
53
74
|
|
|
75
|
+
CLASSIC_PROMPT_DEDENT_SINGLE_LINE = (
|
|
76
|
+
">>> print(1)\n",
|
|
77
|
+
"print(1)\n",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
CLASSIC_PROMPT_DEDENT_LEADING_WS = (
|
|
81
|
+
" >>> print(1)\n",
|
|
82
|
+
"print(1)\n",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
CLASSIC_PROMPT_MULTILINE_DOCTEST = (
|
|
86
|
+
"""\
|
|
87
|
+
>>> for i in range(2):
|
|
88
|
+
... print(i)
|
|
89
|
+
""",
|
|
90
|
+
"""\
|
|
91
|
+
for i in range(2):
|
|
92
|
+
print(i)
|
|
93
|
+
""",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
CLASSIC_PROMPT_STANDALONE_CONTINUATION = (
|
|
97
|
+
"... print(1)\n",
|
|
98
|
+
"... print(1)\n",
|
|
99
|
+
)
|
|
100
|
+
|
|
54
101
|
|
|
55
102
|
def test_classic_prompt():
|
|
56
|
-
for sample, expected in [
|
|
103
|
+
for sample, expected in [
|
|
104
|
+
CLASSIC_PROMPT,
|
|
105
|
+
CLASSIC_PROMPT_L2,
|
|
106
|
+
CLASSIC_PROMPT_L3,
|
|
107
|
+
CLASSIC_PROMPT_DEDENT_SINGLE_LINE,
|
|
108
|
+
CLASSIC_PROMPT_DEDENT_LEADING_WS,
|
|
109
|
+
CLASSIC_PROMPT_MULTILINE_DOCTEST,
|
|
110
|
+
CLASSIC_PROMPT_STANDALONE_CONTINUATION,
|
|
111
|
+
]:
|
|
57
112
|
assert ipt2.classic_prompt(
|
|
58
113
|
sample.splitlines(keepends=True)
|
|
59
114
|
) == expected.splitlines(keepends=True)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|