ipython 9.9.0__tar.gz → 9.11.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.
Files changed (441) hide show
  1. {ipython-9.9.0 → ipython-9.11.0}/IPython/__init__.py +2 -2
  2. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/completer.py +2 -6
  3. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/events.py +12 -5
  4. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/guarded_eval.py +1 -4
  5. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/history.py +41 -5
  6. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/inputtransformer2.py +94 -27
  7. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/interactiveshell.py +53 -7
  8. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magic.py +104 -63
  9. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/basic.py +1 -1
  10. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/execution.py +4 -3
  11. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/release.py +1 -1
  12. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/ultratb.py +1 -5
  13. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/autoreload.py +4 -0
  14. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/deduperreload/deduperreload.py +22 -6
  15. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/decorators.py +4 -1
  16. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_common.py +18 -15
  17. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_win32.py +5 -6
  18. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_sysinfo.py +1 -1
  19. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/contexts.py +14 -5
  20. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/decorators.py +16 -12
  21. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/dir2.py +6 -3
  22. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/frame.py +7 -4
  23. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/openpy.py +6 -4
  24. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/py3compat.py +1 -1
  25. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/text.py +1 -4
  26. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/timing.py +18 -5
  27. {ipython-9.9.0/ipython.egg-info → ipython-9.11.0}/PKG-INFO +13 -13
  28. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version9.rst +113 -5
  29. {ipython-9.9.0 → ipython-9.11.0/ipython.egg-info}/PKG-INFO +13 -13
  30. {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/requires.txt +11 -13
  31. {ipython-9.9.0 → ipython-9.11.0}/pyproject.toml +38 -18
  32. {ipython-9.9.0 → ipython-9.11.0}/setup.py +0 -51
  33. {ipython-9.9.0 → ipython-9.11.0}/tests/test_completer.py +1 -1
  34. {ipython-9.9.0 → ipython-9.11.0}/tests/test_guarded_eval.py +1 -4
  35. {ipython-9.9.0 → ipython-9.11.0}/tests/test_inputtransformer2_line.py +57 -2
  36. {ipython-9.9.0 → ipython-9.11.0}/tests/test_oinspect.py +1 -1
  37. {ipython-9.9.0 → ipython-9.11.0}/tests/test_pretty.py +6 -1
  38. {ipython-9.9.0 → ipython-9.11.0}/tests/test_shortcuts.py +1 -0
  39. {ipython-9.9.0 → ipython-9.11.0}/tests/test_zzz_autoreload.py +0 -2
  40. {ipython-9.9.0 → ipython-9.11.0}/.flake8 +0 -0
  41. {ipython-9.9.0 → ipython-9.11.0}/.mailmap +0 -0
  42. {ipython-9.9.0 → ipython-9.11.0}/.pre-commit-config.yaml +0 -0
  43. {ipython-9.9.0 → ipython-9.11.0}/COPYING.rst +0 -0
  44. {ipython-9.9.0 → ipython-9.11.0}/IPython/__main__.py +0 -0
  45. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/__init__.py +0 -0
  46. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/alias.py +0 -0
  47. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/application.py +0 -0
  48. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/async_helpers.py +0 -0
  49. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/autocall.py +0 -0
  50. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/builtin_trap.py +0 -0
  51. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/compilerop.py +0 -0
  52. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/completerlib.py +0 -0
  53. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/crashhandler.py +0 -0
  54. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/debugger.py +0 -0
  55. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/debugger_backport.py +0 -0
  56. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/display.py +0 -0
  57. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/display_functions.py +0 -0
  58. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/display_trap.py +0 -0
  59. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/displayhook.py +0 -0
  60. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/displaypub.py +0 -0
  61. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/doctb.py +0 -0
  62. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/error.py +0 -0
  63. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/extensions.py +0 -0
  64. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/formatters.py +0 -0
  65. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/getipython.py +0 -0
  66. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/historyapp.py +0 -0
  67. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/hooks.py +0 -0
  68. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/latex_symbols.py +0 -0
  69. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/logger.py +0 -0
  70. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/macro.py +0 -0
  71. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magic_arguments.py +0 -0
  72. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/__init__.py +0 -0
  73. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/ast_mod.py +0 -0
  74. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/auto.py +0 -0
  75. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/code.py +0 -0
  76. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/config.py +0 -0
  77. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/display.py +0 -0
  78. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/extension.py +0 -0
  79. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/history.py +0 -0
  80. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/logging.py +0 -0
  81. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/namespace.py +0 -0
  82. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/osm.py +0 -0
  83. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/packaging.py +0 -0
  84. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/pylab.py +0 -0
  85. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/magics/script.py +0 -0
  86. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/oinspect.py +0 -0
  87. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/page.py +0 -0
  88. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/payload.py +0 -0
  89. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/payloadpage.py +0 -0
  90. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/prefilter.py +0 -0
  91. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/profile/README_STARTUP +0 -0
  92. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/profileapp.py +0 -0
  93. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/profiledir.py +0 -0
  94. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/pylabtools.py +0 -0
  95. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/shellapp.py +0 -0
  96. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/splitinput.py +0 -0
  97. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/tbtools.py +0 -0
  98. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/tips.py +0 -0
  99. {ipython-9.9.0 → ipython-9.11.0}/IPython/core/usage.py +0 -0
  100. {ipython-9.9.0 → ipython-9.11.0}/IPython/display.py +0 -0
  101. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/__init__.py +0 -0
  102. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/deduperreload/__init__.py +0 -0
  103. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
  104. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/storemagic.py +0 -0
  105. {ipython-9.9.0 → ipython-9.11.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
  106. {ipython-9.9.0 → ipython-9.11.0}/IPython/external/__init__.py +0 -0
  107. {ipython-9.9.0 → ipython-9.11.0}/IPython/external/pickleshare.py +0 -0
  108. {ipython-9.9.0 → ipython-9.11.0}/IPython/external/qt_for_kernel.py +0 -0
  109. {ipython-9.9.0 → ipython-9.11.0}/IPython/external/qt_loaders.py +0 -0
  110. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/__init__.py +0 -0
  111. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/backgroundjobs.py +0 -0
  112. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/clipboard.py +0 -0
  113. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/deepreload.py +0 -0
  114. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/demo.py +0 -0
  115. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/display.py +0 -0
  116. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/editorhooks.py +0 -0
  117. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/guisupport.py +0 -0
  118. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/latextools.py +0 -0
  119. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/lexers.py +0 -0
  120. {ipython-9.9.0 → ipython-9.11.0}/IPython/lib/pretty.py +0 -0
  121. {ipython-9.9.0 → ipython-9.11.0}/IPython/paths.py +0 -0
  122. {ipython-9.9.0 → ipython-9.11.0}/IPython/py.typed +0 -0
  123. {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/__init__.py +0 -0
  124. {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/custom_doctests.py +0 -0
  125. {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  126. {ipython-9.9.0 → ipython-9.11.0}/IPython/sphinxext/ipython_directive.py +0 -0
  127. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/__init__.py +0 -0
  128. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/debugger.py +0 -0
  129. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/embed.py +0 -0
  130. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/interactiveshell.py +0 -0
  131. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/ipapp.py +0 -0
  132. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/magics.py +0 -0
  133. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/prompts.py +0 -0
  134. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  135. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  136. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  137. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  138. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  139. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  140. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  141. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  142. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  143. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  144. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  145. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/ptutils.py +0 -0
  146. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  147. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  148. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  149. {ipython-9.9.0 → ipython-9.11.0}/IPython/terminal/shortcuts/filters.py +0 -0
  150. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/__init__.py +0 -0
  151. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/globalipapp.py +0 -0
  152. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/ipunittest.py +0 -0
  153. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/Makefile +0 -0
  154. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/__init__.py +0 -0
  155. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/dtexample.py +0 -0
  156. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  157. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  158. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/setup.py +0 -0
  159. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/simple.py +0 -0
  160. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/simplevars.py +0 -0
  161. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_combo.txt +0 -0
  162. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_example.txt +0 -0
  163. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  164. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  165. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/plugin/test_refs.py +0 -0
  166. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/skipdoctest.py +0 -0
  167. {ipython-9.9.0 → ipython-9.11.0}/IPython/testing/tools.py +0 -0
  168. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/PyColorize.py +0 -0
  169. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/__init__.py +0 -0
  170. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_cli.py +0 -0
  171. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_emscripten.py +0 -0
  172. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_posix.py +0 -0
  173. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/_process_win32_controller.py +0 -0
  174. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/capture.py +0 -0
  175. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/coloransi.py +0 -0
  176. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/data.py +0 -0
  177. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/docs.py +0 -0
  178. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/encoding.py +0 -0
  179. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/eventful.py +0 -0
  180. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/generics.py +0 -0
  181. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/importstring.py +0 -0
  182. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/io.py +0 -0
  183. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/ipstruct.py +0 -0
  184. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/jsonutil.py +0 -0
  185. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/log.py +0 -0
  186. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/module_paths.py +0 -0
  187. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/path.py +0 -0
  188. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/process.py +0 -0
  189. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/sentinel.py +0 -0
  190. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/strdispatch.py +0 -0
  191. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/sysinfo.py +0 -0
  192. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/syspathcontext.py +0 -0
  193. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/tempdir.py +0 -0
  194. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/terminal.py +0 -0
  195. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/tokenutil.py +0 -0
  196. {ipython-9.9.0 → ipython-9.11.0}/IPython/utils/wildcard.py +0 -0
  197. {ipython-9.9.0 → ipython-9.11.0}/LICENSE +0 -0
  198. {ipython-9.9.0 → ipython-9.11.0}/MANIFEST.in +0 -0
  199. {ipython-9.9.0 → ipython-9.11.0}/README.rst +0 -0
  200. {ipython-9.9.0 → ipython-9.11.0}/_build_meta.py +0 -0
  201. {ipython-9.9.0 → ipython-9.11.0}/docs/Makefile +0 -0
  202. {ipython-9.9.0 → ipython-9.11.0}/docs/README.rst +0 -0
  203. {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_api.py +0 -0
  204. {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_config.py +0 -0
  205. {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_magics.py +0 -0
  206. {ipython-9.9.0 → ipython-9.11.0}/docs/autogen_shortcuts.py +0 -0
  207. {ipython-9.9.0 → ipython-9.11.0}/docs/make.cmd +0 -0
  208. {ipython-9.9.0 → ipython-9.11.0}/docs/man/ipython.1 +0 -0
  209. {ipython-9.9.0 → ipython-9.11.0}/docs/requirements.txt +0 -0
  210. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/running-crop.png +0 -0
  211. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/running.png +0 -0
  212. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/treeview.png +0 -0
  213. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/user-interface.png +0 -0
  214. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/2.0/widgets.png +0 -0
  215. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  216. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  217. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  218. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  219. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  220. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  221. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  222. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  223. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  224. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  225. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  226. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/autosuggest.gif +0 -0
  227. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  228. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  229. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  230. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  231. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  232. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  233. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  234. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  235. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  236. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  237. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  238. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  239. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  240. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  241. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  242. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ms_visual_studio.png +0 -0
  243. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/notebook_specgram.png +0 -0
  244. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/ptshell_features.png +0 -0
  245. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/qtconsole.png +0 -0
  246. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  247. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_images/unicode_completion.png +0 -0
  248. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_static/favicon.ico +0 -0
  249. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_static/logo.png +0 -0
  250. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_static/theme_overrides.css +0 -0
  251. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_templates/breadcrumbs.html +0 -0
  252. {ipython-9.9.0 → ipython-9.11.0}/docs/source/_templates/notebook_redirect.html +0 -0
  253. {ipython-9.9.0 → ipython-9.11.0}/docs/source/about/history.rst +0 -0
  254. {ipython-9.9.0 → ipython-9.11.0}/docs/source/about/index.rst +0 -0
  255. {ipython-9.9.0 → ipython-9.11.0}/docs/source/about/license_and_copyright.rst +0 -0
  256. {ipython-9.9.0 → ipython-9.11.0}/docs/source/api/index.rst +0 -0
  257. {ipython-9.9.0 → ipython-9.11.0}/docs/source/conf.py +0 -0
  258. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/callbacks.rst +0 -0
  259. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/custommagics.rst +0 -0
  260. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/details.rst +0 -0
  261. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/eventloops.rst +0 -0
  262. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/extensions/autoreload.rst +0 -0
  263. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/extensions/index.rst +0 -0
  264. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/extensions/storemagic.rst +0 -0
  265. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/index.rst +0 -0
  266. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/inputtransforms.rst +0 -0
  267. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/integrating.rst +0 -0
  268. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/intro.rst +0 -0
  269. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/options/index.rst +0 -0
  270. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  271. {ipython-9.9.0 → ipython-9.11.0}/docs/source/config/shortcuts/index.rst +0 -0
  272. {ipython-9.9.0 → ipython-9.11.0}/docs/source/coredev/index.rst +0 -0
  273. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/config.rst +0 -0
  274. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/execution.rst +0 -0
  275. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  276. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  277. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/other_kernels.png +0 -0
  278. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/figs/other_kernels.svg +0 -0
  279. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/how_ipython_works.rst +0 -0
  280. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/index.rst +0 -0
  281. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/inputhook_app.rst +0 -0
  282. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/kernels.rst +0 -0
  283. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/messaging.rst +0 -0
  284. {ipython-9.9.0 → ipython-9.11.0}/docs/source/development/wrapperkernels.rst +0 -0
  285. {ipython-9.9.0 → ipython-9.11.0}/docs/source/index.rst +0 -0
  286. {ipython-9.9.0 → ipython-9.11.0}/docs/source/install/index.rst +0 -0
  287. {ipython-9.9.0 → ipython-9.11.0}/docs/source/install/install.rst +0 -0
  288. {ipython-9.9.0 → ipython-9.11.0}/docs/source/install/kernel_install.rst +0 -0
  289. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/autoawait.rst +0 -0
  290. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/index.rst +0 -0
  291. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/magics.rst +0 -0
  292. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/plotting.rst +0 -0
  293. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  294. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/reference.rst +0 -0
  295. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/shell.rst +0 -0
  296. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/tips.rst +0 -0
  297. {ipython-9.9.0 → ipython-9.11.0}/docs/source/interactive/tutorial.rst +0 -0
  298. {ipython-9.9.0 → ipython-9.11.0}/docs/source/links.txt +0 -0
  299. {ipython-9.9.0 → ipython-9.11.0}/docs/source/overview.rst +0 -0
  300. {ipython-9.9.0 → ipython-9.11.0}/docs/source/parallel/index.rst +0 -0
  301. {ipython-9.9.0 → ipython-9.11.0}/docs/source/sphinx.toml +0 -0
  302. {ipython-9.9.0 → ipython-9.11.0}/docs/source/sphinxext.rst +0 -0
  303. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/development.rst +0 -0
  304. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  305. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  306. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  307. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  308. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  309. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  310. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  311. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  312. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  313. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  314. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  315. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/index.rst +0 -0
  316. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/pr/README.md +0 -0
  317. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  318. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  319. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.10.rst +0 -0
  320. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.11.rst +0 -0
  321. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.12.rst +0 -0
  322. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.13.rst +0 -0
  323. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.8.rst +0 -0
  324. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version0.9.rst +0 -0
  325. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version1.0.rst +0 -0
  326. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version2.0.rst +0 -0
  327. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version3.rst +0 -0
  328. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  329. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version4.rst +0 -0
  330. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version5.rst +0 -0
  331. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version6.rst +0 -0
  332. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version7.rst +0 -0
  333. {ipython-9.9.0 → ipython-9.11.0}/docs/source/whatsnew/version8.rst +0 -0
  334. {ipython-9.9.0 → ipython-9.11.0}/docs/sphinxext/apigen.py +0 -0
  335. {ipython-9.9.0 → ipython-9.11.0}/docs/sphinxext/configtraits.py +0 -0
  336. {ipython-9.9.0 → ipython-9.11.0}/docs/sphinxext/magics.py +0 -0
  337. {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/embed_class_long.py +0 -0
  338. {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/embed_class_short.py +0 -0
  339. {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/embed_function.py +0 -0
  340. {ipython-9.9.0 → ipython-9.11.0}/examples/Embedding/start_ipython_config.py +0 -0
  341. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/example-demo.py +0 -0
  342. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  343. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  344. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  345. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  346. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  347. {ipython-9.9.0 → ipython-9.11.0}/examples/IPython Kernel/ipython.desktop +0 -0
  348. {ipython-9.9.0 → ipython-9.11.0}/examples/auto_suggest_llm.py +0 -0
  349. {ipython-9.9.0 → ipython-9.11.0}/examples/utils/cwd_prompt.py +0 -0
  350. {ipython-9.9.0 → ipython-9.11.0}/examples/utils/list_pyfiles.ipy +0 -0
  351. {ipython-9.9.0 → ipython-9.11.0}/examples/utils/list_subdirs.ipy +0 -0
  352. {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/SOURCES.txt +0 -0
  353. {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/dependency_links.txt +0 -0
  354. {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/entry_points.txt +0 -0
  355. {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/not-zip-safe +0 -0
  356. {ipython-9.9.0 → ipython-9.11.0}/ipython.egg-info/top_level.txt +0 -0
  357. {ipython-9.9.0 → ipython-9.11.0}/long_description.rst +0 -0
  358. {ipython-9.9.0 → ipython-9.11.0}/scripts/ipython.ico +0 -0
  359. {ipython-9.9.0 → ipython-9.11.0}/scripts/ipython_nb.ico +0 -0
  360. {ipython-9.9.0 → ipython-9.11.0}/setup.cfg +0 -0
  361. {ipython-9.9.0 → ipython-9.11.0}/setupbase.py +0 -0
  362. {ipython-9.9.0 → ipython-9.11.0}/tests/2x2.jpg +0 -0
  363. {ipython-9.9.0 → ipython-9.11.0}/tests/2x2.png +0 -0
  364. {ipython-9.9.0 → ipython-9.11.0}/tests/__init__.py +0 -0
  365. {ipython-9.9.0 → ipython-9.11.0}/tests/bad_all.py +0 -0
  366. {ipython-9.9.0 → ipython-9.11.0}/tests/conftest.py +0 -0
  367. {ipython-9.9.0 → ipython-9.11.0}/tests/fake_ext_dir/daft_extension.py +0 -0
  368. {ipython-9.9.0 → ipython-9.11.0}/tests/fake_llm.py +0 -0
  369. {ipython-9.9.0 → ipython-9.11.0}/tests/nonascii.py +0 -0
  370. {ipython-9.9.0 → ipython-9.11.0}/tests/nonascii2.py +0 -0
  371. {ipython-9.9.0 → ipython-9.11.0}/tests/print_argv.py +0 -0
  372. {ipython-9.9.0 → ipython-9.11.0}/tests/refbug.py +0 -0
  373. {ipython-9.9.0 → ipython-9.11.0}/tests/simpleerr.py +0 -0
  374. {ipython-9.9.0 → ipython-9.11.0}/tests/tclass.py +0 -0
  375. {ipython-9.9.0 → ipython-9.11.0}/tests/test.wav +0 -0
  376. {ipython-9.9.0 → ipython-9.11.0}/tests/test_alias.py +0 -0
  377. {ipython-9.9.0 → ipython-9.11.0}/tests/test_application.py +0 -0
  378. {ipython-9.9.0 → ipython-9.11.0}/tests/test_async_helpers.py +0 -0
  379. {ipython-9.9.0 → ipython-9.11.0}/tests/test_autocall.py +0 -0
  380. {ipython-9.9.0 → ipython-9.11.0}/tests/test_backgroundjobs.py +0 -0
  381. {ipython-9.9.0 → ipython-9.11.0}/tests/test_capture.py +0 -0
  382. {ipython-9.9.0 → ipython-9.11.0}/tests/test_clipboard.py +0 -0
  383. {ipython-9.9.0 → ipython-9.11.0}/tests/test_compilerop.py +0 -0
  384. {ipython-9.9.0 → ipython-9.11.0}/tests/test_completerlib.py +0 -0
  385. {ipython-9.9.0 → ipython-9.11.0}/tests/test_cve.py +0 -0
  386. {ipython-9.9.0 → ipython-9.11.0}/tests/test_debug_magic.py +0 -0
  387. {ipython-9.9.0 → ipython-9.11.0}/tests/test_debugger.py +0 -0
  388. {ipython-9.9.0 → ipython-9.11.0}/tests/test_decorators.py +0 -0
  389. {ipython-9.9.0 → ipython-9.11.0}/tests/test_decorators_2.py +0 -0
  390. {ipython-9.9.0 → ipython-9.11.0}/tests/test_deepreload.py +0 -0
  391. {ipython-9.9.0 → ipython-9.11.0}/tests/test_dir2.py +0 -0
  392. {ipython-9.9.0 → ipython-9.11.0}/tests/test_display.py +0 -0
  393. {ipython-9.9.0 → ipython-9.11.0}/tests/test_display_2.py +0 -0
  394. {ipython-9.9.0 → ipython-9.11.0}/tests/test_displayhook.py +0 -0
  395. {ipython-9.9.0 → ipython-9.11.0}/tests/test_editorhooks.py +0 -0
  396. {ipython-9.9.0 → ipython-9.11.0}/tests/test_embed.py +0 -0
  397. {ipython-9.9.0 → ipython-9.11.0}/tests/test_events.py +0 -0
  398. {ipython-9.9.0 → ipython-9.11.0}/tests/test_exceptiongroup_tb.py +0 -0
  399. {ipython-9.9.0 → ipython-9.11.0}/tests/test_extension.py +0 -0
  400. {ipython-9.9.0 → ipython-9.11.0}/tests/test_formatters.py +0 -0
  401. {ipython-9.9.0 → ipython-9.11.0}/tests/test_handlers.py +0 -0
  402. {ipython-9.9.0 → ipython-9.11.0}/tests/test_help.py +0 -0
  403. {ipython-9.9.0 → ipython-9.11.0}/tests/test_history.py +0 -0
  404. {ipython-9.9.0 → ipython-9.11.0}/tests/test_hooks.py +0 -0
  405. {ipython-9.9.0 → ipython-9.11.0}/tests/test_imports.py +0 -0
  406. {ipython-9.9.0 → ipython-9.11.0}/tests/test_importstring.py +0 -0
  407. {ipython-9.9.0 → ipython-9.11.0}/tests/test_inputtransformer2.py +0 -0
  408. {ipython-9.9.0 → ipython-9.11.0}/tests/test_interactiveshell.py +0 -0
  409. {ipython-9.9.0 → ipython-9.11.0}/tests/test_interactivshell.py +0 -0
  410. {ipython-9.9.0 → ipython-9.11.0}/tests/test_io.py +0 -0
  411. {ipython-9.9.0 → ipython-9.11.0}/tests/test_iplib.py +0 -0
  412. {ipython-9.9.0 → ipython-9.11.0}/tests/test_ipunittest.py +0 -0
  413. {ipython-9.9.0 → ipython-9.11.0}/tests/test_latextools.py +0 -0
  414. {ipython-9.9.0 → ipython-9.11.0}/tests/test_logger.py +0 -0
  415. {ipython-9.9.0 → ipython-9.11.0}/tests/test_magic.py +0 -0
  416. {ipython-9.9.0 → ipython-9.11.0}/tests/test_magic_arguments.py +0 -0
  417. {ipython-9.9.0 → ipython-9.11.0}/tests/test_magic_terminal.py +0 -0
  418. {ipython-9.9.0 → ipython-9.11.0}/tests/test_module_paths.py +0 -0
  419. {ipython-9.9.0 → ipython-9.11.0}/tests/test_openpy.py +0 -0
  420. {ipython-9.9.0 → ipython-9.11.0}/tests/test_page.py +0 -0
  421. {ipython-9.9.0 → ipython-9.11.0}/tests/test_path.py +0 -0
  422. {ipython-9.9.0 → ipython-9.11.0}/tests/test_paths.py +0 -0
  423. {ipython-9.9.0 → ipython-9.11.0}/tests/test_prefilter.py +0 -0
  424. {ipython-9.9.0 → ipython-9.11.0}/tests/test_process.py +0 -0
  425. {ipython-9.9.0 → ipython-9.11.0}/tests/test_profile.py +0 -0
  426. {ipython-9.9.0 → ipython-9.11.0}/tests/test_pt_inputhooks.py +0 -0
  427. {ipython-9.9.0 → ipython-9.11.0}/tests/test_pycolorize.py +0 -0
  428. {ipython-9.9.0 → ipython-9.11.0}/tests/test_pylabtools.py +0 -0
  429. {ipython-9.9.0 → ipython-9.11.0}/tests/test_qt_loaders.py +0 -0
  430. {ipython-9.9.0 → ipython-9.11.0}/tests/test_run.py +0 -0
  431. {ipython-9.9.0 → ipython-9.11.0}/tests/test_shellapp.py +0 -0
  432. {ipython-9.9.0 → ipython-9.11.0}/tests/test_splitinput.py +0 -0
  433. {ipython-9.9.0 → ipython-9.11.0}/tests/test_storemagic.py +0 -0
  434. {ipython-9.9.0 → ipython-9.11.0}/tests/test_sysinfo.py +0 -0
  435. {ipython-9.9.0 → ipython-9.11.0}/tests/test_tempdir.py +0 -0
  436. {ipython-9.9.0 → ipython-9.11.0}/tests/test_text.py +0 -0
  437. {ipython-9.9.0 → ipython-9.11.0}/tests/test_tips.py +0 -0
  438. {ipython-9.9.0 → ipython-9.11.0}/tests/test_tokenutil.py +0 -0
  439. {ipython-9.9.0 → ipython-9.11.0}/tests/test_tools.py +0 -0
  440. {ipython-9.9.0 → ipython-9.11.0}/tests/test_ultratb.py +0 -0
  441. {ipython-9.9.0 → ipython-9.11.0}/tests/test_wildcard.py +0 -0
@@ -27,13 +27,13 @@ import warnings
27
27
  #-----------------------------------------------------------------------------
28
28
 
29
29
  # Don't forget to also update setup.py when this changes!
30
- if sys.version_info < (3, 11):
30
+ if sys.version_info < (3, 12):
31
31
  raise ImportError(
32
32
  """
33
+ IPython 9.x supports Python 3.12 and above, following SPEC0
33
34
  IPython 8.31+ supports Python 3.11 and above, following SPEC0
34
35
  IPython 8.19+ supports Python 3.10 and above, following SPEC0.
35
36
  IPython 8.13+ supports Python 3.9 and above, following NEP 29.
36
- IPython 8.0-8.12 supports Python 3.8 and above, following NEP 29.
37
37
  When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
38
38
  Python 3.3 and 3.4 were supported up to IPython 6.x.
39
39
  Python 3.5 was supported with IPython 7.0 to 7.9.
@@ -243,11 +243,7 @@ import __main__
243
243
 
244
244
  from typing import cast
245
245
 
246
- if sys.version_info < (3, 12):
247
- from typing_extensions import TypedDict, Protocol
248
- from typing import NotRequired, TypeAlias, TypeGuard
249
- else:
250
- from typing import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard
246
+ from typing import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard
251
247
 
252
248
 
253
249
  # skip module docstests
@@ -274,7 +270,7 @@ except ImportError:
274
270
  # write this). With below range we cover them all, with a density of ~67%
275
271
  # biggest next gap we consider only adds up about 1% density and there are 600
276
272
  # gaps that would need hard coding.
277
- _UNICODE_RANGES = [(32, 0x323B0), (0xE0001, 0xE01F0)]
273
+ _UNICODE_RANGES = [(32, 0x3347A), (0xE0001, 0xE01F0)]
278
274
 
279
275
  # Public API
280
276
  __all__ = ["Completer", "IPCompleter"]
@@ -15,10 +15,14 @@ events and the arguments which will be passed to them.
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- from typing import TYPE_CHECKING, Any, Callable, Iterable
18
+ from typing import TYPE_CHECKING, Any, Callable, Iterable, TypeVar
19
19
 
20
20
  if TYPE_CHECKING:
21
- from IPython.core.interactiveshell import InteractiveShell
21
+ from IPython.core.interactiveshell import (
22
+ ExecutionInfo,
23
+ ExecutionResult,
24
+ InteractiveShell,
25
+ )
22
26
 
23
27
 
24
28
  class EventManager:
@@ -106,7 +110,10 @@ class EventManager:
106
110
  # event_name -> prototype mapping
107
111
  available_events: dict[str, Callable[..., Any]] = {}
108
112
 
109
- def _define_event(callback_function: Callable[..., Any]) -> Callable[..., Any]:
113
+ _CallbackT = TypeVar("_CallbackT", bound=Callable[..., Any])
114
+
115
+ def _define_event(callback_function: _CallbackT) -> _CallbackT:
116
+ """Decorator to register a function as an available event prototype."""
110
117
  available_events[callback_function.__name__] = callback_function
111
118
  return callback_function
112
119
 
@@ -127,7 +134,7 @@ def pre_execute() -> None:
127
134
  pass
128
135
 
129
136
  @_define_event
130
- def pre_run_cell(info: Any) -> None:
137
+ def pre_run_cell(info: ExecutionInfo) -> None:
131
138
  """Fires before user-entered code runs.
132
139
 
133
140
  Parameters
@@ -147,7 +154,7 @@ def post_execute() -> None:
147
154
  pass
148
155
 
149
156
  @_define_event
150
- def post_run_cell(result: Any) -> None:
157
+ def post_run_cell(result: ExecutionResult) -> None:
151
158
  """Fires after user-entered code runs.
152
159
 
153
160
  Parameters
@@ -32,10 +32,7 @@ from IPython.utils.decorators import undoc
32
32
  import types
33
33
  from typing import Self, LiteralString, get_type_hints
34
34
 
35
- if sys.version_info < (3, 12):
36
- from typing_extensions import TypeAliasType
37
- else:
38
- from typing import TypeAliasType
35
+ from typing import TypeAliasType
39
36
 
40
37
 
41
38
  @undoc
@@ -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
 
@@ -38,6 +39,8 @@ from IPython.utils.decorators import undoc
38
39
  from typing import Tuple, Optional, TYPE_CHECKING
39
40
  from collections.abc import Iterable
40
41
  import typing
42
+ import typing as t
43
+ from typing import cast
41
44
  from warnings import warn
42
45
  from weakref import ref, WeakSet
43
46
 
@@ -89,6 +92,9 @@ class DummyDB:
89
92
  def __exit__(self, *args, **kwargs): # type: ignore [no-untyped-def]
90
93
  pass
91
94
 
95
+ def close(self, *args, **kwargs): # type: ignore [no-untyped-def]
96
+ pass
97
+
92
98
 
93
99
  @decorator
94
100
  def only_when_enabled(f, self, *a, **kw): # type: ignore [no-untyped-def]
@@ -343,6 +349,10 @@ class HistoryAccessor(HistoryAccessorBase):
343
349
  # success! reset corrupt db count
344
350
  self._corrupt_db_counter = 0
345
351
 
352
+ def __del__(self) -> None:
353
+ if hasattr(self, "db"):
354
+ self.db.close()
355
+
346
356
  def writeout_cache(self) -> None:
347
357
  """Overridden by HistoryManager to dump the cache before certain
348
358
  database lookups."""
@@ -689,6 +699,7 @@ class HistoryManager(HistoryAccessor):
689
699
  )
690
700
  self.hist_file = ":memory:"
691
701
 
702
+ self.using_thread = False
692
703
  if self.enabled and self.hist_file != ":memory:":
693
704
  self.save_thread = HistorySavingThread(self)
694
705
  try:
@@ -699,6 +710,8 @@ class HistoryManager(HistoryAccessor):
699
710
  exc_info=True,
700
711
  )
701
712
  self.hist_file = ":memory:"
713
+ else:
714
+ self.using_thread = True
702
715
  self._instances.add(self)
703
716
  assert len(HistoryManager._instances) <= HistoryManager._max_inst, (
704
717
  len(HistoryManager._instances),
@@ -708,6 +721,21 @@ class HistoryManager(HistoryAccessor):
708
721
  def __del__(self) -> None:
709
722
  if self.save_thread is not None:
710
723
  self.save_thread.stop()
724
+ HistoryAccessor.__del__(self)
725
+
726
+ @classmethod
727
+ def _stop_thread(cls) -> None:
728
+ # Used before forking so the thread isn't running at fork
729
+ for inst in cls._instances:
730
+ if inst.save_thread is not None:
731
+ inst.save_thread.stop()
732
+ inst.save_thread = None
733
+
734
+ def _restart_thread_if_stopped(self) -> None:
735
+ # Start the thread again after it was stopped for forking
736
+ if self.save_thread is None and self.using_thread:
737
+ self.save_thread = HistorySavingThread(self)
738
+ self.save_thread.start()
711
739
 
712
740
  def _get_hist_file_name(self, profile: Optional[str] = None) -> Path:
713
741
  """Get default history file name based on the Shell's profile.
@@ -970,8 +998,10 @@ class HistoryManager(HistoryAccessor):
970
998
  self.db_input_cache.append((line_num, source, source_raw))
971
999
  # Trigger to flush cache and write to DB.
972
1000
  if len(self.db_input_cache) >= self.db_cache_size:
973
- if self.save_flag:
974
- self.save_flag.set()
1001
+ if self.using_thread:
1002
+ self._restart_thread_if_stopped()
1003
+ if self.save_flag is not None:
1004
+ self.save_flag.set()
975
1005
 
976
1006
  # update the auto _i variables
977
1007
  self._iii = self._ii
@@ -1003,8 +1033,10 @@ class HistoryManager(HistoryAccessor):
1003
1033
 
1004
1034
  with self.db_output_cache_lock:
1005
1035
  self.db_output_cache.append((line_num, output))
1006
- if self.db_cache_size <= 1 and self.save_flag is not None:
1007
- self.save_flag.set()
1036
+ if self.db_cache_size <= 1 and self.using_thread:
1037
+ self._restart_thread_if_stopped()
1038
+ if self.save_flag is not None:
1039
+ self.save_flag.set()
1008
1040
 
1009
1041
  def _writeout_input_cache(self, conn: sqlite3.Connection) -> None:
1010
1042
  with conn:
@@ -1059,6 +1091,10 @@ class HistoryManager(HistoryAccessor):
1059
1091
  self.db_output_cache = []
1060
1092
 
1061
1093
 
1094
+ if hasattr(os, "register_at_fork"):
1095
+ os.register_at_fork(before=HistoryManager._stop_thread)
1096
+
1097
+
1062
1098
  from collections.abc import Callable, Iterator
1063
1099
  from weakref import ReferenceType
1064
1100
 
@@ -1105,7 +1141,7 @@ class HistorySavingThread(threading.Thread):
1105
1141
  if hm() is not None:
1106
1142
  self.db = sqlite3.connect(
1107
1143
  str(hm().hist_file), # type: ignore [union-attr]
1108
- **hm().connection_options, # type: ignore [union-attr]
1144
+ **cast(dict[str, t.Any], hm().connection_options), # type: ignore [union-attr]
1109
1145
  )
1110
1146
  while True:
1111
1147
  self.save_flag.wait()
@@ -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(
@@ -266,24 +356,8 @@ class MagicAssign(TokenTransformBase):
266
356
  class SystemAssign(TokenTransformBase):
267
357
  """Transformer for assignments from system commands (a = !foo)"""
268
358
  @classmethod
269
- def find_pre_312(cls, tokens_by_line):
270
- for line in tokens_by_line:
271
- assign_ix = _find_assign_op(line)
272
- if (assign_ix is not None) \
273
- and not line[assign_ix].line.strip().startswith('=') \
274
- and (len(line) >= assign_ix + 2) \
275
- and (line[assign_ix + 1].type == tokenize.ERRORTOKEN):
276
- ix = assign_ix + 1
277
-
278
- while ix < len(line) and line[ix].type == tokenize.ERRORTOKEN:
279
- if line[ix].string == '!':
280
- return cls(line[ix].start)
281
- elif not line[ix].string.isspace():
282
- break
283
- ix += 1
284
-
285
- @classmethod
286
- def find_post_312(cls, tokens_by_line):
359
+ def find(cls, tokens_by_line):
360
+ """Find the first system assignment (a = !foo) in the cell."""
287
361
  for line in tokens_by_line:
288
362
  assign_ix = _find_assign_op(line)
289
363
  if (
@@ -295,13 +369,6 @@ class SystemAssign(TokenTransformBase):
295
369
  ):
296
370
  return cls(line[assign_ix + 1].start)
297
371
 
298
- @classmethod
299
- def find(cls, tokens_by_line):
300
- """Find the first system assignment (a = !foo) in the cell."""
301
- if sys.version_info < (3, 12):
302
- return cls.find_pre_312(tokens_by_line)
303
- return cls.find_post_312(tokens_by_line)
304
-
305
372
  def transform(self, lines: List[str]):
306
373
  """Transform a system assignment found by the ``find()`` classmethod.
307
374
  """
@@ -22,6 +22,7 @@ import re
22
22
  import runpy
23
23
  import shutil
24
24
  import subprocess
25
+ from subprocess import CalledProcessError
25
26
  import sys
26
27
  import tempfile
27
28
  import traceback
@@ -37,6 +38,7 @@ from typing import List as ListType, Any as AnyType
37
38
  from typing import Literal, Optional, Tuple
38
39
  from collections.abc import Sequence
39
40
  from warnings import warn
41
+ import textwrap
40
42
 
41
43
  from IPython.external.pickleshare import PickleShareDB
42
44
 
@@ -90,7 +92,7 @@ from IPython.utils.decorators import undoc
90
92
  from IPython.utils.io import ask_yes_no
91
93
  from IPython.utils.ipstruct import Struct
92
94
  from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename
93
- from IPython.utils.process import getoutput, system
95
+ from IPython.utils.process import get_output_error_code, getoutput, system
94
96
  from IPython.utils.strdispatch import StrDispatch
95
97
  from IPython.utils.syspathcontext import prepended_to_syspath
96
98
  from IPython.utils.text import DollarFormatter, LSString, SList, format_screen
@@ -538,6 +540,14 @@ class InteractiveShell(SingletonConfigurable):
538
540
 
539
541
  quiet = Bool(False).tag(config=True)
540
542
 
543
+ system_raise_on_error = Bool(False, help=
544
+ """
545
+ Raise an exception on non-zero exit status from shell commands executed
546
+ via the `!` operator. When set to True, shell commands that fail will raise
547
+ CalledProcessError, similar to the behavior of %%script magics.
548
+ """
549
+ ).tag(config=True)
550
+
541
551
  history_length = Integer(10000,
542
552
  help='Total length of command history'
543
553
  ).tag(config=True)
@@ -1014,6 +1024,18 @@ class InteractiveShell(SingletonConfigurable):
1014
1024
 
1015
1025
  @property
1016
1026
  def banner(self):
1027
+ if (when := os.environ.get("SOURCE_DATE_EPOCH", None)) is not None:
1028
+ from datetime import datetime
1029
+
1030
+ date = datetime.fromtimestamp(int(when))
1031
+ return textwrap.dedent(
1032
+ f"""
1033
+ Python 3.y.z | Packaged with love | (main, {date.strftime("%A, %d %B %Y")}) [Compiler]
1034
+ Type 'copyright', 'credits' or 'license' for more information
1035
+ IPython 9.y.z -- An enhanced Interactive Python. Type '?' for help.
1036
+ Tip: unset SOURCE_DATE_EPOCH to restore dynamic banner.
1037
+ """
1038
+ ).lstrip()
1017
1039
  banner = self.banner1
1018
1040
  if self.profile and self.profile != 'default':
1019
1041
  banner += '\nIPython profile: %s\n' % self.profile
@@ -2118,8 +2140,7 @@ class InteractiveShell(SingletonConfigurable):
2118
2140
  sys.last_type = etype
2119
2141
  sys.last_value = value
2120
2142
  sys.last_traceback = tb
2121
- if sys.version_info >= (3, 12):
2122
- sys.last_exc = value
2143
+ sys.last_exc = value
2123
2144
 
2124
2145
  return etype, value, tb
2125
2146
 
@@ -2647,7 +2668,12 @@ class InteractiveShell(SingletonConfigurable):
2647
2668
  # we explicitly do NOT return the subprocess status code, because
2648
2669
  # a non-None value would trigger :func:`sys.displayhook` calls.
2649
2670
  # Instead, we store the exit_code in user_ns.
2650
- self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2671
+ exit_code = system(self.var_expand(cmd, depth=1))
2672
+ self.user_ns['_exit_code'] = exit_code
2673
+
2674
+ # Raise an exception if the command failed and system_raise_on_error is True
2675
+ if self.system_raise_on_error and exit_code != 0:
2676
+ raise CalledProcessError(exit_code, cmd)
2651
2677
 
2652
2678
  def system_raw(self, cmd):
2653
2679
  """Call the given cmd in a subprocess using os.system on Windows or
@@ -2713,6 +2739,10 @@ class InteractiveShell(SingletonConfigurable):
2713
2739
  # but raising SystemExit(_exit_code) will give status 254!
2714
2740
  self.user_ns['_exit_code'] = ec
2715
2741
 
2742
+ # Raise an exception if the command failed and system_raise_on_error is True
2743
+ if self.system_raise_on_error and ec != 0:
2744
+ raise CalledProcessError(ec, cmd)
2745
+
2716
2746
  # use piped system by default, because it is better behaved
2717
2747
  system = system_piped
2718
2748
 
@@ -2738,11 +2768,27 @@ class InteractiveShell(SingletonConfigurable):
2738
2768
  if cmd.rstrip().endswith('&'):
2739
2769
  # this is *far* from a rigorous test
2740
2770
  raise OSError("Background processes not supported.")
2741
- out = getoutput(self.var_expand(cmd, depth=depth+1))
2771
+
2772
+ # Get output and exit code
2773
+ expanded_cmd = self.var_expand(cmd, depth=depth+1)
2774
+ if self.system_raise_on_error:
2775
+ # Use get_output_error_code to get the exit code
2776
+ out_str, err_str, exit_code = get_output_error_code(expanded_cmd)
2777
+ # Combine stdout and stderr as getoutput does
2778
+ out_combined = out_str if not err_str else out_str + err_str
2779
+ self.user_ns['_exit_code'] = exit_code
2780
+
2781
+ # Raise an exception if the command failed
2782
+ if exit_code != 0:
2783
+ raise CalledProcessError(exit_code, cmd)
2784
+ else:
2785
+ # Use the original getoutput for backward compatibility
2786
+ out_combined = getoutput(expanded_cmd)
2787
+
2742
2788
  if split:
2743
- out = SList(out.splitlines())
2789
+ out = SList(out_combined.splitlines())
2744
2790
  else:
2745
- out = LSString(out)
2791
+ out = LSString(out_combined)
2746
2792
  return out
2747
2793
 
2748
2794
  #-------------------------------------------------------------------------