ipython 8.16.1__tar.gz → 8.17.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 (496) hide show
  1. {ipython-8.16.1 → ipython-8.17.0}/.pre-commit-config.yaml +3 -3
  2. {ipython-8.16.1 → ipython-8.17.0}/IPython/__main__.py +2 -2
  3. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/completerlib.py +2 -1
  4. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/display.py +1 -1
  5. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/events.py +3 -15
  6. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/guarded_eval.py +27 -0
  7. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/inputsplitter.py +20 -12
  8. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/inputtransformer.py +23 -16
  9. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/interactiveshell.py +24 -2
  10. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/packaging.py +64 -25
  11. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/oinspect.py +2 -0
  12. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/release.py +2 -2
  13. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_events.py +0 -13
  14. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_guarded_eval.py +26 -6
  15. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_inputsplitter.py +2 -1
  16. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/lexers.py +128 -119
  17. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/pretty.py +2 -11
  18. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_lexers.py +2 -2
  19. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_pygments.py +2 -4
  20. {ipython-8.16.1 → ipython-8.17.0}/IPython/sphinxext/ipython_console_highlighting.py +2 -6
  21. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/_sysinfo.py +1 -1
  22. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/py3compat.py +1 -0
  23. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/sysinfo.py +7 -6
  24. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_text.py +93 -32
  25. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/text.py +63 -16
  26. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/timing.py +2 -2
  27. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tokenutil.py +12 -7
  28. {ipython-8.16.1 → ipython-8.17.0}/PKG-INFO +9 -5
  29. {ipython-8.16.1 → ipython-8.17.0}/README.rst +4 -2
  30. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/lexer.rst +6 -8
  31. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/development.rst +1 -0
  32. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-0.12.rst +4 -4
  33. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-1.0.rst +2 -2
  34. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-2.0.rst +4 -4
  35. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version5.rst +1 -1
  36. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version8.rst +38 -4
  37. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/PKG-INFO +9 -5
  38. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/entry_points.txt +0 -1
  39. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/requires.txt +6 -4
  40. {ipython-8.16.1 → ipython-8.17.0}/setup.cfg +2 -3
  41. {ipython-8.16.1 → ipython-8.17.0}/setup.py +0 -1
  42. {ipython-8.16.1 → ipython-8.17.0}/.flake8 +0 -0
  43. {ipython-8.16.1 → ipython-8.17.0}/.mailmap +0 -0
  44. {ipython-8.16.1 → ipython-8.17.0}/COPYING.rst +0 -0
  45. {ipython-8.16.1 → ipython-8.17.0}/IPython/__init__.py +0 -0
  46. {ipython-8.16.1 → ipython-8.17.0}/IPython/conftest.py +0 -0
  47. {ipython-8.16.1 → ipython-8.17.0}/IPython/consoleapp.py +0 -0
  48. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/__init__.py +0 -0
  49. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/alias.py +0 -0
  50. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/application.py +0 -0
  51. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/async_helpers.py +0 -0
  52. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/autocall.py +0 -0
  53. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/builtin_trap.py +0 -0
  54. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/compilerop.py +0 -0
  55. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/completer.py +0 -0
  56. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/crashhandler.py +0 -0
  57. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/debugger.py +0 -0
  58. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/display_functions.py +0 -0
  59. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/display_trap.py +0 -0
  60. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/displayhook.py +0 -0
  61. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/displaypub.py +0 -0
  62. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/error.py +0 -0
  63. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/excolors.py +0 -0
  64. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/extensions.py +0 -0
  65. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/formatters.py +0 -0
  66. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/getipython.py +0 -0
  67. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/history.py +0 -0
  68. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/historyapp.py +0 -0
  69. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/hooks.py +0 -0
  70. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/inputtransformer2.py +0 -0
  71. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/latex_symbols.py +0 -0
  72. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/logger.py +0 -0
  73. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/macro.py +0 -0
  74. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magic.py +0 -0
  75. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magic_arguments.py +0 -0
  76. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/__init__.py +0 -0
  77. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/ast_mod.py +0 -0
  78. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/auto.py +0 -0
  79. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/basic.py +0 -0
  80. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/code.py +0 -0
  81. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/config.py +0 -0
  82. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/display.py +0 -0
  83. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/execution.py +0 -0
  84. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/extension.py +0 -0
  85. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/history.py +0 -0
  86. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/logging.py +0 -0
  87. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/namespace.py +0 -0
  88. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/osm.py +0 -0
  89. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/pylab.py +0 -0
  90. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/magics/script.py +0 -0
  91. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/page.py +0 -0
  92. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/payload.py +0 -0
  93. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/payloadpage.py +0 -0
  94. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/prefilter.py +0 -0
  95. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/profile/README_STARTUP +0 -0
  96. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/profileapp.py +0 -0
  97. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/profiledir.py +0 -0
  98. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/prompts.py +0 -0
  99. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/pylabtools.py +0 -0
  100. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/shellapp.py +0 -0
  101. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/splitinput.py +0 -0
  102. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/2x2.jpg +0 -0
  103. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/2x2.png +0 -0
  104. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/__init__.py +0 -0
  105. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/bad_all.py +0 -0
  106. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
  107. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/nonascii.py +0 -0
  108. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/nonascii2.py +0 -0
  109. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/print_argv.py +0 -0
  110. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/refbug.py +0 -0
  111. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/simpleerr.py +0 -0
  112. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/tclass.py +0 -0
  113. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_alias.py +0 -0
  114. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_application.py +0 -0
  115. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_async_helpers.py +0 -0
  116. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_autocall.py +0 -0
  117. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_compilerop.py +0 -0
  118. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_completer.py +0 -0
  119. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_completerlib.py +0 -0
  120. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_debugger.py +0 -0
  121. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_display.py +0 -0
  122. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_displayhook.py +0 -0
  123. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
  124. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_extension.py +0 -0
  125. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_formatters.py +0 -0
  126. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_handlers.py +0 -0
  127. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_history.py +0 -0
  128. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_hooks.py +0 -0
  129. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_imports.py +0 -0
  130. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_inputtransformer.py +0 -0
  131. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
  132. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
  133. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_interactiveshell.py +0 -0
  134. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_iplib.py +0 -0
  135. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_logger.py +0 -0
  136. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_magic.py +0 -0
  137. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_magic_arguments.py +0 -0
  138. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_magic_terminal.py +0 -0
  139. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_oinspect.py +0 -0
  140. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_page.py +0 -0
  141. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_paths.py +0 -0
  142. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_prefilter.py +0 -0
  143. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_profile.py +0 -0
  144. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_prompts.py +0 -0
  145. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_pylabtools.py +0 -0
  146. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_run.py +0 -0
  147. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_shellapp.py +0 -0
  148. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_splitinput.py +0 -0
  149. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/tests/test_ultratb.py +0 -0
  150. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/ultratb.py +0 -0
  151. {ipython-8.16.1 → ipython-8.17.0}/IPython/core/usage.py +0 -0
  152. {ipython-8.16.1 → ipython-8.17.0}/IPython/display.py +0 -0
  153. {ipython-8.16.1 → ipython-8.17.0}/IPython/extensions/__init__.py +0 -0
  154. {ipython-8.16.1 → ipython-8.17.0}/IPython/extensions/autoreload.py +0 -0
  155. {ipython-8.16.1 → ipython-8.17.0}/IPython/extensions/storemagic.py +0 -0
  156. {ipython-8.16.1 → ipython-8.17.0}/IPython/extensions/tests/__init__.py +0 -0
  157. {ipython-8.16.1 → ipython-8.17.0}/IPython/extensions/tests/test_autoreload.py +0 -0
  158. {ipython-8.16.1 → ipython-8.17.0}/IPython/extensions/tests/test_storemagic.py +0 -0
  159. {ipython-8.16.1 → ipython-8.17.0}/IPython/external/__init__.py +0 -0
  160. {ipython-8.16.1 → ipython-8.17.0}/IPython/external/qt_for_kernel.py +0 -0
  161. {ipython-8.16.1 → ipython-8.17.0}/IPython/external/qt_loaders.py +0 -0
  162. {ipython-8.16.1 → ipython-8.17.0}/IPython/external/tests/__init__.py +0 -0
  163. {ipython-8.16.1 → ipython-8.17.0}/IPython/external/tests/test_qt_loaders.py +0 -0
  164. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/__init__.py +0 -0
  165. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/backgroundjobs.py +0 -0
  166. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/clipboard.py +0 -0
  167. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/deepreload.py +0 -0
  168. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/demo.py +0 -0
  169. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/display.py +0 -0
  170. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/editorhooks.py +0 -0
  171. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/guisupport.py +0 -0
  172. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/latextools.py +0 -0
  173. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/__init__.py +0 -0
  174. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test.wav +0 -0
  175. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
  176. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_clipboard.py +0 -0
  177. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_deepreload.py +0 -0
  178. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_display.py +0 -0
  179. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_editorhooks.py +0 -0
  180. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_imports.py +0 -0
  181. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_latextools.py +0 -0
  182. {ipython-8.16.1 → ipython-8.17.0}/IPython/lib/tests/test_pretty.py +0 -0
  183. {ipython-8.16.1 → ipython-8.17.0}/IPython/paths.py +0 -0
  184. {ipython-8.16.1 → ipython-8.17.0}/IPython/py.typed +0 -0
  185. {ipython-8.16.1 → ipython-8.17.0}/IPython/sphinxext/__init__.py +0 -0
  186. {ipython-8.16.1 → ipython-8.17.0}/IPython/sphinxext/custom_doctests.py +0 -0
  187. {ipython-8.16.1 → ipython-8.17.0}/IPython/sphinxext/ipython_directive.py +0 -0
  188. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/__init__.py +0 -0
  189. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/console.py +0 -0
  190. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/debugger.py +0 -0
  191. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/embed.py +0 -0
  192. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/interactiveshell.py +0 -0
  193. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/ipapp.py +0 -0
  194. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/magics.py +0 -0
  195. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/prompts.py +0 -0
  196. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  197. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  198. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  199. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  200. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  201. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  202. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  203. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  204. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  205. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  206. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  207. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/ptutils.py +0 -0
  208. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  209. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  210. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  211. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/shortcuts/filters.py +0 -0
  212. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/__init__.py +0 -0
  213. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
  214. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/test_embed.py +0 -0
  215. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/test_help.py +0 -0
  216. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
  217. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
  218. {ipython-8.16.1 → ipython-8.17.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
  219. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/__init__.py +0 -0
  220. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/decorators.py +0 -0
  221. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/globalipapp.py +0 -0
  222. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/ipunittest.py +0 -0
  223. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/Makefile +0 -0
  224. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/README.txt +0 -0
  225. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/__init__.py +0 -0
  226. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/dtexample.py +0 -0
  227. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  228. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  229. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/setup.py +0 -0
  230. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/simple.py +0 -0
  231. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/simplevars.py +0 -0
  232. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/test_combo.txt +0 -0
  233. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/test_example.txt +0 -0
  234. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  235. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  236. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/plugin/test_refs.py +0 -0
  237. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/skipdoctest.py +0 -0
  238. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/tests/__init__.py +0 -0
  239. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/tests/test_decorators.py +0 -0
  240. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/tests/test_ipunittest.py +0 -0
  241. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/tests/test_tools.py +0 -0
  242. {ipython-8.16.1 → ipython-8.17.0}/IPython/testing/tools.py +0 -0
  243. {ipython-8.16.1 → ipython-8.17.0}/IPython/tests/cve.py +0 -0
  244. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/PyColorize.py +0 -0
  245. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/__init__.py +0 -0
  246. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/_process_cli.py +0 -0
  247. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/_process_common.py +0 -0
  248. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/_process_posix.py +0 -0
  249. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/_process_win32.py +0 -0
  250. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/_process_win32_controller.py +0 -0
  251. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/capture.py +0 -0
  252. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/colorable.py +0 -0
  253. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/coloransi.py +0 -0
  254. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/contexts.py +0 -0
  255. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/daemonize.py +0 -0
  256. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/data.py +0 -0
  257. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/decorators.py +0 -0
  258. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/dir2.py +0 -0
  259. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/docs.py +0 -0
  260. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/encoding.py +0 -0
  261. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/eventful.py +0 -0
  262. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/frame.py +0 -0
  263. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/generics.py +0 -0
  264. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/importstring.py +0 -0
  265. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/io.py +0 -0
  266. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/ipstruct.py +0 -0
  267. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/jsonutil.py +0 -0
  268. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/localinterfaces.py +0 -0
  269. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/log.py +0 -0
  270. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/module_paths.py +0 -0
  271. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/openpy.py +0 -0
  272. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/path.py +0 -0
  273. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/process.py +0 -0
  274. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/sentinel.py +0 -0
  275. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/shimmodule.py +0 -0
  276. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/signatures.py +0 -0
  277. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/strdispatch.py +0 -0
  278. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/syspathcontext.py +0 -0
  279. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tempdir.py +0 -0
  280. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/terminal.py +0 -0
  281. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/__init__.py +0 -0
  282. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_capture.py +0 -0
  283. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_decorators.py +0 -0
  284. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_deprecated.py +0 -0
  285. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_dir2.py +0 -0
  286. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_imports.py +0 -0
  287. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_importstring.py +0 -0
  288. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_io.py +0 -0
  289. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_module_paths.py +0 -0
  290. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_openpy.py +0 -0
  291. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_path.py +0 -0
  292. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_process.py +0 -0
  293. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_pycolorize.py +0 -0
  294. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_shimmodule.py +0 -0
  295. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_sysinfo.py +0 -0
  296. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_tempdir.py +0 -0
  297. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_tokenutil.py +0 -0
  298. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tests/test_wildcard.py +0 -0
  299. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/traitlets.py +0 -0
  300. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/tz.py +0 -0
  301. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/ulinecache.py +0 -0
  302. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/version.py +0 -0
  303. {ipython-8.16.1 → ipython-8.17.0}/IPython/utils/wildcard.py +0 -0
  304. {ipython-8.16.1 → ipython-8.17.0}/LICENSE +0 -0
  305. {ipython-8.16.1 → ipython-8.17.0}/MANIFEST.in +0 -0
  306. {ipython-8.16.1 → ipython-8.17.0}/docs/Makefile +0 -0
  307. {ipython-8.16.1 → ipython-8.17.0}/docs/README.rst +0 -0
  308. {ipython-8.16.1 → ipython-8.17.0}/docs/autogen_api.py +0 -0
  309. {ipython-8.16.1 → ipython-8.17.0}/docs/autogen_config.py +0 -0
  310. {ipython-8.16.1 → ipython-8.17.0}/docs/autogen_magics.py +0 -0
  311. {ipython-8.16.1 → ipython-8.17.0}/docs/autogen_shortcuts.py +0 -0
  312. {ipython-8.16.1 → ipython-8.17.0}/docs/make.cmd +0 -0
  313. {ipython-8.16.1 → ipython-8.17.0}/docs/man/ipython.1 +0 -0
  314. {ipython-8.16.1 → ipython-8.17.0}/docs/requirements.txt +0 -0
  315. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/2.0/running-crop.png +0 -0
  316. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/2.0/running.png +0 -0
  317. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/2.0/treeview.png +0 -0
  318. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/2.0/user-interface.png +0 -0
  319. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/2.0/widgets.png +0 -0
  320. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  321. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  322. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  323. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  324. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  325. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  326. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  327. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  328. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  329. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  330. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  331. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/autosuggest.gif +0 -0
  332. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  333. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  334. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  335. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  336. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  337. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  338. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  339. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  340. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  341. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  342. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  343. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  344. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  345. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  346. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  347. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ms_visual_studio.png +0 -0
  348. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/notebook_specgram.png +0 -0
  349. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/ptshell_features.png +0 -0
  350. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/qtconsole.png +0 -0
  351. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  352. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_images/unicode_completion.png +0 -0
  353. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_static/favicon.ico +0 -0
  354. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_static/logo.png +0 -0
  355. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_static/theme_overrides.css +0 -0
  356. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_templates/breadcrumbs.html +0 -0
  357. {ipython-8.16.1 → ipython-8.17.0}/docs/source/_templates/notebook_redirect.html +0 -0
  358. {ipython-8.16.1 → ipython-8.17.0}/docs/source/about/history.rst +0 -0
  359. {ipython-8.16.1 → ipython-8.17.0}/docs/source/about/index.rst +0 -0
  360. {ipython-8.16.1 → ipython-8.17.0}/docs/source/about/license_and_copyright.rst +0 -0
  361. {ipython-8.16.1 → ipython-8.17.0}/docs/source/api/index.rst +0 -0
  362. {ipython-8.16.1 → ipython-8.17.0}/docs/source/conf.py +0 -0
  363. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/callbacks.rst +0 -0
  364. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/custommagics.rst +0 -0
  365. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/details.rst +0 -0
  366. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/eventloops.rst +0 -0
  367. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/extensions/autoreload.rst +0 -0
  368. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/extensions/index.rst +0 -0
  369. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/extensions/storemagic.rst +0 -0
  370. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/index.rst +0 -0
  371. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/inputtransforms.rst +0 -0
  372. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/integrating.rst +0 -0
  373. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/intro.rst +0 -0
  374. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/options/index.rst +0 -0
  375. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  376. {ipython-8.16.1 → ipython-8.17.0}/docs/source/config/shortcuts/index.rst +0 -0
  377. {ipython-8.16.1 → ipython-8.17.0}/docs/source/coredev/index.rst +0 -0
  378. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/config.rst +0 -0
  379. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/execution.rst +0 -0
  380. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  381. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  382. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/figs/other_kernels.png +0 -0
  383. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/figs/other_kernels.svg +0 -0
  384. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/how_ipython_works.rst +0 -0
  385. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/index.rst +0 -0
  386. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/inputhook_app.rst +0 -0
  387. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/kernels.rst +0 -0
  388. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/messaging.rst +0 -0
  389. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/parallel_connections.rst +0 -0
  390. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/parallel_messages.rst +0 -0
  391. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/pycompat.rst +0 -0
  392. {ipython-8.16.1 → ipython-8.17.0}/docs/source/development/wrapperkernels.rst +0 -0
  393. {ipython-8.16.1 → ipython-8.17.0}/docs/source/index.rst +0 -0
  394. {ipython-8.16.1 → ipython-8.17.0}/docs/source/install/index.rst +0 -0
  395. {ipython-8.16.1 → ipython-8.17.0}/docs/source/install/install.rst +0 -0
  396. {ipython-8.16.1 → ipython-8.17.0}/docs/source/install/kernel_install.rst +0 -0
  397. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/autoawait.rst +0 -0
  398. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/figs/besselj.png +0 -0
  399. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/figs/colors_dark.png +0 -0
  400. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/figs/jn.html +0 -0
  401. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/figs/jn.xhtml +0 -0
  402. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/index.rst +0 -0
  403. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/magics.rst +0 -0
  404. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/plotting.rst +0 -0
  405. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  406. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/reference.rst +0 -0
  407. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/shell.rst +0 -0
  408. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/tips.rst +0 -0
  409. {ipython-8.16.1 → ipython-8.17.0}/docs/source/interactive/tutorial.rst +0 -0
  410. {ipython-8.16.1 → ipython-8.17.0}/docs/source/links.txt +0 -0
  411. {ipython-8.16.1 → ipython-8.17.0}/docs/source/overview.rst +0 -0
  412. {ipython-8.16.1 → ipython-8.17.0}/docs/source/parallel/index.rst +0 -0
  413. {ipython-8.16.1 → ipython-8.17.0}/docs/source/sphinxext.rst +0 -0
  414. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  415. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  416. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  417. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  418. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  419. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  420. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  421. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  422. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/index.rst +0 -0
  423. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/pr/README.md +0 -0
  424. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  425. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  426. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version0.10.rst +0 -0
  427. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version0.11.rst +0 -0
  428. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version0.12.rst +0 -0
  429. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version0.13.rst +0 -0
  430. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version0.8.rst +0 -0
  431. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version0.9.rst +0 -0
  432. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version1.0.rst +0 -0
  433. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version2.0.rst +0 -0
  434. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version3.rst +0 -0
  435. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  436. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version4.rst +0 -0
  437. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version6.rst +0 -0
  438. {ipython-8.16.1 → ipython-8.17.0}/docs/source/whatsnew/version7.rst +0 -0
  439. {ipython-8.16.1 → ipython-8.17.0}/docs/sphinxext/apigen.py +0 -0
  440. {ipython-8.16.1 → ipython-8.17.0}/docs/sphinxext/configtraits.py +0 -0
  441. {ipython-8.16.1 → ipython-8.17.0}/docs/sphinxext/github.py +0 -0
  442. {ipython-8.16.1 → ipython-8.17.0}/docs/sphinxext/magics.py +0 -0
  443. {ipython-8.16.1 → ipython-8.17.0}/examples/Embedding/Index.ipynb +0 -0
  444. {ipython-8.16.1 → ipython-8.17.0}/examples/Embedding/embed_class_long.py +0 -0
  445. {ipython-8.16.1 → ipython-8.17.0}/examples/Embedding/embed_class_short.py +0 -0
  446. {ipython-8.16.1 → ipython-8.17.0}/examples/Embedding/embed_function.py +0 -0
  447. {ipython-8.16.1 → ipython-8.17.0}/examples/Embedding/start_ipython_config.py +0 -0
  448. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
  449. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
  450. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
  451. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
  452. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
  453. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
  454. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
  455. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Index.ipynb +0 -0
  456. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
  457. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
  458. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
  459. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
  460. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
  461. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
  462. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
  463. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
  464. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
  465. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
  466. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/data/flare.json +0 -0
  467. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/example-demo.py +0 -0
  468. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  469. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  470. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  471. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  472. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  473. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/ipython.desktop +0 -0
  474. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
  475. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
  476. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
  477. {ipython-8.16.1 → ipython-8.17.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
  478. {ipython-8.16.1 → ipython-8.17.0}/examples/Index.ipynb +0 -0
  479. {ipython-8.16.1 → ipython-8.17.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
  480. {ipython-8.16.1 → ipython-8.17.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
  481. {ipython-8.16.1 → ipython-8.17.0}/examples/images/FrontendKernel.png +0 -0
  482. {ipython-8.16.1 → ipython-8.17.0}/examples/images/animation.m4v +0 -0
  483. {ipython-8.16.1 → ipython-8.17.0}/examples/images/ipython_logo.png +0 -0
  484. {ipython-8.16.1 → ipython-8.17.0}/examples/images/python_logo.svg +0 -0
  485. {ipython-8.16.1 → ipython-8.17.0}/examples/utils/cwd_prompt.py +0 -0
  486. {ipython-8.16.1 → ipython-8.17.0}/examples/utils/list_pyfiles.ipy +0 -0
  487. {ipython-8.16.1 → ipython-8.17.0}/examples/utils/list_subdirs.ipy +0 -0
  488. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/SOURCES.txt +0 -0
  489. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/dependency_links.txt +0 -0
  490. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/not-zip-safe +0 -0
  491. {ipython-8.16.1 → ipython-8.17.0}/ipython.egg-info/top_level.txt +0 -0
  492. {ipython-8.16.1 → ipython-8.17.0}/long_description.rst +0 -0
  493. {ipython-8.16.1 → ipython-8.17.0}/pyproject.toml +0 -0
  494. {ipython-8.16.1 → ipython-8.17.0}/scripts/ipython.ico +0 -0
  495. {ipython-8.16.1 → ipython-8.17.0}/scripts/ipython_nb.ico +0 -0
  496. {ipython-8.16.1 → ipython-8.17.0}/setupbase.py +0 -0
@@ -2,7 +2,7 @@
2
2
  # See https://pre-commit.com/hooks.html for more hooks
3
3
  repos:
4
4
  - repo: https://github.com/pre-commit/pre-commit-hooks
5
- rev: v3.2.0
5
+ rev: v4.4.0
6
6
  hooks:
7
7
  - id: trailing-whitespace
8
8
  - id: end-of-file-fixer
@@ -10,7 +10,7 @@ repos:
10
10
  - id: check-added-large-files
11
11
 
12
12
  - repo: https://github.com/akaihola/darker
13
- rev: 1.3.1
13
+ rev: 1.7.2
14
14
  hooks:
15
15
  - id: darker
16
-
16
+ additional_dependencies: [isort, mypy, flake8]
@@ -2,13 +2,13 @@
2
2
  # encoding: utf-8
3
3
  """Terminal-based IPython entry point.
4
4
  """
5
- #-----------------------------------------------------------------------------
5
+ # -----------------------------------------------------------------------------
6
6
  # Copyright (c) 2012, IPython Development Team.
7
7
  #
8
8
  # Distributed under the terms of the Modified BSD License.
9
9
  #
10
10
  # The full license is in the file COPYING.txt, distributed with this software.
11
- #-----------------------------------------------------------------------------
11
+ # -----------------------------------------------------------------------------
12
12
 
13
13
  from IPython import start_ipython
14
14
 
@@ -190,7 +190,8 @@ def try_import(mod: str, only_modules=False) -> List[str]:
190
190
  completions.extend(m_all)
191
191
 
192
192
  if m_is_init:
193
- completions.extend(module_list(os.path.dirname(m.__file__)))
193
+ file_ = m.__file__
194
+ completions.extend(module_list(os.path.dirname(file_)))
194
195
  completions_set = {c for c in completions if isinstance(c, str)}
195
196
  completions_set.discard('__init__')
196
197
  return list(completions_set)
@@ -286,7 +286,7 @@ class DisplayObject(object):
286
286
  in the frontend. The MIME type of the data should match the
287
287
  subclasses used, so the Png subclass should be used for 'image/png'
288
288
  data. If the data is a URL, the data will first be downloaded
289
- and then displayed. If
289
+ and then displayed.
290
290
 
291
291
  Parameters
292
292
  ----------
@@ -13,8 +13,6 @@ events and the arguments which will be passed to them.
13
13
  This API is experimental in IPython 2.0, and may be revised in future versions.
14
14
  """
15
15
 
16
- from backcall import callback_prototype
17
-
18
16
 
19
17
  class EventManager(object):
20
18
  """Manage a collection of events and a sequence of callbacks for each.
@@ -63,23 +61,14 @@ class EventManager(object):
63
61
  """
64
62
  if not callable(function):
65
63
  raise TypeError('Need a callable, got %r' % function)
66
- callback_proto = available_events.get(event)
67
64
  if function not in self.callbacks[event]:
68
- self.callbacks[event].append(callback_proto.adapt(function))
65
+ self.callbacks[event].append(function)
69
66
 
70
67
  def unregister(self, event, function):
71
68
  """Remove a callback from the given event."""
72
69
  if function in self.callbacks[event]:
73
70
  return self.callbacks[event].remove(function)
74
71
 
75
- # Remove callback in case ``function`` was adapted by `backcall`.
76
- for callback in self.callbacks[event]:
77
- try:
78
- if callback.__wrapped__ is function:
79
- return self.callbacks[event].remove(callback)
80
- except AttributeError:
81
- pass
82
-
83
72
  raise ValueError('Function {!r} is not registered as a {} callback'.format(function, event))
84
73
 
85
74
  def trigger(self, event, *args, **kwargs):
@@ -100,9 +89,8 @@ class EventManager(object):
100
89
  available_events = {}
101
90
 
102
91
  def _define_event(callback_function):
103
- callback_proto = callback_prototype(callback_function)
104
- available_events[callback_function.__name__] = callback_proto
105
- return callback_proto
92
+ available_events[callback_function.__name__] = callback_function
93
+ return callback_function
106
94
 
107
95
  # ------------------------------------------------------------------------------
108
96
  # Callback prototypes
@@ -1,3 +1,4 @@
1
+ from inspect import signature, Signature
1
2
  from typing import (
2
3
  Any,
3
4
  Callable,
@@ -335,6 +336,7 @@ class _IdentitySubscript:
335
336
 
336
337
  IDENTITY_SUBSCRIPT = _IdentitySubscript()
337
338
  SUBSCRIPT_MARKER = "__SUBSCRIPT_SENTINEL__"
339
+ UNKNOWN_SIGNATURE = Signature()
338
340
 
339
341
 
340
342
  class GuardRejection(Exception):
@@ -415,6 +417,10 @@ UNARY_OP_DUNDERS: Dict[Type[ast.unaryop], Tuple[str, ...]] = {
415
417
  }
416
418
 
417
419
 
420
+ class Duck:
421
+ """A dummy class used to create objects of other classes without calling their ``__init__``"""
422
+
423
+
418
424
  def _find_dunder(node_op, dunders) -> Union[Tuple[str, ...], None]:
419
425
  dunder = None
420
426
  for op, candidate_dunder in dunders.items():
@@ -584,6 +590,27 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
584
590
  if policy.can_call(func) and not node.keywords:
585
591
  args = [eval_node(arg, context) for arg in node.args]
586
592
  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
587
614
  raise GuardRejection(
588
615
  "Call for",
589
616
  func, # not joined to avoid calling `repr`
@@ -31,7 +31,8 @@ import sys
31
31
  import tokenize
32
32
  import warnings
33
33
 
34
- from typing import List
34
+ from typing import List, Tuple, Union, Optional
35
+ from types import CodeType
35
36
 
36
37
  from IPython.core.inputtransformer import (leading_indent,
37
38
  classic_prompt,
@@ -91,7 +92,13 @@ def num_ini_spaces(s):
91
92
  -------
92
93
  n : int
93
94
  """
94
-
95
+ warnings.warn(
96
+ "`num_ini_spaces` is Pending Deprecation since IPython 8.17."
97
+ "It is considered fro removal in in future version. "
98
+ "Please open an issue if you believe it should be kept.",
99
+ stacklevel=2,
100
+ category=PendingDeprecationWarning,
101
+ )
95
102
  ini_spaces = ini_spaces_re.match(s)
96
103
  if ini_spaces:
97
104
  return ini_spaces.end()
@@ -144,7 +151,7 @@ def partial_tokens(s):
144
151
  else:
145
152
  raise
146
153
 
147
- def find_next_indent(code):
154
+ def find_next_indent(code) -> int:
148
155
  """Find the number of spaces for the next line of indentation"""
149
156
  tokens = list(partial_tokens(code))
150
157
  if tokens[-1].type == tokenize.ENDMARKER:
@@ -318,7 +325,7 @@ class InputSplitter(object):
318
325
  # If self.source matches the first value, the second value is a valid
319
326
  # current indentation. Otherwise, the cache is invalid and the indentation
320
327
  # must be recalculated.
321
- _indent_spaces_cache = None, None
328
+ _indent_spaces_cache: Union[Tuple[None, None], Tuple[str, int]] = None, None
322
329
  # String, indicating the default input encoding. It is computed by default
323
330
  # at initialization time via get_input_encoding(), but it can be reset by a
324
331
  # client with specific knowledge of the encoding.
@@ -326,11 +333,11 @@ class InputSplitter(object):
326
333
  # String where the current full source input is stored, properly encoded.
327
334
  # Reading this attribute is the normal way of querying the currently pushed
328
335
  # source code, that has been properly encoded.
329
- source = ''
336
+ source: str = ""
330
337
  # Code object corresponding to the current source. It is automatically
331
338
  # synced to the source, so it can be queried at any time to obtain the code
332
339
  # object; it will be None if the source doesn't compile to valid Python.
333
- code = None
340
+ code: Optional[CodeType] = None
334
341
 
335
342
  # Private attributes
336
343
 
@@ -339,9 +346,9 @@ class InputSplitter(object):
339
346
  # Command compiler
340
347
  _compile: codeop.CommandCompiler
341
348
  # Boolean indicating whether the current block is complete
342
- _is_complete = None
349
+ _is_complete: Optional[bool] = None
343
350
  # Boolean indicating whether the current block has an unrecoverable syntax error
344
- _is_invalid = False
351
+ _is_invalid: bool = False
345
352
 
346
353
  def __init__(self) -> None:
347
354
  """Create a new InputSplitter instance."""
@@ -511,9 +518,10 @@ class InputSplitter(object):
511
518
  # General fallback - accept more code
512
519
  return True
513
520
 
514
- def get_indent_spaces(self):
521
+ def get_indent_spaces(self) -> int:
515
522
  sourcefor, n = self._indent_spaces_cache
516
523
  if sourcefor == self.source:
524
+ assert n is not None
517
525
  return n
518
526
 
519
527
  # self.source always has a trailing newline
@@ -562,7 +570,7 @@ class IPythonInputSplitter(InputSplitter):
562
570
  # Private attributes
563
571
 
564
572
  # List with lines of raw input accumulated so far.
565
- _buffer_raw = None
573
+ _buffer_raw: List[str]
566
574
 
567
575
  def __init__(self, line_input_checker=True, physical_line_transforms=None,
568
576
  logical_line_transforms=None, python_line_transforms=None):
@@ -652,8 +660,8 @@ class IPythonInputSplitter(InputSplitter):
652
660
  tmp = transform.reset()
653
661
  if tmp is not None:
654
662
  yield tmp
655
-
656
- out = []
663
+
664
+ out: List[str] = []
657
665
  for t in self.transforms_in_use:
658
666
  out = _flush(t, out)
659
667
 
@@ -71,8 +71,8 @@ class InputTransformer(metaclass=abc.ABCMeta):
71
71
  """
72
72
  @functools.wraps(func)
73
73
  def transformer_factory(**kwargs):
74
- return cls(func, **kwargs)
75
-
74
+ return cls(func, **kwargs) # type: ignore [call-arg]
75
+
76
76
  return transformer_factory
77
77
 
78
78
  class StatelessInputTransformer(InputTransformer):
@@ -194,7 +194,7 @@ def assemble_logical_lines():
194
194
  line = ''.join(parts)
195
195
 
196
196
  # Utilities
197
- def _make_help_call(target, esc, lspace):
197
+ def _make_help_call(target: str, esc: str, lspace: str) -> str:
198
198
  """Prepares a pinfo(2)/psearch call from a target name and the escape
199
199
  (i.e. ? or ??)"""
200
200
  method = 'pinfo2' if esc == '??' \
@@ -212,17 +212,19 @@ def _make_help_call(target, esc, lspace):
212
212
 
213
213
 
214
214
  # These define the transformations for the different escape characters.
215
- def _tr_system(line_info):
215
+ def _tr_system(line_info: LineInfo):
216
216
  "Translate lines escaped with: !"
217
217
  cmd = line_info.line.lstrip().lstrip(ESC_SHELL)
218
218
  return '%sget_ipython().system(%r)' % (line_info.pre, cmd)
219
219
 
220
- def _tr_system2(line_info):
220
+
221
+ def _tr_system2(line_info: LineInfo):
221
222
  "Translate lines escaped with: !!"
222
223
  cmd = line_info.line.lstrip()[2:]
223
224
  return '%sget_ipython().getoutput(%r)' % (line_info.pre, cmd)
224
225
 
225
- def _tr_help(line_info):
226
+
227
+ def _tr_help(line_info: LineInfo):
226
228
  "Translate lines escaped with: ?/??"
227
229
  # A naked help line should just fire the intro help screen
228
230
  if not line_info.line[1:]:
@@ -230,7 +232,8 @@ def _tr_help(line_info):
230
232
 
231
233
  return _make_help_call(line_info.ifun, line_info.esc, line_info.pre)
232
234
 
233
- def _tr_magic(line_info):
235
+
236
+ def _tr_magic(line_info: LineInfo):
234
237
  "Translate lines escaped with: %"
235
238
  tpl = '%sget_ipython().run_line_magic(%r, %r)'
236
239
  if line_info.line.startswith(ESC_MAGIC2):
@@ -241,17 +244,20 @@ def _tr_magic(line_info):
241
244
  t_magic_name = t_magic_name.lstrip(ESC_MAGIC)
242
245
  return tpl % (line_info.pre, t_magic_name, t_magic_arg_s)
243
246
 
244
- def _tr_quote(line_info):
247
+
248
+ def _tr_quote(line_info: LineInfo):
245
249
  "Translate lines escaped with: ,"
246
250
  return '%s%s("%s")' % (line_info.pre, line_info.ifun,
247
251
  '", "'.join(line_info.the_rest.split()) )
248
252
 
249
- def _tr_quote2(line_info):
253
+
254
+ def _tr_quote2(line_info: LineInfo):
250
255
  "Translate lines escaped with: ;"
251
256
  return '%s%s("%s")' % (line_info.pre, line_info.ifun,
252
257
  line_info.the_rest)
253
258
 
254
- def _tr_paren(line_info):
259
+
260
+ def _tr_paren(line_info: LineInfo):
255
261
  "Translate lines escaped with: /"
256
262
  return '%s%s(%s)' % (line_info.pre, line_info.ifun,
257
263
  ", ".join(line_info.the_rest.split()))
@@ -266,9 +272,8 @@ tr = { ESC_SHELL : _tr_system,
266
272
  ESC_PAREN : _tr_paren }
267
273
 
268
274
  @StatelessInputTransformer.wrap
269
- def escaped_commands(line):
270
- """Transform escaped commands - %magic, !system, ?help + various autocalls.
271
- """
275
+ def escaped_commands(line: str):
276
+ """Transform escaped commands - %magic, !system, ?help + various autocalls."""
272
277
  if not line or line.isspace():
273
278
  return line
274
279
  lineinf = LineInfo(line)
@@ -342,20 +347,22 @@ def ends_in_comment_or_string(src):
342
347
 
343
348
 
344
349
  @StatelessInputTransformer.wrap
345
- def help_end(line):
350
+ def help_end(line: str):
346
351
  """Translate lines with ?/?? at the end"""
347
352
  m = _help_end_re.search(line)
348
353
  if m is None or ends_in_comment_or_string(line):
349
354
  return line
350
355
  target = m.group(1)
351
356
  esc = m.group(3)
352
- lspace = _initial_space_re.match(line).group(0)
357
+ match = _initial_space_re.match(line)
358
+ assert match is not None
359
+ lspace = match.group(0)
353
360
 
354
361
  return _make_help_call(target, esc, lspace)
355
362
 
356
363
 
357
364
  @CoroutineInputTransformer.wrap
358
- def cellmagic(end_on_blank_line=False):
365
+ def cellmagic(end_on_blank_line: bool = False):
359
366
  """Captures & transforms cell magics.
360
367
 
361
368
  After a cell magic is started, this stores up any lines it gets until it is
@@ -21,6 +21,7 @@ import inspect
21
21
  import os
22
22
  import re
23
23
  import runpy
24
+ import shutil
24
25
  import subprocess
25
26
  import sys
26
27
  import tempfile
@@ -36,7 +37,28 @@ from typing import List as ListType, Dict as DictType, Any as AnyType
36
37
  from typing import Optional, Sequence, Tuple
37
38
  from warnings import warn
38
39
 
39
- from pickleshare import PickleShareDB
40
+ try:
41
+ from pickleshare import PickleShareDB
42
+ except ModuleNotFoundError:
43
+
44
+ class PickleShareDB: # type: ignore [no-redef]
45
+ def __init__(self, path):
46
+ pass
47
+
48
+ def get(self, key, default):
49
+ warn(
50
+ f"using {key} requires you to install the `pickleshare` library.",
51
+ stacklevel=2,
52
+ )
53
+ return default
54
+
55
+ def __setitem__(self, key, value):
56
+ warn(
57
+ f"using {key} requires you to install the `pickleshare` library.",
58
+ stacklevel=2,
59
+ )
60
+
61
+
40
62
  from tempfile import TemporaryDirectory
41
63
  from traitlets import (
42
64
  Any,
@@ -3902,7 +3924,7 @@ class InteractiveShell(SingletonConfigurable):
3902
3924
  del self.tempfiles
3903
3925
  for tdir in self.tempdirs:
3904
3926
  try:
3905
- tdir.rmdir()
3927
+ shutil.rmtree(tdir)
3906
3928
  self.tempdirs.remove(tdir)
3907
3929
  except FileNotFoundError:
3908
3930
  pass
@@ -8,6 +8,7 @@
8
8
  # The full license is in the file COPYING.txt, distributed with this software.
9
9
  #-----------------------------------------------------------------------------
10
10
 
11
+ import functools
11
12
  import re
12
13
  import shlex
13
14
  import sys
@@ -16,33 +17,49 @@ from pathlib import Path
16
17
  from IPython.core.magic import Magics, magics_class, line_magic
17
18
 
18
19
 
19
- def _is_conda_environment():
20
- """Return True if the current Python executable is in a conda env"""
21
- # TODO: does this need to change on windows?
22
- return Path(sys.prefix, "conda-meta", "history").exists()
20
+ def is_conda_environment(func):
21
+ @functools.wraps(func)
22
+ def wrapper(*args, **kwargs):
23
+ """Return True if the current Python executable is in a conda env"""
24
+ # TODO: does this need to change on windows?
25
+ if not Path(sys.prefix, "conda-meta", "history").exists():
26
+ raise ValueError(
27
+ "The python kernel does not appear to be a conda environment. "
28
+ "Please use ``%pip install`` instead."
29
+ )
30
+ return func(*args, **kwargs)
23
31
 
32
+ return wrapper
24
33
 
25
- def _get_conda_executable():
26
- """Find the path to the conda executable"""
34
+
35
+ def _get_conda_like_executable(command):
36
+ """Find the path to the given executable
37
+
38
+ Parameters
39
+ ----------
40
+
41
+ executable: string
42
+ Value should be: conda, mamba or micromamba
43
+ """
27
44
  # Check if there is a conda executable in the same directory as the Python executable.
28
45
  # This is the case within conda's root environment.
29
- conda = Path(sys.executable).parent / "conda"
30
- if conda.is_file():
31
- return str(conda)
46
+ executable = Path(sys.executable).parent / command
47
+ if executable.is_file():
48
+ return str(executable)
32
49
 
33
50
  # Otherwise, attempt to extract the executable from conda history.
34
51
  # This applies in any conda environment.
35
52
  history = Path(sys.prefix, "conda-meta", "history").read_text(encoding="utf-8")
36
53
  match = re.search(
37
- r"^#\s*cmd:\s*(?P<command>.*conda)\s[create|install]",
54
+ rf"^#\s*cmd:\s*(?P<command>.*{executable})\s[create|install]",
38
55
  history,
39
56
  flags=re.MULTILINE,
40
57
  )
41
58
  if match:
42
59
  return match.groupdict()["command"]
43
60
 
44
- # Fallback: assume conda is available on the system path.
45
- return "conda"
61
+ # Fallback: assume the executable is available on the system path.
62
+ return command
46
63
 
47
64
 
48
65
  CONDA_COMMANDS_REQUIRING_PREFIX = {
@@ -76,18 +93,7 @@ class PackagingMagics(Magics):
76
93
 
77
94
  print("Note: you may need to restart the kernel to use updated packages.")
78
95
 
79
- @line_magic
80
- def conda(self, line):
81
- """Run the conda package manager within the current kernel.
82
-
83
- Usage:
84
- %conda install [pkgs]
85
- """
86
- if not _is_conda_environment():
87
- raise ValueError("The python kernel does not appear to be a conda environment. "
88
- "Please use ``%pip install`` instead.")
89
-
90
- conda = _get_conda_executable()
96
+ def _run_command(self, cmd, line):
91
97
  args = shlex.split(line)
92
98
  command = args[0] if len(args) > 0 else ""
93
99
  args = args[1:] if len(args) > 1 else [""]
@@ -108,5 +114,38 @@ class PackagingMagics(Magics):
108
114
  if needs_prefix and not has_prefix:
109
115
  extra_args.extend(["--prefix", sys.prefix])
110
116
 
111
- self.shell.system(' '.join([conda, command] + extra_args + args))
117
+ self.shell.system(" ".join([cmd, command] + extra_args + args))
112
118
  print("\nNote: you may need to restart the kernel to use updated packages.")
119
+
120
+ @line_magic
121
+ @is_conda_environment
122
+ def conda(self, line):
123
+ """Run the conda package manager within the current kernel.
124
+
125
+ Usage:
126
+ %conda install [pkgs]
127
+ """
128
+ conda = _get_conda_like_executable("conda")
129
+ self._run_command(conda, line)
130
+
131
+ @line_magic
132
+ @is_conda_environment
133
+ def mamba(self, line):
134
+ """Run the mamba package manager within the current kernel.
135
+
136
+ Usage:
137
+ %mamba install [pkgs]
138
+ """
139
+ mamba = _get_conda_like_executable("mamba")
140
+ self._run_command(mamba, line)
141
+
142
+ @line_magic
143
+ @is_conda_environment
144
+ def micromamba(self, line):
145
+ """Run the conda package manager within the current kernel.
146
+
147
+ Usage:
148
+ %micromamba install [pkgs]
149
+ """
150
+ micromamba = _get_conda_like_executable("micromamba")
151
+ self._run_command(micromamba, line)
@@ -416,6 +416,8 @@ class Inspector(Colorable):
416
416
 
417
417
  If any exception is generated, None is returned instead and the
418
418
  exception is suppressed."""
419
+ if not callable(obj):
420
+ return None
419
421
  try:
420
422
  return _render_signature(signature(obj), oname)
421
423
  except:
@@ -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 = 16
20
- _version_patch = 1
19
+ _version_minor = 17
20
+ _version_patch = 0
21
21
  _version_extra = ".dev"
22
22
  # _version_extra = "rc1"
23
23
  _version_extra = "" # Uncomment this for full releases
@@ -76,16 +76,3 @@ class CallbackTests(unittest.TestCase):
76
76
  self.em.trigger('ping_received')
77
77
  self.assertEqual([True, True, False], invoked)
78
78
  self.assertEqual([func3], self.em.callbacks['ping_received'])
79
-
80
- def test_ignore_event_arguments_if_no_argument_required(self):
81
- call_count = [0]
82
- def event_with_no_argument():
83
- call_count[0] += 1
84
-
85
- self.em.register('event_with_argument', event_with_no_argument)
86
- self.em.trigger('event_with_argument', 'the argument')
87
- self.assertEqual(call_count[0], 1)
88
-
89
- self.em.unregister('event_with_argument', event_with_no_argument)
90
- self.em.trigger('ping_received')
91
- self.assertEqual(call_count[0], 1)
@@ -253,16 +253,36 @@ def test_method_descriptor():
253
253
  assert guarded_eval("list.copy.__name__", context) == "copy"
254
254
 
255
255
 
256
+ class HeapType:
257
+ pass
258
+
259
+
260
+ class CallCreatesHeapType:
261
+ def __call__(self) -> HeapType:
262
+ return HeapType()
263
+
264
+
265
+ class CallCreatesBuiltin:
266
+ def __call__(self) -> frozenset:
267
+ return frozenset()
268
+
269
+
256
270
  @pytest.mark.parametrize(
257
- "data,good,bad,expected",
271
+ "data,good,bad,expected, equality",
258
272
  [
259
- [[1, 2, 3], "data.index(2)", "data.append(4)", 1],
260
- [{"a": 1}, "data.keys().isdisjoint({})", "data.update()", True],
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],
261
277
  ],
262
278
  )
263
- def test_evaluates_calls(data, good, bad, expected):
279
+ def test_evaluates_calls(data, good, bad, expected, equality):
264
280
  context = limited(data=data)
265
- assert guarded_eval(good, context) == expected
281
+ value = guarded_eval(good, context)
282
+ if equality:
283
+ assert value == expected
284
+ else:
285
+ assert isinstance(value, expected)
266
286
 
267
287
  with pytest.raises(GuardRejection):
268
288
  guarded_eval(bad, context)
@@ -534,7 +554,7 @@ def test_unbind_method():
534
554
  def test_assumption_instance_attr_do_not_matter():
535
555
  """This is semi-specified in Python documentation.
536
556
 
537
- However, since the specification says 'not guaranted
557
+ However, since the specification says 'not guaranteed
538
558
  to work' rather than 'is forbidden to work', future
539
559
  versions could invalidate this assumptions. This test
540
560
  is meant to catch such a change if it ever comes true.
@@ -77,7 +77,8 @@ def test_spaces():
77
77
  ('\tx', 1),
78
78
  ('\t x', 2),
79
79
  ]
80
- tt.check_pairs(isp.num_ini_spaces, tests)
80
+ with pytest.warns(PendingDeprecationWarning):
81
+ tt.check_pairs(isp.num_ini_spaces, tests)
81
82
 
82
83
 
83
84
  def test_remove_comments():