ipython 8.23.0__tar.gz → 8.24.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 (497) hide show
  1. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/debugger.py +38 -48
  2. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/display_functions.py +1 -1
  3. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/excolors.py +20 -3
  4. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/interactiveshell.py +8 -1
  5. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/pylab.py +10 -6
  6. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/pylabtools.py +106 -21
  7. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/release.py +1 -1
  8. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/shellapp.py +65 -25
  9. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_pylabtools.py +93 -9
  10. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/embed.py +1 -1
  11. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/interactiveshell.py +11 -5
  12. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_sysinfo.py +1 -1
  13. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/coloransi.py +28 -3
  14. {ipython-8.23.0/ipython.egg-info → ipython-8.24.0}/PKG-INFO +3 -3
  15. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version0.11.rst +1 -1
  16. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version8.rst +32 -1
  17. {ipython-8.23.0 → ipython-8.24.0/ipython.egg-info}/PKG-INFO +3 -3
  18. {ipython-8.23.0 → ipython-8.24.0}/ipython.egg-info/SOURCES.txt +0 -1
  19. {ipython-8.23.0 → ipython-8.24.0}/ipython.egg-info/requires.txt +2 -2
  20. {ipython-8.23.0 → ipython-8.24.0}/pyproject.toml +2 -2
  21. ipython-8.23.0/docs/source/development/parallel_messages.rst +0 -8
  22. {ipython-8.23.0 → ipython-8.24.0}/.flake8 +0 -0
  23. {ipython-8.23.0 → ipython-8.24.0}/.mailmap +0 -0
  24. {ipython-8.23.0 → ipython-8.24.0}/.pre-commit-config.yaml +0 -0
  25. {ipython-8.23.0 → ipython-8.24.0}/COPYING.rst +0 -0
  26. {ipython-8.23.0 → ipython-8.24.0}/IPython/__init__.py +0 -0
  27. {ipython-8.23.0 → ipython-8.24.0}/IPython/__main__.py +0 -0
  28. {ipython-8.23.0 → ipython-8.24.0}/IPython/conftest.py +0 -0
  29. {ipython-8.23.0 → ipython-8.24.0}/IPython/consoleapp.py +0 -0
  30. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/__init__.py +0 -0
  31. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/alias.py +0 -0
  32. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/application.py +0 -0
  33. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/async_helpers.py +0 -0
  34. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/autocall.py +0 -0
  35. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/builtin_trap.py +0 -0
  36. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/compilerop.py +0 -0
  37. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/completer.py +0 -0
  38. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/completerlib.py +0 -0
  39. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/crashhandler.py +0 -0
  40. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/display.py +0 -0
  41. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/display_trap.py +0 -0
  42. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/displayhook.py +0 -0
  43. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/displaypub.py +0 -0
  44. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/error.py +0 -0
  45. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/events.py +0 -0
  46. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/extensions.py +0 -0
  47. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/formatters.py +0 -0
  48. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/getipython.py +0 -0
  49. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/guarded_eval.py +0 -0
  50. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/history.py +0 -0
  51. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/historyapp.py +0 -0
  52. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/hooks.py +0 -0
  53. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/inputsplitter.py +0 -0
  54. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/inputtransformer.py +0 -0
  55. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/inputtransformer2.py +0 -0
  56. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/latex_symbols.py +0 -0
  57. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/logger.py +0 -0
  58. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/macro.py +0 -0
  59. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magic.py +0 -0
  60. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magic_arguments.py +0 -0
  61. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/__init__.py +0 -0
  62. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/ast_mod.py +0 -0
  63. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/auto.py +0 -0
  64. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/basic.py +0 -0
  65. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/code.py +0 -0
  66. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/config.py +0 -0
  67. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/display.py +0 -0
  68. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/execution.py +0 -0
  69. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/extension.py +0 -0
  70. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/history.py +0 -0
  71. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/logging.py +0 -0
  72. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/namespace.py +0 -0
  73. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/osm.py +0 -0
  74. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/packaging.py +0 -0
  75. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/magics/script.py +0 -0
  76. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/oinspect.py +0 -0
  77. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/page.py +0 -0
  78. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/payload.py +0 -0
  79. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/payloadpage.py +0 -0
  80. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/prefilter.py +0 -0
  81. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/profile/README_STARTUP +0 -0
  82. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/profileapp.py +0 -0
  83. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/profiledir.py +0 -0
  84. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/prompts.py +0 -0
  85. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/splitinput.py +0 -0
  86. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/2x2.jpg +0 -0
  87. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/2x2.png +0 -0
  88. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/__init__.py +0 -0
  89. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/bad_all.py +0 -0
  90. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
  91. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/nonascii.py +0 -0
  92. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/nonascii2.py +0 -0
  93. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/print_argv.py +0 -0
  94. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/refbug.py +0 -0
  95. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/simpleerr.py +0 -0
  96. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/tclass.py +0 -0
  97. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_alias.py +0 -0
  98. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_application.py +0 -0
  99. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_async_helpers.py +0 -0
  100. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_autocall.py +0 -0
  101. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_compilerop.py +0 -0
  102. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_completer.py +0 -0
  103. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_completerlib.py +0 -0
  104. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_debugger.py +0 -0
  105. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_display.py +0 -0
  106. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_displayhook.py +0 -0
  107. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_events.py +0 -0
  108. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
  109. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_extension.py +0 -0
  110. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_formatters.py +0 -0
  111. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_guarded_eval.py +0 -0
  112. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_handlers.py +0 -0
  113. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_history.py +0 -0
  114. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_hooks.py +0 -0
  115. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_imports.py +0 -0
  116. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_inputsplitter.py +0 -0
  117. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_inputtransformer.py +0 -0
  118. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
  119. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
  120. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_interactiveshell.py +0 -0
  121. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_iplib.py +0 -0
  122. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_logger.py +0 -0
  123. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_magic.py +0 -0
  124. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_magic_arguments.py +0 -0
  125. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_magic_terminal.py +0 -0
  126. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_oinspect.py +0 -0
  127. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_page.py +0 -0
  128. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_paths.py +0 -0
  129. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_prefilter.py +0 -0
  130. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_profile.py +0 -0
  131. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_prompts.py +0 -0
  132. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_run.py +0 -0
  133. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_shellapp.py +0 -0
  134. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_splitinput.py +0 -0
  135. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/tests/test_ultratb.py +0 -0
  136. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/ultratb.py +0 -0
  137. {ipython-8.23.0 → ipython-8.24.0}/IPython/core/usage.py +0 -0
  138. {ipython-8.23.0 → ipython-8.24.0}/IPython/display.py +0 -0
  139. {ipython-8.23.0 → ipython-8.24.0}/IPython/extensions/__init__.py +0 -0
  140. {ipython-8.23.0 → ipython-8.24.0}/IPython/extensions/autoreload.py +0 -0
  141. {ipython-8.23.0 → ipython-8.24.0}/IPython/extensions/storemagic.py +0 -0
  142. {ipython-8.23.0 → ipython-8.24.0}/IPython/extensions/tests/__init__.py +0 -0
  143. {ipython-8.23.0 → ipython-8.24.0}/IPython/extensions/tests/test_autoreload.py +0 -0
  144. {ipython-8.23.0 → ipython-8.24.0}/IPython/extensions/tests/test_storemagic.py +0 -0
  145. {ipython-8.23.0 → ipython-8.24.0}/IPython/external/__init__.py +0 -0
  146. {ipython-8.23.0 → ipython-8.24.0}/IPython/external/qt_for_kernel.py +0 -0
  147. {ipython-8.23.0 → ipython-8.24.0}/IPython/external/qt_loaders.py +0 -0
  148. {ipython-8.23.0 → ipython-8.24.0}/IPython/external/tests/__init__.py +0 -0
  149. {ipython-8.23.0 → ipython-8.24.0}/IPython/external/tests/test_qt_loaders.py +0 -0
  150. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/__init__.py +0 -0
  151. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/backgroundjobs.py +0 -0
  152. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/clipboard.py +0 -0
  153. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/deepreload.py +0 -0
  154. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/demo.py +0 -0
  155. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/display.py +0 -0
  156. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/editorhooks.py +0 -0
  157. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/guisupport.py +0 -0
  158. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/latextools.py +0 -0
  159. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/lexers.py +0 -0
  160. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/pretty.py +0 -0
  161. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/__init__.py +0 -0
  162. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test.wav +0 -0
  163. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
  164. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_clipboard.py +0 -0
  165. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_deepreload.py +0 -0
  166. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_display.py +0 -0
  167. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_editorhooks.py +0 -0
  168. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_imports.py +0 -0
  169. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_latextools.py +0 -0
  170. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_lexers.py +0 -0
  171. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_pretty.py +0 -0
  172. {ipython-8.23.0 → ipython-8.24.0}/IPython/lib/tests/test_pygments.py +0 -0
  173. {ipython-8.23.0 → ipython-8.24.0}/IPython/paths.py +0 -0
  174. {ipython-8.23.0 → ipython-8.24.0}/IPython/py.typed +0 -0
  175. {ipython-8.23.0 → ipython-8.24.0}/IPython/sphinxext/__init__.py +0 -0
  176. {ipython-8.23.0 → ipython-8.24.0}/IPython/sphinxext/custom_doctests.py +0 -0
  177. {ipython-8.23.0 → ipython-8.24.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  178. {ipython-8.23.0 → ipython-8.24.0}/IPython/sphinxext/ipython_directive.py +0 -0
  179. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/__init__.py +0 -0
  180. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/console.py +0 -0
  181. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/debugger.py +0 -0
  182. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/ipapp.py +0 -0
  183. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/magics.py +0 -0
  184. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/prompts.py +0 -0
  185. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  186. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  187. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  188. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  189. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  190. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  191. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  192. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  193. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  194. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  195. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  196. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/ptutils.py +0 -0
  197. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  198. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  199. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  200. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/shortcuts/filters.py +0 -0
  201. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/__init__.py +0 -0
  202. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
  203. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/test_embed.py +0 -0
  204. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/test_help.py +0 -0
  205. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
  206. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
  207. {ipython-8.23.0 → ipython-8.24.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
  208. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/__init__.py +0 -0
  209. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/decorators.py +0 -0
  210. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/globalipapp.py +0 -0
  211. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/ipunittest.py +0 -0
  212. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/Makefile +0 -0
  213. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/README.txt +0 -0
  214. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/__init__.py +0 -0
  215. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/dtexample.py +0 -0
  216. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  217. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  218. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/setup.py +0 -0
  219. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/simple.py +0 -0
  220. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/simplevars.py +0 -0
  221. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/test_combo.txt +0 -0
  222. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/test_example.txt +0 -0
  223. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  224. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  225. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/plugin/test_refs.py +0 -0
  226. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/skipdoctest.py +0 -0
  227. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/tests/__init__.py +0 -0
  228. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/tests/test_decorators.py +0 -0
  229. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/tests/test_ipunittest.py +0 -0
  230. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/tests/test_tools.py +0 -0
  231. {ipython-8.23.0 → ipython-8.24.0}/IPython/testing/tools.py +0 -0
  232. {ipython-8.23.0 → ipython-8.24.0}/IPython/tests/cve.py +0 -0
  233. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/PyColorize.py +0 -0
  234. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/__init__.py +0 -0
  235. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_process_cli.py +0 -0
  236. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_process_common.py +0 -0
  237. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_process_emscripten.py +0 -0
  238. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_process_posix.py +0 -0
  239. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_process_win32.py +0 -0
  240. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/_process_win32_controller.py +0 -0
  241. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/capture.py +0 -0
  242. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/colorable.py +0 -0
  243. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/contexts.py +0 -0
  244. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/daemonize.py +0 -0
  245. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/data.py +0 -0
  246. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/decorators.py +0 -0
  247. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/dir2.py +0 -0
  248. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/docs.py +0 -0
  249. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/encoding.py +0 -0
  250. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/eventful.py +0 -0
  251. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/frame.py +0 -0
  252. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/generics.py +0 -0
  253. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/importstring.py +0 -0
  254. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/io.py +0 -0
  255. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/ipstruct.py +0 -0
  256. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/jsonutil.py +0 -0
  257. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/localinterfaces.py +0 -0
  258. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/log.py +0 -0
  259. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/module_paths.py +0 -0
  260. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/openpy.py +0 -0
  261. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/path.py +0 -0
  262. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/process.py +0 -0
  263. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/py3compat.py +0 -0
  264. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/sentinel.py +0 -0
  265. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/shimmodule.py +0 -0
  266. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/signatures.py +0 -0
  267. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/strdispatch.py +0 -0
  268. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/sysinfo.py +0 -0
  269. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/syspathcontext.py +0 -0
  270. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tempdir.py +0 -0
  271. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/terminal.py +0 -0
  272. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/__init__.py +0 -0
  273. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_capture.py +0 -0
  274. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_decorators.py +0 -0
  275. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_deprecated.py +0 -0
  276. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_dir2.py +0 -0
  277. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_imports.py +0 -0
  278. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_importstring.py +0 -0
  279. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_io.py +0 -0
  280. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_module_paths.py +0 -0
  281. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_openpy.py +0 -0
  282. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_path.py +0 -0
  283. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_process.py +0 -0
  284. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_pycolorize.py +0 -0
  285. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_shimmodule.py +0 -0
  286. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_sysinfo.py +0 -0
  287. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_tempdir.py +0 -0
  288. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_text.py +0 -0
  289. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_tokenutil.py +0 -0
  290. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tests/test_wildcard.py +0 -0
  291. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/text.py +0 -0
  292. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/timing.py +0 -0
  293. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tokenutil.py +0 -0
  294. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/traitlets.py +0 -0
  295. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/tz.py +0 -0
  296. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/ulinecache.py +0 -0
  297. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/version.py +0 -0
  298. {ipython-8.23.0 → ipython-8.24.0}/IPython/utils/wildcard.py +0 -0
  299. {ipython-8.23.0 → ipython-8.24.0}/LICENSE +0 -0
  300. {ipython-8.23.0 → ipython-8.24.0}/MANIFEST.in +0 -0
  301. {ipython-8.23.0 → ipython-8.24.0}/README.rst +0 -0
  302. {ipython-8.23.0 → ipython-8.24.0}/_build_meta.py +0 -0
  303. {ipython-8.23.0 → ipython-8.24.0}/docs/Makefile +0 -0
  304. {ipython-8.23.0 → ipython-8.24.0}/docs/README.rst +0 -0
  305. {ipython-8.23.0 → ipython-8.24.0}/docs/autogen_api.py +0 -0
  306. {ipython-8.23.0 → ipython-8.24.0}/docs/autogen_config.py +0 -0
  307. {ipython-8.23.0 → ipython-8.24.0}/docs/autogen_magics.py +0 -0
  308. {ipython-8.23.0 → ipython-8.24.0}/docs/autogen_shortcuts.py +0 -0
  309. {ipython-8.23.0 → ipython-8.24.0}/docs/make.cmd +0 -0
  310. {ipython-8.23.0 → ipython-8.24.0}/docs/man/ipython.1 +0 -0
  311. {ipython-8.23.0 → ipython-8.24.0}/docs/requirements.txt +0 -0
  312. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/2.0/running-crop.png +0 -0
  313. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/2.0/running.png +0 -0
  314. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/2.0/treeview.png +0 -0
  315. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/2.0/user-interface.png +0 -0
  316. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/2.0/widgets.png +0 -0
  317. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  318. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  319. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  320. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  321. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  322. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  323. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  324. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  325. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  326. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  327. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  328. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/autosuggest.gif +0 -0
  329. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  330. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  331. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  332. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  333. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  334. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  335. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  336. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  337. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  338. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  339. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  340. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  341. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  342. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  343. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  344. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ms_visual_studio.png +0 -0
  345. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/notebook_specgram.png +0 -0
  346. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/ptshell_features.png +0 -0
  347. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/qtconsole.png +0 -0
  348. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  349. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_images/unicode_completion.png +0 -0
  350. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_static/favicon.ico +0 -0
  351. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_static/logo.png +0 -0
  352. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_static/theme_overrides.css +0 -0
  353. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_templates/breadcrumbs.html +0 -0
  354. {ipython-8.23.0 → ipython-8.24.0}/docs/source/_templates/notebook_redirect.html +0 -0
  355. {ipython-8.23.0 → ipython-8.24.0}/docs/source/about/history.rst +0 -0
  356. {ipython-8.23.0 → ipython-8.24.0}/docs/source/about/index.rst +0 -0
  357. {ipython-8.23.0 → ipython-8.24.0}/docs/source/about/license_and_copyright.rst +0 -0
  358. {ipython-8.23.0 → ipython-8.24.0}/docs/source/api/index.rst +0 -0
  359. {ipython-8.23.0 → ipython-8.24.0}/docs/source/conf.py +0 -0
  360. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/callbacks.rst +0 -0
  361. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/custommagics.rst +0 -0
  362. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/details.rst +0 -0
  363. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/eventloops.rst +0 -0
  364. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/extensions/autoreload.rst +0 -0
  365. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/extensions/index.rst +0 -0
  366. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/extensions/storemagic.rst +0 -0
  367. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/index.rst +0 -0
  368. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/inputtransforms.rst +0 -0
  369. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/integrating.rst +0 -0
  370. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/intro.rst +0 -0
  371. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/options/index.rst +0 -0
  372. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  373. {ipython-8.23.0 → ipython-8.24.0}/docs/source/config/shortcuts/index.rst +0 -0
  374. {ipython-8.23.0 → ipython-8.24.0}/docs/source/coredev/index.rst +0 -0
  375. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/config.rst +0 -0
  376. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/execution.rst +0 -0
  377. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  378. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  379. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/figs/other_kernels.png +0 -0
  380. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/figs/other_kernels.svg +0 -0
  381. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/how_ipython_works.rst +0 -0
  382. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/index.rst +0 -0
  383. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/inputhook_app.rst +0 -0
  384. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/kernels.rst +0 -0
  385. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/lexer.rst +0 -0
  386. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/messaging.rst +0 -0
  387. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/pycompat.rst +0 -0
  388. {ipython-8.23.0 → ipython-8.24.0}/docs/source/development/wrapperkernels.rst +0 -0
  389. {ipython-8.23.0 → ipython-8.24.0}/docs/source/index.rst +0 -0
  390. {ipython-8.23.0 → ipython-8.24.0}/docs/source/install/index.rst +0 -0
  391. {ipython-8.23.0 → ipython-8.24.0}/docs/source/install/install.rst +0 -0
  392. {ipython-8.23.0 → ipython-8.24.0}/docs/source/install/kernel_install.rst +0 -0
  393. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/autoawait.rst +0 -0
  394. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/figs/besselj.png +0 -0
  395. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/figs/colors_dark.png +0 -0
  396. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/figs/jn.html +0 -0
  397. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/figs/jn.xhtml +0 -0
  398. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/index.rst +0 -0
  399. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/magics.rst +0 -0
  400. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/plotting.rst +0 -0
  401. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  402. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/reference.rst +0 -0
  403. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/shell.rst +0 -0
  404. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/tips.rst +0 -0
  405. {ipython-8.23.0 → ipython-8.24.0}/docs/source/interactive/tutorial.rst +0 -0
  406. {ipython-8.23.0 → ipython-8.24.0}/docs/source/links.txt +0 -0
  407. {ipython-8.23.0 → ipython-8.24.0}/docs/source/overview.rst +0 -0
  408. {ipython-8.23.0 → ipython-8.24.0}/docs/source/parallel/index.rst +0 -0
  409. {ipython-8.23.0 → ipython-8.24.0}/docs/source/sphinxext.rst +0 -0
  410. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/development.rst +0 -0
  411. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  412. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  413. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  414. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  415. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  416. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  417. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  418. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  419. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  420. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  421. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  422. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/index.rst +0 -0
  423. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/pr/README.md +0 -0
  424. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  425. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  426. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version0.10.rst +0 -0
  427. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version0.12.rst +0 -0
  428. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version0.13.rst +0 -0
  429. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version0.8.rst +0 -0
  430. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version0.9.rst +0 -0
  431. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version1.0.rst +0 -0
  432. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version2.0.rst +0 -0
  433. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version3.rst +0 -0
  434. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  435. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version4.rst +0 -0
  436. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version5.rst +0 -0
  437. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version6.rst +0 -0
  438. {ipython-8.23.0 → ipython-8.24.0}/docs/source/whatsnew/version7.rst +0 -0
  439. {ipython-8.23.0 → ipython-8.24.0}/docs/sphinxext/apigen.py +0 -0
  440. {ipython-8.23.0 → ipython-8.24.0}/docs/sphinxext/configtraits.py +0 -0
  441. {ipython-8.23.0 → ipython-8.24.0}/docs/sphinxext/github.py +0 -0
  442. {ipython-8.23.0 → ipython-8.24.0}/docs/sphinxext/magics.py +0 -0
  443. {ipython-8.23.0 → ipython-8.24.0}/examples/Embedding/Index.ipynb +0 -0
  444. {ipython-8.23.0 → ipython-8.24.0}/examples/Embedding/embed_class_long.py +0 -0
  445. {ipython-8.23.0 → ipython-8.24.0}/examples/Embedding/embed_class_short.py +0 -0
  446. {ipython-8.23.0 → ipython-8.24.0}/examples/Embedding/embed_function.py +0 -0
  447. {ipython-8.23.0 → ipython-8.24.0}/examples/Embedding/start_ipython_config.py +0 -0
  448. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
  449. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
  450. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
  451. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
  452. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
  453. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
  454. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
  455. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Index.ipynb +0 -0
  456. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
  457. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
  458. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
  459. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
  460. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
  461. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
  462. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
  463. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
  464. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
  465. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
  466. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/data/flare.json +0 -0
  467. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/example-demo.py +0 -0
  468. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  469. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  470. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  471. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  472. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  473. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/ipython.desktop +0 -0
  474. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
  475. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
  476. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
  477. {ipython-8.23.0 → ipython-8.24.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
  478. {ipython-8.23.0 → ipython-8.24.0}/examples/Index.ipynb +0 -0
  479. {ipython-8.23.0 → ipython-8.24.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
  480. {ipython-8.23.0 → ipython-8.24.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
  481. {ipython-8.23.0 → ipython-8.24.0}/examples/images/FrontendKernel.png +0 -0
  482. {ipython-8.23.0 → ipython-8.24.0}/examples/images/animation.m4v +0 -0
  483. {ipython-8.23.0 → ipython-8.24.0}/examples/images/ipython_logo.png +0 -0
  484. {ipython-8.23.0 → ipython-8.24.0}/examples/images/python_logo.svg +0 -0
  485. {ipython-8.23.0 → ipython-8.24.0}/examples/utils/cwd_prompt.py +0 -0
  486. {ipython-8.23.0 → ipython-8.24.0}/examples/utils/list_pyfiles.ipy +0 -0
  487. {ipython-8.23.0 → ipython-8.24.0}/examples/utils/list_subdirs.ipy +0 -0
  488. {ipython-8.23.0 → ipython-8.24.0}/ipython.egg-info/dependency_links.txt +0 -0
  489. {ipython-8.23.0 → ipython-8.24.0}/ipython.egg-info/entry_points.txt +0 -0
  490. {ipython-8.23.0 → ipython-8.24.0}/ipython.egg-info/not-zip-safe +0 -0
  491. {ipython-8.23.0 → ipython-8.24.0}/ipython.egg-info/top_level.txt +0 -0
  492. {ipython-8.23.0 → ipython-8.24.0}/long_description.rst +0 -0
  493. {ipython-8.23.0 → ipython-8.24.0}/scripts/ipython.ico +0 -0
  494. {ipython-8.23.0 → ipython-8.24.0}/scripts/ipython_nb.ico +0 -0
  495. {ipython-8.23.0 → ipython-8.24.0}/setup.cfg +0 -0
  496. {ipython-8.23.0 → ipython-8.24.0}/setup.py +0 -0
  497. {ipython-8.23.0 → ipython-8.24.0}/setupbase.py +0 -0
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  Pdb debugger class.
4
3
 
@@ -101,17 +100,25 @@ All the changes since then are under the same license as IPython.
101
100
  #
102
101
  #*****************************************************************************
103
102
 
103
+ from __future__ import annotations
104
+
104
105
  import inspect
105
106
  import linecache
106
- import sys
107
- import re
108
107
  import os
108
+ import re
109
+ import sys
110
+ from contextlib import contextmanager
111
+ from functools import lru_cache
109
112
 
110
113
  from IPython import get_ipython
111
- from contextlib import contextmanager
112
- from IPython.utils import PyColorize
113
- from IPython.utils import coloransi, py3compat
114
114
  from IPython.core.excolors import exception_colors
115
+ from IPython.utils import PyColorize, coloransi, py3compat
116
+
117
+ from typing import TYPE_CHECKING
118
+
119
+ if TYPE_CHECKING:
120
+ # otherwise circular import
121
+ from IPython.core.interactiveshell import InteractiveShell
115
122
 
116
123
  # skip module docstests
117
124
  __skip_doctest__ = True
@@ -149,16 +156,10 @@ def BdbQuit_excepthook(et, ev, tb, excepthook=None):
149
156
  parameter.
150
157
  """
151
158
  raise ValueError(
152
- "`BdbQuit_excepthook` is deprecated since version 5.1",
159
+ "`BdbQuit_excepthook` is deprecated since version 5.1. It is still arround only because it is still imported by ipdb.",
153
160
  )
154
161
 
155
162
 
156
- def BdbQuit_IPython_excepthook(self, et, ev, tb, tb_offset=None):
157
- raise ValueError(
158
- "`BdbQuit_IPython_excepthook` is deprecated since version 5.1",
159
- DeprecationWarning, stacklevel=2)
160
-
161
-
162
163
  RGX_EXTRA_INDENT = re.compile(r'(?<=\n)\s+')
163
164
 
164
165
 
@@ -191,6 +192,8 @@ class Pdb(OldPdb):
191
192
 
192
193
  """
193
194
 
195
+ shell: InteractiveShell
196
+
194
197
  if CHAIN_EXCEPTIONS:
195
198
  MAX_CHAINED_EXCEPTION_DEPTH = 999
196
199
 
@@ -261,21 +264,6 @@ class Pdb(OldPdb):
261
264
  C = coloransi.TermColors
262
265
  cst = self.color_scheme_table
263
266
 
264
- cst['NoColor'].colors.prompt = C.NoColor
265
- cst['NoColor'].colors.breakpoint_enabled = C.NoColor
266
- cst['NoColor'].colors.breakpoint_disabled = C.NoColor
267
-
268
- cst['Linux'].colors.prompt = C.Green
269
- cst['Linux'].colors.breakpoint_enabled = C.LightRed
270
- cst['Linux'].colors.breakpoint_disabled = C.Red
271
-
272
- cst['LightBG'].colors.prompt = C.Blue
273
- cst['LightBG'].colors.breakpoint_enabled = C.LightRed
274
- cst['LightBG'].colors.breakpoint_disabled = C.Red
275
-
276
- cst['Neutral'].colors.prompt = C.Blue
277
- cst['Neutral'].colors.breakpoint_enabled = C.LightRed
278
- cst['Neutral'].colors.breakpoint_disabled = C.Red
279
267
 
280
268
  # Add a python parser so we can syntax highlight source while
281
269
  # debugging.
@@ -471,24 +459,11 @@ class Pdb(OldPdb):
471
459
 
472
460
  return line
473
461
 
474
- def new_do_frame(self, arg):
475
- OldPdb.do_frame(self, arg)
476
-
477
462
  def new_do_quit(self, arg):
478
-
479
- if hasattr(self, 'old_all_completions'):
480
- self.shell.Completer.all_completions = self.old_all_completions
481
-
482
463
  return OldPdb.do_quit(self, arg)
483
464
 
484
465
  do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
485
466
 
486
- def new_do_restart(self, arg):
487
- """Restart command. In the context of ipython this is exactly the same
488
- thing as 'quit'."""
489
- self.msg("Restart doesn't make sense here. Using 'quit' instead.")
490
- return self.do_quit(arg)
491
-
492
467
  def print_stack_trace(self, context=None):
493
468
  Colors = self.color_scheme_table.active_colors
494
469
  ColorsNormal = Colors.Normal
@@ -941,22 +916,37 @@ class Pdb(OldPdb):
941
916
  Utility to tell us whether we are in a decorator internal and should stop.
942
917
 
943
918
  """
944
-
945
919
  # if we are disabled don't skip
946
920
  if not self._predicates["debuggerskip"]:
947
921
  return False
948
922
 
923
+ return self._cachable_skip(frame)
924
+
925
+ @lru_cache(1024)
926
+ def _cached_one_parent_frame_debuggerskip(self, frame):
927
+ """
928
+ Cache looking up for DEBUGGERSKIP on parent frame.
929
+
930
+ This should speedup walking through deep frame when one of the highest
931
+ one does have a debugger skip.
932
+
933
+ This is likely to introduce fake positive though.
934
+ """
935
+ while getattr(frame, "f_back", None):
936
+ frame = frame.f_back
937
+ if self._get_frame_locals(frame).get(DEBUGGERSKIP):
938
+ return True
939
+ return None
940
+
941
+ @lru_cache(1024)
942
+ def _cachable_skip(self, frame):
949
943
  # if frame is tagged, skip by default.
950
944
  if DEBUGGERSKIP in frame.f_code.co_varnames:
951
945
  return True
952
946
 
953
947
  # if one of the parent frame value set to True skip as well.
954
-
955
- cframe = frame
956
- while getattr(cframe, "f_back", None):
957
- cframe = cframe.f_back
958
- if self._get_frame_locals(cframe).get(DEBUGGERSKIP):
959
- return True
948
+ if self._cached_one_parent_frame_debuggerskip(frame):
949
+ return True
960
950
 
961
951
  return False
962
952
 
@@ -111,7 +111,7 @@ def display(
111
111
  display_id=None,
112
112
  raw=False,
113
113
  clear=False,
114
- **kwargs
114
+ **kwargs,
115
115
  ):
116
116
  """Display a Python object in all frontends.
117
117
 
@@ -34,9 +34,10 @@ def exception_colors():
34
34
  >>> ec.active_scheme_name
35
35
  'NoColor'
36
36
  >>> sorted(ec.active_colors.keys())
37
- ['Normal', 'caret', 'em', 'excName', 'filename', 'filenameEm', 'line',
38
- 'lineno', 'linenoEm', 'name', 'nameEm', 'normalEm', 'topline', 'vName',
39
- 'val', 'valEm']
37
+ ['Normal', 'breakpoint_disabled', 'breakpoint_enabled', 'caret', 'em',
38
+ 'excName', 'filename', 'filenameEm', 'line', 'lineno', 'linenoEm', 'name',
39
+ 'nameEm', 'normalEm', 'prompt', 'topline', 'vName', 'val', 'valEm']
40
+
40
41
  """
41
42
 
42
43
  ex_colors = ColorSchemeTable()
@@ -70,6 +71,10 @@ def exception_colors():
70
71
  "line": C.NoColor,
71
72
  "caret": C.NoColor,
72
73
  "Normal": C.NoColor,
74
+ # debugger
75
+ "prompt": C.NoColor,
76
+ "breakpoint_enabled": C.NoColor,
77
+ "breakpoint_disabled": C.NoColor,
73
78
  },
74
79
  )
75
80
  )
@@ -99,6 +104,10 @@ def exception_colors():
99
104
  "line": C.Yellow,
100
105
  "caret": C.White,
101
106
  "Normal": C.Normal,
107
+ # debugger
108
+ "prompt": C.Green,
109
+ "breakpoint_enabled": C.LightRed,
110
+ "breakpoint_disabled": C.Red,
102
111
  },
103
112
  )
104
113
  )
@@ -132,6 +141,10 @@ def exception_colors():
132
141
  "line": C.Red,
133
142
  "caret": C.Normal,
134
143
  "Normal": C.Normal,
144
+ # debugger
145
+ "prompt": C.Blue,
146
+ "breakpoint_enabled": C.LightRed,
147
+ "breakpoint_disabled": C.Red,
135
148
  },
136
149
  )
137
150
  )
@@ -161,6 +174,10 @@ def exception_colors():
161
174
  "line": C.Red,
162
175
  "caret": C.Normal,
163
176
  "Normal": C.Normal,
177
+ # debugger
178
+ "prompt": C.Blue,
179
+ "breakpoint_enabled": C.LightRed,
180
+ "breakpoint_disabled": C.Red,
164
181
  },
165
182
  )
166
183
  )
@@ -3654,10 +3654,17 @@ class InteractiveShell(SingletonConfigurable):
3654
3654
  make sense in all contexts, for example a terminal ipython can't
3655
3655
  display figures inline.
3656
3656
  """
3657
+ from .pylabtools import _matplotlib_manages_backends
3658
+
3659
+ if not _matplotlib_manages_backends() and gui in (None, "auto"):
3660
+ # Early import of backend_inline required for its side effect of
3661
+ # calling _enable_matplotlib_integration()
3662
+ import matplotlib_inline.backend_inline
3663
+
3657
3664
  from IPython.core import pylabtools as pt
3658
3665
  gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3659
3666
 
3660
- if gui != 'inline':
3667
+ if gui != None:
3661
3668
  # If we have our first gui selection, store it
3662
3669
  if self.pylab_gui_select is None:
3663
3670
  self.pylab_gui_select = gui
@@ -18,19 +18,19 @@ from IPython.core import magic_arguments
18
18
  from IPython.core.magic import Magics, magics_class, line_magic
19
19
  from IPython.testing.skipdoctest import skip_doctest
20
20
  from warnings import warn
21
- from IPython.core.pylabtools import backends
22
21
 
23
22
  #-----------------------------------------------------------------------------
24
23
  # Magic implementation classes
25
24
  #-----------------------------------------------------------------------------
26
25
 
27
26
  magic_gui_arg = magic_arguments.argument(
28
- 'gui', nargs='?',
29
- help="""Name of the matplotlib backend to use %s.
27
+ "gui",
28
+ nargs="?",
29
+ help="""Name of the matplotlib backend to use such as 'qt' or 'widget'.
30
30
  If given, the corresponding matplotlib backend is used,
31
31
  otherwise it will be matplotlib's default
32
32
  (which you can set in your matplotlib config file).
33
- """ % str(tuple(sorted(backends.keys())))
33
+ """,
34
34
  )
35
35
 
36
36
 
@@ -93,8 +93,12 @@ class PylabMagics(Magics):
93
93
  """
94
94
  args = magic_arguments.parse_argstring(self.matplotlib, line)
95
95
  if args.list:
96
- backends_list = list(backends.keys())
97
- print("Available matplotlib backends: %s" % backends_list)
96
+ from IPython.core.pylabtools import _list_matplotlib_backends_and_gui_loops
97
+
98
+ print(
99
+ "Available matplotlib backends: %s"
100
+ % _list_matplotlib_backends_and_gui_loops()
101
+ )
98
102
  else:
99
103
  gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui)
100
104
  self._show_matplotlib_backend(args.gui, backend)
@@ -12,9 +12,12 @@ import warnings
12
12
  from IPython.core.display import _pngxy
13
13
  from IPython.utils.decorators import flag_calls
14
14
 
15
- # If user specifies a GUI, that dictates the backend, otherwise we read the
16
- # user's mpl default from the mpl rc structure
17
- backends = {
15
+
16
+ # Matplotlib backend resolution functionality moved from IPython to Matplotlib
17
+ # in IPython 8.24 and Matplotlib 3.9.1. Need to keep `backends` and `backend2gui`
18
+ # here for earlier Matplotlib and for external backend libraries such as
19
+ # mplcairo that might rely upon it.
20
+ _deprecated_backends = {
18
21
  "tk": "TkAgg",
19
22
  "gtk": "GTKAgg",
20
23
  "gtk3": "GTK3Agg",
@@ -41,29 +44,44 @@ backends = {
41
44
  # GUI support to activate based on the desired matplotlib backend. For the
42
45
  # most part it's just a reverse of the above dict, but we also need to add a
43
46
  # few others that map to the same GUI manually:
44
- backend2gui = dict(zip(backends.values(), backends.keys()))
47
+ _deprecated_backend2gui = dict(
48
+ zip(_deprecated_backends.values(), _deprecated_backends.keys())
49
+ )
45
50
  # In the reverse mapping, there are a few extra valid matplotlib backends that
46
51
  # map to the same GUI support
47
- backend2gui["GTK"] = backend2gui["GTKCairo"] = "gtk"
48
- backend2gui["GTK3Cairo"] = "gtk3"
49
- backend2gui["GTK4Cairo"] = "gtk4"
50
- backend2gui["WX"] = "wx"
51
- backend2gui["CocoaAgg"] = "osx"
52
+ _deprecated_backend2gui["GTK"] = _deprecated_backend2gui["GTKCairo"] = "gtk"
53
+ _deprecated_backend2gui["GTK3Cairo"] = "gtk3"
54
+ _deprecated_backend2gui["GTK4Cairo"] = "gtk4"
55
+ _deprecated_backend2gui["WX"] = "wx"
56
+ _deprecated_backend2gui["CocoaAgg"] = "osx"
52
57
  # There needs to be a hysteresis here as the new QtAgg Matplotlib backend
53
58
  # supports either Qt5 or Qt6 and the IPython qt event loop support Qt4, Qt5,
54
59
  # and Qt6.
55
- backend2gui["QtAgg"] = "qt"
56
- backend2gui["Qt4Agg"] = "qt4"
57
- backend2gui["Qt5Agg"] = "qt5"
60
+ _deprecated_backend2gui["QtAgg"] = "qt"
61
+ _deprecated_backend2gui["Qt4Agg"] = "qt4"
62
+ _deprecated_backend2gui["Qt5Agg"] = "qt5"
58
63
 
59
64
  # And some backends that don't need GUI integration
60
- del backend2gui["nbAgg"]
61
- del backend2gui["agg"]
62
- del backend2gui["svg"]
63
- del backend2gui["pdf"]
64
- del backend2gui["ps"]
65
- del backend2gui["module://matplotlib_inline.backend_inline"]
66
- del backend2gui["module://ipympl.backend_nbagg"]
65
+ del _deprecated_backend2gui["nbAgg"]
66
+ del _deprecated_backend2gui["agg"]
67
+ del _deprecated_backend2gui["svg"]
68
+ del _deprecated_backend2gui["pdf"]
69
+ del _deprecated_backend2gui["ps"]
70
+ del _deprecated_backend2gui["module://matplotlib_inline.backend_inline"]
71
+ del _deprecated_backend2gui["module://ipympl.backend_nbagg"]
72
+
73
+
74
+ # Deprecated attributes backends and backend2gui mostly following PEP 562.
75
+ def __getattr__(name):
76
+ if name in ("backends", "backend2gui"):
77
+ warnings.warn(
78
+ f"{name} is deprecated since IPython 8.24, backends are managed "
79
+ "in matplotlib and can be externally registered.",
80
+ DeprecationWarning,
81
+ )
82
+ return globals()[f"_deprecated_{name}"]
83
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
84
+
67
85
 
68
86
  #-----------------------------------------------------------------------------
69
87
  # Matplotlib utilities
@@ -267,7 +285,7 @@ def select_figure_formats(shell, formats, **kwargs):
267
285
 
268
286
  [ f.pop(Figure, None) for f in shell.display_formatter.formatters.values() ]
269
287
  mplbackend = matplotlib.get_backend().lower()
270
- if mplbackend == 'nbagg' or mplbackend == 'module://ipympl.backend_nbagg':
288
+ if mplbackend in ("nbagg", "ipympl", "widget", "module://ipympl.backend_nbagg"):
271
289
  formatter = shell.display_formatter.ipython_display_formatter
272
290
  formatter.for_type(Figure, _reshow_nbagg_figure)
273
291
 
@@ -319,7 +337,23 @@ def find_gui_and_backend(gui=None, gui_select=None):
319
337
 
320
338
  import matplotlib
321
339
 
322
- has_unified_qt_backend = getattr(matplotlib, "__version_info__", (0, 0)) >= (3, 5)
340
+ if _matplotlib_manages_backends():
341
+ backend_registry = matplotlib.backends.registry.backend_registry
342
+
343
+ # gui argument may be a gui event loop or may be a backend name.
344
+ if gui in ("auto", None):
345
+ backend = matplotlib.rcParamsOrig["backend"]
346
+ backend, gui = backend_registry.resolve_backend(backend)
347
+ else:
348
+ backend, gui = backend_registry.resolve_gui_or_backend(gui)
349
+
350
+ return gui, backend
351
+
352
+ # Fallback to previous behaviour (Matplotlib < 3.9)
353
+ mpl_version_info = getattr(matplotlib, "__version_info__", (0, 0))
354
+ has_unified_qt_backend = mpl_version_info >= (3, 5)
355
+
356
+ from IPython.core.pylabtools import backends
323
357
 
324
358
  backends_ = dict(backends)
325
359
  if not has_unified_qt_backend:
@@ -338,6 +372,7 @@ def find_gui_and_backend(gui=None, gui_select=None):
338
372
  backend = matplotlib.rcParamsOrig['backend']
339
373
  # In this case, we need to find what the appropriate gui selection call
340
374
  # should be for IPython, so we can activate inputhook accordingly
375
+ from IPython.core.pylabtools import backend2gui
341
376
  gui = backend2gui.get(backend, None)
342
377
 
343
378
  # If we have already had a gui active, we need it and inline are the
@@ -346,6 +381,11 @@ def find_gui_and_backend(gui=None, gui_select=None):
346
381
  gui = gui_select
347
382
  backend = backends_[gui]
348
383
 
384
+ # Matplotlib before _matplotlib_manages_backends() can return "inline" for
385
+ # no gui event loop rather than the None that IPython >= 8.24.0 expects.
386
+ if gui == "inline":
387
+ gui = None
388
+
349
389
  return gui, backend
350
390
 
351
391
 
@@ -431,3 +471,48 @@ def configure_inline_support(shell, backend):
431
471
  )
432
472
 
433
473
  configure_inline_support_orig(shell, backend)
474
+
475
+
476
+ # Determine if Matplotlib manages backends only if needed, and cache result.
477
+ # Do not read this directly, instead use _matplotlib_manages_backends().
478
+ _matplotlib_manages_backends_value: bool | None = None
479
+
480
+
481
+ def _matplotlib_manages_backends() -> bool:
482
+ """Return True if Matplotlib manages backends, False otherwise.
483
+
484
+ If it returns True, the caller can be sure that
485
+ matplotlib.backends.registry.backend_registry is available along with
486
+ member functions resolve_gui_or_backend, resolve_backend, list_all, and
487
+ list_gui_frameworks.
488
+ """
489
+ global _matplotlib_manages_backends_value
490
+ if _matplotlib_manages_backends_value is None:
491
+ try:
492
+ from matplotlib.backends.registry import backend_registry
493
+
494
+ _matplotlib_manages_backends_value = hasattr(
495
+ backend_registry, "resolve_gui_or_backend"
496
+ )
497
+ except ImportError:
498
+ _matplotlib_manages_backends_value = False
499
+
500
+ return _matplotlib_manages_backends_value
501
+
502
+
503
+ def _list_matplotlib_backends_and_gui_loops() -> list[str]:
504
+ """Return list of all Matplotlib backends and GUI event loops.
505
+
506
+ This is the list returned by
507
+ %matplotlib --list
508
+ """
509
+ if _matplotlib_manages_backends():
510
+ from matplotlib.backends.registry import backend_registry
511
+
512
+ ret = backend_registry.list_all() + backend_registry.list_gui_frameworks()
513
+ else:
514
+ from IPython.core import pylabtools
515
+
516
+ ret = list(pylabtools.backends.keys())
517
+
518
+ return sorted(["auto"] + ret)
@@ -16,7 +16,7 @@
16
16
  # release. 'dev' as a _version_extra string means this is a development
17
17
  # version
18
18
  _version_major = 8
19
- _version_minor = 23
19
+ _version_minor = 24
20
20
  _version_patch = 0
21
21
  _version_extra = ".dev"
22
22
  # _version_extra = "rc1"
@@ -11,37 +11,45 @@ import glob
11
11
  from itertools import chain
12
12
  import os
13
13
  import sys
14
+ import typing as t
14
15
 
15
16
  from traitlets.config.application import boolean_flag
16
17
  from traitlets.config.configurable import Configurable
17
18
  from traitlets.config.loader import Config
18
19
  from IPython.core.application import SYSTEM_CONFIG_DIRS, ENV_CONFIG_DIRS
19
- from IPython.core import pylabtools
20
20
  from IPython.utils.contexts import preserve_keys
21
21
  from IPython.utils.path import filefind
22
22
  from traitlets import (
23
- Unicode, Instance, List, Bool, CaselessStrEnum, observe,
23
+ Unicode,
24
+ Instance,
25
+ List,
26
+ Bool,
27
+ CaselessStrEnum,
28
+ observe,
24
29
  DottedObjectName,
30
+ Undefined,
25
31
  )
26
32
  from IPython.terminal import pt_inputhooks
27
33
 
28
- #-----------------------------------------------------------------------------
34
+ # -----------------------------------------------------------------------------
29
35
  # Aliases and Flags
30
- #-----------------------------------------------------------------------------
36
+ # -----------------------------------------------------------------------------
31
37
 
32
38
  gui_keys = tuple(sorted(pt_inputhooks.backends) + sorted(pt_inputhooks.aliases))
33
39
 
34
- backend_keys = sorted(pylabtools.backends.keys())
35
- backend_keys.insert(0, 'auto')
36
-
37
40
  shell_flags = {}
38
41
 
39
42
  addflag = lambda *args: shell_flags.update(boolean_flag(*args))
40
- addflag('autoindent', 'InteractiveShell.autoindent',
41
- 'Turn on autoindenting.', 'Turn off autoindenting.'
43
+ addflag(
44
+ "autoindent",
45
+ "InteractiveShell.autoindent",
46
+ "Turn on autoindenting.",
47
+ "Turn off autoindenting.",
42
48
  )
43
- addflag('automagic', 'InteractiveShell.automagic',
44
- """Turn on the auto calling of magic commands. Type %%magic at the
49
+ addflag(
50
+ "automagic",
51
+ "InteractiveShell.automagic",
52
+ """Turn on the auto calling of magic commands. Type %%magic at the
45
53
  IPython prompt for more information.""",
46
54
  'Turn off the auto calling of magic commands.'
47
55
  )
@@ -97,6 +105,37 @@ shell_aliases = dict(
97
105
  )
98
106
  shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
99
107
 
108
+
109
+ # -----------------------------------------------------------------------------
110
+ # Traitlets
111
+ # -----------------------------------------------------------------------------
112
+
113
+
114
+ class MatplotlibBackendCaselessStrEnum(CaselessStrEnum):
115
+ """An enum of Matplotlib backend strings where the case should be ignored.
116
+
117
+ Prior to Matplotlib 3.9.1 the list of valid backends is hardcoded in
118
+ pylabtools.backends. After that, Matplotlib manages backends.
119
+
120
+ The list of valid backends is determined when it is first needed to avoid
121
+ wasting unnecessary initialisation time.
122
+ """
123
+
124
+ def __init__(
125
+ self: CaselessStrEnum[t.Any],
126
+ default_value: t.Any = Undefined,
127
+ **kwargs: t.Any,
128
+ ) -> None:
129
+ super().__init__(None, default_value=default_value, **kwargs)
130
+
131
+ def __getattribute__(self, name):
132
+ if name == "values" and object.__getattribute__(self, name) is None:
133
+ from IPython.core.pylabtools import _list_matplotlib_backends_and_gui_loops
134
+
135
+ self.values = _list_matplotlib_backends_and_gui_loops()
136
+ return object.__getattribute__(self, name)
137
+
138
+
100
139
  #-----------------------------------------------------------------------------
101
140
  # Main classes and functions
102
141
  #-----------------------------------------------------------------------------
@@ -156,30 +195,31 @@ class InteractiveShellApp(Configurable):
156
195
  exec_lines = List(Unicode(),
157
196
  help="""lines of code to run at IPython startup."""
158
197
  ).tag(config=True)
159
- code_to_run = Unicode('',
160
- help="Execute the given command string."
161
- ).tag(config=True)
162
- module_to_run = Unicode('',
163
- help="Run the module as a script."
198
+ code_to_run = Unicode("", help="Execute the given command string.").tag(config=True)
199
+ module_to_run = Unicode("", help="Run the module as a script.").tag(config=True)
200
+ gui = CaselessStrEnum(
201
+ gui_keys,
202
+ allow_none=True,
203
+ help="Enable GUI event loop integration with any of {0}.".format(gui_keys),
164
204
  ).tag(config=True)
165
- gui = CaselessStrEnum(gui_keys, allow_none=True,
166
- help="Enable GUI event loop integration with any of {0}.".format(gui_keys)
167
- ).tag(config=True)
168
- matplotlib = CaselessStrEnum(backend_keys, allow_none=True,
205
+ matplotlib = MatplotlibBackendCaselessStrEnum(
206
+ allow_none=True,
169
207
  help="""Configure matplotlib for interactive use with
170
- the default matplotlib backend."""
208
+ the default matplotlib backend.""",
171
209
  ).tag(config=True)
172
- pylab = CaselessStrEnum(backend_keys, allow_none=True,
210
+ pylab = MatplotlibBackendCaselessStrEnum(
211
+ allow_none=True,
173
212
  help="""Pre-load matplotlib and numpy for interactive use,
174
213
  selecting a particular matplotlib backend and loop integration.
175
- """
214
+ """,
176
215
  ).tag(config=True)
177
- pylab_import_all = Bool(True,
216
+ pylab_import_all = Bool(
217
+ True,
178
218
  help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
179
219
  and an ``import *`` is done from numpy and pylab, when using pylab mode.
180
220
 
181
221
  When False, pylab mode should not import any names into the user namespace.
182
- """
222
+ """,
183
223
  ).tag(config=True)
184
224
  ignore_cwd = Bool(
185
225
  False,