ipython 9.8.0__tar.gz → 9.10.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.8.0 → ipython-9.10.0}/IPython/core/async_helpers.py +4 -9
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/completer.py +2 -2
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/history.py +30 -4
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/inputtransformer2.py +92 -2
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/interactiveshell.py +1 -1
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/prefilter.py +2 -2
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/release.py +1 -1
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/splitinput.py +45 -35
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/tips.py +10 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/autoreload.py +4 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/deduperreload/deduperreload.py +22 -6
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/deduperreload/deduperreload_patching.py +3 -8
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/pretty.py +8 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/__init__.py +1 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-9.8.0/ipython.egg-info → ipython-9.10.0}/PKG-INFO +3 -2
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/conf.py +6 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/install/install.rst +26 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/sphinx.toml +1 -1
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version9.rst +96 -5
- {ipython-9.8.0 → ipython-9.10.0/ipython.egg-info}/PKG-INFO +3 -2
- {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/SOURCES.txt +1 -2
- {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/requires.txt +2 -1
- {ipython-9.8.0 → ipython-9.10.0}/pyproject.toml +2 -1
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_async_helpers.py +11 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_completer.py +23 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_inputtransformer2_line.py +57 -2
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_pretty.py +25 -0
- ipython-9.8.0/docs/sphinxext/github.py +0 -168
- {ipython-9.8.0 → ipython-9.10.0}/.flake8 +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/.mailmap +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/.pre-commit-config.yaml +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/COPYING.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/__main__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/alias.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/application.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/autocall.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/compilerop.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/completerlib.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/crashhandler.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/debugger.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/debugger_backport.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/display.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/display_functions.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/display_trap.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/displayhook.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/displaypub.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/doctb.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/error.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/events.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/extensions.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/formatters.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/getipython.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/guarded_eval.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/historyapp.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/hooks.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/logger.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/macro.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magic.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/auto.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/basic.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/code.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/config.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/display.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/execution.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/extension.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/history.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/logging.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/namespace.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/osm.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/packaging.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/script.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/oinspect.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/page.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/payload.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/payloadpage.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/profileapp.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/profiledir.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/pylabtools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/shellapp.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/tbtools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/ultratb.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/core/usage.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/display.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/deduperreload/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/external/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/external/pickleshare.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/external/qt_loaders.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/clipboard.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/deepreload.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/demo.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/display.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/guisupport.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/latextools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/lexers.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/paths.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/py.typed +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/debugger.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/embed.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/interactiveshell.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/magics.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/prompts.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/decorators.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/tools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/PyColorize.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_cli.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_common.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_win32.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/capture.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/coloransi.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/contexts.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/data.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/decorators.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/dir2.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/docs.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/encoding.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/eventful.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/frame.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/generics.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/importstring.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/io.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/log.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/module_paths.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/openpy.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/path.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/process.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/py3compat.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/sentinel.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/sysinfo.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/tempdir.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/terminal.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/text.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/timing.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/tokenutil.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/wildcard.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/LICENSE +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/MANIFEST.in +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/README.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/_build_meta.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/Makefile +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/README.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_api.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_config.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_magics.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/make.cmd +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/man/ipython.1 +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/requirements.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_static/logo.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/about/history.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/about/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/api/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/details.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/integrating.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/intro.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/options/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/coredev/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/config.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/execution.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/kernels.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/messaging.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/install/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/magics.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/links.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/overview.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/parallel/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/sphinxext.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/development.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version8.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/docs/sphinxext/magics.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/start_ipython_config.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/auto_suggest_llm.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/long_description.rst +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/scripts/ipython.ico +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/scripts/ipython_nb.ico +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/setup.cfg +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/setup.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/setupbase.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/2x2.jpg +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/2x2.png +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/__init__.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/bad_all.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/conftest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/fake_ext_dir/daft_extension.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/fake_llm.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/nonascii.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/nonascii2.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/print_argv.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/refbug.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/simpleerr.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/tclass.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test.wav +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_alias.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_application.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_autocall.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_backgroundjobs.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_capture.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_clipboard.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_compilerop.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_completerlib.py +0 -0
- /ipython-9.8.0/tests/cve.py → /ipython-9.10.0/tests/test_cve.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_debug_magic.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_debugger.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_decorators.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_decorators_2.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_deepreload.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_dir2.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_display.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_display_2.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_displayhook.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_editorhooks.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_embed.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_events.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_extension.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_formatters.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_guarded_eval.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_handlers.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_help.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_history.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_hooks.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_imports.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_importstring.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_inputtransformer2.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_interactiveshell.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_interactivshell.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_io.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_iplib.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_ipunittest.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_latextools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_logger.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_magic.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_magic_arguments.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_magic_terminal.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_module_paths.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_oinspect.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_openpy.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_page.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_path.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_paths.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_prefilter.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_process.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_profile.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_pt_inputhooks.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_pycolorize.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_pylabtools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_qt_loaders.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_run.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_shellapp.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_shortcuts.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_splitinput.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_storemagic.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_sysinfo.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_tempdir.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_text.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_tips.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_tokenutil.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_tools.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_ultratb.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_wildcard.py +0 -0
- {ipython-9.8.0 → ipython-9.10.0}/tests/test_zzz_autoreload.py +0 -0
|
@@ -136,20 +136,15 @@ def _pseudo_sync_runner(coro):
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
def _should_be_async(cell: str) -> bool:
|
|
139
|
-
"""Detect if a block of code
|
|
139
|
+
"""Detect if a block of code needs to be wrapped in an `async def`
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
If it works, assume it should be async. Otherwise Return False.
|
|
145
|
-
|
|
146
|
-
Not handled yet: If the block of code has a return statement as the top
|
|
147
|
-
level, it will be seen as async. This is a know limitation.
|
|
141
|
+
If the code block has a top-level return statement or is otherwise
|
|
142
|
+
invalid, `False` will be returned.
|
|
148
143
|
"""
|
|
149
144
|
try:
|
|
150
145
|
code = compile(
|
|
151
146
|
cell, "<>", "exec", flags=getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
|
|
152
147
|
)
|
|
153
148
|
return inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE
|
|
154
|
-
except (SyntaxError, MemoryError):
|
|
149
|
+
except (SyntaxError, ValueError, MemoryError):
|
|
155
150
|
return False
|
|
@@ -2608,8 +2608,8 @@ class IPCompleter(Completer):
|
|
|
2608
2608
|
if re.search(r"(?<!\w)(?<!\d\.)([-+]?\d+\.(\d+)?)(?!\w)$", line):
|
|
2609
2609
|
return self._CompletionContextType.GLOBAL
|
|
2610
2610
|
|
|
2611
|
-
# Handle all other attribute matches np.ran, d[0].k, (a,b).count
|
|
2612
|
-
chain_match = re.search(r".*(.+(?<!\s)\.(?:[a-zA-
|
|
2611
|
+
# Handle all other attribute matches np.ran, d[0].k, (a,b).count, obj._private
|
|
2612
|
+
chain_match = re.search(r".*(.+(?<!\s)\.(?:[a-zA-Z_]\w*)?)$", line)
|
|
2613
2613
|
if chain_match:
|
|
2614
2614
|
return self._CompletionContextType.ATTRIBUTE
|
|
2615
2615
|
|
|
@@ -8,6 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import atexit
|
|
10
10
|
import datetime
|
|
11
|
+
import os
|
|
11
12
|
import re
|
|
12
13
|
|
|
13
14
|
|
|
@@ -689,6 +690,7 @@ class HistoryManager(HistoryAccessor):
|
|
|
689
690
|
)
|
|
690
691
|
self.hist_file = ":memory:"
|
|
691
692
|
|
|
693
|
+
self.using_thread = False
|
|
692
694
|
if self.enabled and self.hist_file != ":memory:":
|
|
693
695
|
self.save_thread = HistorySavingThread(self)
|
|
694
696
|
try:
|
|
@@ -699,6 +701,8 @@ class HistoryManager(HistoryAccessor):
|
|
|
699
701
|
exc_info=True,
|
|
700
702
|
)
|
|
701
703
|
self.hist_file = ":memory:"
|
|
704
|
+
else:
|
|
705
|
+
self.using_thread = True
|
|
702
706
|
self._instances.add(self)
|
|
703
707
|
assert len(HistoryManager._instances) <= HistoryManager._max_inst, (
|
|
704
708
|
len(HistoryManager._instances),
|
|
@@ -709,6 +713,20 @@ class HistoryManager(HistoryAccessor):
|
|
|
709
713
|
if self.save_thread is not None:
|
|
710
714
|
self.save_thread.stop()
|
|
711
715
|
|
|
716
|
+
@classmethod
|
|
717
|
+
def _stop_thread(cls) -> None:
|
|
718
|
+
# Used before forking so the thread isn't running at fork
|
|
719
|
+
for inst in cls._instances:
|
|
720
|
+
if inst.save_thread is not None:
|
|
721
|
+
inst.save_thread.stop()
|
|
722
|
+
inst.save_thread = None
|
|
723
|
+
|
|
724
|
+
def _restart_thread_if_stopped(self) -> None:
|
|
725
|
+
# Start the thread again after it was stopped for forking
|
|
726
|
+
if self.save_thread is None and self.using_thread:
|
|
727
|
+
self.save_thread = HistorySavingThread(self)
|
|
728
|
+
self.save_thread.start()
|
|
729
|
+
|
|
712
730
|
def _get_hist_file_name(self, profile: Optional[str] = None) -> Path:
|
|
713
731
|
"""Get default history file name based on the Shell's profile.
|
|
714
732
|
|
|
@@ -970,8 +988,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
970
988
|
self.db_input_cache.append((line_num, source, source_raw))
|
|
971
989
|
# Trigger to flush cache and write to DB.
|
|
972
990
|
if len(self.db_input_cache) >= self.db_cache_size:
|
|
973
|
-
if self.
|
|
974
|
-
self.
|
|
991
|
+
if self.using_thread:
|
|
992
|
+
self._restart_thread_if_stopped()
|
|
993
|
+
if self.save_flag is not None:
|
|
994
|
+
self.save_flag.set()
|
|
975
995
|
|
|
976
996
|
# update the auto _i variables
|
|
977
997
|
self._iii = self._ii
|
|
@@ -1003,8 +1023,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
1003
1023
|
|
|
1004
1024
|
with self.db_output_cache_lock:
|
|
1005
1025
|
self.db_output_cache.append((line_num, output))
|
|
1006
|
-
if self.db_cache_size <= 1 and self.
|
|
1007
|
-
self.
|
|
1026
|
+
if self.db_cache_size <= 1 and self.using_thread:
|
|
1027
|
+
self._restart_thread_if_stopped()
|
|
1028
|
+
if self.save_flag is not None:
|
|
1029
|
+
self.save_flag.set()
|
|
1008
1030
|
|
|
1009
1031
|
def _writeout_input_cache(self, conn: sqlite3.Connection) -> None:
|
|
1010
1032
|
with conn:
|
|
@@ -1059,6 +1081,10 @@ class HistoryManager(HistoryAccessor):
|
|
|
1059
1081
|
self.db_output_cache = []
|
|
1060
1082
|
|
|
1061
1083
|
|
|
1084
|
+
if hasattr(os, "register_at_fork"):
|
|
1085
|
+
os.register_at_fork(before=HistoryManager._stop_thread)
|
|
1086
|
+
|
|
1087
|
+
|
|
1062
1088
|
from collections.abc import Callable, Iterator
|
|
1063
1089
|
from weakref import ReferenceType
|
|
1064
1090
|
|
|
@@ -67,9 +67,47 @@ class PromptStripper:
|
|
|
67
67
|
If any prompt is found on the first two lines,
|
|
68
68
|
prompts will be stripped from the rest of the block.
|
|
69
69
|
"""
|
|
70
|
-
def __init__(self, prompt_re, initial_re=None):
|
|
70
|
+
def __init__(self, prompt_re, initial_re=None, *, doctest=False):
|
|
71
71
|
self.prompt_re = prompt_re
|
|
72
72
|
self.initial_re = initial_re or prompt_re
|
|
73
|
+
self.doctest = doctest
|
|
74
|
+
if doctest:
|
|
75
|
+
# Doctest/xdoctest prompts may be indented (e.g. " >>>").
|
|
76
|
+
# We only treat "..." as a continuation prompt when the same pasted
|
|
77
|
+
# block contains at least one ">>>" line, to avoid ambiguity with the
|
|
78
|
+
# Python Ellipsis literal.
|
|
79
|
+
self._doctest_initial_re = re.compile(r'^\s*>>>')
|
|
80
|
+
self._doctest_ps1_re = re.compile(r'^\s*>>>\s?')
|
|
81
|
+
self._doctest_ps2_re = re.compile(r'^\s*\.\.\.\s?')
|
|
82
|
+
|
|
83
|
+
# Very small state machine to detect triple-quoted strings in the
|
|
84
|
+
# *same* input block (e.g. user typed """ then pasted doctest).
|
|
85
|
+
# We preserve literal >>> / ... inside triple-quoted strings.
|
|
86
|
+
self._triple_quote_re = re.compile(r"(?<!\\)(\"\"\"|''')")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _triple_quote_mask(self, lines: List[str]) -> List[bool]:
|
|
90
|
+
"""
|
|
91
|
+
Return a boolean mask: True if the corresponding line is considered
|
|
92
|
+
inside a triple-quoted string literal.
|
|
93
|
+
|
|
94
|
+
This is intentionally heuristic (fast + good enough for paste handling).
|
|
95
|
+
"""
|
|
96
|
+
mask: List[bool] = []
|
|
97
|
+
in_triple: str | None = None # either ''' or """
|
|
98
|
+
for line in lines:
|
|
99
|
+
mask.append(in_triple is not None)
|
|
100
|
+
# Toggle state for each occurrence of """ or ''' in the line.
|
|
101
|
+
for m in self._triple_quote_re.finditer(line):
|
|
102
|
+
q = m.group(1)
|
|
103
|
+
if in_triple is None:
|
|
104
|
+
in_triple = q
|
|
105
|
+
mask[-1] = True # current line is inside triple quotes
|
|
106
|
+
elif in_triple == q:
|
|
107
|
+
in_triple = None
|
|
108
|
+
# else: ignore mismatched triple quote while inside
|
|
109
|
+
return mask
|
|
110
|
+
|
|
73
111
|
|
|
74
112
|
def _strip(self, lines):
|
|
75
113
|
return [self.prompt_re.sub('', l, count=1) for l in lines]
|
|
@@ -77,6 +115,57 @@ class PromptStripper:
|
|
|
77
115
|
def __call__(self, lines):
|
|
78
116
|
if not lines:
|
|
79
117
|
return lines
|
|
118
|
+
|
|
119
|
+
if self.doctest:
|
|
120
|
+
triple_mask = self._triple_quote_mask(lines)
|
|
121
|
+
|
|
122
|
+
# Detect doctest prompts only outside triple-quoted strings.
|
|
123
|
+
has_doctest_outside = any(
|
|
124
|
+
(not in_triple) and self._doctest_initial_re.match(l)
|
|
125
|
+
for l, in_triple in zip(lines, triple_mask)
|
|
126
|
+
)
|
|
127
|
+
if not has_doctest_outside:
|
|
128
|
+
return lines
|
|
129
|
+
|
|
130
|
+
out_lines: List[str] = []
|
|
131
|
+
stripped_mask: List[bool] = []
|
|
132
|
+
|
|
133
|
+
for l, in_triple in zip(lines, triple_mask):
|
|
134
|
+
if in_triple:
|
|
135
|
+
out_lines.append(l)
|
|
136
|
+
stripped_mask.append(False)
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
if self._doctest_ps1_re.match(l):
|
|
140
|
+
new_l = self._doctest_ps1_re.sub('', l, count=1)
|
|
141
|
+
elif self._doctest_ps2_re.match(l):
|
|
142
|
+
new_l = self._doctest_ps2_re.sub('', l, count=1)
|
|
143
|
+
else:
|
|
144
|
+
new_l = l
|
|
145
|
+
out_lines.append(new_l)
|
|
146
|
+
stripped_mask.append(new_l != l)
|
|
147
|
+
|
|
148
|
+
# Dedent only the non-triple-quoted segments where stripping occurred.
|
|
149
|
+
dedented: List[str] = []
|
|
150
|
+
i = 0
|
|
151
|
+
while i < len(out_lines):
|
|
152
|
+
j = i
|
|
153
|
+
in_triple = triple_mask[i]
|
|
154
|
+
while j < len(out_lines) and triple_mask[j] == in_triple:
|
|
155
|
+
j += 1
|
|
156
|
+
|
|
157
|
+
segment = out_lines[i:j]
|
|
158
|
+
seg_stripped = any(stripped_mask[i:j])
|
|
159
|
+
|
|
160
|
+
if (not in_triple) and seg_stripped:
|
|
161
|
+
dedented.extend(dedent(''.join(segment)).splitlines(keepends=True))
|
|
162
|
+
else:
|
|
163
|
+
dedented.extend(segment)
|
|
164
|
+
|
|
165
|
+
i = j
|
|
166
|
+
|
|
167
|
+
return dedented
|
|
168
|
+
|
|
80
169
|
if self.initial_re.match(lines[0]) or \
|
|
81
170
|
(len(lines) > 1 and self.prompt_re.match(lines[1])):
|
|
82
171
|
return self._strip(lines)
|
|
@@ -84,7 +173,8 @@ class PromptStripper:
|
|
|
84
173
|
|
|
85
174
|
classic_prompt = PromptStripper(
|
|
86
175
|
prompt_re=re.compile(r'^(>>>|\.\.\.)( |$)'),
|
|
87
|
-
initial_re=re.compile(r'^>>>( |$)')
|
|
176
|
+
initial_re=re.compile(r'^>>>( |$)'),
|
|
177
|
+
doctest=True,
|
|
88
178
|
)
|
|
89
179
|
|
|
90
180
|
ipython_prompt = PromptStripper(
|
|
@@ -2141,7 +2141,7 @@ class InteractiveShell(SingletonConfigurable):
|
|
|
2141
2141
|
|
|
2142
2142
|
def showtraceback(
|
|
2143
2143
|
self,
|
|
2144
|
-
exc_tuple: tuple[type[BaseException], BaseException,
|
|
2144
|
+
exc_tuple: tuple[type[BaseException], BaseException, AnyType] | None = None,
|
|
2145
2145
|
filename: str | None = None,
|
|
2146
2146
|
tb_offset: int | None = None,
|
|
2147
2147
|
exception_only: bool = False,
|
|
@@ -498,7 +498,7 @@ class AutocallChecker(PrefilterChecker):
|
|
|
498
498
|
if not self.shell.autocall:
|
|
499
499
|
return None
|
|
500
500
|
|
|
501
|
-
oinfo =
|
|
501
|
+
oinfo = self.shell._ofind(line_info.ifun) # This can mutate state via getattr
|
|
502
502
|
if not oinfo.found:
|
|
503
503
|
return None
|
|
504
504
|
|
|
@@ -610,7 +610,7 @@ class AutoHandler(PrefilterHandler):
|
|
|
610
610
|
the_rest = line_info.the_rest
|
|
611
611
|
esc = line_info.esc
|
|
612
612
|
continue_prompt = line_info.continue_prompt
|
|
613
|
-
obj =
|
|
613
|
+
obj = self.shell._ofind(line_info.ifun).obj
|
|
614
614
|
|
|
615
615
|
# This should only be active for single-line input!
|
|
616
616
|
if continue_prompt:
|
|
@@ -1,35 +1,21 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
1
|
"""
|
|
3
2
|
Simple utility for splitting user input. This is used by both inputsplitter and
|
|
4
3
|
prefilter.
|
|
5
|
-
|
|
6
|
-
Authors:
|
|
7
|
-
|
|
8
|
-
* Brian Granger
|
|
9
|
-
* Fernando Perez
|
|
10
4
|
"""
|
|
11
5
|
|
|
12
|
-
|
|
13
|
-
# Copyright (C) 2008-2011 The IPython Development Team
|
|
14
|
-
#
|
|
15
|
-
# Distributed under the terms of the BSD License. The full license is in
|
|
16
|
-
# the file COPYING, distributed as part of this software.
|
|
17
|
-
#-----------------------------------------------------------------------------
|
|
18
|
-
|
|
19
|
-
#-----------------------------------------------------------------------------
|
|
6
|
+
# -----------------------------------------------------------------------------
|
|
20
7
|
# Imports
|
|
21
|
-
|
|
8
|
+
# -----------------------------------------------------------------------------
|
|
22
9
|
|
|
23
10
|
import re
|
|
24
11
|
import sys
|
|
12
|
+
import warnings
|
|
25
13
|
|
|
26
|
-
from IPython.utils import py3compat
|
|
27
|
-
from IPython.utils.encoding import get_stream_enc
|
|
28
14
|
from IPython.core.oinspect import OInfo
|
|
29
15
|
|
|
30
|
-
|
|
16
|
+
# -----------------------------------------------------------------------------
|
|
31
17
|
# Main function
|
|
32
|
-
|
|
18
|
+
# -----------------------------------------------------------------------------
|
|
33
19
|
|
|
34
20
|
# RegExp for splitting line contents into pre-char//first word-method//rest.
|
|
35
21
|
# For clarity, each group in on one line.
|
|
@@ -42,22 +28,25 @@ from IPython.core.oinspect import OInfo
|
|
|
42
28
|
# ! and !! trigger if they are first char(s) *or* follow an indent
|
|
43
29
|
# ? triggers as first or last char.
|
|
44
30
|
|
|
45
|
-
line_split = re.compile(
|
|
31
|
+
line_split = re.compile(
|
|
32
|
+
r"""
|
|
46
33
|
^(\s*) # any leading space
|
|
47
34
|
([,;/%]|!!?|\?\??)? # escape character or characters
|
|
48
35
|
\s*(%{0,2}[\w\.\*]*) # function/method, possibly with leading %
|
|
49
36
|
# to correctly treat things like '?%magic'
|
|
50
37
|
(.*?$|$) # rest of line
|
|
51
|
-
""",
|
|
38
|
+
""",
|
|
39
|
+
re.VERBOSE,
|
|
40
|
+
)
|
|
52
41
|
|
|
53
42
|
|
|
54
|
-
def split_user_input(
|
|
43
|
+
def split_user_input(
|
|
44
|
+
line: str, pattern: re.Pattern[str] | None = None
|
|
45
|
+
) -> tuple[str, str, str, str]:
|
|
55
46
|
"""Split user input into initial whitespace, escape character, function part
|
|
56
47
|
and the rest.
|
|
57
48
|
"""
|
|
58
|
-
|
|
59
|
-
encoding = get_stream_enc(sys.stdin, 'utf-8')
|
|
60
|
-
line = py3compat.cast_unicode(line, encoding)
|
|
49
|
+
assert isinstance(line, str)
|
|
61
50
|
|
|
62
51
|
if pattern is None:
|
|
63
52
|
pattern = line_split
|
|
@@ -65,11 +54,11 @@ def split_user_input(line, pattern=None):
|
|
|
65
54
|
if not match:
|
|
66
55
|
# print("match failed for line '%s'" % line)
|
|
67
56
|
try:
|
|
68
|
-
ifun, the_rest = line.split(None,1)
|
|
57
|
+
ifun, the_rest = line.split(None, 1)
|
|
69
58
|
except ValueError:
|
|
70
59
|
# print("split failed for line '%s'" % line)
|
|
71
|
-
ifun, the_rest = line,
|
|
72
|
-
pre = re.match(r
|
|
60
|
+
ifun, the_rest = line, ""
|
|
61
|
+
pre = re.match(r"^(\s*)(.*)", line).groups()[0]
|
|
73
62
|
esc = ""
|
|
74
63
|
else:
|
|
75
64
|
pre, esc, ifun, the_rest = match.groups()
|
|
@@ -111,15 +100,27 @@ class LineInfo:
|
|
|
111
100
|
raw_the_rest
|
|
112
101
|
the_rest without whitespace stripped.
|
|
113
102
|
"""
|
|
114
|
-
|
|
115
|
-
|
|
103
|
+
|
|
104
|
+
line: str
|
|
105
|
+
continue_prompt: bool
|
|
106
|
+
pre: str
|
|
107
|
+
esc: str
|
|
108
|
+
ifun: str
|
|
109
|
+
raw_the_rest: str
|
|
110
|
+
the_rest: str
|
|
111
|
+
pre_char: str
|
|
112
|
+
pre_whitespace: str
|
|
113
|
+
|
|
114
|
+
def __init__(self, line: str, continue_prompt: bool = False) -> None:
|
|
115
|
+
assert isinstance(line, str)
|
|
116
|
+
self.line = line
|
|
116
117
|
self.continue_prompt = continue_prompt
|
|
117
118
|
self.pre, self.esc, self.ifun, self.raw_the_rest = split_user_input(line)
|
|
118
119
|
self.the_rest = self.raw_the_rest.lstrip()
|
|
119
120
|
|
|
120
|
-
self.pre_char
|
|
121
|
+
self.pre_char = self.pre.strip()
|
|
121
122
|
if self.pre_char:
|
|
122
|
-
self.pre_whitespace =
|
|
123
|
+
self.pre_whitespace = "" # No whitespace allowed before esc chars
|
|
123
124
|
else:
|
|
124
125
|
self.pre_whitespace = self.pre
|
|
125
126
|
|
|
@@ -135,11 +136,20 @@ class LineInfo:
|
|
|
135
136
|
|
|
136
137
|
Does cache the results of the call, so can be called multiple times
|
|
137
138
|
without worrying about *further* damaging state.
|
|
139
|
+
|
|
140
|
+
.. deprecated:: 9.8
|
|
141
|
+
Use ``shell._ofind(line_info.ifun)`` directly instead.
|
|
138
142
|
"""
|
|
143
|
+
warnings.warn(
|
|
144
|
+
"LineInfo.ofind() is deprecated since IPython 9.9. "
|
|
145
|
+
"Use shell._ofind(line_info.ifun) directly instead.",
|
|
146
|
+
DeprecationWarning,
|
|
147
|
+
stacklevel=2,
|
|
148
|
+
)
|
|
139
149
|
return ip._ofind(self.ifun)
|
|
140
150
|
|
|
141
|
-
def __str__(self):
|
|
142
|
-
return "LineInfo [%s|%s|%s|%s]" %(self.pre, self.esc, self.ifun, self.the_rest)
|
|
151
|
+
def __str__(self) -> str:
|
|
152
|
+
return "LineInfo [%s|%s|%s|%s]" % (self.pre, self.esc, self.ifun, self.the_rest)
|
|
143
153
|
|
|
144
|
-
def __repr__(self):
|
|
154
|
+
def __repr__(self) -> str:
|
|
145
155
|
return "<" + str(self) + ">"
|
|
@@ -107,6 +107,16 @@ else:
|
|
|
107
107
|
]
|
|
108
108
|
)
|
|
109
109
|
|
|
110
|
+
# Check if argcomplete is installed and add tip
|
|
111
|
+
try:
|
|
112
|
+
import argcomplete
|
|
113
|
+
|
|
114
|
+
_tips["random"].append(
|
|
115
|
+
"Run `activate-global-python-argcomplete` from your shell to enable CLI completion for IPython"
|
|
116
|
+
)
|
|
117
|
+
except ModuleNotFoundError:
|
|
118
|
+
pass
|
|
119
|
+
|
|
110
120
|
|
|
111
121
|
def pick_tip() -> str:
|
|
112
122
|
current_date = datetime.now()
|
|
@@ -327,6 +327,10 @@ class ModuleReloader:
|
|
|
327
327
|
del self.failed[py_filename]
|
|
328
328
|
except:
|
|
329
329
|
if not self.hide_errors:
|
|
330
|
+
logger = logging.getLogger("autoreload")
|
|
331
|
+
logger.exception(
|
|
332
|
+
f"Failed to reload module '{modname}' from file '{py_filename}'"
|
|
333
|
+
)
|
|
330
334
|
print(
|
|
331
335
|
"[autoreload of {} failed: {}]".format(
|
|
332
336
|
modname, traceback.format_exc(10)
|
|
@@ -3,6 +3,7 @@ import ast
|
|
|
3
3
|
import builtins
|
|
4
4
|
import contextlib
|
|
5
5
|
import itertools
|
|
6
|
+
import logging
|
|
6
7
|
import os
|
|
7
8
|
import pickle
|
|
8
9
|
import platform
|
|
@@ -209,11 +210,19 @@ class DeduperReloader(DeduperReloaderPatchingMixin):
|
|
|
209
210
|
):
|
|
210
211
|
self.source_by_modname[new_modname] = ""
|
|
211
212
|
continue
|
|
212
|
-
|
|
213
|
-
|
|
213
|
+
# Skip binary files (e.g., .so, .pyd, .pyo)
|
|
214
|
+
if not fname.endswith(".py"):
|
|
215
|
+
self.source_by_modname[new_modname] = ""
|
|
216
|
+
continue
|
|
217
|
+
try:
|
|
218
|
+
with open(fname, "r") as f:
|
|
214
219
|
self.source_by_modname[new_modname] = f.read()
|
|
215
|
-
|
|
216
|
-
|
|
220
|
+
except Exception as e:
|
|
221
|
+
logger = logging.getLogger("autoreload")
|
|
222
|
+
logger.exception(
|
|
223
|
+
f"Failed to read module file '{fname}' for module '{new_modname}': {type(e).__name__}"
|
|
224
|
+
)
|
|
225
|
+
self.source_by_modname[new_modname] = ""
|
|
217
226
|
|
|
218
227
|
constexpr_detector = ConstexprDetector()
|
|
219
228
|
|
|
@@ -542,8 +551,15 @@ class DeduperReloader(DeduperReloaderPatchingMixin):
|
|
|
542
551
|
return False
|
|
543
552
|
if (fname := get_module_file_name(module)) is None:
|
|
544
553
|
return False
|
|
545
|
-
|
|
546
|
-
|
|
554
|
+
try:
|
|
555
|
+
with open(fname, "r") as f:
|
|
556
|
+
new_source_code = f.read()
|
|
557
|
+
except Exception as e:
|
|
558
|
+
logger = logging.getLogger("autoreload")
|
|
559
|
+
logger.exception(
|
|
560
|
+
f"Failed to read module file '{fname}' for module '{modname}': {type(e).__name__}"
|
|
561
|
+
)
|
|
562
|
+
return False
|
|
547
563
|
patched_flag = False
|
|
548
564
|
if old_source_code := self.source_by_modname.get(modname):
|
|
549
565
|
# get old/new module ast
|
|
@@ -7,12 +7,7 @@ NOT_FOUND: object = object()
|
|
|
7
7
|
NULL: object = object()
|
|
8
8
|
_MAX_FIELD_SEARCH_OFFSET = 50
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
WORD_TYPE: type[ctypes.c_int32] | type[ctypes.c_int64] = ctypes.c_int64
|
|
12
|
-
WORD_N_BYTES = 8
|
|
13
|
-
else:
|
|
14
|
-
WORD_TYPE = ctypes.c_int32
|
|
15
|
-
WORD_N_BYTES = 4
|
|
10
|
+
POINTER_N_BYTES = ctypes.sizeof(ctypes.c_void_p)
|
|
16
11
|
|
|
17
12
|
|
|
18
13
|
class DeduperReloaderPatchingMixin:
|
|
@@ -32,7 +27,7 @@ class DeduperReloaderPatchingMixin:
|
|
|
32
27
|
for offset in range(1, _MAX_FIELD_SEARCH_OFFSET):
|
|
33
28
|
if (
|
|
34
29
|
ctypes.cast(
|
|
35
|
-
obj_addr +
|
|
30
|
+
obj_addr + POINTER_N_BYTES * offset, ctypes.POINTER(ctypes.c_void_p)
|
|
36
31
|
).contents.value
|
|
37
32
|
== field_addr
|
|
38
33
|
):
|
|
@@ -69,7 +64,7 @@ class DeduperReloaderPatchingMixin:
|
|
|
69
64
|
if new_value not in (None, NULL):
|
|
70
65
|
ctypes.pythonapi.Py_IncRef(ctypes.py_object(new_value))
|
|
71
66
|
ctypes.cast(
|
|
72
|
-
obj_addr +
|
|
67
|
+
obj_addr + POINTER_N_BYTES * offset, ctypes.POINTER(ctypes.c_void_p)
|
|
73
68
|
).contents.value = new_value_addr
|
|
74
69
|
|
|
75
70
|
@classmethod
|
|
@@ -109,6 +109,14 @@ from IPython.utils.py3compat import PYPY
|
|
|
109
109
|
|
|
110
110
|
from typing import Dict
|
|
111
111
|
|
|
112
|
+
# Allow pretty-printing of functions with PEP-649 annotations
|
|
113
|
+
if sys.version_info >= (3, 14):
|
|
114
|
+
from annotationlib import Format
|
|
115
|
+
from functools import partial
|
|
116
|
+
|
|
117
|
+
signature = partial(signature, annotation_format=Format.FORWARDREF)
|
|
118
|
+
|
|
119
|
+
|
|
112
120
|
__all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
|
|
113
121
|
'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression']
|
|
114
122
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# GENERATED BY setup.py
|
|
2
|
-
commit = "
|
|
2
|
+
commit = "178fef7"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ipython
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.10.0
|
|
4
4
|
Summary: IPython: Productive Interactive Computing
|
|
5
5
|
Author: The IPython Development Team
|
|
6
6
|
Author-email: ipython-dev@python.org
|
|
@@ -70,7 +70,8 @@ Requires-Dist: trio>=0.1.0; extra == "test-extra"
|
|
|
70
70
|
Provides-Extra: matplotlib
|
|
71
71
|
Requires-Dist: matplotlib>3.9; extra == "matplotlib"
|
|
72
72
|
Provides-Extra: all
|
|
73
|
-
Requires-Dist: ipython[doc,matplotlib,test,test_extra]; extra == "all"
|
|
73
|
+
Requires-Dist: ipython[doc,matplotlib,terminal,test,test_extra]; extra == "all"
|
|
74
|
+
Requires-Dist: argcomplete>=3.0; extra == "all"
|
|
74
75
|
Dynamic: author
|
|
75
76
|
Dynamic: author-email
|
|
76
77
|
Dynamic: license-file
|
|
@@ -92,6 +92,12 @@ intersphinx_mapping = get_intersphinx_mapping(
|
|
|
92
92
|
}
|
|
93
93
|
)
|
|
94
94
|
|
|
95
|
+
# External links configuration (replaces custom github extension)
|
|
96
|
+
extlinks = {
|
|
97
|
+
"ghissue": ("https://github.com/ipython/ipython/issues/%s/", "#%s"),
|
|
98
|
+
"ghpull": ("https://github.com/ipython/ipython/pull/%s/", "PR #%s"),
|
|
99
|
+
}
|
|
100
|
+
|
|
95
101
|
|
|
96
102
|
# Options for HTML output
|
|
97
103
|
# -----------------------
|
|
@@ -78,6 +78,32 @@ The quickest way to get up and running with IPython is to install it with pip:
|
|
|
78
78
|
That's it.
|
|
79
79
|
|
|
80
80
|
|
|
81
|
+
Optional: Command-line completion
|
|
82
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
83
|
+
|
|
84
|
+
IPython supports command-line completion via the ``argcomplete`` package.
|
|
85
|
+
To enable tab completion for IPython and other Python programs that support
|
|
86
|
+
argcomplete, install IPython with the ``terminal`` extra:
|
|
87
|
+
|
|
88
|
+
.. code-block:: bash
|
|
89
|
+
|
|
90
|
+
$ pip install ipython[all]
|
|
91
|
+
$ activate-global-python-argcomplete
|
|
92
|
+
|
|
93
|
+
Alternatively, you can install argcomplete separately:
|
|
94
|
+
|
|
95
|
+
.. code-block:: bash
|
|
96
|
+
|
|
97
|
+
$ pip install argcomplete
|
|
98
|
+
$ activate-global-python-argcomplete
|
|
99
|
+
|
|
100
|
+
This will enable shell completion for all Python programs that support argcomplete,
|
|
101
|
+
including IPython. Note that you may need to restart your shell for the changes
|
|
102
|
+
to take effect.
|
|
103
|
+
|
|
104
|
+
For more information, see the `argcomplete documentation <https://github.com/kislyuk/argcomplete>`_.
|
|
105
|
+
|
|
106
|
+
|
|
81
107
|
.. _devinstall:
|
|
82
108
|
|
|
83
109
|
Installing the development version
|
|
@@ -13,11 +13,11 @@ extensions = [
|
|
|
13
13
|
"sphinx.ext.inheritance_diagram",
|
|
14
14
|
"sphinx.ext.intersphinx",
|
|
15
15
|
"sphinx.ext.graphviz",
|
|
16
|
+
"sphinx.ext.extlinks", # for easy GitHub links
|
|
16
17
|
"sphinxcontrib.jquery",
|
|
17
18
|
"IPython.sphinxext.ipython_console_highlighting",
|
|
18
19
|
"IPython.sphinxext.ipython_directive",
|
|
19
20
|
"sphinx.ext.napoleon", # to preprocess docstrings
|
|
20
|
-
"github", # for easy GitHub links
|
|
21
21
|
"magics",
|
|
22
22
|
"configtraits",
|
|
23
23
|
]
|