ipython 8.29.0__tar.gz → 8.31.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.29.0 → ipython-8.31.0}/IPython/core/completer.py +52 -20
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/crashhandler.py +33 -21
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/debugger.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/display.py +7 -4
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/formatters.py +92 -33
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/guarded_eval.py +6 -9
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/inputsplitter.py +1 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/inputtransformer.py +35 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/inputtransformer2.py +4 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/basic.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/logging.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/prompts.py +3 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/release.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/nonascii2.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_completer.py +95 -45
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_formatters.py +1 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_inputtransformer2.py +1 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_interactiveshell.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_logger.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_magic.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_paths.py +10 -8
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_run.py +3 -3
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_ultratb.py +4 -3
- {ipython-8.29.0 → ipython-8.31.0}/IPython/extensions/tests/test_storemagic.py +29 -24
- {ipython-8.29.0 → ipython-8.31.0}/IPython/external/qt_loaders.py +1 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/__init__.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/clipboard.py +1 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/latextools.py +4 -4
- {ipython-8.29.0 → ipython-8.31.0}/IPython/sphinxext/custom_doctests.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/sphinxext/ipython_directive.py +16 -14
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/interactiveshell.py +21 -12
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/shortcuts/__init__.py +8 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/shortcuts/auto_match.py +1 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/tests/__init__.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_process_cli.py +3 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_process_win32.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/dir2.py +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/sysinfo.py +1 -1
- {ipython-8.29.0/ipython.egg-info → ipython-8.31.0}/PKG-INFO +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/conf.py +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/inputtransforms.rst +2 -2
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/integrating.rst +4 -2
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/magics.rst +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version8.rst +133 -50
- {ipython-8.29.0 → ipython-8.31.0/ipython.egg-info}/PKG-INFO +1 -1
- {ipython-8.29.0 → ipython-8.31.0}/pyproject.toml +17 -5
- {ipython-8.29.0 → ipython-8.31.0}/.flake8 +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/.mailmap +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/.pre-commit-config.yaml +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/COPYING.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/__main__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/conftest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/consoleapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/alias.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/application.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/async_helpers.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/autocall.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/compilerop.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/completerlib.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/display_functions.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/display_trap.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/displayhook.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/displaypub.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/error.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/events.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/excolors.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/extensions.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/getipython.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/history.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/historyapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/hooks.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/interactiveshell.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/logger.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/macro.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magic.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/auto.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/code.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/config.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/display.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/execution.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/extension.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/history.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/namespace.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/osm.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/packaging.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/magics/script.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/oinspect.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/page.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/payload.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/payloadpage.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/prefilter.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/profileapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/profiledir.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/pylabtools.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/shellapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/splitinput.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/2x2.jpg +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/2x2.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/bad_all.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/nonascii.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/print_argv.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/refbug.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/simpleerr.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/tclass.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_alias.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_application.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_async_helpers.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_autocall.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_compilerop.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_completerlib.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_debugger.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_display.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_displayhook.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_events.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_extension.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_guarded_eval.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_handlers.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_history.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_hooks.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_imports.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_inputsplitter.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_inputtransformer.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_iplib.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_magic_arguments.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_magic_terminal.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_oinspect.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_page.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_prefilter.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_profile.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_prompts.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_pylabtools.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_shellapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/tests/test_splitinput.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/ultratb.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/core/usage.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/display.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/extensions/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/extensions/autoreload.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/extensions/tests/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/extensions/tests/test_autoreload.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/external/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/external/tests/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/external/tests/test_qt_loaders.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/deepreload.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/demo.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/display.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/guisupport.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/lexers.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/pretty.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test.wav +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_clipboard.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_deepreload.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_display.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_editorhooks.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_imports.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_latextools.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_lexers.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_pretty.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/lib/tests/test_pygments.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/paths.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/py.typed +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/console.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/debugger.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/embed.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/magics.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/prompts.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/test_embed.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/test_help.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/decorators.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/README.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/tests/test_decorators.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/tests/test_ipunittest.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/tests/test_tools.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/testing/tools.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/tests/cve.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/PyColorize.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_process_common.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/capture.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/colorable.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/coloransi.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/contexts.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/daemonize.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/data.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/decorators.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/docs.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/encoding.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/eventful.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/frame.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/generics.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/importstring.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/io.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/localinterfaces.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/log.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/module_paths.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/openpy.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/path.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/process.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/py3compat.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/sentinel.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/shimmodule.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/signatures.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tempdir.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/terminal.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_capture.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_decorators.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_deprecated.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_dir2.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_imports.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_importstring.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_io.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_module_paths.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_openpy.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_path.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_process.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_pycolorize.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_shimmodule.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_sysinfo.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_tempdir.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_text.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_tokenutil.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tests/test_wildcard.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/text.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/timing.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tokenutil.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/traitlets.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/tz.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/ulinecache.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/version.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/IPython/utils/wildcard.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/LICENSE +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/MANIFEST.in +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/README.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/_build_meta.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/Makefile +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/README.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/autogen_api.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/autogen_config.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/autogen_magics.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/make.cmd +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/man/ipython.1 +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/requirements.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_static/logo.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/about/history.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/about/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/api/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/details.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/intro.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/options/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/coredev/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/config.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/execution.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/kernels.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/lexer.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/messaging.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/pycompat.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/install/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/install/install.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/figs/besselj.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/figs/colors_dark.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/figs/jn.html +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/figs/jn.xhtml +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/links.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/overview.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/parallel/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/sphinx.toml +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/sphinxext.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/development.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/sphinxext/github.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/docs/sphinxext/magics.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/Embedding/Index.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Index.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/data/flare.json +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/Index.ipynb +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/images/FrontendKernel.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/images/animation.m4v +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/images/ipython_logo.png +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/images/python_logo.svg +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/ipython.egg-info/SOURCES.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/ipython.egg-info/requires.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/long_description.rst +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/scripts/ipython.ico +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/scripts/ipython_nb.ico +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/setup.cfg +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/setup.py +0 -0
- {ipython-8.29.0 → ipython-8.31.0}/setupbase.py +0 -0
|
@@ -184,6 +184,7 @@ import glob
|
|
|
184
184
|
import inspect
|
|
185
185
|
import itertools
|
|
186
186
|
import keyword
|
|
187
|
+
import ast
|
|
187
188
|
import os
|
|
188
189
|
import re
|
|
189
190
|
import string
|
|
@@ -347,7 +348,7 @@ def provisionalcompleter(action='ignore'):
|
|
|
347
348
|
yield
|
|
348
349
|
|
|
349
350
|
|
|
350
|
-
def has_open_quotes(s):
|
|
351
|
+
def has_open_quotes(s: str) -> Union[str, bool]:
|
|
351
352
|
"""Return whether a string has open quotes.
|
|
352
353
|
|
|
353
354
|
This simply counts whether the number of quote characters of either type in
|
|
@@ -368,7 +369,7 @@ def has_open_quotes(s):
|
|
|
368
369
|
return False
|
|
369
370
|
|
|
370
371
|
|
|
371
|
-
def protect_filename(s, protectables=PROTECTABLES):
|
|
372
|
+
def protect_filename(s: str, protectables: str = PROTECTABLES) -> str:
|
|
372
373
|
"""Escape a string to protect certain characters."""
|
|
373
374
|
if set(s) & set(protectables):
|
|
374
375
|
if sys.platform == "win32":
|
|
@@ -449,11 +450,11 @@ def completions_sorting_key(word):
|
|
|
449
450
|
|
|
450
451
|
if word.startswith('%%'):
|
|
451
452
|
# If there's another % in there, this is something else, so leave it alone
|
|
452
|
-
if
|
|
453
|
+
if "%" not in word[2:]:
|
|
453
454
|
word = word[2:]
|
|
454
455
|
prio2 = 2
|
|
455
456
|
elif word.startswith('%'):
|
|
456
|
-
if
|
|
457
|
+
if "%" not in word[1:]:
|
|
457
458
|
word = word[1:]
|
|
458
459
|
prio2 = 1
|
|
459
460
|
|
|
@@ -752,7 +753,7 @@ def completion_matcher(
|
|
|
752
753
|
priority: Optional[float] = None,
|
|
753
754
|
identifier: Optional[str] = None,
|
|
754
755
|
api_version: int = 1,
|
|
755
|
-
):
|
|
756
|
+
) -> Callable[[Matcher], Matcher]:
|
|
756
757
|
"""Adds attributes describing the matcher.
|
|
757
758
|
|
|
758
759
|
Parameters
|
|
@@ -961,8 +962,8 @@ class CompletionSplitter(object):
|
|
|
961
962
|
def split_line(self, line, cursor_pos=None):
|
|
962
963
|
"""Split a line of text with a cursor at the given position.
|
|
963
964
|
"""
|
|
964
|
-
|
|
965
|
-
return self._delim_re.split(
|
|
965
|
+
cut_line = line if cursor_pos is None else line[:cursor_pos]
|
|
966
|
+
return self._delim_re.split(cut_line)[-1]
|
|
966
967
|
|
|
967
968
|
|
|
968
969
|
|
|
@@ -1141,8 +1142,13 @@ class Completer(Configurable):
|
|
|
1141
1142
|
"""
|
|
1142
1143
|
return self._attr_matches(text)[0]
|
|
1143
1144
|
|
|
1144
|
-
|
|
1145
|
-
|
|
1145
|
+
# we simple attribute matching with normal identifiers.
|
|
1146
|
+
_ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$")
|
|
1147
|
+
|
|
1148
|
+
def _attr_matches(
|
|
1149
|
+
self, text: str, include_prefix: bool = True
|
|
1150
|
+
) -> Tuple[Sequence[str], str]:
|
|
1151
|
+
m2 = self._ATTR_MATCH_RE.match(self.line_buffer)
|
|
1146
1152
|
if not m2:
|
|
1147
1153
|
return [], ""
|
|
1148
1154
|
expr, attr = m2.group(1, 2)
|
|
@@ -1204,6 +1210,30 @@ class Completer(Configurable):
|
|
|
1204
1210
|
"." + attr,
|
|
1205
1211
|
)
|
|
1206
1212
|
|
|
1213
|
+
def _trim_expr(self, code: str) -> str:
|
|
1214
|
+
"""
|
|
1215
|
+
Trim the code until it is a valid expression and not a tuple;
|
|
1216
|
+
|
|
1217
|
+
return the trimmed expression for guarded_eval.
|
|
1218
|
+
"""
|
|
1219
|
+
while code:
|
|
1220
|
+
code = code[1:]
|
|
1221
|
+
try:
|
|
1222
|
+
res = ast.parse(code)
|
|
1223
|
+
except SyntaxError:
|
|
1224
|
+
continue
|
|
1225
|
+
|
|
1226
|
+
assert res is not None
|
|
1227
|
+
if len(res.body) != 1:
|
|
1228
|
+
continue
|
|
1229
|
+
expr = res.body[0].value
|
|
1230
|
+
if isinstance(expr, ast.Tuple) and not code[-1] == ")":
|
|
1231
|
+
# we skip implicit tuple, like when trimming `fun(a,b`<completion>
|
|
1232
|
+
# as `a,b` would be a tuple, and we actually expect to get only `b`
|
|
1233
|
+
continue
|
|
1234
|
+
return code
|
|
1235
|
+
return ""
|
|
1236
|
+
|
|
1207
1237
|
def _evaluate_expr(self, expr):
|
|
1208
1238
|
obj = not_found
|
|
1209
1239
|
done = False
|
|
@@ -1225,14 +1255,14 @@ class Completer(Configurable):
|
|
|
1225
1255
|
# e.g. user starts `(d[`, so we get `expr = '(d'`,
|
|
1226
1256
|
# where parenthesis is not closed.
|
|
1227
1257
|
# TODO: make this faster by reusing parts of the computation?
|
|
1228
|
-
expr = expr
|
|
1258
|
+
expr = self._trim_expr(expr)
|
|
1229
1259
|
return obj
|
|
1230
1260
|
|
|
1231
1261
|
def get__all__entries(obj):
|
|
1232
1262
|
"""returns the strings in the __all__ attribute"""
|
|
1233
1263
|
try:
|
|
1234
1264
|
words = getattr(obj, '__all__')
|
|
1235
|
-
except:
|
|
1265
|
+
except Exception:
|
|
1236
1266
|
return []
|
|
1237
1267
|
|
|
1238
1268
|
return [w for w in words if isinstance(w, str)]
|
|
@@ -1362,9 +1392,9 @@ def match_dict_keys(
|
|
|
1362
1392
|
# All checks passed!
|
|
1363
1393
|
return True
|
|
1364
1394
|
|
|
1365
|
-
filtered_key_is_final: Dict[
|
|
1366
|
-
|
|
1367
|
-
|
|
1395
|
+
filtered_key_is_final: Dict[Union[str, bytes, int, float], _DictKeyState] = (
|
|
1396
|
+
defaultdict(lambda: _DictKeyState.BASELINE)
|
|
1397
|
+
)
|
|
1368
1398
|
|
|
1369
1399
|
for k in keys:
|
|
1370
1400
|
# If at least one of the matches is not final, mark as undetermined.
|
|
@@ -1447,7 +1477,7 @@ def match_dict_keys(
|
|
|
1447
1477
|
try:
|
|
1448
1478
|
if not str_key.startswith(prefix_str):
|
|
1449
1479
|
continue
|
|
1450
|
-
except (AttributeError, TypeError, UnicodeError)
|
|
1480
|
+
except (AttributeError, TypeError, UnicodeError):
|
|
1451
1481
|
# Python 3+ TypeError on b'a'.startswith('a') or vice-versa
|
|
1452
1482
|
continue
|
|
1453
1483
|
|
|
@@ -1495,7 +1525,7 @@ def cursor_to_position(text:str, line:int, column:int)->int:
|
|
|
1495
1525
|
lines = text.split('\n')
|
|
1496
1526
|
assert line <= len(lines), '{} <= {}'.format(str(line), str(len(lines)))
|
|
1497
1527
|
|
|
1498
|
-
return sum(len(
|
|
1528
|
+
return sum(len(line) + 1 for line in lines[:line]) + column
|
|
1499
1529
|
|
|
1500
1530
|
def position_to_cursor(text:str, offset:int)->Tuple[int, int]:
|
|
1501
1531
|
"""
|
|
@@ -2112,7 +2142,7 @@ class IPCompleter(Completer):
|
|
|
2112
2142
|
result["suppress"] = is_magic_prefix and bool(result["completions"])
|
|
2113
2143
|
return result
|
|
2114
2144
|
|
|
2115
|
-
def magic_matches(self, text: str):
|
|
2145
|
+
def magic_matches(self, text: str) -> List[str]:
|
|
2116
2146
|
"""Match magics.
|
|
2117
2147
|
|
|
2118
2148
|
.. deprecated:: 8.6
|
|
@@ -2469,7 +2499,8 @@ class IPCompleter(Completer):
|
|
|
2469
2499
|
# parenthesis before the cursor
|
|
2470
2500
|
# e.g. for "foo (1+bar(x), pa<cursor>,a=1)", the candidate is "foo"
|
|
2471
2501
|
tokens = regexp.findall(self.text_until_cursor)
|
|
2472
|
-
iterTokens = reversed(tokens)
|
|
2502
|
+
iterTokens = reversed(tokens)
|
|
2503
|
+
openPar = 0
|
|
2473
2504
|
|
|
2474
2505
|
for token in iterTokens:
|
|
2475
2506
|
if token == ')':
|
|
@@ -2489,7 +2520,8 @@ class IPCompleter(Completer):
|
|
|
2489
2520
|
try:
|
|
2490
2521
|
ids.append(next(iterTokens))
|
|
2491
2522
|
if not isId(ids[-1]):
|
|
2492
|
-
ids.pop()
|
|
2523
|
+
ids.pop()
|
|
2524
|
+
break
|
|
2493
2525
|
if not next(iterTokens) == '.':
|
|
2494
2526
|
break
|
|
2495
2527
|
except StopIteration:
|
|
@@ -3215,7 +3247,7 @@ class IPCompleter(Completer):
|
|
|
3215
3247
|
else:
|
|
3216
3248
|
api_version = _get_matcher_api_version(matcher)
|
|
3217
3249
|
raise ValueError(f"Unsupported API version {api_version}")
|
|
3218
|
-
except:
|
|
3250
|
+
except BaseException:
|
|
3219
3251
|
# Show the ugly traceback if the matcher causes an
|
|
3220
3252
|
# exception, but do NOT crash the kernel!
|
|
3221
3253
|
sys.excepthook(*sys.exc_info())
|
|
@@ -24,14 +24,17 @@ import traceback
|
|
|
24
24
|
from pprint import pformat
|
|
25
25
|
from pathlib import Path
|
|
26
26
|
|
|
27
|
+
import builtins as builtin_mod
|
|
28
|
+
|
|
27
29
|
from IPython.core import ultratb
|
|
30
|
+
from IPython.core.application import Application
|
|
28
31
|
from IPython.core.release import author_email
|
|
29
32
|
from IPython.utils.sysinfo import sys_info
|
|
30
|
-
from IPython.utils.py3compat import input
|
|
31
33
|
|
|
32
34
|
from IPython.core.release import __version__ as version
|
|
33
35
|
|
|
34
|
-
from typing import Optional
|
|
36
|
+
from typing import Optional, Dict
|
|
37
|
+
import types
|
|
35
38
|
|
|
36
39
|
#-----------------------------------------------------------------------------
|
|
37
40
|
# Code
|
|
@@ -84,7 +87,7 @@ Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
|
|
|
84
87
|
"""
|
|
85
88
|
|
|
86
89
|
|
|
87
|
-
class CrashHandler
|
|
90
|
+
class CrashHandler:
|
|
88
91
|
"""Customizable crash handlers for IPython applications.
|
|
89
92
|
|
|
90
93
|
Instances of this class provide a :meth:`__call__` method which can be
|
|
@@ -95,10 +98,11 @@ class CrashHandler(object):
|
|
|
95
98
|
|
|
96
99
|
message_template = _default_message_template
|
|
97
100
|
section_sep = '\n\n'+'*'*75+'\n\n'
|
|
101
|
+
info: Dict[str, Optional[str]]
|
|
98
102
|
|
|
99
103
|
def __init__(
|
|
100
104
|
self,
|
|
101
|
-
app,
|
|
105
|
+
app: Application,
|
|
102
106
|
contact_name: Optional[str] = None,
|
|
103
107
|
contact_email: Optional[str] = None,
|
|
104
108
|
bug_tracker: Optional[str] = None,
|
|
@@ -142,10 +146,14 @@ class CrashHandler(object):
|
|
|
142
146
|
bug_tracker = bug_tracker,
|
|
143
147
|
crash_report_fname = self.crash_report_fname)
|
|
144
148
|
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
def __call__(
|
|
150
|
+
self,
|
|
151
|
+
etype: type[BaseException],
|
|
152
|
+
evalue: BaseException,
|
|
153
|
+
etb: types.TracebackType,
|
|
154
|
+
) -> None:
|
|
147
155
|
"""Handle an exception, call for compatible with sys.excepthook"""
|
|
148
|
-
|
|
156
|
+
|
|
149
157
|
# do not allow the crash handler to be called twice without reinstalling it
|
|
150
158
|
# this prevents unlikely errors in the crash handling from entering an
|
|
151
159
|
# infinite loop.
|
|
@@ -155,21 +163,23 @@ class CrashHandler(object):
|
|
|
155
163
|
color_scheme = 'NoColor'
|
|
156
164
|
|
|
157
165
|
# Use this ONLY for developer debugging (keep commented out for release)
|
|
158
|
-
#color_scheme = 'Linux' # dbg
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
166
|
+
# color_scheme = 'Linux' # dbg
|
|
167
|
+
ipython_dir = getattr(self.app, "ipython_dir", None)
|
|
168
|
+
if ipython_dir is not None:
|
|
169
|
+
assert isinstance(ipython_dir, str)
|
|
170
|
+
rptdir = Path(ipython_dir)
|
|
171
|
+
else:
|
|
162
172
|
rptdir = Path.cwd()
|
|
163
|
-
if
|
|
173
|
+
if not rptdir.is_dir():
|
|
164
174
|
rptdir = Path.cwd()
|
|
165
175
|
report_name = rptdir / self.crash_report_fname
|
|
166
176
|
# write the report filename into the instance dict so it can get
|
|
167
177
|
# properly expanded out in the user message template
|
|
168
|
-
self.crash_report_fname = report_name
|
|
169
|
-
self.info[
|
|
178
|
+
self.crash_report_fname = str(report_name)
|
|
179
|
+
self.info["crash_report_fname"] = str(report_name)
|
|
170
180
|
TBhandler = ultratb.VerboseTB(
|
|
171
181
|
color_scheme=color_scheme,
|
|
172
|
-
long_header=
|
|
182
|
+
long_header=True,
|
|
173
183
|
call_pdb=self.call_pdb,
|
|
174
184
|
)
|
|
175
185
|
if self.call_pdb:
|
|
@@ -195,11 +205,11 @@ class CrashHandler(object):
|
|
|
195
205
|
print(self.message_template.format(**self.info), file=sys.stderr)
|
|
196
206
|
|
|
197
207
|
# Construct report on disk
|
|
198
|
-
report.write(self.make_report(traceback))
|
|
208
|
+
report.write(self.make_report(str(traceback)))
|
|
199
209
|
|
|
200
|
-
input("Hit <Enter> to quit (your terminal may close):")
|
|
210
|
+
builtin_mod.input("Hit <Enter> to quit (your terminal may close):")
|
|
201
211
|
|
|
202
|
-
def make_report(self,traceback):
|
|
212
|
+
def make_report(self, traceback: str) -> str:
|
|
203
213
|
"""Return a string containing a crash report."""
|
|
204
214
|
|
|
205
215
|
sec_sep = self.section_sep
|
|
@@ -211,8 +221,8 @@ class CrashHandler(object):
|
|
|
211
221
|
try:
|
|
212
222
|
config = pformat(self.app.config)
|
|
213
223
|
rpt_add(sec_sep)
|
|
214
|
-
rpt_add(
|
|
215
|
-
rpt_add(
|
|
224
|
+
rpt_add("Application name: %s\n\n" % self.app.name)
|
|
225
|
+
rpt_add("Current user configuration structure:\n\n")
|
|
216
226
|
rpt_add(config)
|
|
217
227
|
except:
|
|
218
228
|
pass
|
|
@@ -221,7 +231,9 @@ class CrashHandler(object):
|
|
|
221
231
|
return ''.join(report)
|
|
222
232
|
|
|
223
233
|
|
|
224
|
-
def crash_handler_lite(
|
|
234
|
+
def crash_handler_lite(
|
|
235
|
+
etype: type[BaseException], evalue: BaseException, tb: types.TracebackType
|
|
236
|
+
) -> None:
|
|
225
237
|
"""a light excepthook, adding a small message to the usual traceback"""
|
|
226
238
|
traceback.print_exception(etype, evalue, tb)
|
|
227
239
|
|
|
@@ -550,7 +550,7 @@ class Pdb(OldPdb):
|
|
|
550
550
|
So if frame is self.current_frame we instead return self.curframe_locals
|
|
551
551
|
|
|
552
552
|
"""
|
|
553
|
-
if frame is self
|
|
553
|
+
if frame is getattr(self, "curframe", None):
|
|
554
554
|
return self.curframe_locals
|
|
555
555
|
else:
|
|
556
556
|
return frame.f_locals
|
|
@@ -16,7 +16,8 @@ from copy import deepcopy
|
|
|
16
16
|
from os.path import splitext
|
|
17
17
|
from pathlib import Path, PurePath
|
|
18
18
|
|
|
19
|
-
from
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
20
21
|
from IPython.testing.skipdoctest import skip_doctest
|
|
21
22
|
from . import display_functions
|
|
22
23
|
|
|
@@ -518,7 +519,7 @@ class SVG(DisplayObject):
|
|
|
518
519
|
_read_flags = 'rb'
|
|
519
520
|
# wrap data in a property, which extracts the <svg> tag, discarding
|
|
520
521
|
# document headers
|
|
521
|
-
_data = None
|
|
522
|
+
_data: Optional[str] = None
|
|
522
523
|
|
|
523
524
|
@property
|
|
524
525
|
def data(self):
|
|
@@ -540,8 +541,10 @@ class SVG(DisplayObject):
|
|
|
540
541
|
# fallback on the input, trust the user
|
|
541
542
|
# but this is probably an error.
|
|
542
543
|
pass
|
|
543
|
-
|
|
544
|
-
|
|
544
|
+
if isinstance(svg, bytes):
|
|
545
|
+
self._data = svg.decode(errors="replace")
|
|
546
|
+
else:
|
|
547
|
+
self._data = svg
|
|
545
548
|
|
|
546
549
|
def _repr_svg_(self):
|
|
547
550
|
return self._data_and_metadata()
|
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
"""Display formatters.
|
|
3
3
|
|
|
4
|
+
This module defines the base instances in order to implement custom
|
|
5
|
+
formatters/mimetypes
|
|
6
|
+
got objects:
|
|
7
|
+
|
|
8
|
+
As we want to see internal IPython working we are going to use the following
|
|
9
|
+
function to diaply objects instead of the normal print or display method:
|
|
10
|
+
|
|
11
|
+
>>> ip = get_ipython()
|
|
12
|
+
>>> ip.display_formatter.format(...)
|
|
13
|
+
({'text/plain': 'Ellipsis'}, {})
|
|
14
|
+
|
|
15
|
+
This return a tuple with the mimebumdle for the current object, and the
|
|
16
|
+
associated metadata.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
We can now define our own formatter and register it:
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
>>> from IPython.core.formatters import BaseFormatter, FormatterABC
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
>>> class LLMFormatter(BaseFormatter):
|
|
26
|
+
...
|
|
27
|
+
... format_type = 'x-vendor/llm'
|
|
28
|
+
... print_method = '_repr_llm_'
|
|
29
|
+
... _return_type = (dict, str)
|
|
30
|
+
|
|
31
|
+
>>> llm_formatter = LLMFormatter(parent=ip.display_formatter)
|
|
32
|
+
|
|
33
|
+
>>> ip.display_formatter.formatters[LLMFormatter.format_type] = llm_formatter
|
|
34
|
+
|
|
35
|
+
Now any class that define `_repr_llm_` will return a x-vendor/llm as part of
|
|
36
|
+
it's display data:
|
|
37
|
+
|
|
38
|
+
>>> class A:
|
|
39
|
+
...
|
|
40
|
+
... def _repr_llm_(self, *kwargs):
|
|
41
|
+
... return 'This a A'
|
|
42
|
+
...
|
|
43
|
+
|
|
44
|
+
>>> ip.display_formatter.format(A())
|
|
45
|
+
({'text/plain': '<IPython.core.formatters.A at ...>', 'x-vendor/llm': 'This a A'}, {})
|
|
46
|
+
|
|
47
|
+
As usual, you can register methods for third party types (see
|
|
48
|
+
:ref:`third_party_formatting`)
|
|
49
|
+
|
|
50
|
+
>>> def llm_int(obj):
|
|
51
|
+
... return 'This is the integer %s, in between %s and %s'%(obj, obj-1, obj+1)
|
|
52
|
+
|
|
53
|
+
>>> llm_formatter.for_type(int, llm_int)
|
|
54
|
+
|
|
55
|
+
>>> ip.display_formatter.format(42)
|
|
56
|
+
({'text/plain': '42', 'x-vendor/llm': 'This is the integer 42, in between 41 and 43'}, {})
|
|
57
|
+
|
|
58
|
+
|
|
4
59
|
Inheritance diagram:
|
|
5
60
|
|
|
6
61
|
.. inheritance-diagram:: IPython.core.formatters
|
|
@@ -37,9 +92,10 @@ class DisplayFormatter(Configurable):
|
|
|
37
92
|
active_types = List(Unicode(),
|
|
38
93
|
help="""List of currently active mime-types to display.
|
|
39
94
|
You can use this to set a white-list for formats to display.
|
|
40
|
-
|
|
95
|
+
|
|
41
96
|
Most users will not need to change this value.
|
|
42
|
-
"""
|
|
97
|
+
""",
|
|
98
|
+
).tag(config=True)
|
|
43
99
|
|
|
44
100
|
@default('active_types')
|
|
45
101
|
def _active_types_default(self):
|
|
@@ -144,7 +200,7 @@ class DisplayFormatter(Configurable):
|
|
|
144
200
|
"""
|
|
145
201
|
format_dict = {}
|
|
146
202
|
md_dict = {}
|
|
147
|
-
|
|
203
|
+
|
|
148
204
|
if self.ipython_display_formatter(obj):
|
|
149
205
|
# object handled itself, don't proceed
|
|
150
206
|
return {}, {}
|
|
@@ -176,18 +232,18 @@ class DisplayFormatter(Configurable):
|
|
|
176
232
|
continue
|
|
177
233
|
if exclude and format_type in exclude:
|
|
178
234
|
continue
|
|
179
|
-
|
|
235
|
+
|
|
180
236
|
md = None
|
|
181
237
|
try:
|
|
182
238
|
data = formatter(obj)
|
|
183
239
|
except:
|
|
184
240
|
# FIXME: log the exception
|
|
185
241
|
raise
|
|
186
|
-
|
|
242
|
+
|
|
187
243
|
# formatters can return raw data or (data, metadata)
|
|
188
244
|
if isinstance(data, tuple) and len(data) == 2:
|
|
189
245
|
data, md = data
|
|
190
|
-
|
|
246
|
+
|
|
191
247
|
if data is not None:
|
|
192
248
|
format_dict[format_type] = data
|
|
193
249
|
if md is not None:
|
|
@@ -252,7 +308,7 @@ class FormatterABC(metaclass=abc.ABCMeta):
|
|
|
252
308
|
|
|
253
309
|
# Is the formatter enabled...
|
|
254
310
|
enabled = True
|
|
255
|
-
|
|
311
|
+
|
|
256
312
|
@abc.abstractmethod
|
|
257
313
|
def __call__(self, obj):
|
|
258
314
|
"""Return a JSON'able representation of the object.
|
|
@@ -278,12 +334,15 @@ def _get_type(obj):
|
|
|
278
334
|
return getattr(obj, '__class__', None) or type(obj)
|
|
279
335
|
|
|
280
336
|
|
|
281
|
-
_raise_key_error = Sentinel(
|
|
282
|
-
""
|
|
337
|
+
_raise_key_error = Sentinel(
|
|
338
|
+
"_raise_key_error",
|
|
339
|
+
__name__,
|
|
340
|
+
"""
|
|
283
341
|
Special value to raise a KeyError
|
|
284
342
|
|
|
285
343
|
Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop`
|
|
286
|
-
"""
|
|
344
|
+
""",
|
|
345
|
+
)
|
|
287
346
|
|
|
288
347
|
|
|
289
348
|
class BaseFormatter(Configurable):
|
|
@@ -329,7 +388,7 @@ class BaseFormatter(Configurable):
|
|
|
329
388
|
# The deferred-import type-specific printers.
|
|
330
389
|
# Map (modulename, classname) pairs to the format functions.
|
|
331
390
|
deferred_printers = Dict().tag(config=True)
|
|
332
|
-
|
|
391
|
+
|
|
333
392
|
@catch_format_error
|
|
334
393
|
def __call__(self, obj):
|
|
335
394
|
"""Compute the format for an object."""
|
|
@@ -348,7 +407,7 @@ class BaseFormatter(Configurable):
|
|
|
348
407
|
return None
|
|
349
408
|
else:
|
|
350
409
|
return None
|
|
351
|
-
|
|
410
|
+
|
|
352
411
|
def __contains__(self, typ):
|
|
353
412
|
"""map in to lookup_by_type"""
|
|
354
413
|
try:
|
|
@@ -357,7 +416,7 @@ class BaseFormatter(Configurable):
|
|
|
357
416
|
return False
|
|
358
417
|
else:
|
|
359
418
|
return True
|
|
360
|
-
|
|
419
|
+
|
|
361
420
|
def _check_return(self, r, obj):
|
|
362
421
|
"""Check that a return value is appropriate
|
|
363
422
|
|
|
@@ -372,7 +431,7 @@ class BaseFormatter(Configurable):
|
|
|
372
431
|
(self.format_type, type(r), self._return_type, _safe_repr(obj)),
|
|
373
432
|
FormatterWarning
|
|
374
433
|
)
|
|
375
|
-
|
|
434
|
+
|
|
376
435
|
def lookup(self, obj):
|
|
377
436
|
"""Look up the formatter for a given instance.
|
|
378
437
|
|
|
@@ -395,7 +454,7 @@ class BaseFormatter(Configurable):
|
|
|
395
454
|
return self.singleton_printers[obj_id]
|
|
396
455
|
# then lookup by type
|
|
397
456
|
return self.lookup_by_type(_get_type(obj))
|
|
398
|
-
|
|
457
|
+
|
|
399
458
|
def lookup_by_type(self, typ):
|
|
400
459
|
"""Look up the registered formatter for a type.
|
|
401
460
|
|
|
@@ -426,7 +485,7 @@ class BaseFormatter(Configurable):
|
|
|
426
485
|
for cls in pretty._get_mro(typ):
|
|
427
486
|
if cls in self.type_printers or self._in_deferred_types(cls):
|
|
428
487
|
return self.type_printers[cls]
|
|
429
|
-
|
|
488
|
+
|
|
430
489
|
# If we have reached here, the lookup failed.
|
|
431
490
|
raise KeyError("No registered printer for {0!r}".format(typ))
|
|
432
491
|
|
|
@@ -459,15 +518,15 @@ class BaseFormatter(Configurable):
|
|
|
459
518
|
if isinstance(typ, str):
|
|
460
519
|
type_module, type_name = typ.rsplit('.', 1)
|
|
461
520
|
return self.for_type_by_name(type_module, type_name, func)
|
|
462
|
-
|
|
521
|
+
|
|
463
522
|
try:
|
|
464
523
|
oldfunc = self.lookup_by_type(typ)
|
|
465
524
|
except KeyError:
|
|
466
525
|
oldfunc = None
|
|
467
|
-
|
|
526
|
+
|
|
468
527
|
if func is not None:
|
|
469
528
|
self.type_printers[typ] = func
|
|
470
|
-
|
|
529
|
+
|
|
471
530
|
return oldfunc
|
|
472
531
|
|
|
473
532
|
def for_type_by_name(self, type_module, type_name, func=None):
|
|
@@ -501,16 +560,16 @@ class BaseFormatter(Configurable):
|
|
|
501
560
|
this will be the previous value (to enable restoring later).
|
|
502
561
|
"""
|
|
503
562
|
key = (type_module, type_name)
|
|
504
|
-
|
|
563
|
+
|
|
505
564
|
try:
|
|
506
565
|
oldfunc = self.lookup_by_type("%s.%s" % key)
|
|
507
566
|
except KeyError:
|
|
508
567
|
oldfunc = None
|
|
509
|
-
|
|
568
|
+
|
|
510
569
|
if func is not None:
|
|
511
570
|
self.deferred_printers[key] = func
|
|
512
571
|
return oldfunc
|
|
513
|
-
|
|
572
|
+
|
|
514
573
|
def pop(self, typ, default=_raise_key_error):
|
|
515
574
|
"""Pop a formatter for the given type.
|
|
516
575
|
|
|
@@ -529,7 +588,7 @@ class BaseFormatter(Configurable):
|
|
|
529
588
|
------
|
|
530
589
|
KeyError if the type is not registered and default is not specified.
|
|
531
590
|
"""
|
|
532
|
-
|
|
591
|
+
|
|
533
592
|
if isinstance(typ, str):
|
|
534
593
|
typ_key = tuple(typ.rsplit('.',1))
|
|
535
594
|
if typ_key not in self.deferred_printers:
|
|
@@ -599,14 +658,14 @@ class PlainTextFormatter(BaseFormatter):
|
|
|
599
658
|
# This subclass ignores this attribute as it always need to return
|
|
600
659
|
# something.
|
|
601
660
|
enabled = Bool(True).tag(config=False)
|
|
602
|
-
|
|
661
|
+
|
|
603
662
|
max_seq_length = Integer(pretty.MAX_SEQ_LENGTH,
|
|
604
663
|
help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
|
|
605
|
-
|
|
664
|
+
|
|
606
665
|
Set to 0 to disable truncation.
|
|
607
|
-
"""
|
|
666
|
+
""",
|
|
608
667
|
).tag(config=True)
|
|
609
|
-
|
|
668
|
+
|
|
610
669
|
# Look for a _repr_pretty_ methods to use for pretty printing.
|
|
611
670
|
print_method = ObjectName('_repr_pretty_')
|
|
612
671
|
|
|
@@ -775,7 +834,7 @@ class PNGFormatter(BaseFormatter):
|
|
|
775
834
|
format_type = Unicode('image/png')
|
|
776
835
|
|
|
777
836
|
print_method = ObjectName('_repr_png_')
|
|
778
|
-
|
|
837
|
+
|
|
779
838
|
_return_type = (bytes, str)
|
|
780
839
|
|
|
781
840
|
|
|
@@ -829,7 +888,7 @@ class JSONFormatter(BaseFormatter):
|
|
|
829
888
|
_return_type = (list, dict)
|
|
830
889
|
|
|
831
890
|
print_method = ObjectName('_repr_json_')
|
|
832
|
-
|
|
891
|
+
|
|
833
892
|
def _check_return(self, r, obj):
|
|
834
893
|
"""Check that a return value is appropriate
|
|
835
894
|
|
|
@@ -887,19 +946,19 @@ class PDFFormatter(BaseFormatter):
|
|
|
887
946
|
|
|
888
947
|
class IPythonDisplayFormatter(BaseFormatter):
|
|
889
948
|
"""An escape-hatch Formatter for objects that know how to display themselves.
|
|
890
|
-
|
|
949
|
+
|
|
891
950
|
To define the callables that compute the representation of your
|
|
892
951
|
objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
|
|
893
952
|
or :meth:`for_type_by_name` methods to register functions that handle
|
|
894
953
|
this. Unlike mime-type displays, this method should not return anything,
|
|
895
954
|
instead calling any appropriate display methods itself.
|
|
896
|
-
|
|
955
|
+
|
|
897
956
|
This display formatter has highest priority.
|
|
898
957
|
If it fires, no other display formatter will be called.
|
|
899
958
|
|
|
900
959
|
Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types
|
|
901
960
|
without registering a new Formatter.
|
|
902
|
-
|
|
961
|
+
|
|
903
962
|
IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types,
|
|
904
963
|
so `_ipython_display_` should only be used for objects that require unusual
|
|
905
964
|
display patterns, such as multiple display calls.
|
|
@@ -943,7 +1002,7 @@ class MimeBundleFormatter(BaseFormatter):
|
|
|
943
1002
|
"""
|
|
944
1003
|
print_method = ObjectName('_repr_mimebundle_')
|
|
945
1004
|
_return_type = dict
|
|
946
|
-
|
|
1005
|
+
|
|
947
1006
|
def _check_return(self, r, obj):
|
|
948
1007
|
r = super(MimeBundleFormatter, self)._check_return(r, obj)
|
|
949
1008
|
# always return (data, metadata):
|
|
@@ -44,20 +44,17 @@ else:
|
|
|
44
44
|
|
|
45
45
|
@undoc
|
|
46
46
|
class HasGetItem(Protocol):
|
|
47
|
-
def __getitem__(self, key) -> None:
|
|
48
|
-
...
|
|
47
|
+
def __getitem__(self, key) -> None: ...
|
|
49
48
|
|
|
50
49
|
|
|
51
50
|
@undoc
|
|
52
51
|
class InstancesHaveGetItem(Protocol):
|
|
53
|
-
def __call__(self, *args, **kwargs) -> HasGetItem:
|
|
54
|
-
...
|
|
52
|
+
def __call__(self, *args, **kwargs) -> HasGetItem: ...
|
|
55
53
|
|
|
56
54
|
|
|
57
55
|
@undoc
|
|
58
56
|
class HasGetAttr(Protocol):
|
|
59
|
-
def __getattr__(self, key) -> None:
|
|
60
|
-
...
|
|
57
|
+
def __getattr__(self, key) -> None: ...
|
|
61
58
|
|
|
62
59
|
|
|
63
60
|
@undoc
|
|
@@ -329,9 +326,9 @@ class EvaluationContext(NamedTuple):
|
|
|
329
326
|
#: Global namespace
|
|
330
327
|
globals: dict
|
|
331
328
|
#: Evaluation policy identifier
|
|
332
|
-
evaluation: Literal[
|
|
333
|
-
"forbidden"
|
|
334
|
-
|
|
329
|
+
evaluation: Literal["forbidden", "minimal", "limited", "unsafe", "dangerous"] = (
|
|
330
|
+
"forbidden"
|
|
331
|
+
)
|
|
335
332
|
#: Whether the evaluation of code takes place inside of a subscript.
|
|
336
333
|
#: Useful for evaluating ``:-1, 'col'`` in ``df[:-1, 'col']``.
|
|
337
334
|
in_subscript: bool = False
|