ipython 8.16.0__tar.gz → 8.17.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.16.0 → ipython-8.17.0}/.pre-commit-config.yaml +3 -3
- {ipython-8.16.0 → ipython-8.17.0}/IPython/__main__.py +2 -2
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/completerlib.py +2 -1
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/display.py +1 -1
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/displayhook.py +12 -5
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/events.py +3 -15
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/guarded_eval.py +27 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/inputsplitter.py +20 -12
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/inputtransformer.py +23 -16
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/interactiveshell.py +24 -2
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/packaging.py +64 -25
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/oinspect.py +2 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/release.py +1 -1
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_events.py +0 -13
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_guarded_eval.py +26 -6
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_inputsplitter.py +2 -1
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/lexers.py +128 -119
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/pretty.py +2 -11
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_lexers.py +2 -2
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_pygments.py +2 -4
- {ipython-8.16.0 → ipython-8.17.0}/IPython/sphinxext/ipython_console_highlighting.py +2 -6
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/py3compat.py +1 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/sysinfo.py +7 -6
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_text.py +93 -32
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/text.py +63 -16
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/timing.py +2 -2
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tokenutil.py +12 -7
- {ipython-8.16.0 → ipython-8.17.0}/PKG-INFO +9 -5
- {ipython-8.16.0 → ipython-8.17.0}/README.rst +4 -2
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/lexer.rst +6 -8
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/development.rst +1 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-0.12.rst +4 -4
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-1.0.rst +2 -2
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-2.0.rst +4 -4
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version5.rst +1 -1
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version8.rst +48 -9
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/PKG-INFO +9 -5
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/entry_points.txt +0 -1
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/requires.txt +6 -4
- {ipython-8.16.0 → ipython-8.17.0}/setup.cfg +2 -3
- {ipython-8.16.0 → ipython-8.17.0}/setup.py +0 -1
- {ipython-8.16.0 → ipython-8.17.0}/.flake8 +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/.mailmap +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/COPYING.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/conftest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/consoleapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/alias.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/application.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/async_helpers.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/autocall.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/compilerop.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/completer.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/crashhandler.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/debugger.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/display_functions.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/display_trap.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/displaypub.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/error.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/excolors.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/extensions.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/formatters.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/getipython.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/history.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/historyapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/hooks.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/inputtransformer2.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/logger.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/macro.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magic.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/auto.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/basic.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/code.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/config.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/display.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/execution.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/extension.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/history.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/logging.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/namespace.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/osm.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/magics/script.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/page.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/payload.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/payloadpage.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/prefilter.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/profileapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/profiledir.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/prompts.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/pylabtools.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/shellapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/splitinput.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/2x2.jpg +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/2x2.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/bad_all.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/nonascii.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/nonascii2.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/print_argv.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/refbug.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/simpleerr.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/tclass.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_alias.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_application.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_async_helpers.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_autocall.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_compilerop.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_completer.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_completerlib.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_debugger.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_display.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_displayhook.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_extension.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_formatters.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_handlers.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_history.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_hooks.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_imports.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_inputtransformer.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_interactiveshell.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_iplib.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_logger.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_magic.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_magic_arguments.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_magic_terminal.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_oinspect.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_page.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_paths.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_prefilter.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_profile.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_prompts.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_pylabtools.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_run.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_shellapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_splitinput.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/tests/test_ultratb.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/ultratb.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/core/usage.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/display.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/extensions/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/extensions/autoreload.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/extensions/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/extensions/tests/test_autoreload.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/extensions/tests/test_storemagic.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/external/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/external/qt_loaders.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/external/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/external/tests/test_qt_loaders.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/clipboard.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/deepreload.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/demo.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/display.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/guisupport.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/latextools.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test.wav +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_clipboard.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_deepreload.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_display.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_editorhooks.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_imports.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_latextools.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/lib/tests/test_pretty.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/paths.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/py.typed +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/console.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/debugger.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/embed.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/interactiveshell.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/magics.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/prompts.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/shortcuts/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/test_embed.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/test_help.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/decorators.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/README.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/tests/test_decorators.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/tests/test_ipunittest.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/tests/test_tools.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/testing/tools.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/tests/cve.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/PyColorize.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/_process_cli.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/_process_common.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/_process_win32.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/capture.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/colorable.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/coloransi.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/contexts.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/daemonize.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/data.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/decorators.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/dir2.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/docs.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/encoding.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/eventful.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/frame.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/generics.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/importstring.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/io.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/localinterfaces.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/log.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/module_paths.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/openpy.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/path.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/process.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/sentinel.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/shimmodule.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/signatures.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tempdir.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/terminal.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_capture.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_decorators.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_deprecated.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_dir2.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_imports.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_importstring.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_io.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_module_paths.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_openpy.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_path.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_process.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_pycolorize.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_shimmodule.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_sysinfo.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_tempdir.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_tokenutil.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tests/test_wildcard.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/traitlets.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/tz.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/ulinecache.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/version.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/IPython/utils/wildcard.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/LICENSE +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/MANIFEST.in +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/Makefile +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/README.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/autogen_api.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/autogen_config.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/autogen_magics.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/make.cmd +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/man/ipython.1 +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/requirements.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_static/logo.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/about/history.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/about/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/api/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/conf.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/details.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/integrating.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/intro.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/options/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/coredev/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/config.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/execution.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/kernels.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/messaging.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/parallel_connections.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/parallel_messages.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/pycompat.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/install/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/install/install.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/figs/besselj.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/figs/colors_dark.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/figs/jn.html +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/figs/jn.xhtml +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/magics.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/links.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/overview.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/parallel/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/sphinxext.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/sphinxext/github.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/docs/sphinxext/magics.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/Embedding/Index.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Index.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/data/flare.json +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/Index.ipynb +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/images/FrontendKernel.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/images/animation.m4v +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/images/ipython_logo.png +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/images/python_logo.svg +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/SOURCES.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/long_description.rst +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/pyproject.toml +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/scripts/ipython.ico +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/scripts/ipython_nb.ico +0 -0
- {ipython-8.16.0 → ipython-8.17.0}/setupbase.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# See https://pre-commit.com/hooks.html for more hooks
|
|
3
3
|
repos:
|
|
4
4
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
5
|
-
rev:
|
|
5
|
+
rev: v4.4.0
|
|
6
6
|
hooks:
|
|
7
7
|
- id: trailing-whitespace
|
|
8
8
|
- id: end-of-file-fixer
|
|
@@ -10,7 +10,7 @@ repos:
|
|
|
10
10
|
- id: check-added-large-files
|
|
11
11
|
|
|
12
12
|
- repo: https://github.com/akaihola/darker
|
|
13
|
-
rev: 1.
|
|
13
|
+
rev: 1.7.2
|
|
14
14
|
hooks:
|
|
15
15
|
- id: darker
|
|
16
|
-
|
|
16
|
+
additional_dependencies: [isort, mypy, flake8]
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
# encoding: utf-8
|
|
3
3
|
"""Terminal-based IPython entry point.
|
|
4
4
|
"""
|
|
5
|
-
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
6
|
# Copyright (c) 2012, IPython Development Team.
|
|
7
7
|
#
|
|
8
8
|
# Distributed under the terms of the Modified BSD License.
|
|
9
9
|
#
|
|
10
10
|
# The full license is in the file COPYING.txt, distributed with this software.
|
|
11
|
-
|
|
11
|
+
# -----------------------------------------------------------------------------
|
|
12
12
|
|
|
13
13
|
from IPython import start_ipython
|
|
14
14
|
|
|
@@ -190,7 +190,8 @@ def try_import(mod: str, only_modules=False) -> List[str]:
|
|
|
190
190
|
completions.extend(m_all)
|
|
191
191
|
|
|
192
192
|
if m_is_init:
|
|
193
|
-
|
|
193
|
+
file_ = m.__file__
|
|
194
|
+
completions.extend(module_list(os.path.dirname(file_)))
|
|
194
195
|
completions_set = {c for c in completions if isinstance(c, str)}
|
|
195
196
|
completions_set.discard('__init__')
|
|
196
197
|
return list(completions_set)
|
|
@@ -286,7 +286,7 @@ class DisplayObject(object):
|
|
|
286
286
|
in the frontend. The MIME type of the data should match the
|
|
287
287
|
subclasses used, so the Png subclass should be used for 'image/png'
|
|
288
288
|
data. If the data is a URL, the data will first be downloaded
|
|
289
|
-
and then displayed.
|
|
289
|
+
and then displayed.
|
|
290
290
|
|
|
291
291
|
Parameters
|
|
292
292
|
----------
|
|
@@ -51,7 +51,7 @@ class DisplayHook(Configurable):
|
|
|
51
51
|
|
|
52
52
|
# we need a reference to the user-level namespace
|
|
53
53
|
self.shell = shell
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
self._,self.__,self.___ = '','',''
|
|
56
56
|
|
|
57
57
|
# these are deliberately global:
|
|
@@ -83,9 +83,15 @@ class DisplayHook(Configurable):
|
|
|
83
83
|
|
|
84
84
|
def quiet(self):
|
|
85
85
|
"""Should we silence the display hook because of ';'?"""
|
|
86
|
-
if
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
# do not print output if input ends in ';'
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
cell = self.shell.history_manager.input_hist_parsed[-1]
|
|
90
|
+
except IndexError:
|
|
91
|
+
# some uses of ipshellembed may fail here
|
|
92
|
+
return False
|
|
93
|
+
|
|
94
|
+
return self.semicolon_at_end_of_expression(cell)
|
|
89
95
|
|
|
90
96
|
@staticmethod
|
|
91
97
|
def semicolon_at_end_of_expression(expression):
|
|
@@ -274,12 +280,13 @@ class DisplayHook(Configurable):
|
|
|
274
280
|
cull_count = max(int(sz * self.cull_fraction), 2)
|
|
275
281
|
warn('Output cache limit (currently {sz} entries) hit.\n'
|
|
276
282
|
'Flushing oldest {cull_count} entries.'.format(sz=sz, cull_count=cull_count))
|
|
277
|
-
|
|
283
|
+
|
|
278
284
|
for i, n in enumerate(sorted(oh)):
|
|
279
285
|
if i >= cull_count:
|
|
280
286
|
break
|
|
281
287
|
self.shell.user_ns.pop('_%i' % n, None)
|
|
282
288
|
oh.pop(n, None)
|
|
289
|
+
|
|
283
290
|
|
|
284
291
|
def flush(self):
|
|
285
292
|
if not self.do_full_cache:
|
|
@@ -13,8 +13,6 @@ events and the arguments which will be passed to them.
|
|
|
13
13
|
This API is experimental in IPython 2.0, and may be revised in future versions.
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
from backcall import callback_prototype
|
|
17
|
-
|
|
18
16
|
|
|
19
17
|
class EventManager(object):
|
|
20
18
|
"""Manage a collection of events and a sequence of callbacks for each.
|
|
@@ -63,23 +61,14 @@ class EventManager(object):
|
|
|
63
61
|
"""
|
|
64
62
|
if not callable(function):
|
|
65
63
|
raise TypeError('Need a callable, got %r' % function)
|
|
66
|
-
callback_proto = available_events.get(event)
|
|
67
64
|
if function not in self.callbacks[event]:
|
|
68
|
-
self.callbacks[event].append(
|
|
65
|
+
self.callbacks[event].append(function)
|
|
69
66
|
|
|
70
67
|
def unregister(self, event, function):
|
|
71
68
|
"""Remove a callback from the given event."""
|
|
72
69
|
if function in self.callbacks[event]:
|
|
73
70
|
return self.callbacks[event].remove(function)
|
|
74
71
|
|
|
75
|
-
# Remove callback in case ``function`` was adapted by `backcall`.
|
|
76
|
-
for callback in self.callbacks[event]:
|
|
77
|
-
try:
|
|
78
|
-
if callback.__wrapped__ is function:
|
|
79
|
-
return self.callbacks[event].remove(callback)
|
|
80
|
-
except AttributeError:
|
|
81
|
-
pass
|
|
82
|
-
|
|
83
72
|
raise ValueError('Function {!r} is not registered as a {} callback'.format(function, event))
|
|
84
73
|
|
|
85
74
|
def trigger(self, event, *args, **kwargs):
|
|
@@ -100,9 +89,8 @@ class EventManager(object):
|
|
|
100
89
|
available_events = {}
|
|
101
90
|
|
|
102
91
|
def _define_event(callback_function):
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return callback_proto
|
|
92
|
+
available_events[callback_function.__name__] = callback_function
|
|
93
|
+
return callback_function
|
|
106
94
|
|
|
107
95
|
# ------------------------------------------------------------------------------
|
|
108
96
|
# Callback prototypes
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from inspect import signature, Signature
|
|
1
2
|
from typing import (
|
|
2
3
|
Any,
|
|
3
4
|
Callable,
|
|
@@ -335,6 +336,7 @@ class _IdentitySubscript:
|
|
|
335
336
|
|
|
336
337
|
IDENTITY_SUBSCRIPT = _IdentitySubscript()
|
|
337
338
|
SUBSCRIPT_MARKER = "__SUBSCRIPT_SENTINEL__"
|
|
339
|
+
UNKNOWN_SIGNATURE = Signature()
|
|
338
340
|
|
|
339
341
|
|
|
340
342
|
class GuardRejection(Exception):
|
|
@@ -415,6 +417,10 @@ UNARY_OP_DUNDERS: Dict[Type[ast.unaryop], Tuple[str, ...]] = {
|
|
|
415
417
|
}
|
|
416
418
|
|
|
417
419
|
|
|
420
|
+
class Duck:
|
|
421
|
+
"""A dummy class used to create objects of other classes without calling their ``__init__``"""
|
|
422
|
+
|
|
423
|
+
|
|
418
424
|
def _find_dunder(node_op, dunders) -> Union[Tuple[str, ...], None]:
|
|
419
425
|
dunder = None
|
|
420
426
|
for op, candidate_dunder in dunders.items():
|
|
@@ -584,6 +590,27 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
|
|
|
584
590
|
if policy.can_call(func) and not node.keywords:
|
|
585
591
|
args = [eval_node(arg, context) for arg in node.args]
|
|
586
592
|
return func(*args)
|
|
593
|
+
try:
|
|
594
|
+
sig = signature(func)
|
|
595
|
+
except ValueError:
|
|
596
|
+
sig = UNKNOWN_SIGNATURE
|
|
597
|
+
# if annotation was not stringized, or it was stringized
|
|
598
|
+
# but resolved by signature call we know the return type
|
|
599
|
+
not_empty = sig.return_annotation is not Signature.empty
|
|
600
|
+
not_stringized = not isinstance(sig.return_annotation, str)
|
|
601
|
+
if not_empty and not_stringized:
|
|
602
|
+
duck = Duck()
|
|
603
|
+
# if allow-listed builtin is on type annotation, instantiate it
|
|
604
|
+
if policy.can_call(sig.return_annotation) and not node.keywords:
|
|
605
|
+
args = [eval_node(arg, context) for arg in node.args]
|
|
606
|
+
return sig.return_annotation(*args)
|
|
607
|
+
try:
|
|
608
|
+
# if custom class is in type annotation, mock it;
|
|
609
|
+
# this only works for heap types, not builtins
|
|
610
|
+
duck.__class__ = sig.return_annotation
|
|
611
|
+
return duck
|
|
612
|
+
except TypeError:
|
|
613
|
+
pass
|
|
587
614
|
raise GuardRejection(
|
|
588
615
|
"Call for",
|
|
589
616
|
func, # not joined to avoid calling `repr`
|
|
@@ -31,7 +31,8 @@ import sys
|
|
|
31
31
|
import tokenize
|
|
32
32
|
import warnings
|
|
33
33
|
|
|
34
|
-
from typing import List
|
|
34
|
+
from typing import List, Tuple, Union, Optional
|
|
35
|
+
from types import CodeType
|
|
35
36
|
|
|
36
37
|
from IPython.core.inputtransformer import (leading_indent,
|
|
37
38
|
classic_prompt,
|
|
@@ -91,7 +92,13 @@ def num_ini_spaces(s):
|
|
|
91
92
|
-------
|
|
92
93
|
n : int
|
|
93
94
|
"""
|
|
94
|
-
|
|
95
|
+
warnings.warn(
|
|
96
|
+
"`num_ini_spaces` is Pending Deprecation since IPython 8.17."
|
|
97
|
+
"It is considered fro removal in in future version. "
|
|
98
|
+
"Please open an issue if you believe it should be kept.",
|
|
99
|
+
stacklevel=2,
|
|
100
|
+
category=PendingDeprecationWarning,
|
|
101
|
+
)
|
|
95
102
|
ini_spaces = ini_spaces_re.match(s)
|
|
96
103
|
if ini_spaces:
|
|
97
104
|
return ini_spaces.end()
|
|
@@ -144,7 +151,7 @@ def partial_tokens(s):
|
|
|
144
151
|
else:
|
|
145
152
|
raise
|
|
146
153
|
|
|
147
|
-
def find_next_indent(code):
|
|
154
|
+
def find_next_indent(code) -> int:
|
|
148
155
|
"""Find the number of spaces for the next line of indentation"""
|
|
149
156
|
tokens = list(partial_tokens(code))
|
|
150
157
|
if tokens[-1].type == tokenize.ENDMARKER:
|
|
@@ -318,7 +325,7 @@ class InputSplitter(object):
|
|
|
318
325
|
# If self.source matches the first value, the second value is a valid
|
|
319
326
|
# current indentation. Otherwise, the cache is invalid and the indentation
|
|
320
327
|
# must be recalculated.
|
|
321
|
-
_indent_spaces_cache = None, None
|
|
328
|
+
_indent_spaces_cache: Union[Tuple[None, None], Tuple[str, int]] = None, None
|
|
322
329
|
# String, indicating the default input encoding. It is computed by default
|
|
323
330
|
# at initialization time via get_input_encoding(), but it can be reset by a
|
|
324
331
|
# client with specific knowledge of the encoding.
|
|
@@ -326,11 +333,11 @@ class InputSplitter(object):
|
|
|
326
333
|
# String where the current full source input is stored, properly encoded.
|
|
327
334
|
# Reading this attribute is the normal way of querying the currently pushed
|
|
328
335
|
# source code, that has been properly encoded.
|
|
329
|
-
source =
|
|
336
|
+
source: str = ""
|
|
330
337
|
# Code object corresponding to the current source. It is automatically
|
|
331
338
|
# synced to the source, so it can be queried at any time to obtain the code
|
|
332
339
|
# object; it will be None if the source doesn't compile to valid Python.
|
|
333
|
-
code = None
|
|
340
|
+
code: Optional[CodeType] = None
|
|
334
341
|
|
|
335
342
|
# Private attributes
|
|
336
343
|
|
|
@@ -339,9 +346,9 @@ class InputSplitter(object):
|
|
|
339
346
|
# Command compiler
|
|
340
347
|
_compile: codeop.CommandCompiler
|
|
341
348
|
# Boolean indicating whether the current block is complete
|
|
342
|
-
_is_complete = None
|
|
349
|
+
_is_complete: Optional[bool] = None
|
|
343
350
|
# Boolean indicating whether the current block has an unrecoverable syntax error
|
|
344
|
-
_is_invalid = False
|
|
351
|
+
_is_invalid: bool = False
|
|
345
352
|
|
|
346
353
|
def __init__(self) -> None:
|
|
347
354
|
"""Create a new InputSplitter instance."""
|
|
@@ -511,9 +518,10 @@ class InputSplitter(object):
|
|
|
511
518
|
# General fallback - accept more code
|
|
512
519
|
return True
|
|
513
520
|
|
|
514
|
-
def get_indent_spaces(self):
|
|
521
|
+
def get_indent_spaces(self) -> int:
|
|
515
522
|
sourcefor, n = self._indent_spaces_cache
|
|
516
523
|
if sourcefor == self.source:
|
|
524
|
+
assert n is not None
|
|
517
525
|
return n
|
|
518
526
|
|
|
519
527
|
# self.source always has a trailing newline
|
|
@@ -562,7 +570,7 @@ class IPythonInputSplitter(InputSplitter):
|
|
|
562
570
|
# Private attributes
|
|
563
571
|
|
|
564
572
|
# List with lines of raw input accumulated so far.
|
|
565
|
-
_buffer_raw
|
|
573
|
+
_buffer_raw: List[str]
|
|
566
574
|
|
|
567
575
|
def __init__(self, line_input_checker=True, physical_line_transforms=None,
|
|
568
576
|
logical_line_transforms=None, python_line_transforms=None):
|
|
@@ -652,8 +660,8 @@ class IPythonInputSplitter(InputSplitter):
|
|
|
652
660
|
tmp = transform.reset()
|
|
653
661
|
if tmp is not None:
|
|
654
662
|
yield tmp
|
|
655
|
-
|
|
656
|
-
out = []
|
|
663
|
+
|
|
664
|
+
out: List[str] = []
|
|
657
665
|
for t in self.transforms_in_use:
|
|
658
666
|
out = _flush(t, out)
|
|
659
667
|
|
|
@@ -71,8 +71,8 @@ class InputTransformer(metaclass=abc.ABCMeta):
|
|
|
71
71
|
"""
|
|
72
72
|
@functools.wraps(func)
|
|
73
73
|
def transformer_factory(**kwargs):
|
|
74
|
-
return cls(func, **kwargs)
|
|
75
|
-
|
|
74
|
+
return cls(func, **kwargs) # type: ignore [call-arg]
|
|
75
|
+
|
|
76
76
|
return transformer_factory
|
|
77
77
|
|
|
78
78
|
class StatelessInputTransformer(InputTransformer):
|
|
@@ -194,7 +194,7 @@ def assemble_logical_lines():
|
|
|
194
194
|
line = ''.join(parts)
|
|
195
195
|
|
|
196
196
|
# Utilities
|
|
197
|
-
def _make_help_call(target, esc, lspace):
|
|
197
|
+
def _make_help_call(target: str, esc: str, lspace: str) -> str:
|
|
198
198
|
"""Prepares a pinfo(2)/psearch call from a target name and the escape
|
|
199
199
|
(i.e. ? or ??)"""
|
|
200
200
|
method = 'pinfo2' if esc == '??' \
|
|
@@ -212,17 +212,19 @@ def _make_help_call(target, esc, lspace):
|
|
|
212
212
|
|
|
213
213
|
|
|
214
214
|
# These define the transformations for the different escape characters.
|
|
215
|
-
def _tr_system(line_info):
|
|
215
|
+
def _tr_system(line_info: LineInfo):
|
|
216
216
|
"Translate lines escaped with: !"
|
|
217
217
|
cmd = line_info.line.lstrip().lstrip(ESC_SHELL)
|
|
218
218
|
return '%sget_ipython().system(%r)' % (line_info.pre, cmd)
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
|
|
221
|
+
def _tr_system2(line_info: LineInfo):
|
|
221
222
|
"Translate lines escaped with: !!"
|
|
222
223
|
cmd = line_info.line.lstrip()[2:]
|
|
223
224
|
return '%sget_ipython().getoutput(%r)' % (line_info.pre, cmd)
|
|
224
225
|
|
|
225
|
-
|
|
226
|
+
|
|
227
|
+
def _tr_help(line_info: LineInfo):
|
|
226
228
|
"Translate lines escaped with: ?/??"
|
|
227
229
|
# A naked help line should just fire the intro help screen
|
|
228
230
|
if not line_info.line[1:]:
|
|
@@ -230,7 +232,8 @@ def _tr_help(line_info):
|
|
|
230
232
|
|
|
231
233
|
return _make_help_call(line_info.ifun, line_info.esc, line_info.pre)
|
|
232
234
|
|
|
233
|
-
|
|
235
|
+
|
|
236
|
+
def _tr_magic(line_info: LineInfo):
|
|
234
237
|
"Translate lines escaped with: %"
|
|
235
238
|
tpl = '%sget_ipython().run_line_magic(%r, %r)'
|
|
236
239
|
if line_info.line.startswith(ESC_MAGIC2):
|
|
@@ -241,17 +244,20 @@ def _tr_magic(line_info):
|
|
|
241
244
|
t_magic_name = t_magic_name.lstrip(ESC_MAGIC)
|
|
242
245
|
return tpl % (line_info.pre, t_magic_name, t_magic_arg_s)
|
|
243
246
|
|
|
244
|
-
|
|
247
|
+
|
|
248
|
+
def _tr_quote(line_info: LineInfo):
|
|
245
249
|
"Translate lines escaped with: ,"
|
|
246
250
|
return '%s%s("%s")' % (line_info.pre, line_info.ifun,
|
|
247
251
|
'", "'.join(line_info.the_rest.split()) )
|
|
248
252
|
|
|
249
|
-
|
|
253
|
+
|
|
254
|
+
def _tr_quote2(line_info: LineInfo):
|
|
250
255
|
"Translate lines escaped with: ;"
|
|
251
256
|
return '%s%s("%s")' % (line_info.pre, line_info.ifun,
|
|
252
257
|
line_info.the_rest)
|
|
253
258
|
|
|
254
|
-
|
|
259
|
+
|
|
260
|
+
def _tr_paren(line_info: LineInfo):
|
|
255
261
|
"Translate lines escaped with: /"
|
|
256
262
|
return '%s%s(%s)' % (line_info.pre, line_info.ifun,
|
|
257
263
|
", ".join(line_info.the_rest.split()))
|
|
@@ -266,9 +272,8 @@ tr = { ESC_SHELL : _tr_system,
|
|
|
266
272
|
ESC_PAREN : _tr_paren }
|
|
267
273
|
|
|
268
274
|
@StatelessInputTransformer.wrap
|
|
269
|
-
def escaped_commands(line):
|
|
270
|
-
"""Transform escaped commands - %magic, !system, ?help + various autocalls.
|
|
271
|
-
"""
|
|
275
|
+
def escaped_commands(line: str):
|
|
276
|
+
"""Transform escaped commands - %magic, !system, ?help + various autocalls."""
|
|
272
277
|
if not line or line.isspace():
|
|
273
278
|
return line
|
|
274
279
|
lineinf = LineInfo(line)
|
|
@@ -342,20 +347,22 @@ def ends_in_comment_or_string(src):
|
|
|
342
347
|
|
|
343
348
|
|
|
344
349
|
@StatelessInputTransformer.wrap
|
|
345
|
-
def help_end(line):
|
|
350
|
+
def help_end(line: str):
|
|
346
351
|
"""Translate lines with ?/?? at the end"""
|
|
347
352
|
m = _help_end_re.search(line)
|
|
348
353
|
if m is None or ends_in_comment_or_string(line):
|
|
349
354
|
return line
|
|
350
355
|
target = m.group(1)
|
|
351
356
|
esc = m.group(3)
|
|
352
|
-
|
|
357
|
+
match = _initial_space_re.match(line)
|
|
358
|
+
assert match is not None
|
|
359
|
+
lspace = match.group(0)
|
|
353
360
|
|
|
354
361
|
return _make_help_call(target, esc, lspace)
|
|
355
362
|
|
|
356
363
|
|
|
357
364
|
@CoroutineInputTransformer.wrap
|
|
358
|
-
def cellmagic(end_on_blank_line=False):
|
|
365
|
+
def cellmagic(end_on_blank_line: bool = False):
|
|
359
366
|
"""Captures & transforms cell magics.
|
|
360
367
|
|
|
361
368
|
After a cell magic is started, this stores up any lines it gets until it is
|
|
@@ -21,6 +21,7 @@ import inspect
|
|
|
21
21
|
import os
|
|
22
22
|
import re
|
|
23
23
|
import runpy
|
|
24
|
+
import shutil
|
|
24
25
|
import subprocess
|
|
25
26
|
import sys
|
|
26
27
|
import tempfile
|
|
@@ -36,7 +37,28 @@ from typing import List as ListType, Dict as DictType, Any as AnyType
|
|
|
36
37
|
from typing import Optional, Sequence, Tuple
|
|
37
38
|
from warnings import warn
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
try:
|
|
41
|
+
from pickleshare import PickleShareDB
|
|
42
|
+
except ModuleNotFoundError:
|
|
43
|
+
|
|
44
|
+
class PickleShareDB: # type: ignore [no-redef]
|
|
45
|
+
def __init__(self, path):
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
def get(self, key, default):
|
|
49
|
+
warn(
|
|
50
|
+
f"using {key} requires you to install the `pickleshare` library.",
|
|
51
|
+
stacklevel=2,
|
|
52
|
+
)
|
|
53
|
+
return default
|
|
54
|
+
|
|
55
|
+
def __setitem__(self, key, value):
|
|
56
|
+
warn(
|
|
57
|
+
f"using {key} requires you to install the `pickleshare` library.",
|
|
58
|
+
stacklevel=2,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
40
62
|
from tempfile import TemporaryDirectory
|
|
41
63
|
from traitlets import (
|
|
42
64
|
Any,
|
|
@@ -3902,7 +3924,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
3902
3924
|
del self.tempfiles
|
|
3903
3925
|
for tdir in self.tempdirs:
|
|
3904
3926
|
try:
|
|
3905
|
-
|
|
3927
|
+
shutil.rmtree(tdir)
|
|
3906
3928
|
self.tempdirs.remove(tdir)
|
|
3907
3929
|
except FileNotFoundError:
|
|
3908
3930
|
pass
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
# The full license is in the file COPYING.txt, distributed with this software.
|
|
9
9
|
#-----------------------------------------------------------------------------
|
|
10
10
|
|
|
11
|
+
import functools
|
|
11
12
|
import re
|
|
12
13
|
import shlex
|
|
13
14
|
import sys
|
|
@@ -16,33 +17,49 @@ from pathlib import Path
|
|
|
16
17
|
from IPython.core.magic import Magics, magics_class, line_magic
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
def is_conda_environment(func):
|
|
21
|
+
@functools.wraps(func)
|
|
22
|
+
def wrapper(*args, **kwargs):
|
|
23
|
+
"""Return True if the current Python executable is in a conda env"""
|
|
24
|
+
# TODO: does this need to change on windows?
|
|
25
|
+
if not Path(sys.prefix, "conda-meta", "history").exists():
|
|
26
|
+
raise ValueError(
|
|
27
|
+
"The python kernel does not appear to be a conda environment. "
|
|
28
|
+
"Please use ``%pip install`` instead."
|
|
29
|
+
)
|
|
30
|
+
return func(*args, **kwargs)
|
|
23
31
|
|
|
32
|
+
return wrapper
|
|
24
33
|
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
|
|
35
|
+
def _get_conda_like_executable(command):
|
|
36
|
+
"""Find the path to the given executable
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
|
|
41
|
+
executable: string
|
|
42
|
+
Value should be: conda, mamba or micromamba
|
|
43
|
+
"""
|
|
27
44
|
# Check if there is a conda executable in the same directory as the Python executable.
|
|
28
45
|
# This is the case within conda's root environment.
|
|
29
|
-
|
|
30
|
-
if
|
|
31
|
-
return str(
|
|
46
|
+
executable = Path(sys.executable).parent / command
|
|
47
|
+
if executable.is_file():
|
|
48
|
+
return str(executable)
|
|
32
49
|
|
|
33
50
|
# Otherwise, attempt to extract the executable from conda history.
|
|
34
51
|
# This applies in any conda environment.
|
|
35
52
|
history = Path(sys.prefix, "conda-meta", "history").read_text(encoding="utf-8")
|
|
36
53
|
match = re.search(
|
|
37
|
-
|
|
54
|
+
rf"^#\s*cmd:\s*(?P<command>.*{executable})\s[create|install]",
|
|
38
55
|
history,
|
|
39
56
|
flags=re.MULTILINE,
|
|
40
57
|
)
|
|
41
58
|
if match:
|
|
42
59
|
return match.groupdict()["command"]
|
|
43
60
|
|
|
44
|
-
# Fallback: assume
|
|
45
|
-
return
|
|
61
|
+
# Fallback: assume the executable is available on the system path.
|
|
62
|
+
return command
|
|
46
63
|
|
|
47
64
|
|
|
48
65
|
CONDA_COMMANDS_REQUIRING_PREFIX = {
|
|
@@ -76,18 +93,7 @@ class PackagingMagics(Magics):
|
|
|
76
93
|
|
|
77
94
|
print("Note: you may need to restart the kernel to use updated packages.")
|
|
78
95
|
|
|
79
|
-
|
|
80
|
-
def conda(self, line):
|
|
81
|
-
"""Run the conda package manager within the current kernel.
|
|
82
|
-
|
|
83
|
-
Usage:
|
|
84
|
-
%conda install [pkgs]
|
|
85
|
-
"""
|
|
86
|
-
if not _is_conda_environment():
|
|
87
|
-
raise ValueError("The python kernel does not appear to be a conda environment. "
|
|
88
|
-
"Please use ``%pip install`` instead.")
|
|
89
|
-
|
|
90
|
-
conda = _get_conda_executable()
|
|
96
|
+
def _run_command(self, cmd, line):
|
|
91
97
|
args = shlex.split(line)
|
|
92
98
|
command = args[0] if len(args) > 0 else ""
|
|
93
99
|
args = args[1:] if len(args) > 1 else [""]
|
|
@@ -108,5 +114,38 @@ class PackagingMagics(Magics):
|
|
|
108
114
|
if needs_prefix and not has_prefix:
|
|
109
115
|
extra_args.extend(["--prefix", sys.prefix])
|
|
110
116
|
|
|
111
|
-
self.shell.system(
|
|
117
|
+
self.shell.system(" ".join([cmd, command] + extra_args + args))
|
|
112
118
|
print("\nNote: you may need to restart the kernel to use updated packages.")
|
|
119
|
+
|
|
120
|
+
@line_magic
|
|
121
|
+
@is_conda_environment
|
|
122
|
+
def conda(self, line):
|
|
123
|
+
"""Run the conda package manager within the current kernel.
|
|
124
|
+
|
|
125
|
+
Usage:
|
|
126
|
+
%conda install [pkgs]
|
|
127
|
+
"""
|
|
128
|
+
conda = _get_conda_like_executable("conda")
|
|
129
|
+
self._run_command(conda, line)
|
|
130
|
+
|
|
131
|
+
@line_magic
|
|
132
|
+
@is_conda_environment
|
|
133
|
+
def mamba(self, line):
|
|
134
|
+
"""Run the mamba package manager within the current kernel.
|
|
135
|
+
|
|
136
|
+
Usage:
|
|
137
|
+
%mamba install [pkgs]
|
|
138
|
+
"""
|
|
139
|
+
mamba = _get_conda_like_executable("mamba")
|
|
140
|
+
self._run_command(mamba, line)
|
|
141
|
+
|
|
142
|
+
@line_magic
|
|
143
|
+
@is_conda_environment
|
|
144
|
+
def micromamba(self, line):
|
|
145
|
+
"""Run the conda package manager within the current kernel.
|
|
146
|
+
|
|
147
|
+
Usage:
|
|
148
|
+
%micromamba install [pkgs]
|
|
149
|
+
"""
|
|
150
|
+
micromamba = _get_conda_like_executable("micromamba")
|
|
151
|
+
self._run_command(micromamba, line)
|
|
@@ -76,16 +76,3 @@ class CallbackTests(unittest.TestCase):
|
|
|
76
76
|
self.em.trigger('ping_received')
|
|
77
77
|
self.assertEqual([True, True, False], invoked)
|
|
78
78
|
self.assertEqual([func3], self.em.callbacks['ping_received'])
|
|
79
|
-
|
|
80
|
-
def test_ignore_event_arguments_if_no_argument_required(self):
|
|
81
|
-
call_count = [0]
|
|
82
|
-
def event_with_no_argument():
|
|
83
|
-
call_count[0] += 1
|
|
84
|
-
|
|
85
|
-
self.em.register('event_with_argument', event_with_no_argument)
|
|
86
|
-
self.em.trigger('event_with_argument', 'the argument')
|
|
87
|
-
self.assertEqual(call_count[0], 1)
|
|
88
|
-
|
|
89
|
-
self.em.unregister('event_with_argument', event_with_no_argument)
|
|
90
|
-
self.em.trigger('ping_received')
|
|
91
|
-
self.assertEqual(call_count[0], 1)
|
|
@@ -253,16 +253,36 @@ def test_method_descriptor():
|
|
|
253
253
|
assert guarded_eval("list.copy.__name__", context) == "copy"
|
|
254
254
|
|
|
255
255
|
|
|
256
|
+
class HeapType:
|
|
257
|
+
pass
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class CallCreatesHeapType:
|
|
261
|
+
def __call__(self) -> HeapType:
|
|
262
|
+
return HeapType()
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class CallCreatesBuiltin:
|
|
266
|
+
def __call__(self) -> frozenset:
|
|
267
|
+
return frozenset()
|
|
268
|
+
|
|
269
|
+
|
|
256
270
|
@pytest.mark.parametrize(
|
|
257
|
-
"data,good,bad,expected",
|
|
271
|
+
"data,good,bad,expected, equality",
|
|
258
272
|
[
|
|
259
|
-
[[1, 2, 3], "data.index(2)", "data.append(4)", 1],
|
|
260
|
-
[{"a": 1}, "data.keys().isdisjoint({})", "data.update()", True],
|
|
273
|
+
[[1, 2, 3], "data.index(2)", "data.append(4)", 1, True],
|
|
274
|
+
[{"a": 1}, "data.keys().isdisjoint({})", "data.update()", True, True],
|
|
275
|
+
[CallCreatesHeapType(), "data()", "data.__class__()", HeapType, False],
|
|
276
|
+
[CallCreatesBuiltin(), "data()", "data.__class__()", frozenset, False],
|
|
261
277
|
],
|
|
262
278
|
)
|
|
263
|
-
def test_evaluates_calls(data, good, bad, expected):
|
|
279
|
+
def test_evaluates_calls(data, good, bad, expected, equality):
|
|
264
280
|
context = limited(data=data)
|
|
265
|
-
|
|
281
|
+
value = guarded_eval(good, context)
|
|
282
|
+
if equality:
|
|
283
|
+
assert value == expected
|
|
284
|
+
else:
|
|
285
|
+
assert isinstance(value, expected)
|
|
266
286
|
|
|
267
287
|
with pytest.raises(GuardRejection):
|
|
268
288
|
guarded_eval(bad, context)
|
|
@@ -534,7 +554,7 @@ def test_unbind_method():
|
|
|
534
554
|
def test_assumption_instance_attr_do_not_matter():
|
|
535
555
|
"""This is semi-specified in Python documentation.
|
|
536
556
|
|
|
537
|
-
However, since the specification says 'not
|
|
557
|
+
However, since the specification says 'not guaranteed
|
|
538
558
|
to work' rather than 'is forbidden to work', future
|
|
539
559
|
versions could invalidate this assumptions. This test
|
|
540
560
|
is meant to catch such a change if it ever comes true.
|