ipython 8.22.1__tar.gz → 8.23.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 (498) hide show
  1. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/guarded_eval.py +183 -45
  2. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/basic.py +3 -0
  3. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/execution.py +1 -1
  4. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/release.py +2 -2
  5. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_guarded_eval.py +192 -9
  6. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_process_emscripten.py +5 -3
  7. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_sysinfo.py +1 -1
  8. {ipython-8.22.1/ipython.egg-info → ipython-8.23.0}/PKG-INFO +5 -3
  9. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version8.rst +37 -2
  10. {ipython-8.22.1 → ipython-8.23.0/ipython.egg-info}/PKG-INFO +5 -3
  11. {ipython-8.22.1 → ipython-8.23.0}/ipython.egg-info/SOURCES.txt +0 -1
  12. {ipython-8.22.1 → ipython-8.23.0}/ipython.egg-info/requires.txt +7 -4
  13. {ipython-8.22.1 → ipython-8.23.0}/pyproject.toml +5 -2
  14. ipython-8.22.1/docs/source/development/parallel_connections.rst +0 -8
  15. {ipython-8.22.1 → ipython-8.23.0}/.flake8 +0 -0
  16. {ipython-8.22.1 → ipython-8.23.0}/.mailmap +0 -0
  17. {ipython-8.22.1 → ipython-8.23.0}/.pre-commit-config.yaml +0 -0
  18. {ipython-8.22.1 → ipython-8.23.0}/COPYING.rst +0 -0
  19. {ipython-8.22.1 → ipython-8.23.0}/IPython/__init__.py +0 -0
  20. {ipython-8.22.1 → ipython-8.23.0}/IPython/__main__.py +0 -0
  21. {ipython-8.22.1 → ipython-8.23.0}/IPython/conftest.py +0 -0
  22. {ipython-8.22.1 → ipython-8.23.0}/IPython/consoleapp.py +0 -0
  23. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/__init__.py +0 -0
  24. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/alias.py +0 -0
  25. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/application.py +0 -0
  26. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/async_helpers.py +0 -0
  27. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/autocall.py +0 -0
  28. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/builtin_trap.py +0 -0
  29. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/compilerop.py +0 -0
  30. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/completer.py +0 -0
  31. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/completerlib.py +0 -0
  32. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/crashhandler.py +0 -0
  33. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/debugger.py +0 -0
  34. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/display.py +0 -0
  35. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/display_functions.py +0 -0
  36. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/display_trap.py +0 -0
  37. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/displayhook.py +0 -0
  38. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/displaypub.py +0 -0
  39. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/error.py +0 -0
  40. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/events.py +0 -0
  41. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/excolors.py +0 -0
  42. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/extensions.py +0 -0
  43. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/formatters.py +0 -0
  44. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/getipython.py +0 -0
  45. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/history.py +0 -0
  46. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/historyapp.py +0 -0
  47. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/hooks.py +0 -0
  48. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/inputsplitter.py +0 -0
  49. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/inputtransformer.py +0 -0
  50. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/inputtransformer2.py +0 -0
  51. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/interactiveshell.py +0 -0
  52. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/latex_symbols.py +0 -0
  53. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/logger.py +0 -0
  54. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/macro.py +0 -0
  55. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magic.py +0 -0
  56. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magic_arguments.py +0 -0
  57. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/__init__.py +0 -0
  58. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/ast_mod.py +0 -0
  59. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/auto.py +0 -0
  60. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/code.py +0 -0
  61. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/config.py +0 -0
  62. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/display.py +0 -0
  63. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/extension.py +0 -0
  64. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/history.py +0 -0
  65. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/logging.py +0 -0
  66. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/namespace.py +0 -0
  67. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/osm.py +0 -0
  68. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/packaging.py +0 -0
  69. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/pylab.py +0 -0
  70. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/magics/script.py +0 -0
  71. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/oinspect.py +0 -0
  72. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/page.py +0 -0
  73. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/payload.py +0 -0
  74. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/payloadpage.py +0 -0
  75. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/prefilter.py +0 -0
  76. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/profile/README_STARTUP +0 -0
  77. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/profileapp.py +0 -0
  78. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/profiledir.py +0 -0
  79. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/prompts.py +0 -0
  80. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/pylabtools.py +0 -0
  81. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/shellapp.py +0 -0
  82. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/splitinput.py +0 -0
  83. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/2x2.jpg +0 -0
  84. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/2x2.png +0 -0
  85. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/__init__.py +0 -0
  86. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/bad_all.py +0 -0
  87. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
  88. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/nonascii.py +0 -0
  89. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/nonascii2.py +0 -0
  90. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/print_argv.py +0 -0
  91. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/refbug.py +0 -0
  92. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/simpleerr.py +0 -0
  93. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/tclass.py +0 -0
  94. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_alias.py +0 -0
  95. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_application.py +0 -0
  96. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_async_helpers.py +0 -0
  97. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_autocall.py +0 -0
  98. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_compilerop.py +0 -0
  99. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_completer.py +0 -0
  100. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_completerlib.py +0 -0
  101. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_debugger.py +0 -0
  102. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_display.py +0 -0
  103. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_displayhook.py +0 -0
  104. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_events.py +0 -0
  105. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
  106. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_extension.py +0 -0
  107. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_formatters.py +0 -0
  108. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_handlers.py +0 -0
  109. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_history.py +0 -0
  110. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_hooks.py +0 -0
  111. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_imports.py +0 -0
  112. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_inputsplitter.py +0 -0
  113. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_inputtransformer.py +0 -0
  114. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
  115. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
  116. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_interactiveshell.py +0 -0
  117. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_iplib.py +0 -0
  118. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_logger.py +0 -0
  119. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_magic.py +0 -0
  120. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_magic_arguments.py +0 -0
  121. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_magic_terminal.py +0 -0
  122. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_oinspect.py +0 -0
  123. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_page.py +0 -0
  124. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_paths.py +0 -0
  125. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_prefilter.py +0 -0
  126. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_profile.py +0 -0
  127. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_prompts.py +0 -0
  128. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_pylabtools.py +0 -0
  129. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_run.py +0 -0
  130. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_shellapp.py +0 -0
  131. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_splitinput.py +0 -0
  132. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/tests/test_ultratb.py +0 -0
  133. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/ultratb.py +0 -0
  134. {ipython-8.22.1 → ipython-8.23.0}/IPython/core/usage.py +0 -0
  135. {ipython-8.22.1 → ipython-8.23.0}/IPython/display.py +0 -0
  136. {ipython-8.22.1 → ipython-8.23.0}/IPython/extensions/__init__.py +0 -0
  137. {ipython-8.22.1 → ipython-8.23.0}/IPython/extensions/autoreload.py +0 -0
  138. {ipython-8.22.1 → ipython-8.23.0}/IPython/extensions/storemagic.py +0 -0
  139. {ipython-8.22.1 → ipython-8.23.0}/IPython/extensions/tests/__init__.py +0 -0
  140. {ipython-8.22.1 → ipython-8.23.0}/IPython/extensions/tests/test_autoreload.py +0 -0
  141. {ipython-8.22.1 → ipython-8.23.0}/IPython/extensions/tests/test_storemagic.py +0 -0
  142. {ipython-8.22.1 → ipython-8.23.0}/IPython/external/__init__.py +0 -0
  143. {ipython-8.22.1 → ipython-8.23.0}/IPython/external/qt_for_kernel.py +0 -0
  144. {ipython-8.22.1 → ipython-8.23.0}/IPython/external/qt_loaders.py +0 -0
  145. {ipython-8.22.1 → ipython-8.23.0}/IPython/external/tests/__init__.py +0 -0
  146. {ipython-8.22.1 → ipython-8.23.0}/IPython/external/tests/test_qt_loaders.py +0 -0
  147. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/__init__.py +0 -0
  148. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/backgroundjobs.py +0 -0
  149. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/clipboard.py +0 -0
  150. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/deepreload.py +0 -0
  151. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/demo.py +0 -0
  152. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/display.py +0 -0
  153. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/editorhooks.py +0 -0
  154. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/guisupport.py +0 -0
  155. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/latextools.py +0 -0
  156. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/lexers.py +0 -0
  157. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/pretty.py +0 -0
  158. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/__init__.py +0 -0
  159. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test.wav +0 -0
  160. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
  161. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_clipboard.py +0 -0
  162. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_deepreload.py +0 -0
  163. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_display.py +0 -0
  164. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_editorhooks.py +0 -0
  165. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_imports.py +0 -0
  166. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_latextools.py +0 -0
  167. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_lexers.py +0 -0
  168. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_pretty.py +0 -0
  169. {ipython-8.22.1 → ipython-8.23.0}/IPython/lib/tests/test_pygments.py +0 -0
  170. {ipython-8.22.1 → ipython-8.23.0}/IPython/paths.py +0 -0
  171. {ipython-8.22.1 → ipython-8.23.0}/IPython/py.typed +0 -0
  172. {ipython-8.22.1 → ipython-8.23.0}/IPython/sphinxext/__init__.py +0 -0
  173. {ipython-8.22.1 → ipython-8.23.0}/IPython/sphinxext/custom_doctests.py +0 -0
  174. {ipython-8.22.1 → ipython-8.23.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  175. {ipython-8.22.1 → ipython-8.23.0}/IPython/sphinxext/ipython_directive.py +0 -0
  176. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/__init__.py +0 -0
  177. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/console.py +0 -0
  178. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/debugger.py +0 -0
  179. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/embed.py +0 -0
  180. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/interactiveshell.py +0 -0
  181. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/ipapp.py +0 -0
  182. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/magics.py +0 -0
  183. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/prompts.py +0 -0
  184. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  185. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  186. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  187. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  188. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  189. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  190. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  191. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  192. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  193. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  194. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  195. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/ptutils.py +0 -0
  196. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  197. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  198. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  199. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/shortcuts/filters.py +0 -0
  200. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/__init__.py +0 -0
  201. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
  202. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/test_embed.py +0 -0
  203. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/test_help.py +0 -0
  204. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
  205. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
  206. {ipython-8.22.1 → ipython-8.23.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
  207. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/__init__.py +0 -0
  208. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/decorators.py +0 -0
  209. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/globalipapp.py +0 -0
  210. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/ipunittest.py +0 -0
  211. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/Makefile +0 -0
  212. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/README.txt +0 -0
  213. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/__init__.py +0 -0
  214. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/dtexample.py +0 -0
  215. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  216. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  217. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/setup.py +0 -0
  218. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/simple.py +0 -0
  219. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/simplevars.py +0 -0
  220. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/test_combo.txt +0 -0
  221. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/test_example.txt +0 -0
  222. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  223. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  224. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/plugin/test_refs.py +0 -0
  225. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/skipdoctest.py +0 -0
  226. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/tests/__init__.py +0 -0
  227. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/tests/test_decorators.py +0 -0
  228. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/tests/test_ipunittest.py +0 -0
  229. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/tests/test_tools.py +0 -0
  230. {ipython-8.22.1 → ipython-8.23.0}/IPython/testing/tools.py +0 -0
  231. {ipython-8.22.1 → ipython-8.23.0}/IPython/tests/cve.py +0 -0
  232. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/PyColorize.py +0 -0
  233. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/__init__.py +0 -0
  234. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_process_cli.py +0 -0
  235. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_process_common.py +0 -0
  236. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_process_posix.py +0 -0
  237. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_process_win32.py +0 -0
  238. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/_process_win32_controller.py +0 -0
  239. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/capture.py +0 -0
  240. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/colorable.py +0 -0
  241. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/coloransi.py +0 -0
  242. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/contexts.py +0 -0
  243. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/daemonize.py +0 -0
  244. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/data.py +0 -0
  245. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/decorators.py +0 -0
  246. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/dir2.py +0 -0
  247. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/docs.py +0 -0
  248. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/encoding.py +0 -0
  249. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/eventful.py +0 -0
  250. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/frame.py +0 -0
  251. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/generics.py +0 -0
  252. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/importstring.py +0 -0
  253. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/io.py +0 -0
  254. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/ipstruct.py +0 -0
  255. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/jsonutil.py +0 -0
  256. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/localinterfaces.py +0 -0
  257. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/log.py +0 -0
  258. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/module_paths.py +0 -0
  259. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/openpy.py +0 -0
  260. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/path.py +0 -0
  261. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/process.py +0 -0
  262. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/py3compat.py +0 -0
  263. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/sentinel.py +0 -0
  264. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/shimmodule.py +0 -0
  265. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/signatures.py +0 -0
  266. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/strdispatch.py +0 -0
  267. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/sysinfo.py +0 -0
  268. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/syspathcontext.py +0 -0
  269. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tempdir.py +0 -0
  270. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/terminal.py +0 -0
  271. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/__init__.py +0 -0
  272. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_capture.py +0 -0
  273. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_decorators.py +0 -0
  274. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_deprecated.py +0 -0
  275. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_dir2.py +0 -0
  276. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_imports.py +0 -0
  277. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_importstring.py +0 -0
  278. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_io.py +0 -0
  279. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_module_paths.py +0 -0
  280. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_openpy.py +0 -0
  281. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_path.py +0 -0
  282. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_process.py +0 -0
  283. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_pycolorize.py +0 -0
  284. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_shimmodule.py +0 -0
  285. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_sysinfo.py +0 -0
  286. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_tempdir.py +0 -0
  287. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_text.py +0 -0
  288. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_tokenutil.py +0 -0
  289. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tests/test_wildcard.py +0 -0
  290. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/text.py +0 -0
  291. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/timing.py +0 -0
  292. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tokenutil.py +0 -0
  293. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/traitlets.py +0 -0
  294. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/tz.py +0 -0
  295. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/ulinecache.py +0 -0
  296. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/version.py +0 -0
  297. {ipython-8.22.1 → ipython-8.23.0}/IPython/utils/wildcard.py +0 -0
  298. {ipython-8.22.1 → ipython-8.23.0}/LICENSE +0 -0
  299. {ipython-8.22.1 → ipython-8.23.0}/MANIFEST.in +0 -0
  300. {ipython-8.22.1 → ipython-8.23.0}/README.rst +0 -0
  301. {ipython-8.22.1 → ipython-8.23.0}/_build_meta.py +0 -0
  302. {ipython-8.22.1 → ipython-8.23.0}/docs/Makefile +0 -0
  303. {ipython-8.22.1 → ipython-8.23.0}/docs/README.rst +0 -0
  304. {ipython-8.22.1 → ipython-8.23.0}/docs/autogen_api.py +0 -0
  305. {ipython-8.22.1 → ipython-8.23.0}/docs/autogen_config.py +0 -0
  306. {ipython-8.22.1 → ipython-8.23.0}/docs/autogen_magics.py +0 -0
  307. {ipython-8.22.1 → ipython-8.23.0}/docs/autogen_shortcuts.py +0 -0
  308. {ipython-8.22.1 → ipython-8.23.0}/docs/make.cmd +0 -0
  309. {ipython-8.22.1 → ipython-8.23.0}/docs/man/ipython.1 +0 -0
  310. {ipython-8.22.1 → ipython-8.23.0}/docs/requirements.txt +0 -0
  311. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/2.0/running-crop.png +0 -0
  312. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/2.0/running.png +0 -0
  313. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/2.0/treeview.png +0 -0
  314. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/2.0/user-interface.png +0 -0
  315. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/2.0/widgets.png +0 -0
  316. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  317. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  318. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  319. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  320. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  321. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  322. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  323. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  324. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  325. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  326. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  327. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/autosuggest.gif +0 -0
  328. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  329. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  330. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  331. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  332. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  333. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  334. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  335. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  336. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  337. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  338. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  339. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  340. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  341. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  342. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  343. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ms_visual_studio.png +0 -0
  344. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/notebook_specgram.png +0 -0
  345. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/ptshell_features.png +0 -0
  346. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/qtconsole.png +0 -0
  347. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  348. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_images/unicode_completion.png +0 -0
  349. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_static/favicon.ico +0 -0
  350. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_static/logo.png +0 -0
  351. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_static/theme_overrides.css +0 -0
  352. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_templates/breadcrumbs.html +0 -0
  353. {ipython-8.22.1 → ipython-8.23.0}/docs/source/_templates/notebook_redirect.html +0 -0
  354. {ipython-8.22.1 → ipython-8.23.0}/docs/source/about/history.rst +0 -0
  355. {ipython-8.22.1 → ipython-8.23.0}/docs/source/about/index.rst +0 -0
  356. {ipython-8.22.1 → ipython-8.23.0}/docs/source/about/license_and_copyright.rst +0 -0
  357. {ipython-8.22.1 → ipython-8.23.0}/docs/source/api/index.rst +0 -0
  358. {ipython-8.22.1 → ipython-8.23.0}/docs/source/conf.py +0 -0
  359. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/callbacks.rst +0 -0
  360. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/custommagics.rst +0 -0
  361. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/details.rst +0 -0
  362. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/eventloops.rst +0 -0
  363. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/extensions/autoreload.rst +0 -0
  364. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/extensions/index.rst +0 -0
  365. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/extensions/storemagic.rst +0 -0
  366. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/index.rst +0 -0
  367. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/inputtransforms.rst +0 -0
  368. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/integrating.rst +0 -0
  369. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/intro.rst +0 -0
  370. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/options/index.rst +0 -0
  371. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  372. {ipython-8.22.1 → ipython-8.23.0}/docs/source/config/shortcuts/index.rst +0 -0
  373. {ipython-8.22.1 → ipython-8.23.0}/docs/source/coredev/index.rst +0 -0
  374. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/config.rst +0 -0
  375. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/execution.rst +0 -0
  376. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  377. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  378. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/figs/other_kernels.png +0 -0
  379. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/figs/other_kernels.svg +0 -0
  380. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/how_ipython_works.rst +0 -0
  381. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/index.rst +0 -0
  382. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/inputhook_app.rst +0 -0
  383. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/kernels.rst +0 -0
  384. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/lexer.rst +0 -0
  385. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/messaging.rst +0 -0
  386. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/parallel_messages.rst +0 -0
  387. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/pycompat.rst +0 -0
  388. {ipython-8.22.1 → ipython-8.23.0}/docs/source/development/wrapperkernels.rst +0 -0
  389. {ipython-8.22.1 → ipython-8.23.0}/docs/source/index.rst +0 -0
  390. {ipython-8.22.1 → ipython-8.23.0}/docs/source/install/index.rst +0 -0
  391. {ipython-8.22.1 → ipython-8.23.0}/docs/source/install/install.rst +0 -0
  392. {ipython-8.22.1 → ipython-8.23.0}/docs/source/install/kernel_install.rst +0 -0
  393. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/autoawait.rst +0 -0
  394. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/figs/besselj.png +0 -0
  395. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/figs/colors_dark.png +0 -0
  396. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/figs/jn.html +0 -0
  397. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/figs/jn.xhtml +0 -0
  398. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/index.rst +0 -0
  399. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/magics.rst +0 -0
  400. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/plotting.rst +0 -0
  401. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  402. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/reference.rst +0 -0
  403. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/shell.rst +0 -0
  404. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/tips.rst +0 -0
  405. {ipython-8.22.1 → ipython-8.23.0}/docs/source/interactive/tutorial.rst +0 -0
  406. {ipython-8.22.1 → ipython-8.23.0}/docs/source/links.txt +0 -0
  407. {ipython-8.22.1 → ipython-8.23.0}/docs/source/overview.rst +0 -0
  408. {ipython-8.22.1 → ipython-8.23.0}/docs/source/parallel/index.rst +0 -0
  409. {ipython-8.22.1 → ipython-8.23.0}/docs/source/sphinxext.rst +0 -0
  410. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/development.rst +0 -0
  411. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  412. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  413. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  414. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  415. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  416. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  417. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  418. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  419. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  420. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  421. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  422. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/index.rst +0 -0
  423. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/pr/README.md +0 -0
  424. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  425. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  426. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version0.10.rst +0 -0
  427. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version0.11.rst +0 -0
  428. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version0.12.rst +0 -0
  429. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version0.13.rst +0 -0
  430. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version0.8.rst +0 -0
  431. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version0.9.rst +0 -0
  432. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version1.0.rst +0 -0
  433. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version2.0.rst +0 -0
  434. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version3.rst +0 -0
  435. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  436. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version4.rst +0 -0
  437. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version5.rst +0 -0
  438. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version6.rst +0 -0
  439. {ipython-8.22.1 → ipython-8.23.0}/docs/source/whatsnew/version7.rst +0 -0
  440. {ipython-8.22.1 → ipython-8.23.0}/docs/sphinxext/apigen.py +0 -0
  441. {ipython-8.22.1 → ipython-8.23.0}/docs/sphinxext/configtraits.py +0 -0
  442. {ipython-8.22.1 → ipython-8.23.0}/docs/sphinxext/github.py +0 -0
  443. {ipython-8.22.1 → ipython-8.23.0}/docs/sphinxext/magics.py +0 -0
  444. {ipython-8.22.1 → ipython-8.23.0}/examples/Embedding/Index.ipynb +0 -0
  445. {ipython-8.22.1 → ipython-8.23.0}/examples/Embedding/embed_class_long.py +0 -0
  446. {ipython-8.22.1 → ipython-8.23.0}/examples/Embedding/embed_class_short.py +0 -0
  447. {ipython-8.22.1 → ipython-8.23.0}/examples/Embedding/embed_function.py +0 -0
  448. {ipython-8.22.1 → ipython-8.23.0}/examples/Embedding/start_ipython_config.py +0 -0
  449. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
  450. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
  451. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
  452. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
  453. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
  454. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
  455. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
  456. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Index.ipynb +0 -0
  457. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
  458. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
  459. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
  460. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
  461. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
  462. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
  463. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
  464. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
  465. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
  466. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
  467. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/data/flare.json +0 -0
  468. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/example-demo.py +0 -0
  469. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  470. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  471. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  472. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  473. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  474. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/ipython.desktop +0 -0
  475. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
  476. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
  477. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
  478. {ipython-8.22.1 → ipython-8.23.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
  479. {ipython-8.22.1 → ipython-8.23.0}/examples/Index.ipynb +0 -0
  480. {ipython-8.22.1 → ipython-8.23.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
  481. {ipython-8.22.1 → ipython-8.23.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
  482. {ipython-8.22.1 → ipython-8.23.0}/examples/images/FrontendKernel.png +0 -0
  483. {ipython-8.22.1 → ipython-8.23.0}/examples/images/animation.m4v +0 -0
  484. {ipython-8.22.1 → ipython-8.23.0}/examples/images/ipython_logo.png +0 -0
  485. {ipython-8.22.1 → ipython-8.23.0}/examples/images/python_logo.svg +0 -0
  486. {ipython-8.22.1 → ipython-8.23.0}/examples/utils/cwd_prompt.py +0 -0
  487. {ipython-8.22.1 → ipython-8.23.0}/examples/utils/list_pyfiles.ipy +0 -0
  488. {ipython-8.22.1 → ipython-8.23.0}/examples/utils/list_subdirs.ipy +0 -0
  489. {ipython-8.22.1 → ipython-8.23.0}/ipython.egg-info/dependency_links.txt +0 -0
  490. {ipython-8.22.1 → ipython-8.23.0}/ipython.egg-info/entry_points.txt +0 -0
  491. {ipython-8.22.1 → ipython-8.23.0}/ipython.egg-info/not-zip-safe +0 -0
  492. {ipython-8.22.1 → ipython-8.23.0}/ipython.egg-info/top_level.txt +0 -0
  493. {ipython-8.22.1 → ipython-8.23.0}/long_description.rst +0 -0
  494. {ipython-8.22.1 → ipython-8.23.0}/scripts/ipython.ico +0 -0
  495. {ipython-8.22.1 → ipython-8.23.0}/scripts/ipython_nb.ico +0 -0
  496. {ipython-8.22.1 → ipython-8.23.0}/setup.cfg +0 -0
  497. {ipython-8.22.1 → ipython-8.23.0}/setup.py +0 -0
  498. {ipython-8.22.1 → ipython-8.23.0}/setupbase.py +0 -0
@@ -1,16 +1,23 @@
1
- from inspect import signature, Signature
1
+ from inspect import isclass, signature, Signature
2
2
  from typing import (
3
- Any,
3
+ Annotated,
4
+ AnyStr,
4
5
  Callable,
5
6
  Dict,
7
+ Literal,
8
+ NamedTuple,
9
+ NewType,
10
+ Optional,
11
+ Protocol,
6
12
  Set,
7
13
  Sequence,
8
14
  Tuple,
9
- NamedTuple,
10
15
  Type,
11
- Literal,
16
+ TypeGuard,
12
17
  Union,
13
- TYPE_CHECKING,
18
+ get_args,
19
+ get_origin,
20
+ is_typeddict,
14
21
  )
15
22
  import ast
16
23
  import builtins
@@ -21,15 +28,18 @@ from functools import cached_property
21
28
  from dataclasses import dataclass, field
22
29
  from types import MethodDescriptorType, ModuleType
23
30
 
24
- from IPython.utils.docs import GENERATING_DOCUMENTATION
25
31
  from IPython.utils.decorators import undoc
26
32
 
27
33
 
28
- if TYPE_CHECKING or GENERATING_DOCUMENTATION:
29
- from typing_extensions import Protocol
34
+ if sys.version_info < (3, 11):
35
+ from typing_extensions import Self, LiteralString
36
+ else:
37
+ from typing import Self, LiteralString
38
+
39
+ if sys.version_info < (3, 12):
40
+ from typing_extensions import TypeAliasType
30
41
  else:
31
- # do not require on runtime
32
- Protocol = object # requires Python >=3.8
42
+ from typing import TypeAliasType
33
43
 
34
44
 
35
45
  @undoc
@@ -337,6 +347,7 @@ class _IdentitySubscript:
337
347
  IDENTITY_SUBSCRIPT = _IdentitySubscript()
338
348
  SUBSCRIPT_MARKER = "__SUBSCRIPT_SENTINEL__"
339
349
  UNKNOWN_SIGNATURE = Signature()
350
+ NOT_EVALUATED = object()
340
351
 
341
352
 
342
353
  class GuardRejection(Exception):
@@ -417,9 +428,37 @@ UNARY_OP_DUNDERS: Dict[Type[ast.unaryop], Tuple[str, ...]] = {
417
428
  }
418
429
 
419
430
 
420
- class Duck:
431
+ class ImpersonatingDuck:
421
432
  """A dummy class used to create objects of other classes without calling their ``__init__``"""
422
433
 
434
+ # no-op: override __class__ to impersonate
435
+
436
+
437
+ class _Duck:
438
+ """A dummy class used to create objects pretending to have given attributes"""
439
+
440
+ def __init__(self, attributes: Optional[dict] = None, items: Optional[dict] = None):
441
+ self.attributes = attributes or {}
442
+ self.items = items or {}
443
+
444
+ def __getattr__(self, attr: str):
445
+ return self.attributes[attr]
446
+
447
+ def __hasattr__(self, attr: str):
448
+ return attr in self.attributes
449
+
450
+ def __dir__(self):
451
+ return [*dir(super), *self.attributes]
452
+
453
+ def __getitem__(self, key: str):
454
+ return self.items[key]
455
+
456
+ def __hasitem__(self, key: str):
457
+ return self.items[key]
458
+
459
+ def _ipython_key_completions_(self):
460
+ return self.items.keys()
461
+
423
462
 
424
463
  def _find_dunder(node_op, dunders) -> Union[Tuple[str, ...], None]:
425
464
  dunder = None
@@ -557,19 +596,7 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
557
596
  f" not allowed in {context.evaluation} mode",
558
597
  )
559
598
  if isinstance(node, ast.Name):
560
- if policy.allow_locals_access and node.id in context.locals:
561
- return context.locals[node.id]
562
- if policy.allow_globals_access and node.id in context.globals:
563
- return context.globals[node.id]
564
- if policy.allow_builtins_access and hasattr(builtins, node.id):
565
- # note: do not use __builtins__, it is implementation detail of cPython
566
- return getattr(builtins, node.id)
567
- if not policy.allow_globals_access and not policy.allow_locals_access:
568
- raise GuardRejection(
569
- f"Namespace access not allowed in {context.evaluation} mode"
570
- )
571
- else:
572
- raise NameError(f"{node.id} not found in locals, globals, nor builtins")
599
+ return _eval_node_name(node.id, context)
573
600
  if isinstance(node, ast.Attribute):
574
601
  value = eval_node(node.value, context)
575
602
  if policy.can_get_attr(value, node.attr):
@@ -590,27 +617,19 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
590
617
  if policy.can_call(func) and not node.keywords:
591
618
  args = [eval_node(arg, context) for arg in node.args]
592
619
  return func(*args)
593
- try:
594
- sig = signature(func)
595
- except ValueError:
596
- sig = UNKNOWN_SIGNATURE
597
- # if annotation was not stringized, or it was stringized
598
- # but resolved by signature call we know the return type
599
- not_empty = sig.return_annotation is not Signature.empty
600
- not_stringized = not isinstance(sig.return_annotation, str)
601
- if not_empty and not_stringized:
602
- duck = Duck()
603
- # if allow-listed builtin is on type annotation, instantiate it
604
- if policy.can_call(sig.return_annotation) and not node.keywords:
605
- args = [eval_node(arg, context) for arg in node.args]
606
- return sig.return_annotation(*args)
607
- try:
608
- # if custom class is in type annotation, mock it;
609
- # this only works for heap types, not builtins
610
- duck.__class__ = sig.return_annotation
611
- return duck
612
- except TypeError:
613
- pass
620
+ if isclass(func):
621
+ # this code path gets entered when calling class e.g. `MyClass()`
622
+ # or `my_instance.__class__()` - in both cases `func` is `MyClass`.
623
+ # Should return `MyClass` if `__new__` is not overridden,
624
+ # otherwise whatever `__new__` return type is.
625
+ overridden_return_type = _eval_return_type(func.__new__, node, context)
626
+ if overridden_return_type is not NOT_EVALUATED:
627
+ return overridden_return_type
628
+ return _create_duck_for_heap_type(func)
629
+ else:
630
+ return_type = _eval_return_type(func, node, context)
631
+ if return_type is not NOT_EVALUATED:
632
+ return return_type
614
633
  raise GuardRejection(
615
634
  "Call for",
616
635
  func, # not joined to avoid calling `repr`
@@ -619,6 +638,125 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
619
638
  raise ValueError("Unhandled node", ast.dump(node))
620
639
 
621
640
 
641
+ def _eval_return_type(func: Callable, node: ast.Call, context: EvaluationContext):
642
+ """Evaluate return type of a given callable function.
643
+
644
+ Returns the built-in type, a duck or NOT_EVALUATED sentinel.
645
+ """
646
+ try:
647
+ sig = signature(func)
648
+ except ValueError:
649
+ sig = UNKNOWN_SIGNATURE
650
+ # if annotation was not stringized, or it was stringized
651
+ # but resolved by signature call we know the return type
652
+ not_empty = sig.return_annotation is not Signature.empty
653
+ if not_empty:
654
+ return _resolve_annotation(sig.return_annotation, sig, func, node, context)
655
+ return NOT_EVALUATED
656
+
657
+
658
+ def _resolve_annotation(
659
+ annotation,
660
+ sig: Signature,
661
+ func: Callable,
662
+ node: ast.Call,
663
+ context: EvaluationContext,
664
+ ):
665
+ """Resolve annotation created by user with `typing` module and custom objects."""
666
+ annotation = (
667
+ _eval_node_name(annotation, context)
668
+ if isinstance(annotation, str)
669
+ else annotation
670
+ )
671
+ origin = get_origin(annotation)
672
+ if annotation is Self and hasattr(func, "__self__"):
673
+ return func.__self__
674
+ elif origin is Literal:
675
+ type_args = get_args(annotation)
676
+ if len(type_args) == 1:
677
+ return type_args[0]
678
+ elif annotation is LiteralString:
679
+ return ""
680
+ elif annotation is AnyStr:
681
+ index = None
682
+ for i, (key, value) in enumerate(sig.parameters.items()):
683
+ if value.annotation is AnyStr:
684
+ index = i
685
+ break
686
+ if index is not None and index < len(node.args):
687
+ return eval_node(node.args[index], context)
688
+ elif origin is TypeGuard:
689
+ return bool()
690
+ elif origin is Union:
691
+ attributes = [
692
+ attr
693
+ for type_arg in get_args(annotation)
694
+ for attr in dir(_resolve_annotation(type_arg, sig, func, node, context))
695
+ ]
696
+ return _Duck(attributes=dict.fromkeys(attributes))
697
+ elif is_typeddict(annotation):
698
+ return _Duck(
699
+ attributes=dict.fromkeys(dir(dict())),
700
+ items={
701
+ k: _resolve_annotation(v, sig, func, node, context)
702
+ for k, v in annotation.__annotations__.items()
703
+ },
704
+ )
705
+ elif hasattr(annotation, "_is_protocol"):
706
+ return _Duck(attributes=dict.fromkeys(dir(annotation)))
707
+ elif origin is Annotated:
708
+ type_arg = get_args(annotation)[0]
709
+ return _resolve_annotation(type_arg, sig, func, node, context)
710
+ elif isinstance(annotation, NewType):
711
+ return _eval_or_create_duck(annotation.__supertype__, node, context)
712
+ elif isinstance(annotation, TypeAliasType):
713
+ return _eval_or_create_duck(annotation.__value__, node, context)
714
+ else:
715
+ return _eval_or_create_duck(annotation, node, context)
716
+
717
+
718
+ def _eval_node_name(node_id: str, context: EvaluationContext):
719
+ policy = EVALUATION_POLICIES[context.evaluation]
720
+ if policy.allow_locals_access and node_id in context.locals:
721
+ return context.locals[node_id]
722
+ if policy.allow_globals_access and node_id in context.globals:
723
+ return context.globals[node_id]
724
+ if policy.allow_builtins_access and hasattr(builtins, node_id):
725
+ # note: do not use __builtins__, it is implementation detail of cPython
726
+ return getattr(builtins, node_id)
727
+ if not policy.allow_globals_access and not policy.allow_locals_access:
728
+ raise GuardRejection(
729
+ f"Namespace access not allowed in {context.evaluation} mode"
730
+ )
731
+ else:
732
+ raise NameError(f"{node_id} not found in locals, globals, nor builtins")
733
+
734
+
735
+ def _eval_or_create_duck(duck_type, node: ast.Call, context: EvaluationContext):
736
+ policy = EVALUATION_POLICIES[context.evaluation]
737
+ # if allow-listed builtin is on type annotation, instantiate it
738
+ if policy.can_call(duck_type) and not node.keywords:
739
+ args = [eval_node(arg, context) for arg in node.args]
740
+ return duck_type(*args)
741
+ # if custom class is in type annotation, mock it
742
+ return _create_duck_for_heap_type(duck_type)
743
+
744
+
745
+ def _create_duck_for_heap_type(duck_type):
746
+ """Create an imitation of an object of a given type (a duck).
747
+
748
+ Returns the duck or NOT_EVALUATED sentinel if duck could not be created.
749
+ """
750
+ duck = ImpersonatingDuck()
751
+ try:
752
+ # this only works for heap types, not builtins
753
+ duck.__class__ = duck_type
754
+ return duck
755
+ except TypeError:
756
+ pass
757
+ return NOT_EVALUATED
758
+
759
+
622
760
  SUPPORTED_EXTERNAL_GETITEM = {
623
761
  ("pandas", "core", "indexing", "_iLocIndexer"),
624
762
  ("pandas", "core", "indexing", "_LocIndexer"),
@@ -40,6 +40,9 @@ class MagicsDisplay(object):
40
40
  def _repr_pretty_(self, p, cycle):
41
41
  p.text(self._lsmagic())
42
42
 
43
+ def __repr__(self):
44
+ return self.__str__()
45
+
43
46
  def __str__(self):
44
47
  return self._lsmagic()
45
48
 
@@ -1506,7 +1506,7 @@ class ExecutionMagics(Magics):
1506
1506
  @line_cell_magic
1507
1507
  def code_wrap(self, line, cell=None):
1508
1508
  """
1509
- Simple magic to quickly define a code transformer for all IPython's future imput.
1509
+ Simple magic to quickly define a code transformer for all IPython's future input.
1510
1510
 
1511
1511
  ``__code__`` and ``__ret__`` are special variable that represent the code to run
1512
1512
  and the value of the last expression of ``__code__`` respectively.
@@ -16,8 +16,8 @@
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 = 22
20
- _version_patch = 1
19
+ _version_minor = 23
20
+ _version_patch = 0
21
21
  _version_extra = ".dev"
22
22
  # _version_extra = "rc1"
23
23
  _version_extra = "" # Uncomment this for full releases
@@ -1,5 +1,17 @@
1
+ import sys
1
2
  from contextlib import contextmanager
2
- from typing import NamedTuple
3
+ from typing import (
4
+ Annotated,
5
+ AnyStr,
6
+ NamedTuple,
7
+ Literal,
8
+ NewType,
9
+ Optional,
10
+ Protocol,
11
+ TypeGuard,
12
+ Union,
13
+ TypedDict,
14
+ )
3
15
  from functools import partial
4
16
  from IPython.core.guarded_eval import (
5
17
  EvaluationContext,
@@ -11,6 +23,17 @@ from IPython.testing import decorators as dec
11
23
  import pytest
12
24
 
13
25
 
26
+ if sys.version_info < (3, 11):
27
+ from typing_extensions import Self, LiteralString
28
+ else:
29
+ from typing import Self, LiteralString
30
+
31
+ if sys.version_info < (3, 12):
32
+ from typing_extensions import TypeAliasType
33
+ else:
34
+ from typing import TypeAliasType
35
+
36
+
14
37
  def create_context(evaluation: str, **kwargs):
15
38
  return EvaluationContext(locals=kwargs, globals={}, evaluation=evaluation)
16
39
 
@@ -267,23 +290,183 @@ class CallCreatesBuiltin:
267
290
  return frozenset()
268
291
 
269
292
 
293
+ class HasStaticMethod:
294
+ @staticmethod
295
+ def static_method() -> HeapType:
296
+ return HeapType()
297
+
298
+
299
+ class InitReturnsFrozenset:
300
+ def __new__(self) -> frozenset: # type:ignore[misc]
301
+ return frozenset()
302
+
303
+
304
+ class StringAnnotation:
305
+ def heap(self) -> "HeapType":
306
+ return HeapType()
307
+
308
+ def copy(self) -> "StringAnnotation":
309
+ return StringAnnotation()
310
+
311
+
312
+ CustomIntType = NewType("CustomIntType", int)
313
+ CustomHeapType = NewType("CustomHeapType", HeapType)
314
+ IntTypeAlias = TypeAliasType("IntTypeAlias", int)
315
+ HeapTypeAlias = TypeAliasType("HeapTypeAlias", HeapType)
316
+
317
+
318
+ class TestProtocol(Protocol):
319
+ def test_method(self) -> bool:
320
+ pass
321
+
322
+
323
+ class TestProtocolImplementer(TestProtocol):
324
+ def test_method(self) -> bool:
325
+ return True
326
+
327
+
328
+ class Movie(TypedDict):
329
+ name: str
330
+ year: int
331
+
332
+
333
+ class SpecialTyping:
334
+ def custom_int_type(self) -> CustomIntType:
335
+ return CustomIntType(1)
336
+
337
+ def custom_heap_type(self) -> CustomHeapType:
338
+ return CustomHeapType(HeapType())
339
+
340
+ # TODO: remove type:ignore comment once mypy
341
+ # supports explicit calls to `TypeAliasType`, see:
342
+ # https://github.com/python/mypy/issues/16614
343
+ def int_type_alias(self) -> IntTypeAlias: # type:ignore[valid-type]
344
+ return 1
345
+
346
+ def heap_type_alias(self) -> HeapTypeAlias: # type:ignore[valid-type]
347
+ return 1
348
+
349
+ def literal(self) -> Literal[False]:
350
+ return False
351
+
352
+ def literal_string(self) -> LiteralString:
353
+ return "test"
354
+
355
+ def self(self) -> Self:
356
+ return self
357
+
358
+ def any_str(self, x: AnyStr) -> AnyStr:
359
+ return x
360
+
361
+ def annotated(self) -> Annotated[float, "positive number"]:
362
+ return 1
363
+
364
+ def annotated_self(self) -> Annotated[Self, "self with metadata"]:
365
+ self._metadata = "test"
366
+ return self
367
+
368
+ def int_type_guard(self, x) -> TypeGuard[int]:
369
+ return isinstance(x, int)
370
+
371
+ def optional_float(self) -> Optional[float]:
372
+ return 1.0
373
+
374
+ def union_str_and_int(self) -> Union[str, int]:
375
+ return ""
376
+
377
+ def protocol(self) -> TestProtocol:
378
+ return TestProtocolImplementer()
379
+
380
+ def typed_dict(self) -> Movie:
381
+ return {"name": "The Matrix", "year": 1999}
382
+
383
+
270
384
  @pytest.mark.parametrize(
271
- "data,good,bad,expected, equality",
385
+ "data,code,expected,equality",
272
386
  [
273
- [[1, 2, 3], "data.index(2)", "data.append(4)", 1, True],
274
- [{"a": 1}, "data.keys().isdisjoint({})", "data.update()", True, True],
275
- [CallCreatesHeapType(), "data()", "data.__class__()", HeapType, False],
276
- [CallCreatesBuiltin(), "data()", "data.__class__()", frozenset, False],
387
+ [[1, 2, 3], "data.index(2)", 1, True],
388
+ [{"a": 1}, "data.keys().isdisjoint({})", True, True],
389
+ [StringAnnotation(), "data.heap()", HeapType, False],
390
+ [StringAnnotation(), "data.copy()", StringAnnotation, False],
391
+ # test cases for `__call__`
392
+ [CallCreatesHeapType(), "data()", HeapType, False],
393
+ [CallCreatesBuiltin(), "data()", frozenset, False],
394
+ # Test cases for `__init__`
395
+ [HeapType, "data()", HeapType, False],
396
+ [InitReturnsFrozenset, "data()", frozenset, False],
397
+ [HeapType(), "data.__class__()", HeapType, False],
398
+ # supported special cases for typing
399
+ [SpecialTyping(), "data.custom_int_type()", int, False],
400
+ [SpecialTyping(), "data.custom_heap_type()", HeapType, False],
401
+ [SpecialTyping(), "data.int_type_alias()", int, False],
402
+ [SpecialTyping(), "data.heap_type_alias()", HeapType, False],
403
+ [SpecialTyping(), "data.self()", SpecialTyping, False],
404
+ [SpecialTyping(), "data.literal()", False, True],
405
+ [SpecialTyping(), "data.literal_string()", str, False],
406
+ [SpecialTyping(), "data.any_str('a')", str, False],
407
+ [SpecialTyping(), "data.any_str(b'a')", bytes, False],
408
+ [SpecialTyping(), "data.annotated()", float, False],
409
+ [SpecialTyping(), "data.annotated_self()", SpecialTyping, False],
410
+ [SpecialTyping(), "data.int_type_guard()", int, False],
411
+ # test cases for static methods
412
+ [HasStaticMethod, "data.static_method()", HeapType, False],
277
413
  ],
278
414
  )
279
- def test_evaluates_calls(data, good, bad, expected, equality):
280
- context = limited(data=data)
281
- value = guarded_eval(good, context)
415
+ def test_evaluates_calls(data, code, expected, equality):
416
+ context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation)
417
+ value = guarded_eval(code, context)
282
418
  if equality:
283
419
  assert value == expected
284
420
  else:
285
421
  assert isinstance(value, expected)
286
422
 
423
+
424
+ @pytest.mark.parametrize(
425
+ "data,code,expected_attributes",
426
+ [
427
+ [SpecialTyping(), "data.optional_float()", ["is_integer"]],
428
+ [
429
+ SpecialTyping(),
430
+ "data.union_str_and_int()",
431
+ ["capitalize", "as_integer_ratio"],
432
+ ],
433
+ [SpecialTyping(), "data.protocol()", ["test_method"]],
434
+ [SpecialTyping(), "data.typed_dict()", ["keys", "values", "items"]],
435
+ ],
436
+ )
437
+ def test_mocks_attributes_of_call_results(data, code, expected_attributes):
438
+ context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation)
439
+ result = guarded_eval(code, context)
440
+ for attr in expected_attributes:
441
+ assert hasattr(result, attr)
442
+ assert attr in dir(result)
443
+
444
+
445
+ @pytest.mark.parametrize(
446
+ "data,code,expected_items",
447
+ [
448
+ [SpecialTyping(), "data.typed_dict()", {"year": int, "name": str}],
449
+ ],
450
+ )
451
+ def test_mocks_items_of_call_results(data, code, expected_items):
452
+ context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation)
453
+ result = guarded_eval(code, context)
454
+ ipython_keys = result._ipython_key_completions_()
455
+ for key, value in expected_items.items():
456
+ assert isinstance(result[key], value)
457
+ assert key in ipython_keys
458
+
459
+
460
+ @pytest.mark.parametrize(
461
+ "data,bad",
462
+ [
463
+ [[1, 2, 3], "data.append(4)"],
464
+ [{"a": 1}, "data.update()"],
465
+ ],
466
+ )
467
+ def test_rejects_calls_with_side_effects(data, bad):
468
+ context = limited(data=data)
469
+
287
470
  with pytest.raises(GuardRejection):
288
471
  guarded_eval(bad, context)
289
472
 
@@ -4,6 +4,9 @@ This file is only meant to be imported by process.py, not by end-users.
4
4
  """
5
5
 
6
6
 
7
+ from ._process_common import arg_split
8
+
9
+
7
10
  def system(cmd):
8
11
  raise OSError("Not available")
9
12
 
@@ -16,6 +19,5 @@ def check_pid(cmd):
16
19
  raise OSError("Not available")
17
20
 
18
21
 
19
- def arg_split(s, posix=False, strict=True):
20
- """This one could be made to work but it's not clear if it would be useful..."""
21
- raise OSError("Not available")
22
+ # `arg_split` is still used by magics regardless of whether we are on a posix/windows/emscipten
23
+ __all__ = ["system", "getoutput", "check_pid", "arg_split"]
@@ -1,2 +1,2 @@
1
1
  # GENERATED BY setup.py
2
- commit = "cf4a6f5b6"
2
+ commit = "5e7c4a991"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ipython
3
- Version: 8.22.1
3
+ Version: 8.23.0
4
4
  Summary: IPython: Productive Interactive Computing
5
5
  Author: The IPython Development Team
6
6
  Author-email: ipython-dev@python.org
@@ -36,7 +36,7 @@ Requires-Dist: prompt_toolkit<3.1.0,>=3.0.41
36
36
  Requires-Dist: pygments>=2.4.0
37
37
  Requires-Dist: stack_data
38
38
  Requires-Dist: traitlets>=5.13.0
39
- Requires-Dist: typing_extensions; python_version < "3.10"
39
+ Requires-Dist: typing_extensions; python_version < "3.12"
40
40
  Provides-Extra: black
41
41
  Requires-Dist: black; extra == "black"
42
42
  Provides-Extra: doc
@@ -78,8 +78,10 @@ Requires-Dist: nbformat; extra == "test-extra"
78
78
  Requires-Dist: numpy>=1.23; extra == "test-extra"
79
79
  Requires-Dist: pandas; extra == "test-extra"
80
80
  Requires-Dist: trio; extra == "test-extra"
81
+ Provides-Extra: matplotlib
82
+ Requires-Dist: matplotlib; extra == "matplotlib"
81
83
  Provides-Extra: all
82
- Requires-Dist: ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,terminal]; extra == "all"
84
+ Requires-Dist: ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]; extra == "all"
83
85
  Requires-Dist: ipython[test,test_extra]; extra == "all"
84
86
 
85
87
  IPython provides a rich toolkit to help you make the most out of using Python
@@ -2,11 +2,38 @@
2
2
  8.x Series
3
3
  ============
4
4
 
5
- .. _version 8.22:
5
+ .. _version 8.23:
6
6
 
7
- IPython 8.22
7
+ IPython 8.23
8
8
  ============
9
9
 
10
+ Super tiny release of IPython on Sunday – a bit later than usual, which is also
11
+ `🏳️‍⚧️ International Transgender Day of Visibility🏳️‍⚧️
12
+ <https://en.wikipedia.org/wiki/International_Transgender_Day_of_Visibility>`_ –
13
+ so a though for you on this day, you matter and you are valid [1]_.
14
+
15
+ This is a minuscule release with only 5 Pull requests.
16
+
17
+ Main change is :ghpull:`14357` which improve inference from return type
18
+ annotations in completer and the introduction of the optional target
19
+ ``ipython[matplotlib]`` to explicitly request the matplotlib optional
20
+ dependencies.
21
+
22
+ As usual you can find the full list of PRs on GitHub under `the 8.23
23
+ <https://github.com/ipython/ipython/milestone/130?closed=1>`__ milestone.
24
+
25
+ Thanks
26
+ ------
27
+
28
+ Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
29
+ work on IPython and related libraries.
30
+
31
+
32
+ .. _version 8.22:
33
+
34
+ IPython 8.22, 8.22.1 and 8.22.2
35
+ ===============================
36
+
10
37
  Quick release of IPython for this short month of February, with quite a bit of
11
38
  activity with more than 15 PRs.
12
39
 
@@ -19,6 +46,10 @@ I am not going to details all the changes, but among other we have :
19
46
  - Fix crashing IPython when some tracebacks encounter dynamically evaluated
20
47
  code.
21
48
 
49
+ IPython 8.22.1 increase the minimal traitlets version, and 8.22.2 fix a critical
50
+ bug on emscripten preventing to use some magics like ``%matplotlib`` on
51
+ jupyter-light.
52
+
22
53
  API changes
23
54
  -----------
24
55
 
@@ -2200,3 +2231,7 @@ The following attribute/methods have been removed::
2200
2231
  - IPython.terminal.ipapp.LocateIPythonApp.initialize_subcommand
2201
2232
  - IPython.terminal.ipapp.TerminalIPythonApp.deprecated_subcommands
2202
2233
  - IPython.terminal.ipapp.TerminalIPythonApp.initialize_subcommand
2234
+
2235
+ ------
2236
+
2237
+ .. [1] If this make you incomfortable feel free to not use IPython 8.23.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ipython
3
- Version: 8.22.1
3
+ Version: 8.23.0
4
4
  Summary: IPython: Productive Interactive Computing
5
5
  Author: The IPython Development Team
6
6
  Author-email: ipython-dev@python.org
@@ -36,7 +36,7 @@ Requires-Dist: prompt_toolkit<3.1.0,>=3.0.41
36
36
  Requires-Dist: pygments>=2.4.0
37
37
  Requires-Dist: stack_data
38
38
  Requires-Dist: traitlets>=5.13.0
39
- Requires-Dist: typing_extensions; python_version < "3.10"
39
+ Requires-Dist: typing_extensions; python_version < "3.12"
40
40
  Provides-Extra: black
41
41
  Requires-Dist: black; extra == "black"
42
42
  Provides-Extra: doc
@@ -78,8 +78,10 @@ Requires-Dist: nbformat; extra == "test-extra"
78
78
  Requires-Dist: numpy>=1.23; extra == "test-extra"
79
79
  Requires-Dist: pandas; extra == "test-extra"
80
80
  Requires-Dist: trio; extra == "test-extra"
81
+ Provides-Extra: matplotlib
82
+ Requires-Dist: matplotlib; extra == "matplotlib"
81
83
  Provides-Extra: all
82
- Requires-Dist: ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,terminal]; extra == "all"
84
+ Requires-Dist: ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]; extra == "all"
83
85
  Requires-Dist: ipython[test,test_extra]; extra == "all"
84
86
 
85
87
  IPython provides a rich toolkit to help you make the most out of using Python