ipython 8.31.0__tar.gz → 8.33.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-8.31.0 → ipython-8.33.0}/IPython/__init__.py +3 -3
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/interactiveshell.py +4 -2
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/execution.py +15 -1
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/script.py +28 -7
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/release.py +1 -1
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_magic.py +67 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/interactiveshell.py +82 -10
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/qt.py +15 -17
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/shortcuts/__init__.py +4 -3
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/shortcuts/auto_suggest.py +272 -16
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-8.31.0/ipython.egg-info → ipython-8.33.0}/PKG-INFO +5 -2
- {ipython-8.31.0 → ipython-8.33.0}/docs/autogen_config.py +0 -9
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/details.rst +98 -3
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/options/index.rst +5 -7
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version8.rst +53 -3
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Index.ipynb +10 -10
- {ipython-8.31.0 → ipython-8.33.0}/examples/Index.ipynb +1 -1
- ipython-8.33.0/examples/auto_suggest_llm.py +146 -0
- {ipython-8.31.0 → ipython-8.33.0/ipython.egg-info}/PKG-INFO +5 -2
- {ipython-8.31.0 → ipython-8.33.0}/ipython.egg-info/SOURCES.txt +1 -0
- {ipython-8.31.0 → ipython-8.33.0}/.flake8 +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/.mailmap +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/.pre-commit-config.yaml +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/COPYING.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/__main__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/conftest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/consoleapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/alias.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/application.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/async_helpers.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/autocall.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/compilerop.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/completer.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/completerlib.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/crashhandler.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/debugger.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/display.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/display_functions.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/display_trap.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/displayhook.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/displaypub.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/error.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/events.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/excolors.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/extensions.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/formatters.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/getipython.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/guarded_eval.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/history.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/historyapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/hooks.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/inputsplitter.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/inputtransformer.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/inputtransformer2.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/logger.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/macro.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magic.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/auto.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/basic.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/code.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/config.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/display.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/extension.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/history.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/logging.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/namespace.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/osm.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/packaging.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/oinspect.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/page.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/payload.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/payloadpage.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/prefilter.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/profileapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/profiledir.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/prompts.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/pylabtools.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/shellapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/splitinput.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/2x2.jpg +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/2x2.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/bad_all.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/nonascii.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/nonascii2.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/print_argv.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/refbug.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/simpleerr.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/tclass.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_alias.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_application.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_async_helpers.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_autocall.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_compilerop.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_completer.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_completerlib.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_debugger.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_display.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_displayhook.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_events.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_extension.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_formatters.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_guarded_eval.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_handlers.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_history.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_hooks.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_imports.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_inputsplitter.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_inputtransformer.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_interactiveshell.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_iplib.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_logger.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_magic_arguments.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_magic_terminal.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_oinspect.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_page.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_paths.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_prefilter.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_profile.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_prompts.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_pylabtools.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_run.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_shellapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_splitinput.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/tests/test_ultratb.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/ultratb.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/core/usage.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/display.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/extensions/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/extensions/autoreload.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/extensions/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/extensions/tests/test_autoreload.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/extensions/tests/test_storemagic.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/external/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/external/qt_loaders.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/external/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/external/tests/test_qt_loaders.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/clipboard.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/deepreload.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/demo.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/display.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/guisupport.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/latextools.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/lexers.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/pretty.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test.wav +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_clipboard.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_deepreload.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_display.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_editorhooks.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_imports.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_latextools.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_lexers.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_pretty.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/lib/tests/test_pygments.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/paths.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/py.typed +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/console.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/debugger.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/embed.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/magics.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/prompts.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/test_embed.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/test_help.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/decorators.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/README.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/tests/test_decorators.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/tests/test_ipunittest.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/tests/test_tools.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/testing/tools.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/tests/cve.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/PyColorize.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_process_cli.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_process_common.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_process_win32.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/capture.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/colorable.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/coloransi.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/contexts.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/daemonize.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/data.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/decorators.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/dir2.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/docs.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/encoding.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/eventful.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/frame.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/generics.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/importstring.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/io.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/localinterfaces.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/log.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/module_paths.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/openpy.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/path.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/process.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/py3compat.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/sentinel.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/shimmodule.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/signatures.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/sysinfo.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tempdir.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/terminal.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_capture.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_decorators.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_deprecated.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_dir2.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_imports.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_importstring.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_io.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_module_paths.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_openpy.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_path.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_process.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_pycolorize.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_shimmodule.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_sysinfo.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_tempdir.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_text.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_tokenutil.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tests/test_wildcard.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/text.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/timing.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tokenutil.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/traitlets.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/tz.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/ulinecache.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/version.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/IPython/utils/wildcard.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/LICENSE +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/MANIFEST.in +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/README.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/_build_meta.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/Makefile +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/README.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/autogen_api.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/autogen_magics.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/make.cmd +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/man/ipython.1 +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/requirements.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_static/logo.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/about/history.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/about/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/api/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/conf.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/integrating.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/intro.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/coredev/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/config.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/execution.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/kernels.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/lexer.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/messaging.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/pycompat.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/install/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/install/install.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/figs/besselj.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/figs/colors_dark.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/figs/jn.html +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/figs/jn.xhtml +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/magics.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/links.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/overview.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/parallel/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/sphinx.toml +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/sphinxext.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/development.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/sphinxext/github.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/docs/sphinxext/magics.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/Embedding/Index.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/data/flare.json +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/images/FrontendKernel.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/images/animation.m4v +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/images/ipython_logo.png +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/images/python_logo.svg +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/ipython.egg-info/requires.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/long_description.rst +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/pyproject.toml +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/scripts/ipython.ico +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/scripts/ipython_nb.ico +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/setup.cfg +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/setup.py +0 -0
- {ipython-8.31.0 → ipython-8.33.0}/setupbase.py +0 -0
|
@@ -87,7 +87,7 @@ def embed_kernel(module=None, local_ns=None, **kwargs):
|
|
|
87
87
|
**kwargs : various, optional
|
|
88
88
|
Further keyword args are relayed to the IPKernelApp constructor,
|
|
89
89
|
such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`),
|
|
90
|
-
allowing configuration of the kernel
|
|
90
|
+
allowing configuration of the kernel. Will only have an effect
|
|
91
91
|
on the first embed_kernel call for a given process.
|
|
92
92
|
"""
|
|
93
93
|
|
|
@@ -95,7 +95,7 @@ def embed_kernel(module=None, local_ns=None, **kwargs):
|
|
|
95
95
|
if module is None:
|
|
96
96
|
module = caller_module
|
|
97
97
|
if local_ns is None:
|
|
98
|
-
local_ns = caller_locals
|
|
98
|
+
local_ns = dict(**caller_locals)
|
|
99
99
|
|
|
100
100
|
# Only import .zmq when we really need it
|
|
101
101
|
from ipykernel.embed import embed_kernel as real_embed_kernel
|
|
@@ -150,7 +150,7 @@ def start_kernel(argv=None, **kwargs):
|
|
|
150
150
|
**kwargs : various, optional
|
|
151
151
|
Any other kwargs will be passed to the Application constructor,
|
|
152
152
|
such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`),
|
|
153
|
-
allowing configuration of the kernel
|
|
153
|
+
allowing configuration of the kernel.
|
|
154
154
|
"""
|
|
155
155
|
import warnings
|
|
156
156
|
|
|
@@ -900,7 +900,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
900
900
|
return
|
|
901
901
|
|
|
902
902
|
p = Path(sys.executable)
|
|
903
|
-
p_venv = Path(os.environ["VIRTUAL_ENV"])
|
|
903
|
+
p_venv = Path(os.environ["VIRTUAL_ENV"]).resolve()
|
|
904
904
|
|
|
905
905
|
# fallback venv detection:
|
|
906
906
|
# stdlib venv may symlink sys.executable, so we can't use realpath.
|
|
@@ -913,7 +913,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
913
913
|
drive_name = p_venv.parts[2]
|
|
914
914
|
p_venv = (drive_name + ":/") / Path(*p_venv.parts[3:])
|
|
915
915
|
|
|
916
|
-
if any(p_venv == p.parents[1] for p in paths):
|
|
916
|
+
if any(p_venv == p.parents[1].resolve() for p in paths):
|
|
917
917
|
# Our exe is inside or has access to the virtualenv, don't need to do anything.
|
|
918
918
|
return
|
|
919
919
|
|
|
@@ -2093,6 +2093,8 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2093
2093
|
sys.last_type = etype
|
|
2094
2094
|
sys.last_value = value
|
|
2095
2095
|
sys.last_traceback = tb
|
|
2096
|
+
if sys.version_info >= (3, 12):
|
|
2097
|
+
sys.last_exc = value
|
|
2096
2098
|
|
|
2097
2099
|
return etype, value, tb
|
|
2098
2100
|
|
|
@@ -977,7 +977,21 @@ class ExecutionMagics(Magics):
|
|
|
977
977
|
break
|
|
978
978
|
finally:
|
|
979
979
|
sys.settrace(trace)
|
|
980
|
-
|
|
980
|
+
|
|
981
|
+
# Perform proper cleanup of the session in case if
|
|
982
|
+
# it exited with "continue" and not "quit" command
|
|
983
|
+
if hasattr(deb, "rcLines"):
|
|
984
|
+
# Run this code defensively in case if custom debugger
|
|
985
|
+
# class does not implement rcLines, which although public
|
|
986
|
+
# is an implementation detail of `pdb.Pdb` and not part of
|
|
987
|
+
# the more generic basic debugger framework (`bdb.Bdb`).
|
|
988
|
+
deb.set_quit()
|
|
989
|
+
deb.rcLines.extend(["q"])
|
|
990
|
+
try:
|
|
991
|
+
deb.run("", code_ns, local_ns)
|
|
992
|
+
except StopIteration:
|
|
993
|
+
# Stop iteration is raised on quit command
|
|
994
|
+
pass
|
|
981
995
|
|
|
982
996
|
except:
|
|
983
997
|
etype, value, tb = sys.exc_info()
|
|
@@ -67,6 +67,10 @@ def script_args(f):
|
|
|
67
67
|
return f
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
class RaiseAfterInterrupt(Exception):
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
|
|
70
74
|
@magics_class
|
|
71
75
|
class ScriptMagics(Magics):
|
|
72
76
|
"""Magics for talking to scripts
|
|
@@ -176,6 +180,10 @@ class ScriptMagics(Magics):
|
|
|
176
180
|
|
|
177
181
|
The rest of the cell is run by that program.
|
|
178
182
|
|
|
183
|
+
.. versionchanged:: 9.0
|
|
184
|
+
Interrupting the script executed without `--bg` will end in
|
|
185
|
+
raising an exception (unless `--no-raise-error` is passed).
|
|
186
|
+
|
|
179
187
|
Examples
|
|
180
188
|
--------
|
|
181
189
|
::
|
|
@@ -212,7 +220,7 @@ class ScriptMagics(Magics):
|
|
|
212
220
|
|
|
213
221
|
async def _readchunk(stream):
|
|
214
222
|
try:
|
|
215
|
-
return await stream.
|
|
223
|
+
return await stream.read(100)
|
|
216
224
|
except asyncio.exceptions.IncompleteReadError as e:
|
|
217
225
|
return e.partial
|
|
218
226
|
except asyncio.exceptions.LimitOverrunError as e:
|
|
@@ -292,20 +300,33 @@ class ScriptMagics(Magics):
|
|
|
292
300
|
p.send_signal(signal.SIGINT)
|
|
293
301
|
in_thread(asyncio.wait_for(p.wait(), timeout=0.1))
|
|
294
302
|
if p.returncode is not None:
|
|
295
|
-
print("Process
|
|
296
|
-
|
|
303
|
+
print("Process was interrupted.")
|
|
304
|
+
if args.raise_error:
|
|
305
|
+
raise RaiseAfterInterrupt()
|
|
306
|
+
else:
|
|
307
|
+
return
|
|
297
308
|
p.terminate()
|
|
298
309
|
in_thread(asyncio.wait_for(p.wait(), timeout=0.1))
|
|
299
310
|
if p.returncode is not None:
|
|
300
|
-
print("Process
|
|
301
|
-
|
|
311
|
+
print("Process was terminated.")
|
|
312
|
+
if args.raise_error:
|
|
313
|
+
raise RaiseAfterInterrupt()
|
|
314
|
+
else:
|
|
315
|
+
return
|
|
302
316
|
p.kill()
|
|
303
|
-
print("Process
|
|
317
|
+
print("Process was killed.")
|
|
318
|
+
if args.raise_error:
|
|
319
|
+
raise RaiseAfterInterrupt()
|
|
320
|
+
except RaiseAfterInterrupt:
|
|
321
|
+
pass
|
|
304
322
|
except OSError:
|
|
305
323
|
pass
|
|
306
324
|
except Exception as e:
|
|
307
325
|
print("Error while terminating subprocess (pid=%i): %s" % (p.pid, e))
|
|
308
|
-
|
|
326
|
+
if args.raise_error:
|
|
327
|
+
raise CalledProcessError(p.returncode, cell) from None
|
|
328
|
+
else:
|
|
329
|
+
return
|
|
309
330
|
|
|
310
331
|
if args.raise_error and p.returncode != 0:
|
|
311
332
|
# If we get here and p.returncode is still None, we must have
|
|
@@ -6,12 +6,18 @@ import io
|
|
|
6
6
|
import os
|
|
7
7
|
import re
|
|
8
8
|
import shlex
|
|
9
|
+
import signal
|
|
9
10
|
import sys
|
|
10
11
|
import warnings
|
|
11
12
|
from importlib import invalidate_caches
|
|
12
13
|
from io import StringIO
|
|
13
14
|
from pathlib import Path
|
|
15
|
+
from time import sleep
|
|
16
|
+
from threading import Thread
|
|
17
|
+
from subprocess import CalledProcessError
|
|
14
18
|
from textwrap import dedent
|
|
19
|
+
from time import sleep
|
|
20
|
+
from threading import Thread
|
|
15
21
|
from unittest import TestCase, mock
|
|
16
22
|
|
|
17
23
|
import pytest
|
|
@@ -1121,6 +1127,36 @@ def test_script_config():
|
|
|
1121
1127
|
assert "whoda" in sm.magics["cell"]
|
|
1122
1128
|
|
|
1123
1129
|
|
|
1130
|
+
def _interrupt_after_1s():
|
|
1131
|
+
sleep(1)
|
|
1132
|
+
signal.raise_signal(signal.SIGINT)
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
def test_script_raise_on_interrupt():
|
|
1136
|
+
ip = get_ipython()
|
|
1137
|
+
|
|
1138
|
+
with pytest.raises(CalledProcessError):
|
|
1139
|
+
thread = Thread(target=_interrupt_after_1s)
|
|
1140
|
+
thread.start()
|
|
1141
|
+
ip.run_cell_magic(
|
|
1142
|
+
"script", f"{sys.executable}", "from time import sleep; sleep(2)"
|
|
1143
|
+
)
|
|
1144
|
+
thread.join()
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
def test_script_do_not_raise_on_interrupt():
|
|
1148
|
+
ip = get_ipython()
|
|
1149
|
+
|
|
1150
|
+
thread = Thread(target=_interrupt_after_1s)
|
|
1151
|
+
thread.start()
|
|
1152
|
+
ip.run_cell_magic(
|
|
1153
|
+
"script",
|
|
1154
|
+
f"--no-raise-error {sys.executable}",
|
|
1155
|
+
"from time import sleep; sleep(2)",
|
|
1156
|
+
)
|
|
1157
|
+
thread.join()
|
|
1158
|
+
|
|
1159
|
+
|
|
1124
1160
|
def test_script_out():
|
|
1125
1161
|
ip = get_ipython()
|
|
1126
1162
|
ip.run_cell_magic("script", f"--out output {sys.executable}", "print('hi')")
|
|
@@ -1225,6 +1261,37 @@ def test_script_defaults():
|
|
|
1225
1261
|
assert cmd in ip.magics_manager.magics["cell"]
|
|
1226
1262
|
|
|
1227
1263
|
|
|
1264
|
+
async def test_script_streams_continiously(capsys):
|
|
1265
|
+
ip = get_ipython()
|
|
1266
|
+
# Windows is slow to start up a thread on CI
|
|
1267
|
+
is_windows = os.name == "nt"
|
|
1268
|
+
step = 3 if is_windows else 1
|
|
1269
|
+
code = dedent(
|
|
1270
|
+
f"""\
|
|
1271
|
+
import time
|
|
1272
|
+
for _ in range(3):
|
|
1273
|
+
time.sleep({step})
|
|
1274
|
+
print(".", flush=True, end="")
|
|
1275
|
+
"""
|
|
1276
|
+
)
|
|
1277
|
+
|
|
1278
|
+
def print_numbers():
|
|
1279
|
+
for i in range(3):
|
|
1280
|
+
sleep(step)
|
|
1281
|
+
print(i, flush=True, end="")
|
|
1282
|
+
|
|
1283
|
+
thread = Thread(target=print_numbers)
|
|
1284
|
+
thread.start()
|
|
1285
|
+
sleep(step / 2)
|
|
1286
|
+
ip.run_cell_magic("script", f"{sys.executable}", code)
|
|
1287
|
+
thread.join()
|
|
1288
|
+
|
|
1289
|
+
captured = capsys.readouterr()
|
|
1290
|
+
# If the streaming was line-wise or broken
|
|
1291
|
+
# we would get `012...`
|
|
1292
|
+
assert captured.out == "0.1.2."
|
|
1293
|
+
|
|
1294
|
+
|
|
1228
1295
|
@magics_class
|
|
1229
1296
|
class FooFoo(Magics):
|
|
1230
1297
|
"""class with both %foo and %%foo magics"""
|
|
@@ -26,7 +26,10 @@ from traitlets import (
|
|
|
26
26
|
Any,
|
|
27
27
|
validate,
|
|
28
28
|
Float,
|
|
29
|
+
DottedObjectName,
|
|
29
30
|
)
|
|
31
|
+
from traitlets.utils.importstring import import_item
|
|
32
|
+
|
|
30
33
|
|
|
31
34
|
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
|
|
32
35
|
from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode
|
|
@@ -214,7 +217,9 @@ class TerminalInteractiveShell(InteractiveShell):
|
|
|
214
217
|
|
|
215
218
|
pt_app: UnionType[PromptSession, None] = None
|
|
216
219
|
auto_suggest: UnionType[
|
|
217
|
-
AutoSuggestFromHistory,
|
|
220
|
+
AutoSuggestFromHistory,
|
|
221
|
+
NavigableAutoSuggestFromHistory,
|
|
222
|
+
None,
|
|
218
223
|
] = None
|
|
219
224
|
debugger_history = None
|
|
220
225
|
|
|
@@ -421,6 +426,45 @@ class TerminalInteractiveShell(InteractiveShell):
|
|
|
421
426
|
allow_none=True,
|
|
422
427
|
).tag(config=True)
|
|
423
428
|
|
|
429
|
+
llm_constructor_kwargs = Dict(
|
|
430
|
+
{},
|
|
431
|
+
help="""
|
|
432
|
+
Extra arguments to pass to `llm_provider_class` constructor.
|
|
433
|
+
|
|
434
|
+
This is used to – for example – set the `model_id`""",
|
|
435
|
+
).tag(config=True)
|
|
436
|
+
|
|
437
|
+
llm_provider_class = DottedObjectName(
|
|
438
|
+
None,
|
|
439
|
+
allow_none=True,
|
|
440
|
+
help="""\
|
|
441
|
+
Provisional:
|
|
442
|
+
This is a provisinal API in IPython 8.32, before stabilisation
|
|
443
|
+
in 9.0, it may change without warnings.
|
|
444
|
+
|
|
445
|
+
class to use for the `NavigableAutoSuggestFromHistory` to request
|
|
446
|
+
completions from a LLM, this should inherit from
|
|
447
|
+
`jupyter_ai_magics:BaseProvider` and implement
|
|
448
|
+
`stream_inline_completions`
|
|
449
|
+
""",
|
|
450
|
+
).tag(config=True)
|
|
451
|
+
|
|
452
|
+
@observe("llm_provider_class")
|
|
453
|
+
def _llm_provider_class_changed(self, change):
|
|
454
|
+
provider_class = change.new
|
|
455
|
+
if provider_class is not None:
|
|
456
|
+
warn(
|
|
457
|
+
"TerminalInteractiveShell.llm_provider_class is a provisional"
|
|
458
|
+
" API as of IPython 8.32, and may change without warnings."
|
|
459
|
+
)
|
|
460
|
+
if isinstance(self.auto_suggest, NavigableAutoSuggestFromHistory):
|
|
461
|
+
self.auto_suggest._llm_provider = provider_class()
|
|
462
|
+
else:
|
|
463
|
+
self.log.warn(
|
|
464
|
+
"llm_provider_class only has effects when using"
|
|
465
|
+
"`NavigableAutoSuggestFromHistory` as auto_suggest."
|
|
466
|
+
)
|
|
467
|
+
|
|
424
468
|
def _set_autosuggestions(self, provider):
|
|
425
469
|
# disconnect old handler
|
|
426
470
|
if self.auto_suggest and isinstance(
|
|
@@ -432,7 +476,15 @@ class TerminalInteractiveShell(InteractiveShell):
|
|
|
432
476
|
elif provider == "AutoSuggestFromHistory":
|
|
433
477
|
self.auto_suggest = AutoSuggestFromHistory()
|
|
434
478
|
elif provider == "NavigableAutoSuggestFromHistory":
|
|
479
|
+
# LLM stuff are all Provisional in 8.32
|
|
480
|
+
if self.llm_provider_class:
|
|
481
|
+
llm_provider_constructor = import_item(self.llm_provider_class)
|
|
482
|
+
llm_provider = llm_provider_constructor(**self.llm_constructor_kwargs)
|
|
483
|
+
else:
|
|
484
|
+
llm_provider = None
|
|
435
485
|
self.auto_suggest = NavigableAutoSuggestFromHistory()
|
|
486
|
+
# Provisinal in 8.32
|
|
487
|
+
self.auto_suggest._llm_provider = llm_provider
|
|
436
488
|
else:
|
|
437
489
|
raise ValueError("No valid provider.")
|
|
438
490
|
if self.pt_app:
|
|
@@ -464,23 +516,23 @@ class TerminalInteractiveShell(InteractiveShell):
|
|
|
464
516
|
"create": Bool(False),
|
|
465
517
|
},
|
|
466
518
|
),
|
|
467
|
-
help="""
|
|
519
|
+
help="""
|
|
520
|
+
Add, disable or modifying shortcuts.
|
|
468
521
|
|
|
469
522
|
Each entry on the list should be a dictionary with ``command`` key
|
|
470
523
|
identifying the target function executed by the shortcut and at least
|
|
471
524
|
one of the following:
|
|
472
525
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
526
|
+
- ``match_keys``: list of keys used to match an existing shortcut,
|
|
527
|
+
- ``match_filter``: shortcut filter used to match an existing shortcut,
|
|
528
|
+
- ``new_keys``: list of keys to set,
|
|
529
|
+
- ``new_filter``: a new shortcut filter to set
|
|
477
530
|
|
|
478
531
|
The filters have to be composed of pre-defined verbs and joined by one
|
|
479
532
|
of the following conjunctions: ``&`` (and), ``|`` (or), ``~`` (not).
|
|
480
533
|
The pre-defined verbs are:
|
|
481
534
|
|
|
482
|
-
{}
|
|
483
|
-
|
|
535
|
+
{filters}
|
|
484
536
|
|
|
485
537
|
To disable a shortcut set ``new_keys`` to an empty list.
|
|
486
538
|
To add a shortcut add key ``create`` with value ``True``.
|
|
@@ -495,8 +547,27 @@ class TerminalInteractiveShell(InteractiveShell):
|
|
|
495
547
|
shortcuts) can be modified or disabled. The full list of shortcuts,
|
|
496
548
|
command identifiers and filters is available under
|
|
497
549
|
:ref:`terminal-shortcuts-list`.
|
|
550
|
+
|
|
551
|
+
Here is an example:
|
|
552
|
+
|
|
553
|
+
.. code::
|
|
554
|
+
|
|
555
|
+
c.TerminalInteractiveShell.shortcuts = [
|
|
556
|
+
{{
|
|
557
|
+
"new_keys": ["c-q"],
|
|
558
|
+
"command": "prompt_toolkit:named_commands.capitalize_word",
|
|
559
|
+
"create": True,
|
|
560
|
+
}},
|
|
561
|
+
{{
|
|
562
|
+
"new_keys": ["c-j"],
|
|
563
|
+
"command": "prompt_toolkit:named_commands.beginning_of_line",
|
|
564
|
+
"create": True,
|
|
565
|
+
}},
|
|
566
|
+
]
|
|
567
|
+
|
|
568
|
+
|
|
498
569
|
""".format(
|
|
499
|
-
"\n ".join([f"-
|
|
570
|
+
filters="\n ".join([f" - ``{k}``" for k in KEYBINDING_FILTERS])
|
|
500
571
|
),
|
|
501
572
|
).tag(config=True)
|
|
502
573
|
|
|
@@ -815,7 +886,8 @@ class TerminalInteractiveShell(InteractiveShell):
|
|
|
815
886
|
& ~IsDone()
|
|
816
887
|
& Condition(
|
|
817
888
|
lambda: isinstance(
|
|
818
|
-
self.auto_suggest,
|
|
889
|
+
self.auto_suggest,
|
|
890
|
+
NavigableAutoSuggestFromHistory,
|
|
819
891
|
)
|
|
820
892
|
),
|
|
821
893
|
),
|
|
@@ -3,9 +3,11 @@ import os
|
|
|
3
3
|
from IPython.external.qt_for_kernel import QtCore, QtGui, enum_helper
|
|
4
4
|
from IPython import get_ipython
|
|
5
5
|
|
|
6
|
-
# If we create a QApplication, keep a reference to
|
|
7
|
-
# garbage collected.
|
|
6
|
+
# If we create a QApplication, QEventLoop, or a QTimer, keep a reference to them
|
|
7
|
+
# so that they don't get garbage collected or leak memory when created multiple times.
|
|
8
8
|
_appref = None
|
|
9
|
+
_eventloop = None
|
|
10
|
+
_timer = None
|
|
9
11
|
_already_warned = False
|
|
10
12
|
|
|
11
13
|
|
|
@@ -21,7 +23,7 @@ def _reclaim_excepthook():
|
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
def inputhook(context):
|
|
24
|
-
global _appref
|
|
26
|
+
global _appref, _eventloop, _timer
|
|
25
27
|
app = QtCore.QCoreApplication.instance()
|
|
26
28
|
if not app:
|
|
27
29
|
if sys.platform == 'linux':
|
|
@@ -48,6 +50,7 @@ def inputhook(context):
|
|
|
48
50
|
except AttributeError: # Only for Qt>=5.14.
|
|
49
51
|
pass
|
|
50
52
|
_appref = app = QtGui.QApplication([" "])
|
|
53
|
+
_eventloop = QtCore.QEventLoop(app)
|
|
51
54
|
|
|
52
55
|
# "reclaim" IPython sys.excepthook after event loop starts
|
|
53
56
|
# without this, it defaults back to BaseIPythonApplication.excepthook
|
|
@@ -55,18 +58,17 @@ def inputhook(context):
|
|
|
55
58
|
# formatting and look like "bug in IPython".
|
|
56
59
|
QtCore.QTimer.singleShot(0, _reclaim_excepthook)
|
|
57
60
|
|
|
58
|
-
event_loop = QtCore.QEventLoop(app)
|
|
59
|
-
|
|
60
61
|
if sys.platform == 'win32':
|
|
61
62
|
# The QSocketNotifier method doesn't appear to work on Windows.
|
|
62
63
|
# Use polling instead.
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
if _timer is None:
|
|
65
|
+
_timer = QtCore.QTimer()
|
|
66
|
+
_timer.timeout.connect(_eventloop.quit)
|
|
65
67
|
while not context.input_is_ready():
|
|
66
|
-
# NOTE: run the event loop, and after
|
|
67
|
-
|
|
68
|
-
_exec(
|
|
69
|
-
|
|
68
|
+
# NOTE: run the event loop, and after 10 ms, call `quit` to exit it.
|
|
69
|
+
_timer.start(10) # 10 ms
|
|
70
|
+
_exec(_eventloop)
|
|
71
|
+
_timer.stop()
|
|
70
72
|
else:
|
|
71
73
|
# On POSIX platforms, we can use a file descriptor to quit the event
|
|
72
74
|
# loop when there is input ready to read.
|
|
@@ -77,14 +79,10 @@ def inputhook(context):
|
|
|
77
79
|
# connect the callback we care about before we turn it on
|
|
78
80
|
# lambda is necessary as PyQT inspect the function signature to know
|
|
79
81
|
# what arguments to pass to. See https://github.com/ipython/ipython/pull/12355
|
|
80
|
-
notifier.activated.connect(lambda:
|
|
82
|
+
notifier.activated.connect(lambda: _eventloop.exit())
|
|
81
83
|
notifier.setEnabled(True)
|
|
82
84
|
# only start the event loop we are not already flipped
|
|
83
85
|
if not context.input_is_ready():
|
|
84
|
-
_exec(
|
|
86
|
+
_exec(_eventloop)
|
|
85
87
|
finally:
|
|
86
88
|
notifier.setEnabled(False)
|
|
87
|
-
|
|
88
|
-
# This makes sure that the event loop is garbage collected.
|
|
89
|
-
# See issue 14240.
|
|
90
|
-
event_loop.setParent(None)
|
|
@@ -24,9 +24,9 @@ from prompt_toolkit.key_binding.vi_state import InputMode, ViState
|
|
|
24
24
|
from prompt_toolkit.filters import Condition
|
|
25
25
|
|
|
26
26
|
from IPython.core.getipython import get_ipython
|
|
27
|
-
from
|
|
28
|
-
from
|
|
29
|
-
from
|
|
27
|
+
from . import auto_match as match
|
|
28
|
+
from . import auto_suggest
|
|
29
|
+
from .filters import filter_from_string
|
|
30
30
|
from IPython.utils.decorators import undoc
|
|
31
31
|
|
|
32
32
|
from prompt_toolkit.enums import DEFAULT_BUFFER
|
|
@@ -630,6 +630,7 @@ KEY_BINDINGS = [
|
|
|
630
630
|
]
|
|
631
631
|
|
|
632
632
|
UNASSIGNED_ALLOWED_COMMANDS = [
|
|
633
|
+
auto_suggest.llm_autosuggestion,
|
|
633
634
|
nc.beginning_of_buffer,
|
|
634
635
|
nc.end_of_buffer,
|
|
635
636
|
nc.end_of_line,
|