ipython 9.2.0__tar.gz → 9.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/completer.py +93 -7
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/debugger.py +11 -1
- ipython-9.4.0/IPython/core/debugger_backport.py +206 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/guarded_eval.py +23 -8
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/interactiveshell.py +44 -15
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/execution.py +64 -11
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/namespace.py +19 -5
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/script.py +8 -1
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/release.py +1 -1
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/autoreload.py +165 -6
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/deduperreload/deduperreload.py +1 -10
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/tests/test_deduperreload.py +39 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/interactiveshell.py +8 -5
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/auto_suggest.py +22 -9
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-9.2.0/ipython.egg-info → ipython-9.4.0}/PKG-INFO +1 -1
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version8.rst +10 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version9.rst +51 -2
- {ipython-9.2.0 → ipython-9.4.0}/examples/auto_suggest_llm.py +2 -2
- {ipython-9.2.0 → ipython-9.4.0/ipython.egg-info}/PKG-INFO +1 -1
- {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/SOURCES.txt +1 -114
- {ipython-9.2.0 → ipython-9.4.0}/pyproject.toml +10 -2
- {ipython-9.2.0 → ipython-9.4.0}/tests/fake_llm.py +15 -1
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_completer.py +61 -1
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_debugger.py +28 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_guarded_eval.py +25 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_magic.py +17 -2
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_shortcuts.py +12 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_zzz_autoreload.py +445 -1
- ipython-9.2.0/docs/source/.jupyter/desktop-workspaces/default-37a8.jupyterlab-workspace +0 -1
- ipython-9.2.0/docs/source/api/generated/IPython.core.alias.rst +0 -36
- ipython-9.2.0/docs/source/api/generated/IPython.core.application.rst +0 -20
- ipython-9.2.0/docs/source/api/generated/IPython.core.async_helpers.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.core.autocall.rst +0 -24
- ipython-9.2.0/docs/source/api/generated/IPython.core.builtin_trap.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.compilerop.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.core.completer.rst +0 -107
- ipython-9.2.0/docs/source/api/generated/IPython.core.completerlib.rst +0 -43
- ipython-9.2.0/docs/source/api/generated/IPython.core.crashhandler.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.core.debugger.rst +0 -35
- ipython-9.2.0/docs/source/api/generated/IPython.core.doctb.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.error.rst +0 -30
- ipython-9.2.0/docs/source/api/generated/IPython.core.events.rst +0 -34
- ipython-9.2.0/docs/source/api/generated/IPython.core.extensions.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.formatters.rst +0 -83
- ipython-9.2.0/docs/source/api/generated/IPython.core.getipython.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.core.guarded_eval.rst +0 -31
- ipython-9.2.0/docs/source/api/generated/IPython.core.history.rst +0 -59
- ipython-9.2.0/docs/source/api/generated/IPython.core.historyapp.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.core.hooks.rst +0 -31
- ipython-9.2.0/docs/source/api/generated/IPython.core.inputtransformer2.rst +0 -85
- ipython-9.2.0/docs/source/api/generated/IPython.core.interactiveshell.rst +0 -56
- ipython-9.2.0/docs/source/api/generated/IPython.core.logger.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.macro.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.magic.rst +0 -59
- ipython-9.2.0/docs/source/api/generated/IPython.core.magic_arguments.rst +0 -62
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.ast_mod.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.auto.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.basic.rst +0 -24
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.code.rst +0 -38
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.config.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.display.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.execution.rst +0 -38
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.extension.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.history.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.logging.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.namespace.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.osm.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.packaging.rst +0 -20
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.pylab.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.magics.script.rst +0 -26
- ipython-9.2.0/docs/source/api/generated/IPython.core.oinspect.rst +0 -52
- ipython-9.2.0/docs/source/api/generated/IPython.core.page.rst +0 -37
- ipython-9.2.0/docs/source/api/generated/IPython.core.payload.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.core.payloadpage.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.core.prefilter.rst +0 -88
- ipython-9.2.0/docs/source/api/generated/IPython.core.profileapp.rst +0 -35
- ipython-9.2.0/docs/source/api/generated/IPython.core.profiledir.rst +0 -18
- ipython-9.2.0/docs/source/api/generated/IPython.core.pylabtools.rst +0 -37
- ipython-9.2.0/docs/source/api/generated/IPython.core.shellapp.rst +0 -20
- ipython-9.2.0/docs/source/api/generated/IPython.core.splitinput.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.core.tbtools.rst +0 -40
- ipython-9.2.0/docs/source/api/generated/IPython.core.tips.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.core.ultratb.rst +0 -42
- ipython-9.2.0/docs/source/api/generated/IPython.display.rst +0 -181
- ipython-9.2.0/docs/source/api/generated/IPython.lib.backgroundjobs.rst +0 -34
- ipython-9.2.0/docs/source/api/generated/IPython.lib.clipboard.rst +0 -29
- ipython-9.2.0/docs/source/api/generated/IPython.lib.deepreload.rst +0 -37
- ipython-9.2.0/docs/source/api/generated/IPython.lib.demo.rst +0 -53
- ipython-9.2.0/docs/source/api/generated/IPython.lib.editorhooks.rst +0 -43
- ipython-9.2.0/docs/source/api/generated/IPython.lib.guisupport.rst +0 -28
- ipython-9.2.0/docs/source/api/generated/IPython.lib.latextools.rst +0 -35
- ipython-9.2.0/docs/source/api/generated/IPython.lib.pretty.rst +0 -83
- ipython-9.2.0/docs/source/api/generated/IPython.paths.rst +0 -25
- ipython-9.2.0/docs/source/api/generated/IPython.rst +0 -19
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.debugger.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.embed.rst +0 -30
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.interactiveshell.rst +0 -34
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.ipapp.rst +0 -30
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.magics.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.prompts.rst +0 -24
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.auto_match.rst +0 -46
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.auto_suggest.rst +0 -67
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.filters.rst +0 -58
- ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.rst +0 -76
- ipython-9.2.0/docs/source/api/generated/IPython.testing.decorators.rst +0 -25
- ipython-9.2.0/docs/source/api/generated/IPython.testing.globalipapp.rst +0 -19
- ipython-9.2.0/docs/source/api/generated/IPython.testing.ipunittest.rst +0 -31
- ipython-9.2.0/docs/source/api/generated/IPython.testing.skipdoctest.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.testing.tools.rst +0 -60
- ipython-9.2.0/docs/source/api/generated/IPython.utils.PyColorize.rst +0 -26
- ipython-9.2.0/docs/source/api/generated/IPython.utils.capture.rst +0 -28
- ipython-9.2.0/docs/source/api/generated/IPython.utils.coloransi.rst +0 -14
- ipython-9.2.0/docs/source/api/generated/IPython.utils.contexts.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.data.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.decorators.rst +0 -19
- ipython-9.2.0/docs/source/api/generated/IPython.utils.dir2.rst +0 -19
- ipython-9.2.0/docs/source/api/generated/IPython.utils.encoding.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.frame.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.utils.generics.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.importstring.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.utils.io.rst +0 -25
- ipython-9.2.0/docs/source/api/generated/IPython.utils.ipstruct.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.module_paths.rst +0 -13
- ipython-9.2.0/docs/source/api/generated/IPython.utils.openpy.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.utils.path.rst +0 -56
- ipython-9.2.0/docs/source/api/generated/IPython.utils.process.rst +0 -23
- ipython-9.2.0/docs/source/api/generated/IPython.utils.sentinel.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.strdispatch.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.sysinfo.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.utils.syspathcontext.rst +0 -16
- ipython-9.2.0/docs/source/api/generated/IPython.utils.tempdir.rst +0 -20
- ipython-9.2.0/docs/source/api/generated/IPython.utils.terminal.rst +0 -22
- ipython-9.2.0/docs/source/api/generated/IPython.utils.text.rst +0 -54
- ipython-9.2.0/docs/source/api/generated/IPython.utils.timing.rst +0 -31
- ipython-9.2.0/docs/source/api/generated/IPython.utils.tokenutil.rst +0 -29
- ipython-9.2.0/docs/source/api/generated/IPython.utils.wildcard.rst +0 -28
- ipython-9.2.0/docs/source/api/generated/gen.txt +0 -113
- ipython-9.2.0/docs/source/config/options/config-generated.txt +0 -0
- ipython-9.2.0/docs/source/config/options/terminal.rst +0 -2016
- ipython-9.2.0/docs/source/config/shortcuts/table.tsv +0 -79
- ipython-9.2.0/docs/source/interactive/magics-generated.txt +0 -2493
- {ipython-9.2.0 → ipython-9.4.0}/.flake8 +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/.mailmap +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/.pre-commit-config.yaml +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/COPYING.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/__main__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/alias.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/application.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/async_helpers.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/autocall.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/compilerop.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/completerlib.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/crashhandler.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/display.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/display_functions.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/display_trap.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/displayhook.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/displaypub.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/doctb.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/error.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/events.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/extensions.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/formatters.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/getipython.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/history.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/historyapp.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/hooks.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/inputtransformer2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/logger.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/macro.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magic.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/auto.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/basic.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/code.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/config.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/display.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/extension.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/history.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/logging.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/osm.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/packaging.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/oinspect.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/page.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/payload.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/payloadpage.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/prefilter.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/profileapp.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/profiledir.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/pylabtools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/shellapp.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/splitinput.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/tbtools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/tips.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/ultratb.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/core/usage.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/display.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/deduperreload/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/external/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/external/pickleshare.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/external/qt_loaders.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/clipboard.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/deepreload.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/demo.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/display.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/guisupport.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/latextools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/lexers.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/pretty.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/paths.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/py.typed +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/debugger.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/embed.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/magics.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/prompts.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/decorators.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/tools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/PyColorize.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_cli.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_common.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_win32.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/capture.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/coloransi.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/contexts.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/data.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/decorators.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/dir2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/docs.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/encoding.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/eventful.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/frame.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/generics.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/importstring.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/io.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/log.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/module_paths.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/openpy.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/path.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/process.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/py3compat.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/sentinel.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/sysinfo.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/tempdir.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/terminal.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/text.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/timing.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/tokenutil.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/wildcard.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/LICENSE +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/MANIFEST.in +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/README.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/_build_meta.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/Makefile +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/README.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_api.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_config.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_magics.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/make.cmd +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/man/ipython.1 +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/requirements.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_static/logo.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/about/history.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/about/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/api/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/conf.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/details.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/integrating.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/intro.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/options/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/coredev/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/config.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/execution.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/kernels.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/messaging.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/pycompat.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/install/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/install/install.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/magics.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/links.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/overview.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/parallel/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/sphinx.toml +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/sphinxext.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/development.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/github.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/magics.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/requires.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/long_description.rst +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/scripts/ipython.ico +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/scripts/ipython_nb.ico +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/setup.cfg +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/setup.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/setupbase.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/2x2.jpg +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/2x2.png +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/__init__.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/bad_all.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/conftest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/cve.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/fake_ext_dir/daft_extension.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/nonascii.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/nonascii2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/print_argv.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/refbug.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/simpleerr.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/tclass.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test.wav +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_alias.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_application.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_async_helpers.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_autocall.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_backgroundjobs.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_capture.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_clipboard.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_compilerop.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_completerlib.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_debug_magic.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_decorators.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_decorators_2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_deepreload.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_dir2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_display.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_display_2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_displayhook.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_editorhooks.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_embed.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_events.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_extension.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_formatters.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_handlers.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_help.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_history.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_hooks.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_imports.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_importstring.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_inputtransformer2.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_inputtransformer2_line.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_interactiveshell.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_interactivshell.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_io.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_iplib.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_ipunittest.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_latextools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_logger.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_magic_arguments.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_magic_terminal.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_module_paths.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_oinspect.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_openpy.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_page.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_path.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_paths.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_prefilter.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_pretty.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_process.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_profile.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_pt_inputhooks.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_pycolorize.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_pylabtools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_qt_loaders.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_run.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_shellapp.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_splitinput.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_storemagic.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_sysinfo.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_tempdir.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_text.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_tips.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_tokenutil.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_tools.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_ultratb.py +0 -0
- {ipython-9.2.0 → ipython-9.4.0}/tests/test_wildcard.py +0 -0
|
@@ -203,15 +203,11 @@ from types import SimpleNamespace
|
|
|
203
203
|
from typing import (
|
|
204
204
|
Iterable,
|
|
205
205
|
Iterator,
|
|
206
|
-
List,
|
|
207
|
-
Tuple,
|
|
208
206
|
Union,
|
|
209
207
|
Any,
|
|
210
208
|
Sequence,
|
|
211
|
-
Dict,
|
|
212
209
|
Optional,
|
|
213
210
|
TYPE_CHECKING,
|
|
214
|
-
Set,
|
|
215
211
|
Sized,
|
|
216
212
|
TypeVar,
|
|
217
213
|
Literal,
|
|
@@ -236,10 +232,12 @@ from traitlets import (
|
|
|
236
232
|
List as ListTrait,
|
|
237
233
|
Unicode,
|
|
238
234
|
Dict as DictTrait,
|
|
235
|
+
DottedObjectName,
|
|
239
236
|
Union as UnionTrait,
|
|
240
237
|
observe,
|
|
241
238
|
)
|
|
242
239
|
from traitlets.config.configurable import Configurable
|
|
240
|
+
from traitlets.utils.importstring import import_item
|
|
243
241
|
|
|
244
242
|
import __main__
|
|
245
243
|
|
|
@@ -987,7 +985,7 @@ class Completer(Configurable):
|
|
|
987
985
|
|
|
988
986
|
- ``forbidden``: no evaluation of code is permitted,
|
|
989
987
|
- ``minimal``: evaluation of literals and access to built-in namespace;
|
|
990
|
-
no item/attribute
|
|
988
|
+
no item/attribute evaluation, no access to locals/globals,
|
|
991
989
|
no evaluation of any operations or comparisons.
|
|
992
990
|
- ``limited``: access to all namespaces, evaluation of hard-coded methods
|
|
993
991
|
(for example: :any:`dict.keys`, :any:`object.__getattr__`,
|
|
@@ -995,7 +993,9 @@ class Completer(Configurable):
|
|
|
995
993
|
:any:`dict`, :any:`list`, :any:`tuple`, ``pandas.Series``),
|
|
996
994
|
- ``unsafe``: evaluation of all methods and function calls but not of
|
|
997
995
|
syntax with side-effects like `del x`,
|
|
998
|
-
- ``dangerous``: completely arbitrary evaluation.
|
|
996
|
+
- ``dangerous``: completely arbitrary evaluation; does not support auto-import.
|
|
997
|
+
|
|
998
|
+
To override specific elements of the policy, you can use ``policy_overrides`` trait.
|
|
999
999
|
""",
|
|
1000
1000
|
).tag(config=True)
|
|
1001
1001
|
|
|
@@ -1031,6 +1031,35 @@ class Completer(Configurable):
|
|
|
1031
1031
|
""",
|
|
1032
1032
|
).tag(config=True)
|
|
1033
1033
|
|
|
1034
|
+
policy_overrides = DictTrait(
|
|
1035
|
+
default_value={},
|
|
1036
|
+
key_trait=Unicode(),
|
|
1037
|
+
help="""Overrides for policy evaluation.
|
|
1038
|
+
|
|
1039
|
+
For example, to enable auto-import on completion specify:
|
|
1040
|
+
|
|
1041
|
+
.. code-block::
|
|
1042
|
+
|
|
1043
|
+
ipython --Completer.policy_overrides='{"allow_auto_import": True}' --Completer.use_jedi=False
|
|
1044
|
+
|
|
1045
|
+
""",
|
|
1046
|
+
).tag(config=True)
|
|
1047
|
+
|
|
1048
|
+
auto_import_method = DottedObjectName(
|
|
1049
|
+
default_value="importlib.import_module",
|
|
1050
|
+
allow_none=True,
|
|
1051
|
+
help="""\
|
|
1052
|
+
Provisional:
|
|
1053
|
+
This is a provisional API in IPython 9.3, it may change without warnings.
|
|
1054
|
+
|
|
1055
|
+
A fully qualified path to an auto-import method for use by completer.
|
|
1056
|
+
The function should take a single string and return `ModuleType` and
|
|
1057
|
+
can raise `ImportError` exception if module is not found.
|
|
1058
|
+
|
|
1059
|
+
The default auto-import implementation does not populate the user namespace with the imported module.
|
|
1060
|
+
""",
|
|
1061
|
+
).tag(config=True)
|
|
1062
|
+
|
|
1034
1063
|
def __init__(self, namespace=None, global_namespace=None, **kwargs):
|
|
1035
1064
|
"""Create a new completer for the command line.
|
|
1036
1065
|
|
|
@@ -1134,6 +1163,48 @@ class Completer(Configurable):
|
|
|
1134
1163
|
# we simple attribute matching with normal identifiers.
|
|
1135
1164
|
_ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$")
|
|
1136
1165
|
|
|
1166
|
+
def _strip_code_before_operator(self, code: str) -> str:
|
|
1167
|
+
o_parens = {"(", "[", "{"}
|
|
1168
|
+
c_parens = {")", "]", "}"}
|
|
1169
|
+
|
|
1170
|
+
# Dry-run tokenize to catch errors
|
|
1171
|
+
try:
|
|
1172
|
+
_ = list(tokenize.generate_tokens(iter(code.splitlines()).__next__))
|
|
1173
|
+
except tokenize.TokenError:
|
|
1174
|
+
# Try trimming the expression and retrying
|
|
1175
|
+
trimmed_code = self._trim_expr(code)
|
|
1176
|
+
try:
|
|
1177
|
+
_ = list(
|
|
1178
|
+
tokenize.generate_tokens(iter(trimmed_code.splitlines()).__next__)
|
|
1179
|
+
)
|
|
1180
|
+
code = trimmed_code
|
|
1181
|
+
except tokenize.TokenError:
|
|
1182
|
+
return code
|
|
1183
|
+
|
|
1184
|
+
tokens = _parse_tokens(code)
|
|
1185
|
+
encountered_operator = False
|
|
1186
|
+
after_operator = []
|
|
1187
|
+
nesting_level = 0
|
|
1188
|
+
|
|
1189
|
+
for t in tokens:
|
|
1190
|
+
if t.type == tokenize.OP:
|
|
1191
|
+
if t.string in o_parens:
|
|
1192
|
+
nesting_level += 1
|
|
1193
|
+
elif t.string in c_parens:
|
|
1194
|
+
nesting_level -= 1
|
|
1195
|
+
elif t.string != "." and nesting_level == 0:
|
|
1196
|
+
encountered_operator = True
|
|
1197
|
+
after_operator = []
|
|
1198
|
+
continue
|
|
1199
|
+
|
|
1200
|
+
if encountered_operator:
|
|
1201
|
+
after_operator.append(t.string)
|
|
1202
|
+
|
|
1203
|
+
if encountered_operator:
|
|
1204
|
+
return "".join(after_operator)
|
|
1205
|
+
else:
|
|
1206
|
+
return code
|
|
1207
|
+
|
|
1137
1208
|
def _attr_matches(
|
|
1138
1209
|
self, text: str, include_prefix: bool = True
|
|
1139
1210
|
) -> tuple[Sequence[str], str]:
|
|
@@ -1141,9 +1212,12 @@ class Completer(Configurable):
|
|
|
1141
1212
|
if not m2:
|
|
1142
1213
|
return [], ""
|
|
1143
1214
|
expr, attr = m2.group(1, 2)
|
|
1215
|
+
try:
|
|
1216
|
+
expr = self._strip_code_before_operator(expr)
|
|
1217
|
+
except tokenize.TokenError:
|
|
1218
|
+
pass
|
|
1144
1219
|
|
|
1145
1220
|
obj = self._evaluate_expr(expr)
|
|
1146
|
-
|
|
1147
1221
|
if obj is not_found:
|
|
1148
1222
|
return [], ""
|
|
1149
1223
|
|
|
@@ -1234,6 +1308,8 @@ class Completer(Configurable):
|
|
|
1234
1308
|
globals=self.global_namespace,
|
|
1235
1309
|
locals=self.namespace,
|
|
1236
1310
|
evaluation=self.evaluation,
|
|
1311
|
+
auto_import=self._auto_import,
|
|
1312
|
+
policy_overrides=self.policy_overrides,
|
|
1237
1313
|
),
|
|
1238
1314
|
)
|
|
1239
1315
|
done = True
|
|
@@ -1247,6 +1323,14 @@ class Completer(Configurable):
|
|
|
1247
1323
|
expr = self._trim_expr(expr)
|
|
1248
1324
|
return obj
|
|
1249
1325
|
|
|
1326
|
+
@property
|
|
1327
|
+
def _auto_import(self):
|
|
1328
|
+
if self.auto_import_method is None:
|
|
1329
|
+
return None
|
|
1330
|
+
if not hasattr(self, "_auto_import_func"):
|
|
1331
|
+
self._auto_import_func = import_item(self.auto_import_method)
|
|
1332
|
+
return self._auto_import_func
|
|
1333
|
+
|
|
1250
1334
|
def get__all__entries(obj):
|
|
1251
1335
|
"""returns the strings in the __all__ attribute"""
|
|
1252
1336
|
try:
|
|
@@ -2787,6 +2871,8 @@ class IPCompleter(Completer):
|
|
|
2787
2871
|
locals=self.namespace,
|
|
2788
2872
|
evaluation=self.evaluation, # type: ignore
|
|
2789
2873
|
in_subscript=True,
|
|
2874
|
+
auto_import=self._auto_import,
|
|
2875
|
+
policy_overrides=self.policy_overrides,
|
|
2790
2876
|
),
|
|
2791
2877
|
)
|
|
2792
2878
|
|
|
@@ -133,6 +133,7 @@ from contextlib import contextmanager
|
|
|
133
133
|
from functools import lru_cache
|
|
134
134
|
|
|
135
135
|
from IPython import get_ipython
|
|
136
|
+
from IPython.core.debugger_backport import PdbClosureBackport
|
|
136
137
|
from IPython.utils import PyColorize
|
|
137
138
|
from IPython.utils.PyColorize import TokenStream
|
|
138
139
|
|
|
@@ -140,9 +141,18 @@ from typing import TYPE_CHECKING
|
|
|
140
141
|
from types import FrameType
|
|
141
142
|
|
|
142
143
|
# We have to check this directly from sys.argv, config struct not yet available
|
|
143
|
-
from pdb import Pdb as
|
|
144
|
+
from pdb import Pdb as _OldPdb
|
|
144
145
|
from pygments.token import Token
|
|
145
146
|
|
|
147
|
+
|
|
148
|
+
if sys.version_info < (3, 13):
|
|
149
|
+
|
|
150
|
+
class OldPdb(PdbClosureBackport, _OldPdb):
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
else:
|
|
154
|
+
OldPdb = _OldPdb
|
|
155
|
+
|
|
146
156
|
if TYPE_CHECKING:
|
|
147
157
|
# otherwise circular import
|
|
148
158
|
from IPython.core.interactiveshell import InteractiveShell
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The code in this module is a backport of cPython changes in Pdb
|
|
3
|
+
that were introduced in Python 3.13 by gh-83151: Make closure work on pdb
|
|
4
|
+
https://github.com/python/cpython/pull/111094.
|
|
5
|
+
This file should be removed once IPython drops supports for Python 3.12.
|
|
6
|
+
|
|
7
|
+
The only changes are:
|
|
8
|
+
- reformatting by darker (black) formatter
|
|
9
|
+
- addition of type-ignore comments to satisfy mypy
|
|
10
|
+
|
|
11
|
+
Copyright (c) 2001 Python Software Foundation; All Rights Reserved
|
|
12
|
+
|
|
13
|
+
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
|
|
14
|
+
--------------------------------------------
|
|
15
|
+
|
|
16
|
+
1. This LICENSE AGREEMENT is between the Python Software Foundation
|
|
17
|
+
("PSF"), and the Individual or Organization ("Licensee") accessing and
|
|
18
|
+
otherwise using this software ("Python") in source or binary form and
|
|
19
|
+
its associated documentation.
|
|
20
|
+
|
|
21
|
+
2. Subject to the terms and conditions of this License Agreement, PSF hereby
|
|
22
|
+
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
|
|
23
|
+
analyze, test, perform and/or display publicly, prepare derivative works,
|
|
24
|
+
distribute, and otherwise use Python alone or in any derivative version,
|
|
25
|
+
provided, however, that PSF's License Agreement and PSF's notice of copyright,
|
|
26
|
+
i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved"
|
|
27
|
+
are retained in Python alone or in any derivative version prepared by Licensee.
|
|
28
|
+
|
|
29
|
+
3. In the event Licensee prepares a derivative work that is based on
|
|
30
|
+
or incorporates Python or any part thereof, and wants to make
|
|
31
|
+
the derivative work available to others as provided herein, then
|
|
32
|
+
Licensee hereby agrees to include in any such work a brief summary of
|
|
33
|
+
the changes made to Python.
|
|
34
|
+
|
|
35
|
+
4. PSF is making Python available to Licensee on an "AS IS"
|
|
36
|
+
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
|
37
|
+
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
|
|
38
|
+
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
|
39
|
+
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
|
|
40
|
+
INFRINGE ANY THIRD PARTY RIGHTS.
|
|
41
|
+
|
|
42
|
+
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
|
43
|
+
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
|
44
|
+
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
|
|
45
|
+
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
|
46
|
+
|
|
47
|
+
6. This License Agreement will automatically terminate upon a material
|
|
48
|
+
breach of its terms and conditions.
|
|
49
|
+
|
|
50
|
+
7. Nothing in this License Agreement shall be deemed to create any
|
|
51
|
+
relationship of agency, partnership, or joint venture between PSF and
|
|
52
|
+
Licensee. This License Agreement does not grant permission to use PSF
|
|
53
|
+
trademarks or trade name in a trademark sense to endorse or promote
|
|
54
|
+
products or services of Licensee, or any third party.
|
|
55
|
+
|
|
56
|
+
8. By copying, installing or otherwise using Python, Licensee
|
|
57
|
+
agrees to be bound by the terms and conditions of this License
|
|
58
|
+
Agreement.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
import sys
|
|
62
|
+
import types
|
|
63
|
+
import codeop
|
|
64
|
+
import textwrap
|
|
65
|
+
from types import CodeType
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class PdbClosureBackport:
|
|
69
|
+
def _exec_in_closure(self, source, globals, locals): # type: ignore[no-untyped-def]
|
|
70
|
+
"""Run source code in closure so code object created within source
|
|
71
|
+
can find variables in locals correctly
|
|
72
|
+
returns True if the source is executed, False otherwise
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
# Determine if the source should be executed in closure. Only when the
|
|
76
|
+
# source compiled to multiple code objects, we should use this feature.
|
|
77
|
+
# Otherwise, we can just raise an exception and normal exec will be used.
|
|
78
|
+
|
|
79
|
+
code = compile(source, "<string>", "exec")
|
|
80
|
+
if not any(isinstance(const, CodeType) for const in code.co_consts):
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
# locals could be a proxy which does not support pop
|
|
84
|
+
# copy it first to avoid modifying the original locals
|
|
85
|
+
locals_copy = dict(locals)
|
|
86
|
+
|
|
87
|
+
locals_copy["__pdb_eval__"] = {"result": None, "write_back": {}}
|
|
88
|
+
|
|
89
|
+
# If the source is an expression, we need to print its value
|
|
90
|
+
try:
|
|
91
|
+
compile(source, "<string>", "eval")
|
|
92
|
+
except SyntaxError:
|
|
93
|
+
pass
|
|
94
|
+
else:
|
|
95
|
+
source = "__pdb_eval__['result'] = " + source
|
|
96
|
+
|
|
97
|
+
# Add write-back to update the locals
|
|
98
|
+
source = (
|
|
99
|
+
"try:\n"
|
|
100
|
+
+ textwrap.indent(source, " ")
|
|
101
|
+
+ "\n"
|
|
102
|
+
+ "finally:\n"
|
|
103
|
+
+ " __pdb_eval__['write_back'] = locals()"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Build a closure source code with freevars from locals like:
|
|
107
|
+
# def __pdb_outer():
|
|
108
|
+
# var = None
|
|
109
|
+
# def __pdb_scope(): # This is the code object we want to execute
|
|
110
|
+
# nonlocal var
|
|
111
|
+
# <source>
|
|
112
|
+
# return __pdb_scope.__code__
|
|
113
|
+
source_with_closure = (
|
|
114
|
+
"def __pdb_outer():\n"
|
|
115
|
+
+ "\n".join(f" {var} = None" for var in locals_copy)
|
|
116
|
+
+ "\n"
|
|
117
|
+
+ " def __pdb_scope():\n"
|
|
118
|
+
+ "\n".join(f" nonlocal {var}" for var in locals_copy)
|
|
119
|
+
+ "\n"
|
|
120
|
+
+ textwrap.indent(source, " ")
|
|
121
|
+
+ "\n"
|
|
122
|
+
+ " return __pdb_scope.__code__"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Get the code object of __pdb_scope()
|
|
126
|
+
# The exec fills locals_copy with the __pdb_outer() function and we can call
|
|
127
|
+
# that to get the code object of __pdb_scope()
|
|
128
|
+
ns = {}
|
|
129
|
+
try:
|
|
130
|
+
exec(source_with_closure, {}, ns)
|
|
131
|
+
except Exception:
|
|
132
|
+
return False
|
|
133
|
+
code = ns["__pdb_outer"]()
|
|
134
|
+
|
|
135
|
+
cells = tuple(types.CellType(locals_copy.get(var)) for var in code.co_freevars)
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
exec(code, globals, locals_copy, closure=cells)
|
|
139
|
+
except Exception:
|
|
140
|
+
return False
|
|
141
|
+
|
|
142
|
+
# get the data we need from the statement
|
|
143
|
+
pdb_eval = locals_copy["__pdb_eval__"]
|
|
144
|
+
|
|
145
|
+
# __pdb_eval__ should not be updated back to locals
|
|
146
|
+
pdb_eval["write_back"].pop("__pdb_eval__")
|
|
147
|
+
|
|
148
|
+
# Write all local variables back to locals
|
|
149
|
+
locals.update(pdb_eval["write_back"])
|
|
150
|
+
eval_result = pdb_eval["result"]
|
|
151
|
+
if eval_result is not None:
|
|
152
|
+
print(repr(eval_result))
|
|
153
|
+
|
|
154
|
+
return True
|
|
155
|
+
|
|
156
|
+
def default(self, line): # type: ignore[no-untyped-def]
|
|
157
|
+
if line[:1] == "!":
|
|
158
|
+
line = line[1:].strip()
|
|
159
|
+
locals = self.curframe_locals
|
|
160
|
+
globals = self.curframe.f_globals
|
|
161
|
+
try:
|
|
162
|
+
buffer = line
|
|
163
|
+
if (
|
|
164
|
+
code := codeop.compile_command(line + "\n", "<stdin>", "single")
|
|
165
|
+
) is None:
|
|
166
|
+
# Multi-line mode
|
|
167
|
+
with self._disable_command_completion():
|
|
168
|
+
buffer = line
|
|
169
|
+
continue_prompt = "... "
|
|
170
|
+
while (
|
|
171
|
+
code := codeop.compile_command(buffer, "<stdin>", "single")
|
|
172
|
+
) is None:
|
|
173
|
+
if self.use_rawinput:
|
|
174
|
+
try:
|
|
175
|
+
line = input(continue_prompt)
|
|
176
|
+
except (EOFError, KeyboardInterrupt):
|
|
177
|
+
self.lastcmd = ""
|
|
178
|
+
print("\n")
|
|
179
|
+
return
|
|
180
|
+
else:
|
|
181
|
+
self.stdout.write(continue_prompt)
|
|
182
|
+
self.stdout.flush()
|
|
183
|
+
line = self.stdin.readline()
|
|
184
|
+
if not len(line):
|
|
185
|
+
self.lastcmd = ""
|
|
186
|
+
self.stdout.write("\n")
|
|
187
|
+
self.stdout.flush()
|
|
188
|
+
return
|
|
189
|
+
else:
|
|
190
|
+
line = line.rstrip("\r\n")
|
|
191
|
+
buffer += "\n" + line
|
|
192
|
+
save_stdout = sys.stdout
|
|
193
|
+
save_stdin = sys.stdin
|
|
194
|
+
save_displayhook = sys.displayhook
|
|
195
|
+
try:
|
|
196
|
+
sys.stdin = self.stdin
|
|
197
|
+
sys.stdout = self.stdout
|
|
198
|
+
sys.displayhook = self.displayhook
|
|
199
|
+
if not self._exec_in_closure(buffer, globals, locals):
|
|
200
|
+
exec(code, globals, locals)
|
|
201
|
+
finally:
|
|
202
|
+
sys.stdout = save_stdout
|
|
203
|
+
sys.stdin = save_stdin
|
|
204
|
+
sys.displayhook = save_displayhook
|
|
205
|
+
except:
|
|
206
|
+
self._error_exc()
|
|
@@ -1,19 +1,15 @@
|
|
|
1
|
+
from copy import copy
|
|
1
2
|
from inspect import isclass, signature, Signature
|
|
2
|
-
from pygments.formatters.terminal256 import Terminal256Formatter
|
|
3
3
|
from typing import (
|
|
4
4
|
Annotated,
|
|
5
5
|
AnyStr,
|
|
6
6
|
Callable,
|
|
7
|
-
Dict,
|
|
8
7
|
Literal,
|
|
9
8
|
NamedTuple,
|
|
10
9
|
NewType,
|
|
11
10
|
Optional,
|
|
12
11
|
Protocol,
|
|
13
|
-
Set,
|
|
14
12
|
Sequence,
|
|
15
|
-
Tuple,
|
|
16
|
-
Type,
|
|
17
13
|
TypeGuard,
|
|
18
14
|
Union,
|
|
19
15
|
get_args,
|
|
@@ -97,6 +93,7 @@ class EvaluationPolicy:
|
|
|
97
93
|
allow_builtins_access: bool = False
|
|
98
94
|
allow_all_operations: bool = False
|
|
99
95
|
allow_any_calls: bool = False
|
|
96
|
+
allow_auto_import: bool = False
|
|
100
97
|
allowed_calls: set[Callable] = field(default_factory=set)
|
|
101
98
|
|
|
102
99
|
def can_get_item(self, value, item):
|
|
@@ -330,6 +327,10 @@ class EvaluationContext(NamedTuple):
|
|
|
330
327
|
#: Whether the evaluation of code takes place inside of a subscript.
|
|
331
328
|
#: Useful for evaluating ``:-1, 'col'`` in ``df[:-1, 'col']``.
|
|
332
329
|
in_subscript: bool = False
|
|
330
|
+
#: Auto import method
|
|
331
|
+
auto_import: Callable[list[str], ModuleType] | None = None
|
|
332
|
+
#: Overrides for evaluation policy
|
|
333
|
+
policy_overrides: dict = {}
|
|
333
334
|
|
|
334
335
|
|
|
335
336
|
class _IdentitySubscript:
|
|
@@ -463,6 +464,17 @@ def _find_dunder(node_op, dunders) -> Union[tuple[str, ...], None]:
|
|
|
463
464
|
return dunder
|
|
464
465
|
|
|
465
466
|
|
|
467
|
+
def get_policy(context: EvaluationContext) -> EvaluationPolicy:
|
|
468
|
+
policy = copy(EVALUATION_POLICIES[context.evaluation])
|
|
469
|
+
|
|
470
|
+
for key, value in context.policy_overrides.items():
|
|
471
|
+
if hasattr(policy, key):
|
|
472
|
+
setattr(policy, key, value)
|
|
473
|
+
else:
|
|
474
|
+
print(f"Incorrect policy override key: {key}")
|
|
475
|
+
return policy
|
|
476
|
+
|
|
477
|
+
|
|
466
478
|
def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
|
|
467
479
|
"""Evaluate AST node in provided context.
|
|
468
480
|
|
|
@@ -490,7 +502,8 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
|
|
|
490
502
|
The purpose of this function is to guard against unwanted side-effects;
|
|
491
503
|
it does not give guarantees on protection from malicious code execution.
|
|
492
504
|
"""
|
|
493
|
-
policy =
|
|
505
|
+
policy = get_policy(context)
|
|
506
|
+
|
|
494
507
|
if node is None:
|
|
495
508
|
return None
|
|
496
509
|
if isinstance(node, ast.Expression):
|
|
@@ -711,7 +724,7 @@ def _resolve_annotation(
|
|
|
711
724
|
|
|
712
725
|
|
|
713
726
|
def _eval_node_name(node_id: str, context: EvaluationContext):
|
|
714
|
-
policy =
|
|
727
|
+
policy = get_policy(context)
|
|
715
728
|
if policy.allow_locals_access and node_id in context.locals:
|
|
716
729
|
return context.locals[node_id]
|
|
717
730
|
if policy.allow_globals_access and node_id in context.globals:
|
|
@@ -719,6 +732,8 @@ def _eval_node_name(node_id: str, context: EvaluationContext):
|
|
|
719
732
|
if policy.allow_builtins_access and hasattr(builtins, node_id):
|
|
720
733
|
# note: do not use __builtins__, it is implementation detail of cPython
|
|
721
734
|
return getattr(builtins, node_id)
|
|
735
|
+
if policy.allow_auto_import and context.auto_import:
|
|
736
|
+
return context.auto_import(node_id)
|
|
722
737
|
if not policy.allow_globals_access and not policy.allow_locals_access:
|
|
723
738
|
raise GuardRejection(
|
|
724
739
|
f"Namespace access not allowed in {context.evaluation} mode"
|
|
@@ -728,7 +743,7 @@ def _eval_node_name(node_id: str, context: EvaluationContext):
|
|
|
728
743
|
|
|
729
744
|
|
|
730
745
|
def _eval_or_create_duck(duck_type, node: ast.Call, context: EvaluationContext):
|
|
731
|
-
policy =
|
|
746
|
+
policy = get_policy(context)
|
|
732
747
|
# if allow-listed builtin is on type annotation, instantiate it
|
|
733
748
|
if policy.can_call(duck_type) and not node.keywords:
|
|
734
749
|
args = [eval_node(arg, context) for arg in node.args]
|
|
@@ -252,13 +252,23 @@ class ExecutionInfo:
|
|
|
252
252
|
Stores information about what is going to happen.
|
|
253
253
|
"""
|
|
254
254
|
raw_cell = None
|
|
255
|
+
transformed_cell = None
|
|
255
256
|
store_history = False
|
|
256
257
|
silent = False
|
|
257
258
|
shell_futures = True
|
|
258
259
|
cell_id = None
|
|
259
260
|
|
|
260
|
-
def __init__(
|
|
261
|
+
def __init__(
|
|
262
|
+
self,
|
|
263
|
+
raw_cell,
|
|
264
|
+
store_history,
|
|
265
|
+
silent,
|
|
266
|
+
shell_futures,
|
|
267
|
+
cell_id,
|
|
268
|
+
transformed_cell=None,
|
|
269
|
+
):
|
|
261
270
|
self.raw_cell = raw_cell
|
|
271
|
+
self.transformed_cell = transformed_cell
|
|
262
272
|
self.store_history = store_history
|
|
263
273
|
self.silent = silent
|
|
264
274
|
self.shell_futures = shell_futures
|
|
@@ -269,12 +279,18 @@ class ExecutionInfo:
|
|
|
269
279
|
raw_cell = (
|
|
270
280
|
(self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell
|
|
271
281
|
)
|
|
282
|
+
transformed_cell = (
|
|
283
|
+
(self.transformed_cell[:50] + "..")
|
|
284
|
+
if self.transformed_cell and len(self.transformed_cell) > 50
|
|
285
|
+
else self.transformed_cell
|
|
286
|
+
)
|
|
272
287
|
return (
|
|
273
|
-
'<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
|
|
288
|
+
'<%s object at %x, raw_cell="%s" transformed_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
|
|
274
289
|
% (
|
|
275
290
|
name,
|
|
276
291
|
id(self),
|
|
277
292
|
raw_cell,
|
|
293
|
+
transformed_cell,
|
|
278
294
|
self.store_history,
|
|
279
295
|
self.silent,
|
|
280
296
|
self.shell_futures,
|
|
@@ -290,7 +306,7 @@ class ExecutionResult:
|
|
|
290
306
|
"""
|
|
291
307
|
|
|
292
308
|
execution_count: Optional[int] = None
|
|
293
|
-
error_before_exec: Optional[
|
|
309
|
+
error_before_exec: Optional[BaseException] = None
|
|
294
310
|
error_in_exec: Optional[BaseException] = None
|
|
295
311
|
info = None
|
|
296
312
|
result = None
|
|
@@ -314,6 +330,7 @@ class ExecutionResult:
|
|
|
314
330
|
return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
|
|
315
331
|
(name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
|
|
316
332
|
|
|
333
|
+
|
|
317
334
|
@functools.wraps(io_open)
|
|
318
335
|
def _modified_open(file, *args, **kwargs):
|
|
319
336
|
if file in {0, 1, 2}:
|
|
@@ -331,7 +348,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
331
348
|
|
|
332
349
|
_instance = None
|
|
333
350
|
_user_ns: dict
|
|
334
|
-
_sys_modules_keys: set[str
|
|
351
|
+
_sys_modules_keys: set[str]
|
|
335
352
|
|
|
336
353
|
inspector: oinspect.Inspector
|
|
337
354
|
|
|
@@ -1572,7 +1589,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
1572
1589
|
if isinstance(variables, str):
|
|
1573
1590
|
vlist = variables.split()
|
|
1574
1591
|
else:
|
|
1575
|
-
vlist = variables
|
|
1592
|
+
vlist = list(variables)
|
|
1576
1593
|
vdict = {}
|
|
1577
1594
|
cf = sys._getframe(1)
|
|
1578
1595
|
for name in vlist:
|
|
@@ -1887,11 +1904,12 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
1887
1904
|
with self.builtin_trap:
|
|
1888
1905
|
info = self._object_find(oname)
|
|
1889
1906
|
if info.found:
|
|
1890
|
-
|
|
1891
|
-
sphinxify
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1907
|
+
if self.sphinxify_docstring:
|
|
1908
|
+
if sphinxify is None:
|
|
1909
|
+
raise ImportError("Module ``docrepr`` required but missing")
|
|
1910
|
+
docformat = sphinxify(self.object_inspect(oname))
|
|
1911
|
+
else:
|
|
1912
|
+
docformat = None
|
|
1895
1913
|
return self.inspector._get_info(
|
|
1896
1914
|
info.obj,
|
|
1897
1915
|
oname,
|
|
@@ -2196,7 +2214,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2196
2214
|
except KeyboardInterrupt:
|
|
2197
2215
|
print('\n' + self.get_exception_only(), file=sys.stderr)
|
|
2198
2216
|
|
|
2199
|
-
def _showtraceback(self, etype, evalue, stb: str):
|
|
2217
|
+
def _showtraceback(self, etype, evalue, stb: list[str]):
|
|
2200
2218
|
"""Actually show a traceback.
|
|
2201
2219
|
|
|
2202
2220
|
Subclasses may override this method to put the traceback on a different
|
|
@@ -3154,14 +3172,18 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
3154
3172
|
except BaseException as e:
|
|
3155
3173
|
try:
|
|
3156
3174
|
info = ExecutionInfo(
|
|
3157
|
-
raw_cell,
|
|
3175
|
+
raw_cell,
|
|
3176
|
+
store_history,
|
|
3177
|
+
silent,
|
|
3178
|
+
shell_futures,
|
|
3179
|
+
cell_id,
|
|
3180
|
+
transformed_cell=transformed_cell,
|
|
3158
3181
|
)
|
|
3159
3182
|
result = ExecutionResult(info)
|
|
3160
3183
|
result.error_in_exec = e
|
|
3161
3184
|
self.showtraceback(running_compiled_code=True)
|
|
3162
3185
|
except:
|
|
3163
3186
|
pass
|
|
3164
|
-
|
|
3165
3187
|
return result
|
|
3166
3188
|
|
|
3167
3189
|
def should_run_async(
|
|
@@ -3246,7 +3268,14 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
3246
3268
|
|
|
3247
3269
|
.. versionadded:: 7.0
|
|
3248
3270
|
"""
|
|
3249
|
-
info = ExecutionInfo(
|
|
3271
|
+
info = ExecutionInfo(
|
|
3272
|
+
raw_cell,
|
|
3273
|
+
store_history,
|
|
3274
|
+
silent,
|
|
3275
|
+
shell_futures,
|
|
3276
|
+
cell_id,
|
|
3277
|
+
transformed_cell=transformed_cell,
|
|
3278
|
+
)
|
|
3250
3279
|
result = ExecutionResult(info)
|
|
3251
3280
|
|
|
3252
3281
|
if (not raw_cell) or raw_cell.isspace():
|
|
@@ -3599,7 +3628,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
3599
3628
|
if mode == "exec":
|
|
3600
3629
|
mod = Module([node], [])
|
|
3601
3630
|
elif mode == "single":
|
|
3602
|
-
mod = ast.Interactive([node])
|
|
3631
|
+
mod = ast.Interactive([node])
|
|
3603
3632
|
with compiler.extra_flags(
|
|
3604
3633
|
getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
|
|
3605
3634
|
if self.autoawait
|