ipython 9.0.1__tar.gz → 9.1.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.0.1 → ipython-9.1.0}/IPython/core/completer.py +155 -3
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/display_trap.py +4 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/displayhook.py +17 -7
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/displaypub.py +14 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/history.py +18 -1
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/historyapp.py +3 -3
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/inputtransformer2.py +3 -9
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/interactiveshell.py +141 -20
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/basic.py +42 -9
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/execution.py +18 -10
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/oinspect.py +7 -1
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/release.py +2 -2
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/tbtools.py +7 -1
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/tips.py +14 -14
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/embed.py +2 -1
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/interactiveshell.py +2 -3
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/qt.py +3 -1
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/shortcuts/__init__.py +1 -1
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/shortcuts/auto_suggest.py +16 -15
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/PyColorize.py +10 -4
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_sysinfo.py +1 -1
- {ipython-9.0.1/ipython.egg-info → ipython-9.1.0}/PKG-INFO +7 -3
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/intro.rst +3 -3
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version9.rst +64 -2
- {ipython-9.0.1 → ipython-9.1.0}/examples/Embedding/start_ipython_config.py +1 -1
- {ipython-9.0.1 → ipython-9.1.0}/examples/auto_suggest_llm.py +2 -4
- {ipython-9.0.1 → ipython-9.1.0/ipython.egg-info}/PKG-INFO +7 -3
- {ipython-9.0.1 → ipython-9.1.0}/ipython.egg-info/SOURCES.txt +1 -0
- {ipython-9.0.1 → ipython-9.1.0}/ipython.egg-info/requires.txt +3 -0
- {ipython-9.0.1 → ipython-9.1.0}/pyproject.toml +15 -2
- ipython-9.1.0/tests/fake_llm.py +89 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_completer.py +119 -1
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_inputtransformer2_line.py +25 -6
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_magic.py +74 -3
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_shortcuts.py +24 -0
- {ipython-9.0.1 → ipython-9.1.0}/.flake8 +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/.mailmap +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/.pre-commit-config.yaml +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/COPYING.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/__main__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/alias.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/application.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/async_helpers.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/autocall.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/builtin_trap.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/compilerop.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/completerlib.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/crashhandler.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/debugger.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/display.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/display_functions.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/doctb.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/error.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/events.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/extensions.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/formatters.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/getipython.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/guarded_eval.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/hooks.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/latex_symbols.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/logger.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/macro.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magic.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magic_arguments.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/ast_mod.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/auto.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/code.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/config.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/display.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/extension.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/history.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/logging.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/namespace.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/osm.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/packaging.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/pylab.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/magics/script.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/page.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/payload.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/payloadpage.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/prefilter.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/profile/README_STARTUP +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/profileapp.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/profiledir.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/pylabtools.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/shellapp.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/splitinput.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/ultratb.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/core/usage.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/display.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/autoreload.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/deduperreload/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/deduperreload/deduperreload.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/storemagic.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/external/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/external/pickleshare.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/external/qt_for_kernel.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/external/qt_loaders.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/backgroundjobs.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/clipboard.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/deepreload.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/demo.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/display.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/editorhooks.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/guisupport.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/latextools.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/lexers.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/lib/pretty.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/paths.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/py.typed +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/sphinxext/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/sphinxext/custom_doctests.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/sphinxext/ipython_directive.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/debugger.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/ipapp.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/magics.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/prompts.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/ptutils.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/terminal/shortcuts/filters.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/decorators.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/globalipapp.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/ipunittest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/Makefile +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/dtexample.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/ipdoctest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/setup.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/simple.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/simplevars.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/test_combo.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/test_example.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/plugin/test_refs.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/skipdoctest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/testing/tools.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_process_cli.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_process_common.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_process_emscripten.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_process_posix.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_process_win32.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/_process_win32_controller.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/capture.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/coloransi.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/contexts.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/data.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/decorators.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/dir2.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/docs.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/encoding.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/eventful.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/frame.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/generics.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/importstring.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/io.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/ipstruct.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/jsonutil.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/log.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/module_paths.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/openpy.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/path.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/process.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/py3compat.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/sentinel.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/strdispatch.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/sysinfo.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/syspathcontext.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/tempdir.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/terminal.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/text.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/timing.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/tokenutil.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/IPython/utils/wildcard.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/LICENSE +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/MANIFEST.in +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/README.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/_build_meta.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/Makefile +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/README.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/autogen_api.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/autogen_config.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/autogen_magics.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/autogen_shortcuts.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/make.cmd +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/man/ipython.1 +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/requirements.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/2.0/running-crop.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/2.0/running.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/2.0/treeview.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/2.0/user-interface.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/2.0/widgets.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/autosuggest.gif +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ms_visual_studio.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/notebook_specgram.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/ptshell_features.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/qtconsole.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_images/unicode_completion.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_static/favicon.ico +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_static/logo.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_static/theme_overrides.css +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_templates/breadcrumbs.html +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/_templates/notebook_redirect.html +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/about/history.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/about/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/about/license_and_copyright.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/api/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/conf.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/callbacks.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/custommagics.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/details.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/eventloops.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/extensions/autoreload.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/extensions/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/extensions/storemagic.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/inputtransforms.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/integrating.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/options/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/shell_mimerenderer.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/config/shortcuts/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/coredev/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/config.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/execution.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/figs/other_kernels.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/figs/other_kernels.svg +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/how_ipython_works.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/inputhook_app.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/kernels.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/messaging.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/pycompat.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/development/wrapperkernels.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/install/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/install/install.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/install/kernel_install.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/autoawait.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/magics.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/plotting.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/reference.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/shell.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/tips.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/interactive/tutorial.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/links.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/overview.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/parallel/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/sphinx.toml +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/sphinxext.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/development.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/index.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/pr/README.md +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version0.10.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version0.11.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version0.12.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version0.13.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version0.8.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version0.9.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version1.0.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version2.0.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version3.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version4.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version5.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version6.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version7.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/source/whatsnew/version8.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/sphinxext/apigen.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/sphinxext/configtraits.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/sphinxext/github.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/docs/sphinxext/magics.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/Embedding/embed_class_long.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/Embedding/embed_class_short.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/Embedding/embed_function.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/example-demo.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/IPython Kernel/ipython.desktop +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/utils/cwd_prompt.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/utils/list_pyfiles.ipy +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/examples/utils/list_subdirs.ipy +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/ipython.egg-info/dependency_links.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/ipython.egg-info/entry_points.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/ipython.egg-info/not-zip-safe +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/ipython.egg-info/top_level.txt +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/long_description.rst +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/scripts/ipython.ico +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/scripts/ipython_nb.ico +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/setup.cfg +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/setup.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/setupbase.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/2x2.jpg +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/2x2.png +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/__init__.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/bad_all.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/conftest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/cve.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/fake_ext_dir/daft_extension.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/nonascii.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/nonascii2.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/print_argv.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/refbug.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/simpleerr.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/tclass.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test.wav +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_alias.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_application.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_async_helpers.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_autocall.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_backgroundjobs.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_capture.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_clipboard.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_compilerop.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_completerlib.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_debug_magic.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_debugger.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_decorators.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_decorators_2.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_deepreload.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_dir2.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_display.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_display_2.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_displayhook.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_editorhooks.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_embed.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_events.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_exceptiongroup_tb.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_extension.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_formatters.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_guarded_eval.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_handlers.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_help.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_history.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_hooks.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_imports.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_importstring.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_inputtransformer2.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_interactiveshell.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_interactivshell.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_io.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_iplib.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_ipunittest.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_latextools.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_logger.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_magic_arguments.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_magic_terminal.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_module_paths.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_oinspect.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_openpy.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_page.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_path.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_paths.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_prefilter.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_pretty.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_process.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_profile.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_pt_inputhooks.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_pycolorize.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_pylabtools.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_qt_loaders.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_run.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_shellapp.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_splitinput.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_storemagic.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_sysinfo.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_tempdir.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_text.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_tips.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_tokenutil.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_tools.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_ultratb.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_wildcard.py +0 -0
- {ipython-9.0.1 → ipython-9.1.0}/tests/test_zzz_autoreload.py +0 -0
|
@@ -1137,7 +1137,7 @@ class Completer(Configurable):
|
|
|
1137
1137
|
def _attr_matches(
|
|
1138
1138
|
self, text: str, include_prefix: bool = True
|
|
1139
1139
|
) -> tuple[Sequence[str], str]:
|
|
1140
|
-
m2 = self._ATTR_MATCH_RE.match(
|
|
1140
|
+
m2 = self._ATTR_MATCH_RE.match(text)
|
|
1141
1141
|
if not m2:
|
|
1142
1142
|
return [], ""
|
|
1143
1143
|
expr, attr = m2.group(1, 2)
|
|
@@ -2360,11 +2360,163 @@ class IPCompleter(Completer):
|
|
|
2360
2360
|
else:
|
|
2361
2361
|
return iter([])
|
|
2362
2362
|
|
|
2363
|
+
class _CompletionContextType(enum.Enum):
|
|
2364
|
+
ATTRIBUTE = "attribute" # For attribute completion
|
|
2365
|
+
GLOBAL = "global" # For global completion
|
|
2366
|
+
|
|
2367
|
+
def _determine_completion_context(self, line):
|
|
2368
|
+
"""
|
|
2369
|
+
Determine whether the cursor is in an attribute or global completion context.
|
|
2370
|
+
"""
|
|
2371
|
+
# Cursor in string/comment → GLOBAL.
|
|
2372
|
+
is_string, is_in_expression = self._is_in_string_or_comment(line)
|
|
2373
|
+
if is_string and not is_in_expression:
|
|
2374
|
+
return self._CompletionContextType.GLOBAL
|
|
2375
|
+
|
|
2376
|
+
# If we're in a template string expression, handle specially
|
|
2377
|
+
if is_string and is_in_expression:
|
|
2378
|
+
# Extract the expression part - look for the last { that isn't closed
|
|
2379
|
+
expr_start = line.rfind("{")
|
|
2380
|
+
if expr_start >= 0:
|
|
2381
|
+
# We're looking at the expression inside a template string
|
|
2382
|
+
expr = line[expr_start + 1 :]
|
|
2383
|
+
# Recursively determine the context of the expression
|
|
2384
|
+
return self._determine_completion_context(expr)
|
|
2385
|
+
|
|
2386
|
+
# Handle plain number literals - should be global context
|
|
2387
|
+
# Ex: 3. -42.14 but not 3.1.
|
|
2388
|
+
if re.search(r"(?<!\w)(?<!\d\.)([-+]?\d+\.(\d+)?)(?!\w)$", line):
|
|
2389
|
+
return self._CompletionContextType.GLOBAL
|
|
2390
|
+
|
|
2391
|
+
# Handle all other attribute matches np.ran, d[0].k, (a,b).count
|
|
2392
|
+
chain_match = re.search(r".*(.+\.(?:[a-zA-Z]\w*)?)$", line)
|
|
2393
|
+
if chain_match:
|
|
2394
|
+
return self._CompletionContextType.ATTRIBUTE
|
|
2395
|
+
|
|
2396
|
+
return self._CompletionContextType.GLOBAL
|
|
2397
|
+
|
|
2398
|
+
def _is_in_string_or_comment(self, text):
|
|
2399
|
+
"""
|
|
2400
|
+
Determine if the cursor is inside a string or comment.
|
|
2401
|
+
Returns (is_string, is_in_expression) tuple:
|
|
2402
|
+
- is_string: True if in any kind of string
|
|
2403
|
+
- is_in_expression: True if inside an f-string/t-string expression
|
|
2404
|
+
"""
|
|
2405
|
+
in_single_quote = False
|
|
2406
|
+
in_double_quote = False
|
|
2407
|
+
in_triple_single = False
|
|
2408
|
+
in_triple_double = False
|
|
2409
|
+
in_template_string = False # Covers both f-strings and t-strings
|
|
2410
|
+
in_expression = False # For expressions in f/t-strings
|
|
2411
|
+
expression_depth = 0 # Track nested braces in expressions
|
|
2412
|
+
i = 0
|
|
2413
|
+
|
|
2414
|
+
while i < len(text):
|
|
2415
|
+
# Check for f-string or t-string start
|
|
2416
|
+
if (
|
|
2417
|
+
i + 1 < len(text)
|
|
2418
|
+
and text[i] in ("f", "t")
|
|
2419
|
+
and (text[i + 1] == '"' or text[i + 1] == "'")
|
|
2420
|
+
and not (
|
|
2421
|
+
in_single_quote
|
|
2422
|
+
or in_double_quote
|
|
2423
|
+
or in_triple_single
|
|
2424
|
+
or in_triple_double
|
|
2425
|
+
)
|
|
2426
|
+
):
|
|
2427
|
+
in_template_string = True
|
|
2428
|
+
i += 1 # Skip the 'f' or 't'
|
|
2429
|
+
|
|
2430
|
+
# Handle triple quotes
|
|
2431
|
+
if i + 2 < len(text):
|
|
2432
|
+
if (
|
|
2433
|
+
text[i : i + 3] == '"""'
|
|
2434
|
+
and not in_single_quote
|
|
2435
|
+
and not in_triple_single
|
|
2436
|
+
):
|
|
2437
|
+
in_triple_double = not in_triple_double
|
|
2438
|
+
if not in_triple_double:
|
|
2439
|
+
in_template_string = False
|
|
2440
|
+
i += 3
|
|
2441
|
+
continue
|
|
2442
|
+
if (
|
|
2443
|
+
text[i : i + 3] == "'''"
|
|
2444
|
+
and not in_double_quote
|
|
2445
|
+
and not in_triple_double
|
|
2446
|
+
):
|
|
2447
|
+
in_triple_single = not in_triple_single
|
|
2448
|
+
if not in_triple_single:
|
|
2449
|
+
in_template_string = False
|
|
2450
|
+
i += 3
|
|
2451
|
+
continue
|
|
2452
|
+
|
|
2453
|
+
# Handle escapes
|
|
2454
|
+
if text[i] == "\\" and i + 1 < len(text):
|
|
2455
|
+
i += 2
|
|
2456
|
+
continue
|
|
2457
|
+
|
|
2458
|
+
# Handle nested braces within f-strings
|
|
2459
|
+
if in_template_string:
|
|
2460
|
+
# Special handling for consecutive opening braces
|
|
2461
|
+
if i + 1 < len(text) and text[i : i + 2] == "{{":
|
|
2462
|
+
i += 2
|
|
2463
|
+
continue
|
|
2464
|
+
|
|
2465
|
+
# Detect start of an expression
|
|
2466
|
+
if text[i] == "{":
|
|
2467
|
+
# Only increment depth and mark as expression if not already in an expression
|
|
2468
|
+
# or if we're at a top-level nested brace
|
|
2469
|
+
if not in_expression or (in_expression and expression_depth == 0):
|
|
2470
|
+
in_expression = True
|
|
2471
|
+
expression_depth += 1
|
|
2472
|
+
i += 1
|
|
2473
|
+
continue
|
|
2474
|
+
|
|
2475
|
+
# Detect end of an expression
|
|
2476
|
+
if text[i] == "}":
|
|
2477
|
+
expression_depth -= 1
|
|
2478
|
+
if expression_depth <= 0:
|
|
2479
|
+
in_expression = False
|
|
2480
|
+
expression_depth = 0
|
|
2481
|
+
i += 1
|
|
2482
|
+
continue
|
|
2483
|
+
|
|
2484
|
+
in_triple_quote = in_triple_single or in_triple_double
|
|
2485
|
+
|
|
2486
|
+
# Handle quotes - also reset template string when closing quotes are encountered
|
|
2487
|
+
if text[i] == '"' and not in_single_quote and not in_triple_quote:
|
|
2488
|
+
in_double_quote = not in_double_quote
|
|
2489
|
+
if not in_double_quote and not in_triple_quote:
|
|
2490
|
+
in_template_string = False
|
|
2491
|
+
elif text[i] == "'" and not in_double_quote and not in_triple_quote:
|
|
2492
|
+
in_single_quote = not in_single_quote
|
|
2493
|
+
if not in_single_quote and not in_triple_quote:
|
|
2494
|
+
in_template_string = False
|
|
2495
|
+
|
|
2496
|
+
# Check for comment
|
|
2497
|
+
if text[i] == "#" and not (
|
|
2498
|
+
in_single_quote or in_double_quote or in_triple_quote
|
|
2499
|
+
):
|
|
2500
|
+
return True, False
|
|
2501
|
+
|
|
2502
|
+
i += 1
|
|
2503
|
+
|
|
2504
|
+
is_string = (
|
|
2505
|
+
in_single_quote or in_double_quote or in_triple_single or in_triple_double
|
|
2506
|
+
)
|
|
2507
|
+
|
|
2508
|
+
# Return tuple (is_string, is_in_expression)
|
|
2509
|
+
return (
|
|
2510
|
+
is_string or (in_template_string and not in_expression),
|
|
2511
|
+
in_expression and expression_depth > 0,
|
|
2512
|
+
)
|
|
2513
|
+
|
|
2363
2514
|
@context_matcher()
|
|
2364
2515
|
def python_matcher(self, context: CompletionContext) -> SimpleMatcherResult:
|
|
2365
2516
|
"""Match attributes or global python names"""
|
|
2366
|
-
text = context.
|
|
2367
|
-
|
|
2517
|
+
text = context.text_until_cursor
|
|
2518
|
+
completion_type = self._determine_completion_context(text)
|
|
2519
|
+
if completion_type == self._CompletionContextType.ATTRIBUTE:
|
|
2368
2520
|
try:
|
|
2369
2521
|
matches, fragment = self._attr_matches(text, include_prefix=False)
|
|
2370
2522
|
if text.endswith(".") and self.omit__names:
|
|
@@ -58,6 +58,10 @@ class DisplayTrap(Configurable):
|
|
|
58
58
|
# Returning False will cause exceptions to propagate
|
|
59
59
|
return False
|
|
60
60
|
|
|
61
|
+
@property
|
|
62
|
+
def is_active(self) -> bool:
|
|
63
|
+
return self._nested_level != 0
|
|
64
|
+
|
|
61
65
|
def set(self):
|
|
62
66
|
"""Set the hook."""
|
|
63
67
|
if sys.displayhook is not self.hook:
|
|
@@ -16,6 +16,8 @@ from traitlets.config.configurable import Configurable
|
|
|
16
16
|
from traitlets import Instance, Float
|
|
17
17
|
from warnings import warn
|
|
18
18
|
|
|
19
|
+
from .history import HistoryOutput
|
|
20
|
+
|
|
19
21
|
# TODO: Move the various attributes (cache_size, [others now moved]). Some
|
|
20
22
|
# of these are also attributes of InteractiveShell. They should be on ONE object
|
|
21
23
|
# only and the other objects should ask that one object for their values.
|
|
@@ -35,6 +37,7 @@ class DisplayHook(Configurable):
|
|
|
35
37
|
|
|
36
38
|
def __init__(self, shell=None, cache_size=1000, **kwargs):
|
|
37
39
|
super(DisplayHook, self).__init__(shell=shell, **kwargs)
|
|
40
|
+
self._is_active = False
|
|
38
41
|
cache_size_min = 3
|
|
39
42
|
if cache_size <= 0:
|
|
40
43
|
self.do_full_cache = 0
|
|
@@ -51,7 +54,7 @@ class DisplayHook(Configurable):
|
|
|
51
54
|
|
|
52
55
|
# we need a reference to the user-level namespace
|
|
53
56
|
self.shell = shell
|
|
54
|
-
|
|
57
|
+
|
|
55
58
|
self._,self.__,self.___ = '','',''
|
|
56
59
|
|
|
57
60
|
# these are deliberately global:
|
|
@@ -84,13 +87,13 @@ class DisplayHook(Configurable):
|
|
|
84
87
|
def quiet(self):
|
|
85
88
|
"""Should we silence the display hook because of ';'?"""
|
|
86
89
|
# do not print output if input ends in ';'
|
|
87
|
-
|
|
90
|
+
|
|
88
91
|
try:
|
|
89
92
|
cell = self.shell.history_manager.input_hist_parsed[-1]
|
|
90
93
|
except IndexError:
|
|
91
94
|
# some uses of ipshellembed may fail here
|
|
92
95
|
return False
|
|
93
|
-
|
|
96
|
+
|
|
94
97
|
return self.semicolon_at_end_of_expression(cell)
|
|
95
98
|
|
|
96
99
|
@staticmethod
|
|
@@ -110,7 +113,11 @@ class DisplayHook(Configurable):
|
|
|
110
113
|
|
|
111
114
|
def start_displayhook(self):
|
|
112
115
|
"""Start the displayhook, initializing resources."""
|
|
113
|
-
|
|
116
|
+
self._is_active = True
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def is_active(self):
|
|
120
|
+
return self._is_active
|
|
114
121
|
|
|
115
122
|
def write_output_prompt(self):
|
|
116
123
|
"""Write the output prompt.
|
|
@@ -242,7 +249,10 @@ class DisplayHook(Configurable):
|
|
|
242
249
|
|
|
243
250
|
def log_output(self, format_dict):
|
|
244
251
|
"""Log the output."""
|
|
245
|
-
|
|
252
|
+
self.shell.history_manager.outputs[self.prompt_count].append(
|
|
253
|
+
HistoryOutput(output_type="execute_result", bundle=format_dict)
|
|
254
|
+
)
|
|
255
|
+
if "text/plain" not in format_dict:
|
|
246
256
|
# nothing to do
|
|
247
257
|
return
|
|
248
258
|
if self.shell.logger.log_output:
|
|
@@ -254,6 +264,7 @@ class DisplayHook(Configurable):
|
|
|
254
264
|
"""Finish up all displayhook activities."""
|
|
255
265
|
sys.stdout.write(self.shell.separate_out2)
|
|
256
266
|
sys.stdout.flush()
|
|
267
|
+
self._is_active = False
|
|
257
268
|
|
|
258
269
|
def __call__(self, result=None):
|
|
259
270
|
"""Printing with history cache management.
|
|
@@ -280,13 +291,12 @@ class DisplayHook(Configurable):
|
|
|
280
291
|
cull_count = max(int(sz * self.cull_fraction), 2)
|
|
281
292
|
warn('Output cache limit (currently {sz} entries) hit.\n'
|
|
282
293
|
'Flushing oldest {cull_count} entries.'.format(sz=sz, cull_count=cull_count))
|
|
283
|
-
|
|
294
|
+
|
|
284
295
|
for i, n in enumerate(sorted(oh)):
|
|
285
296
|
if i >= cull_count:
|
|
286
297
|
break
|
|
287
298
|
self.shell.user_ns.pop('_%i' % n, None)
|
|
288
299
|
oh.pop(n, None)
|
|
289
|
-
|
|
290
300
|
|
|
291
301
|
def flush(self):
|
|
292
302
|
if not self.do_full_cache:
|
|
@@ -22,6 +22,7 @@ from traitlets import List
|
|
|
22
22
|
|
|
23
23
|
# This used to be defined here - it is imported for backwards compatibility
|
|
24
24
|
from .display_functions import publish_display_data
|
|
25
|
+
from .history import HistoryOutput
|
|
25
26
|
|
|
26
27
|
import typing as t
|
|
27
28
|
|
|
@@ -41,6 +42,7 @@ class DisplayPublisher(Configurable):
|
|
|
41
42
|
|
|
42
43
|
def __init__(self, shell=None, *args, **kwargs):
|
|
43
44
|
self.shell = shell
|
|
45
|
+
self._is_publishing = False
|
|
44
46
|
super().__init__(*args, **kwargs)
|
|
45
47
|
|
|
46
48
|
def _validate_data(self, data, metadata=None):
|
|
@@ -129,13 +131,25 @@ class DisplayPublisher(Configurable):
|
|
|
129
131
|
if self.shell is not None:
|
|
130
132
|
handlers = getattr(self.shell, "mime_renderers", {})
|
|
131
133
|
|
|
134
|
+
outputs = self.shell.history_manager.outputs
|
|
135
|
+
|
|
136
|
+
outputs[self.shell.execution_count].append(
|
|
137
|
+
HistoryOutput(output_type="display_data", bundle=data)
|
|
138
|
+
)
|
|
139
|
+
|
|
132
140
|
for mime, handler in handlers.items():
|
|
133
141
|
if mime in data:
|
|
134
142
|
handler(data[mime], metadata.get(mime, None))
|
|
135
143
|
return
|
|
136
144
|
|
|
145
|
+
self._is_publishing = True
|
|
137
146
|
if "text/plain" in data:
|
|
138
147
|
print(data["text/plain"])
|
|
148
|
+
self._is_publishing = False
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def is_publishing(self):
|
|
152
|
+
return self._is_publishing
|
|
139
153
|
|
|
140
154
|
def clear_output(self, wait=False):
|
|
141
155
|
"""Clear the output of the cell receiving output."""
|
|
@@ -14,7 +14,9 @@ import re
|
|
|
14
14
|
import threading
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
|
|
17
|
+
from collections import defaultdict
|
|
17
18
|
from contextlib import contextmanager
|
|
19
|
+
from dataclasses import dataclass
|
|
18
20
|
from decorator import decorator
|
|
19
21
|
from traitlets import (
|
|
20
22
|
Any,
|
|
@@ -583,6 +585,14 @@ class HistoryAccessor(HistoryAccessorBase):
|
|
|
583
585
|
yield from self.get_range(sess, s, e, raw=raw, output=output)
|
|
584
586
|
|
|
585
587
|
|
|
588
|
+
@dataclass
|
|
589
|
+
class HistoryOutput:
|
|
590
|
+
output_type: typing.Literal[
|
|
591
|
+
"out_stream", "err_stream", "display_data", "execute_result"
|
|
592
|
+
]
|
|
593
|
+
bundle: typing.Dict[str, str]
|
|
594
|
+
|
|
595
|
+
|
|
586
596
|
class HistoryManager(HistoryAccessor):
|
|
587
597
|
"""A class to organize all history-related functionality in one place."""
|
|
588
598
|
|
|
@@ -610,7 +620,11 @@ class HistoryManager(HistoryAccessor):
|
|
|
610
620
|
# execution count.
|
|
611
621
|
output_hist = Dict()
|
|
612
622
|
# The text/plain repr of outputs.
|
|
613
|
-
output_hist_reprs:
|
|
623
|
+
output_hist_reprs: typing.Dict[int, str] = Dict() # type: ignore [assignment]
|
|
624
|
+
# Maps execution_count to MIME bundles
|
|
625
|
+
outputs: typing.Dict[int, typing.List[HistoryOutput]] = defaultdict(list)
|
|
626
|
+
# Maps execution_count to exception tracebacks
|
|
627
|
+
exceptions: typing.Dict[int, typing.Dict[str, Any]] = Dict() # type: ignore [assignment]
|
|
614
628
|
|
|
615
629
|
# The number of the current session in the history database
|
|
616
630
|
session_number: int = Integer() # type: ignore [assignment]
|
|
@@ -749,6 +763,9 @@ class HistoryManager(HistoryAccessor):
|
|
|
749
763
|
"""Clear the session history, releasing all object references, and
|
|
750
764
|
optionally open a new session."""
|
|
751
765
|
self.output_hist.clear()
|
|
766
|
+
self.outputs.clear()
|
|
767
|
+
self.exceptions.clear()
|
|
768
|
+
|
|
752
769
|
# The directory history can't be completely empty
|
|
753
770
|
self.dir_hist[:] = [Path.cwd()]
|
|
754
771
|
|
|
@@ -59,9 +59,9 @@ class HistoryTrim(BaseIPythonApplication):
|
|
|
59
59
|
print("There are already at most %d entries in the history database." % self.keep)
|
|
60
60
|
print("Not doing anything. Use --keep= argument to keep fewer entries")
|
|
61
61
|
return
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
print("Trimming history to the most recent %d entries." % self.keep)
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
inputs.pop() # Remove the extra element we got to check the length.
|
|
66
66
|
inputs.reverse()
|
|
67
67
|
if inputs:
|
|
@@ -71,7 +71,7 @@ class HistoryTrim(BaseIPythonApplication):
|
|
|
71
71
|
sessions = list(con.execute('SELECT session, start, end, num_cmds, remark FROM '
|
|
72
72
|
'sessions WHERE session >= ?', (first_session,)))
|
|
73
73
|
con.close()
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
# Create the new history database.
|
|
76
76
|
new_hist_file = profile_dir / "history.sqlite.new"
|
|
77
77
|
i = 0
|
|
@@ -17,6 +17,7 @@ import sys
|
|
|
17
17
|
import tokenize
|
|
18
18
|
from typing import List, Tuple, Optional, Any
|
|
19
19
|
import warnings
|
|
20
|
+
from textwrap import dedent
|
|
20
21
|
|
|
21
22
|
from IPython.utils import tokenutil
|
|
22
23
|
|
|
@@ -38,18 +39,11 @@ def leading_empty_lines(lines):
|
|
|
38
39
|
def leading_indent(lines):
|
|
39
40
|
"""Remove leading indentation.
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
removed from each following line in the cell.
|
|
42
|
+
Removes the minimum common leading indentation from all lines.
|
|
43
43
|
"""
|
|
44
44
|
if not lines:
|
|
45
45
|
return lines
|
|
46
|
-
|
|
47
|
-
if not m or lines[0].strip().startswith("#"):
|
|
48
|
-
return lines
|
|
49
|
-
space = m.group(0)
|
|
50
|
-
n = len(space)
|
|
51
|
-
return [l[n:] if l.startswith(space) else l
|
|
52
|
-
for l in lines]
|
|
46
|
+
return dedent("".join(lines)).splitlines(keepends=True)
|
|
53
47
|
|
|
54
48
|
class PromptStripper:
|
|
55
49
|
"""Remove matching input prompts from a block of input.
|