ipython 9.10.0__tar.gz → 9.12.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.10.0 → ipython-9.12.0}/IPython/__init__.py +2 -2
  2. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/alias.py +1 -1
  3. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/application.py +3 -2
  4. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/compilerop.py +2 -2
  5. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/completer.py +2 -6
  6. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/debugger.py +1 -1
  7. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/events.py +12 -5
  8. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/guarded_eval.py +1 -4
  9. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/history.py +9 -1
  10. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/historyapp.py +39 -41
  11. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/inputtransformer2.py +2 -25
  12. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/interactiveshell.py +53 -7
  13. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magic.py +104 -63
  14. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/basic.py +13 -3
  15. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/execution.py +4 -3
  16. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/release.py +1 -1
  17. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/tbtools.py +1 -1
  18. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/ultratb.py +58 -29
  19. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/deduperreload/deduperreload.py +2 -2
  20. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/prompts.py +8 -4
  21. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/shortcuts/filters.py +6 -6
  22. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/decorators.py +10 -5
  23. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/ipunittest.py +1 -1
  24. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/pytest_ipdoctest.py +3 -3
  25. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/skipdoctest.py +2 -1
  26. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/tools.py +12 -10
  27. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_process_common.py +18 -15
  28. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_process_win32.py +5 -6
  29. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_sysinfo.py +1 -1
  30. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/capture.py +8 -6
  31. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/contexts.py +14 -5
  32. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/decorators.py +16 -12
  33. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/dir2.py +6 -3
  34. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/frame.py +7 -4
  35. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/io.py +4 -2
  36. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/ipstruct.py +4 -3
  37. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/openpy.py +6 -4
  38. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/path.py +5 -5
  39. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/py3compat.py +4 -3
  40. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/strdispatch.py +2 -1
  41. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/tempdir.py +8 -5
  42. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/terminal.py +1 -1
  43. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/text.py +1 -4
  44. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/timing.py +18 -5
  45. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/tokenutil.py +2 -2
  46. {ipython-9.10.0/ipython.egg-info → ipython-9.12.0}/PKG-INFO +13 -13
  47. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version9.rst +126 -0
  48. {ipython-9.10.0 → ipython-9.12.0/ipython.egg-info}/PKG-INFO +13 -13
  49. {ipython-9.10.0 → ipython-9.12.0}/ipython.egg-info/requires.txt +11 -13
  50. {ipython-9.10.0 → ipython-9.12.0}/pyproject.toml +41 -18
  51. {ipython-9.10.0 → ipython-9.12.0}/setup.py +0 -51
  52. {ipython-9.10.0 → ipython-9.12.0}/tests/test_completer.py +1 -1
  53. {ipython-9.10.0 → ipython-9.12.0}/tests/test_guarded_eval.py +1 -4
  54. {ipython-9.10.0 → ipython-9.12.0}/tests/test_iplib.py +11 -15
  55. {ipython-9.10.0 → ipython-9.12.0}/tests/test_magic.py +15 -2
  56. {ipython-9.10.0 → ipython-9.12.0}/tests/test_oinspect.py +1 -1
  57. {ipython-9.10.0 → ipython-9.12.0}/tests/test_pretty.py +6 -1
  58. {ipython-9.10.0 → ipython-9.12.0}/tests/test_shortcuts.py +1 -0
  59. {ipython-9.10.0 → ipython-9.12.0}/tests/test_zzz_autoreload.py +0 -2
  60. {ipython-9.10.0 → ipython-9.12.0}/.flake8 +0 -0
  61. {ipython-9.10.0 → ipython-9.12.0}/.mailmap +0 -0
  62. {ipython-9.10.0 → ipython-9.12.0}/.pre-commit-config.yaml +0 -0
  63. {ipython-9.10.0 → ipython-9.12.0}/COPYING.rst +0 -0
  64. {ipython-9.10.0 → ipython-9.12.0}/IPython/__main__.py +0 -0
  65. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/__init__.py +0 -0
  66. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/async_helpers.py +0 -0
  67. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/autocall.py +0 -0
  68. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/builtin_trap.py +0 -0
  69. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/completerlib.py +0 -0
  70. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/crashhandler.py +0 -0
  71. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/debugger_backport.py +0 -0
  72. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/display.py +0 -0
  73. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/display_functions.py +0 -0
  74. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/display_trap.py +0 -0
  75. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/displayhook.py +0 -0
  76. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/displaypub.py +0 -0
  77. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/doctb.py +0 -0
  78. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/error.py +0 -0
  79. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/extensions.py +0 -0
  80. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/formatters.py +0 -0
  81. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/getipython.py +0 -0
  82. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/hooks.py +0 -0
  83. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/latex_symbols.py +0 -0
  84. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/logger.py +0 -0
  85. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/macro.py +0 -0
  86. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magic_arguments.py +0 -0
  87. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/__init__.py +0 -0
  88. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/ast_mod.py +0 -0
  89. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/auto.py +0 -0
  90. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/code.py +0 -0
  91. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/config.py +0 -0
  92. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/display.py +0 -0
  93. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/extension.py +0 -0
  94. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/history.py +0 -0
  95. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/logging.py +0 -0
  96. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/namespace.py +0 -0
  97. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/osm.py +0 -0
  98. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/packaging.py +0 -0
  99. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/pylab.py +0 -0
  100. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/magics/script.py +0 -0
  101. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/oinspect.py +0 -0
  102. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/page.py +0 -0
  103. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/payload.py +0 -0
  104. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/payloadpage.py +0 -0
  105. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/prefilter.py +0 -0
  106. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/profile/README_STARTUP +0 -0
  107. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/profileapp.py +0 -0
  108. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/profiledir.py +0 -0
  109. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/pylabtools.py +0 -0
  110. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/shellapp.py +0 -0
  111. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/splitinput.py +0 -0
  112. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/tips.py +0 -0
  113. {ipython-9.10.0 → ipython-9.12.0}/IPython/core/usage.py +0 -0
  114. {ipython-9.10.0 → ipython-9.12.0}/IPython/display.py +0 -0
  115. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/__init__.py +0 -0
  116. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/autoreload.py +0 -0
  117. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/deduperreload/__init__.py +0 -0
  118. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
  119. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/storemagic.py +0 -0
  120. {ipython-9.10.0 → ipython-9.12.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
  121. {ipython-9.10.0 → ipython-9.12.0}/IPython/external/__init__.py +0 -0
  122. {ipython-9.10.0 → ipython-9.12.0}/IPython/external/pickleshare.py +0 -0
  123. {ipython-9.10.0 → ipython-9.12.0}/IPython/external/qt_for_kernel.py +0 -0
  124. {ipython-9.10.0 → ipython-9.12.0}/IPython/external/qt_loaders.py +0 -0
  125. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/__init__.py +0 -0
  126. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/backgroundjobs.py +0 -0
  127. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/clipboard.py +0 -0
  128. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/deepreload.py +0 -0
  129. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/demo.py +0 -0
  130. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/display.py +0 -0
  131. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/editorhooks.py +0 -0
  132. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/guisupport.py +0 -0
  133. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/latextools.py +0 -0
  134. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/lexers.py +0 -0
  135. {ipython-9.10.0 → ipython-9.12.0}/IPython/lib/pretty.py +0 -0
  136. {ipython-9.10.0 → ipython-9.12.0}/IPython/paths.py +0 -0
  137. {ipython-9.10.0 → ipython-9.12.0}/IPython/py.typed +0 -0
  138. {ipython-9.10.0 → ipython-9.12.0}/IPython/sphinxext/__init__.py +0 -0
  139. {ipython-9.10.0 → ipython-9.12.0}/IPython/sphinxext/custom_doctests.py +0 -0
  140. {ipython-9.10.0 → ipython-9.12.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  141. {ipython-9.10.0 → ipython-9.12.0}/IPython/sphinxext/ipython_directive.py +0 -0
  142. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/__init__.py +0 -0
  143. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/debugger.py +0 -0
  144. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/embed.py +0 -0
  145. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/interactiveshell.py +0 -0
  146. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/ipapp.py +0 -0
  147. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/magics.py +0 -0
  148. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  149. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  150. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  151. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  152. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  153. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  154. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  155. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  156. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  157. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  158. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  159. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/ptutils.py +0 -0
  160. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  161. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  162. {ipython-9.10.0 → ipython-9.12.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  163. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/__init__.py +0 -0
  164. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/globalipapp.py +0 -0
  165. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/Makefile +0 -0
  166. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/__init__.py +0 -0
  167. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/dtexample.py +0 -0
  168. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  169. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/setup.py +0 -0
  170. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/simple.py +0 -0
  171. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/simplevars.py +0 -0
  172. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/test_combo.txt +0 -0
  173. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/test_example.txt +0 -0
  174. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  175. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  176. {ipython-9.10.0 → ipython-9.12.0}/IPython/testing/plugin/test_refs.py +0 -0
  177. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/PyColorize.py +0 -0
  178. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/__init__.py +0 -0
  179. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_process_cli.py +0 -0
  180. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_process_emscripten.py +0 -0
  181. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_process_posix.py +0 -0
  182. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/_process_win32_controller.py +0 -0
  183. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/coloransi.py +0 -0
  184. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/data.py +0 -0
  185. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/docs.py +0 -0
  186. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/encoding.py +0 -0
  187. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/eventful.py +0 -0
  188. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/generics.py +0 -0
  189. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/importstring.py +0 -0
  190. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/jsonutil.py +0 -0
  191. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/log.py +0 -0
  192. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/module_paths.py +0 -0
  193. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/process.py +0 -0
  194. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/sentinel.py +0 -0
  195. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/sysinfo.py +0 -0
  196. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/syspathcontext.py +0 -0
  197. {ipython-9.10.0 → ipython-9.12.0}/IPython/utils/wildcard.py +0 -0
  198. {ipython-9.10.0 → ipython-9.12.0}/LICENSE +0 -0
  199. {ipython-9.10.0 → ipython-9.12.0}/MANIFEST.in +0 -0
  200. {ipython-9.10.0 → ipython-9.12.0}/README.rst +0 -0
  201. {ipython-9.10.0 → ipython-9.12.0}/_build_meta.py +0 -0
  202. {ipython-9.10.0 → ipython-9.12.0}/docs/Makefile +0 -0
  203. {ipython-9.10.0 → ipython-9.12.0}/docs/README.rst +0 -0
  204. {ipython-9.10.0 → ipython-9.12.0}/docs/autogen_api.py +0 -0
  205. {ipython-9.10.0 → ipython-9.12.0}/docs/autogen_config.py +0 -0
  206. {ipython-9.10.0 → ipython-9.12.0}/docs/autogen_magics.py +0 -0
  207. {ipython-9.10.0 → ipython-9.12.0}/docs/autogen_shortcuts.py +0 -0
  208. {ipython-9.10.0 → ipython-9.12.0}/docs/make.cmd +0 -0
  209. {ipython-9.10.0 → ipython-9.12.0}/docs/man/ipython.1 +0 -0
  210. {ipython-9.10.0 → ipython-9.12.0}/docs/requirements.txt +0 -0
  211. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/2.0/running-crop.png +0 -0
  212. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/2.0/running.png +0 -0
  213. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/2.0/treeview.png +0 -0
  214. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/2.0/user-interface.png +0 -0
  215. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/2.0/widgets.png +0 -0
  216. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  217. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  218. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  219. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  220. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  221. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  222. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  223. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  224. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  225. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  226. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  227. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/autosuggest.gif +0 -0
  228. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  229. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  230. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  231. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  232. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  233. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  234. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  235. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  236. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  237. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  238. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  239. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  240. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  241. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  242. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  243. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ms_visual_studio.png +0 -0
  244. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/notebook_specgram.png +0 -0
  245. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/ptshell_features.png +0 -0
  246. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/qtconsole.png +0 -0
  247. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  248. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_images/unicode_completion.png +0 -0
  249. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_static/favicon.ico +0 -0
  250. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_static/logo.png +0 -0
  251. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_static/theme_overrides.css +0 -0
  252. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_templates/breadcrumbs.html +0 -0
  253. {ipython-9.10.0 → ipython-9.12.0}/docs/source/_templates/notebook_redirect.html +0 -0
  254. {ipython-9.10.0 → ipython-9.12.0}/docs/source/about/history.rst +0 -0
  255. {ipython-9.10.0 → ipython-9.12.0}/docs/source/about/index.rst +0 -0
  256. {ipython-9.10.0 → ipython-9.12.0}/docs/source/about/license_and_copyright.rst +0 -0
  257. {ipython-9.10.0 → ipython-9.12.0}/docs/source/api/index.rst +0 -0
  258. {ipython-9.10.0 → ipython-9.12.0}/docs/source/conf.py +0 -0
  259. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/callbacks.rst +0 -0
  260. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/custommagics.rst +0 -0
  261. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/details.rst +0 -0
  262. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/eventloops.rst +0 -0
  263. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/extensions/autoreload.rst +0 -0
  264. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/extensions/index.rst +0 -0
  265. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/extensions/storemagic.rst +0 -0
  266. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/index.rst +0 -0
  267. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/inputtransforms.rst +0 -0
  268. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/integrating.rst +0 -0
  269. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/intro.rst +0 -0
  270. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/options/index.rst +0 -0
  271. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  272. {ipython-9.10.0 → ipython-9.12.0}/docs/source/config/shortcuts/index.rst +0 -0
  273. {ipython-9.10.0 → ipython-9.12.0}/docs/source/coredev/index.rst +0 -0
  274. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/config.rst +0 -0
  275. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/execution.rst +0 -0
  276. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  277. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  278. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/figs/other_kernels.png +0 -0
  279. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/figs/other_kernels.svg +0 -0
  280. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/how_ipython_works.rst +0 -0
  281. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/index.rst +0 -0
  282. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/inputhook_app.rst +0 -0
  283. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/kernels.rst +0 -0
  284. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/messaging.rst +0 -0
  285. {ipython-9.10.0 → ipython-9.12.0}/docs/source/development/wrapperkernels.rst +0 -0
  286. {ipython-9.10.0 → ipython-9.12.0}/docs/source/index.rst +0 -0
  287. {ipython-9.10.0 → ipython-9.12.0}/docs/source/install/index.rst +0 -0
  288. {ipython-9.10.0 → ipython-9.12.0}/docs/source/install/install.rst +0 -0
  289. {ipython-9.10.0 → ipython-9.12.0}/docs/source/install/kernel_install.rst +0 -0
  290. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/autoawait.rst +0 -0
  291. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/index.rst +0 -0
  292. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/magics.rst +0 -0
  293. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/plotting.rst +0 -0
  294. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  295. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/reference.rst +0 -0
  296. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/shell.rst +0 -0
  297. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/tips.rst +0 -0
  298. {ipython-9.10.0 → ipython-9.12.0}/docs/source/interactive/tutorial.rst +0 -0
  299. {ipython-9.10.0 → ipython-9.12.0}/docs/source/links.txt +0 -0
  300. {ipython-9.10.0 → ipython-9.12.0}/docs/source/overview.rst +0 -0
  301. {ipython-9.10.0 → ipython-9.12.0}/docs/source/parallel/index.rst +0 -0
  302. {ipython-9.10.0 → ipython-9.12.0}/docs/source/sphinx.toml +0 -0
  303. {ipython-9.10.0 → ipython-9.12.0}/docs/source/sphinxext.rst +0 -0
  304. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/development.rst +0 -0
  305. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  306. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  307. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  308. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  309. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  310. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  311. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  312. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  313. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  314. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  315. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  316. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/index.rst +0 -0
  317. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/pr/README.md +0 -0
  318. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  319. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  320. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version0.10.rst +0 -0
  321. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version0.11.rst +0 -0
  322. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version0.12.rst +0 -0
  323. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version0.13.rst +0 -0
  324. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version0.8.rst +0 -0
  325. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version0.9.rst +0 -0
  326. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version1.0.rst +0 -0
  327. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version2.0.rst +0 -0
  328. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version3.rst +0 -0
  329. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  330. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version4.rst +0 -0
  331. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version5.rst +0 -0
  332. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version6.rst +0 -0
  333. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version7.rst +0 -0
  334. {ipython-9.10.0 → ipython-9.12.0}/docs/source/whatsnew/version8.rst +0 -0
  335. {ipython-9.10.0 → ipython-9.12.0}/docs/sphinxext/apigen.py +0 -0
  336. {ipython-9.10.0 → ipython-9.12.0}/docs/sphinxext/configtraits.py +0 -0
  337. {ipython-9.10.0 → ipython-9.12.0}/docs/sphinxext/magics.py +0 -0
  338. {ipython-9.10.0 → ipython-9.12.0}/examples/Embedding/embed_class_long.py +0 -0
  339. {ipython-9.10.0 → ipython-9.12.0}/examples/Embedding/embed_class_short.py +0 -0
  340. {ipython-9.10.0 → ipython-9.12.0}/examples/Embedding/embed_function.py +0 -0
  341. {ipython-9.10.0 → ipython-9.12.0}/examples/Embedding/start_ipython_config.py +0 -0
  342. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/example-demo.py +0 -0
  343. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  344. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  345. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  346. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  347. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  348. {ipython-9.10.0 → ipython-9.12.0}/examples/IPython Kernel/ipython.desktop +0 -0
  349. {ipython-9.10.0 → ipython-9.12.0}/examples/auto_suggest_llm.py +0 -0
  350. {ipython-9.10.0 → ipython-9.12.0}/examples/utils/cwd_prompt.py +0 -0
  351. {ipython-9.10.0 → ipython-9.12.0}/examples/utils/list_pyfiles.ipy +0 -0
  352. {ipython-9.10.0 → ipython-9.12.0}/examples/utils/list_subdirs.ipy +0 -0
  353. {ipython-9.10.0 → ipython-9.12.0}/ipython.egg-info/SOURCES.txt +0 -0
  354. {ipython-9.10.0 → ipython-9.12.0}/ipython.egg-info/dependency_links.txt +0 -0
  355. {ipython-9.10.0 → ipython-9.12.0}/ipython.egg-info/entry_points.txt +0 -0
  356. {ipython-9.10.0 → ipython-9.12.0}/ipython.egg-info/not-zip-safe +0 -0
  357. {ipython-9.10.0 → ipython-9.12.0}/ipython.egg-info/top_level.txt +0 -0
  358. {ipython-9.10.0 → ipython-9.12.0}/long_description.rst +0 -0
  359. {ipython-9.10.0 → ipython-9.12.0}/scripts/ipython.ico +0 -0
  360. {ipython-9.10.0 → ipython-9.12.0}/scripts/ipython_nb.ico +0 -0
  361. {ipython-9.10.0 → ipython-9.12.0}/setup.cfg +0 -0
  362. {ipython-9.10.0 → ipython-9.12.0}/setupbase.py +0 -0
  363. {ipython-9.10.0 → ipython-9.12.0}/tests/2x2.jpg +0 -0
  364. {ipython-9.10.0 → ipython-9.12.0}/tests/2x2.png +0 -0
  365. {ipython-9.10.0 → ipython-9.12.0}/tests/__init__.py +0 -0
  366. {ipython-9.10.0 → ipython-9.12.0}/tests/bad_all.py +0 -0
  367. {ipython-9.10.0 → ipython-9.12.0}/tests/conftest.py +0 -0
  368. {ipython-9.10.0 → ipython-9.12.0}/tests/fake_ext_dir/daft_extension.py +0 -0
  369. {ipython-9.10.0 → ipython-9.12.0}/tests/fake_llm.py +0 -0
  370. {ipython-9.10.0 → ipython-9.12.0}/tests/nonascii.py +0 -0
  371. {ipython-9.10.0 → ipython-9.12.0}/tests/nonascii2.py +0 -0
  372. {ipython-9.10.0 → ipython-9.12.0}/tests/print_argv.py +0 -0
  373. {ipython-9.10.0 → ipython-9.12.0}/tests/refbug.py +0 -0
  374. {ipython-9.10.0 → ipython-9.12.0}/tests/simpleerr.py +0 -0
  375. {ipython-9.10.0 → ipython-9.12.0}/tests/tclass.py +0 -0
  376. {ipython-9.10.0 → ipython-9.12.0}/tests/test.wav +0 -0
  377. {ipython-9.10.0 → ipython-9.12.0}/tests/test_alias.py +0 -0
  378. {ipython-9.10.0 → ipython-9.12.0}/tests/test_application.py +0 -0
  379. {ipython-9.10.0 → ipython-9.12.0}/tests/test_async_helpers.py +0 -0
  380. {ipython-9.10.0 → ipython-9.12.0}/tests/test_autocall.py +0 -0
  381. {ipython-9.10.0 → ipython-9.12.0}/tests/test_backgroundjobs.py +0 -0
  382. {ipython-9.10.0 → ipython-9.12.0}/tests/test_capture.py +0 -0
  383. {ipython-9.10.0 → ipython-9.12.0}/tests/test_clipboard.py +0 -0
  384. {ipython-9.10.0 → ipython-9.12.0}/tests/test_compilerop.py +0 -0
  385. {ipython-9.10.0 → ipython-9.12.0}/tests/test_completerlib.py +0 -0
  386. {ipython-9.10.0 → ipython-9.12.0}/tests/test_cve.py +0 -0
  387. {ipython-9.10.0 → ipython-9.12.0}/tests/test_debug_magic.py +0 -0
  388. {ipython-9.10.0 → ipython-9.12.0}/tests/test_debugger.py +0 -0
  389. {ipython-9.10.0 → ipython-9.12.0}/tests/test_decorators.py +0 -0
  390. {ipython-9.10.0 → ipython-9.12.0}/tests/test_decorators_2.py +0 -0
  391. {ipython-9.10.0 → ipython-9.12.0}/tests/test_deepreload.py +0 -0
  392. {ipython-9.10.0 → ipython-9.12.0}/tests/test_dir2.py +0 -0
  393. {ipython-9.10.0 → ipython-9.12.0}/tests/test_display.py +0 -0
  394. {ipython-9.10.0 → ipython-9.12.0}/tests/test_display_2.py +0 -0
  395. {ipython-9.10.0 → ipython-9.12.0}/tests/test_displayhook.py +0 -0
  396. {ipython-9.10.0 → ipython-9.12.0}/tests/test_editorhooks.py +0 -0
  397. {ipython-9.10.0 → ipython-9.12.0}/tests/test_embed.py +0 -0
  398. {ipython-9.10.0 → ipython-9.12.0}/tests/test_events.py +0 -0
  399. {ipython-9.10.0 → ipython-9.12.0}/tests/test_exceptiongroup_tb.py +0 -0
  400. {ipython-9.10.0 → ipython-9.12.0}/tests/test_extension.py +0 -0
  401. {ipython-9.10.0 → ipython-9.12.0}/tests/test_formatters.py +0 -0
  402. {ipython-9.10.0 → ipython-9.12.0}/tests/test_handlers.py +0 -0
  403. {ipython-9.10.0 → ipython-9.12.0}/tests/test_help.py +0 -0
  404. {ipython-9.10.0 → ipython-9.12.0}/tests/test_history.py +0 -0
  405. {ipython-9.10.0 → ipython-9.12.0}/tests/test_hooks.py +0 -0
  406. {ipython-9.10.0 → ipython-9.12.0}/tests/test_imports.py +0 -0
  407. {ipython-9.10.0 → ipython-9.12.0}/tests/test_importstring.py +0 -0
  408. {ipython-9.10.0 → ipython-9.12.0}/tests/test_inputtransformer2.py +0 -0
  409. {ipython-9.10.0 → ipython-9.12.0}/tests/test_inputtransformer2_line.py +0 -0
  410. {ipython-9.10.0 → ipython-9.12.0}/tests/test_interactiveshell.py +0 -0
  411. {ipython-9.10.0 → ipython-9.12.0}/tests/test_interactivshell.py +0 -0
  412. {ipython-9.10.0 → ipython-9.12.0}/tests/test_io.py +0 -0
  413. {ipython-9.10.0 → ipython-9.12.0}/tests/test_ipunittest.py +0 -0
  414. {ipython-9.10.0 → ipython-9.12.0}/tests/test_latextools.py +0 -0
  415. {ipython-9.10.0 → ipython-9.12.0}/tests/test_logger.py +0 -0
  416. {ipython-9.10.0 → ipython-9.12.0}/tests/test_magic_arguments.py +0 -0
  417. {ipython-9.10.0 → ipython-9.12.0}/tests/test_magic_terminal.py +0 -0
  418. {ipython-9.10.0 → ipython-9.12.0}/tests/test_module_paths.py +0 -0
  419. {ipython-9.10.0 → ipython-9.12.0}/tests/test_openpy.py +0 -0
  420. {ipython-9.10.0 → ipython-9.12.0}/tests/test_page.py +0 -0
  421. {ipython-9.10.0 → ipython-9.12.0}/tests/test_path.py +0 -0
  422. {ipython-9.10.0 → ipython-9.12.0}/tests/test_paths.py +0 -0
  423. {ipython-9.10.0 → ipython-9.12.0}/tests/test_prefilter.py +0 -0
  424. {ipython-9.10.0 → ipython-9.12.0}/tests/test_process.py +0 -0
  425. {ipython-9.10.0 → ipython-9.12.0}/tests/test_profile.py +0 -0
  426. {ipython-9.10.0 → ipython-9.12.0}/tests/test_pt_inputhooks.py +0 -0
  427. {ipython-9.10.0 → ipython-9.12.0}/tests/test_pycolorize.py +0 -0
  428. {ipython-9.10.0 → ipython-9.12.0}/tests/test_pylabtools.py +0 -0
  429. {ipython-9.10.0 → ipython-9.12.0}/tests/test_qt_loaders.py +0 -0
  430. {ipython-9.10.0 → ipython-9.12.0}/tests/test_run.py +0 -0
  431. {ipython-9.10.0 → ipython-9.12.0}/tests/test_shellapp.py +0 -0
  432. {ipython-9.10.0 → ipython-9.12.0}/tests/test_splitinput.py +0 -0
  433. {ipython-9.10.0 → ipython-9.12.0}/tests/test_storemagic.py +0 -0
  434. {ipython-9.10.0 → ipython-9.12.0}/tests/test_sysinfo.py +0 -0
  435. {ipython-9.10.0 → ipython-9.12.0}/tests/test_tempdir.py +0 -0
  436. {ipython-9.10.0 → ipython-9.12.0}/tests/test_text.py +0 -0
  437. {ipython-9.10.0 → ipython-9.12.0}/tests/test_tips.py +0 -0
  438. {ipython-9.10.0 → ipython-9.12.0}/tests/test_tokenutil.py +0 -0
  439. {ipython-9.10.0 → ipython-9.12.0}/tests/test_tools.py +0 -0
  440. {ipython-9.10.0 → ipython-9.12.0}/tests/test_ultratb.py +0 -0
  441. {ipython-9.10.0 → ipython-9.12.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.
@@ -219,7 +219,7 @@ class AliasManager(Configurable):
219
219
  self.soft_define_alias(name, cmd)
220
220
 
221
221
  @property
222
- def aliases(self):
222
+ def aliases(self) -> list:
223
223
  return [(n, func.cmd) for (n, func) in self.linemagics.items()
224
224
  if isinstance(func, Alias)]
225
225
 
@@ -33,10 +33,11 @@ from traitlets import (
33
33
  )
34
34
 
35
35
  if os.name == "nt":
36
+ # %PROGRAMDATA% is not safe by default, require opt-in to trust it
36
37
  programdata = os.environ.get("PROGRAMDATA", None)
37
- if programdata is not None:
38
+ if os.environ.get("IPYTHON_USE_PROGRAMDATA") == "1" and programdata is not None:
38
39
  SYSTEM_CONFIG_DIRS = [str(Path(programdata) / "ipython")]
39
- else: # PROGRAMDATA is not defined by default on XP.
40
+ else:
40
41
  SYSTEM_CONFIG_DIRS = []
41
42
  else:
42
43
  SYSTEM_CONFIG_DIRS = [
@@ -51,7 +51,7 @@ PyCF_MASK = functools.reduce(operator.or_,
51
51
  # Local utilities
52
52
  #-----------------------------------------------------------------------------
53
53
 
54
- def code_name(code, number=0):
54
+ def code_name(code, number=0) -> str:
55
55
  """ Compute a (probably) unique name for code for caching.
56
56
 
57
57
  This now expects code to be unicode.
@@ -116,7 +116,7 @@ class CachingCompiler(codeop.Compile):
116
116
  """
117
117
  return code_name(transformed_code, number)
118
118
 
119
- def format_code_name(self, name):
119
+ def format_code_name(self, name) -> str:
120
120
  """Return a user-friendly label and name for a code block.
121
121
 
122
122
  Parameters
@@ -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"]
@@ -444,7 +444,7 @@ class Pdb(OldPdb):
444
444
  self.message(
445
445
  f"More than {self.MAX_CHAINED_EXCEPTION_DEPTH}"
446
446
  " chained exceptions found, not all exceptions"
447
- "will be browsable with `exceptions`."
447
+ " will be browsable with `exceptions`."
448
448
  )
449
449
  break
450
450
  else:
@@ -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
@@ -10,6 +10,7 @@ import atexit
10
10
  import datetime
11
11
  import os
12
12
  import re
13
+ import weakref
13
14
 
14
15
 
15
16
  import threading
@@ -39,6 +40,8 @@ from IPython.utils.decorators import undoc
39
40
  from typing import Tuple, Optional, TYPE_CHECKING
40
41
  from collections.abc import Iterable
41
42
  import typing
43
+ import typing as t
44
+ from typing import cast
42
45
  from warnings import warn
43
46
  from weakref import ref, WeakSet
44
47
 
@@ -90,6 +93,9 @@ class DummyDB:
90
93
  def __exit__(self, *args, **kwargs): # type: ignore [no-untyped-def]
91
94
  pass
92
95
 
96
+ def close(self, *args, **kwargs): # type: ignore [no-untyped-def]
97
+ pass
98
+
93
99
 
94
100
  @decorator
95
101
  def only_when_enabled(f, self, *a, **kw): # type: ignore [no-untyped-def]
@@ -317,12 +323,14 @@ class HistoryAccessor(HistoryAccessorBase):
317
323
  """Connect to the database, and create tables if necessary."""
318
324
  if not self.enabled:
319
325
  self.db = DummyDB()
326
+ self._finalizer = weakref.finalize(self, lambda db: db.close(), self.db)
320
327
  return
321
328
 
322
329
  # use detect_types so that timestamps return datetime objects
323
330
  kwargs = dict(detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
324
331
  kwargs.update(self.connection_options)
325
332
  self.db = sqlite3.connect(str(self.hist_file), **kwargs) # type: ignore [call-overload]
333
+ self._finalizer = weakref.finalize(self, lambda db: db.close(), self.db)
326
334
  with self.db:
327
335
  self.db.execute(
328
336
  """CREATE TABLE IF NOT EXISTS sessions (session integer
@@ -1131,7 +1139,7 @@ class HistorySavingThread(threading.Thread):
1131
1139
  if hm() is not None:
1132
1140
  self.db = sqlite3.connect(
1133
1141
  str(hm().hist_file), # type: ignore [union-attr]
1134
- **hm().connection_options, # type: ignore [union-attr]
1142
+ **cast(dict[str, t.Any], hm().connection_options), # type: ignore [union-attr]
1135
1143
  )
1136
1144
  while True:
1137
1145
  self.save_flag.wait()
@@ -50,27 +50,26 @@ class HistoryTrim(BaseIPythonApplication):
50
50
  def start(self):
51
51
  profile_dir = Path(self.profile_dir.location)
52
52
  hist_file = profile_dir / "history.sqlite"
53
- con = sqlite3.connect(hist_file)
54
-
55
- # Grab the recent history from the current database.
56
- inputs = list(con.execute('SELECT session, line, source, source_raw FROM '
57
- 'history ORDER BY session DESC, line DESC LIMIT ?', (self.keep+1,)))
58
- if len(inputs) <= self.keep:
59
- print("There are already at most %d entries in the history database." % self.keep)
60
- print("Not doing anything. Use --keep= argument to keep fewer entries")
61
- return
62
-
63
- print("Trimming history to the most recent %d entries." % self.keep)
64
-
65
- inputs.pop() # Remove the extra element we got to check the length.
66
- inputs.reverse()
67
- if inputs:
68
- first_session = inputs[0][0]
69
- outputs = list(con.execute('SELECT session, line, output FROM '
70
- 'output_history WHERE session >= ?', (first_session,)))
71
- sessions = list(con.execute('SELECT session, start, end, num_cmds, remark FROM '
72
- 'sessions WHERE session >= ?', (first_session,)))
73
- con.close()
53
+ with sqlite3.connect(hist_file) as con:
54
+
55
+ # Grab the recent history from the current database.
56
+ inputs = list(con.execute('SELECT session, line, source, source_raw FROM '
57
+ 'history ORDER BY session DESC, line DESC LIMIT ?', (self.keep+1,)))
58
+ if len(inputs) <= self.keep:
59
+ print("There are already at most %d entries in the history database." % self.keep)
60
+ print("Not doing anything. Use --keep= argument to keep fewer entries")
61
+ return
62
+
63
+ print("Trimming history to the most recent %d entries." % self.keep)
64
+
65
+ inputs.pop() # Remove the extra element we got to check the length.
66
+ inputs.reverse()
67
+ if inputs:
68
+ first_session = inputs[0][0]
69
+ outputs = list(con.execute('SELECT session, line, output FROM '
70
+ 'output_history WHERE session >= ?', (first_session,)))
71
+ sessions = list(con.execute('SELECT session, start, end, num_cmds, remark FROM '
72
+ 'sessions WHERE session >= ?', (first_session,)))
74
73
 
75
74
  # Create the new history database.
76
75
  new_hist_file = profile_dir / "history.sqlite.new"
@@ -79,26 +78,25 @@ class HistoryTrim(BaseIPythonApplication):
79
78
  # Make sure we don't interfere with an existing file.
80
79
  i += 1
81
80
  new_hist_file = profile_dir / ("history.sqlite.new" + str(i))
82
- new_db = sqlite3.connect(new_hist_file)
83
- new_db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
84
- primary key autoincrement, start timestamp,
85
- end timestamp, num_cmds integer, remark text)""")
86
- new_db.execute("""CREATE TABLE IF NOT EXISTS history
87
- (session integer, line integer, source text, source_raw text,
88
- PRIMARY KEY (session, line))""")
89
- new_db.execute("""CREATE TABLE IF NOT EXISTS output_history
90
- (session integer, line integer, output text,
91
- PRIMARY KEY (session, line))""")
92
- new_db.commit()
93
-
94
-
95
- if inputs:
96
- with new_db:
97
- # Add the recent history into the new database.
98
- new_db.executemany('insert into sessions values (?,?,?,?,?)', sessions)
99
- new_db.executemany('insert into history values (?,?,?,?)', inputs)
100
- new_db.executemany('insert into output_history values (?,?,?)', outputs)
101
- new_db.close()
81
+ with sqlite3.connect(new_hist_file) as new_db:
82
+ new_db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
83
+ primary key autoincrement, start timestamp,
84
+ end timestamp, num_cmds integer, remark text)""")
85
+ new_db.execute("""CREATE TABLE IF NOT EXISTS history
86
+ (session integer, line integer, source text, source_raw text,
87
+ PRIMARY KEY (session, line))""")
88
+ new_db.execute("""CREATE TABLE IF NOT EXISTS output_history
89
+ (session integer, line integer, output text,
90
+ PRIMARY KEY (session, line))""")
91
+ new_db.commit()
92
+
93
+
94
+ if inputs:
95
+ with new_db:
96
+ # Add the recent history into the new database.
97
+ new_db.executemany('insert into sessions values (?,?,?,?,?)', sessions)
98
+ new_db.executemany('insert into history values (?,?,?,?)', inputs)
99
+ new_db.executemany('insert into output_history values (?,?,?)', outputs)
102
100
 
103
101
  if self.backup:
104
102
  i = 1
@@ -356,24 +356,8 @@ class MagicAssign(TokenTransformBase):
356
356
  class SystemAssign(TokenTransformBase):
357
357
  """Transformer for assignments from system commands (a = !foo)"""
358
358
  @classmethod
359
- def find_pre_312(cls, tokens_by_line):
360
- for line in tokens_by_line:
361
- assign_ix = _find_assign_op(line)
362
- if (assign_ix is not None) \
363
- and not line[assign_ix].line.strip().startswith('=') \
364
- and (len(line) >= assign_ix + 2) \
365
- and (line[assign_ix + 1].type == tokenize.ERRORTOKEN):
366
- ix = assign_ix + 1
367
-
368
- while ix < len(line) and line[ix].type == tokenize.ERRORTOKEN:
369
- if line[ix].string == '!':
370
- return cls(line[ix].start)
371
- elif not line[ix].string.isspace():
372
- break
373
- ix += 1
374
-
375
- @classmethod
376
- 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."""
377
361
  for line in tokens_by_line:
378
362
  assign_ix = _find_assign_op(line)
379
363
  if (
@@ -385,13 +369,6 @@ class SystemAssign(TokenTransformBase):
385
369
  ):
386
370
  return cls(line[assign_ix + 1].start)
387
371
 
388
- @classmethod
389
- def find(cls, tokens_by_line):
390
- """Find the first system assignment (a = !foo) in the cell."""
391
- if sys.version_info < (3, 12):
392
- return cls.find_pre_312(tokens_by_line)
393
- return cls.find_post_312(tokens_by_line)
394
-
395
372
  def transform(self, lines: List[str]):
396
373
  """Transform a system assignment found by the ``find()`` classmethod.
397
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
  #-------------------------------------------------------------------------