ipython 8.26.0__tar.gz → 8.27.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.26.0 → ipython-8.27.0}/IPython/core/completer.py +69 -26
  2. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/pylab.py +1 -1
  3. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/prefilter.py +4 -2
  4. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/profiledir.py +32 -13
  5. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/release.py +1 -1
  6. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/splitinput.py +9 -2
  7. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_completer.py +21 -11
  8. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_debugger.py +58 -45
  9. ipython-8.27.0/IPython/core/tests/test_handlers.py +75 -0
  10. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_oinspect.py +5 -5
  11. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_prefilter.py +23 -11
  12. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_pylabtools.py +23 -0
  13. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_splitinput.py +7 -5
  14. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_ultratb.py +12 -0
  15. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/ultratb.py +23 -20
  16. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_sysinfo.py +1 -1
  17. {ipython-8.26.0/ipython.egg-info → ipython-8.27.0}/PKG-INFO +1 -1
  18. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/custommagics.rst +2 -2
  19. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version8.rst +31 -0
  20. {ipython-8.26.0 → ipython-8.27.0/ipython.egg-info}/PKG-INFO +1 -1
  21. {ipython-8.26.0 → ipython-8.27.0}/ipython.egg-info/SOURCES.txt +0 -2
  22. ipython-8.26.0/IPython/core/tests/test_handlers.py +0 -97
  23. {ipython-8.26.0 → ipython-8.27.0}/.flake8 +0 -0
  24. {ipython-8.26.0 → ipython-8.27.0}/.mailmap +0 -0
  25. {ipython-8.26.0 → ipython-8.27.0}/.pre-commit-config.yaml +0 -0
  26. {ipython-8.26.0 → ipython-8.27.0}/COPYING.rst +0 -0
  27. {ipython-8.26.0 → ipython-8.27.0}/IPython/__init__.py +0 -0
  28. {ipython-8.26.0 → ipython-8.27.0}/IPython/__main__.py +0 -0
  29. {ipython-8.26.0 → ipython-8.27.0}/IPython/conftest.py +0 -0
  30. {ipython-8.26.0 → ipython-8.27.0}/IPython/consoleapp.py +0 -0
  31. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/__init__.py +0 -0
  32. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/alias.py +0 -0
  33. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/application.py +0 -0
  34. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/async_helpers.py +0 -0
  35. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/autocall.py +0 -0
  36. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/builtin_trap.py +0 -0
  37. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/compilerop.py +0 -0
  38. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/completerlib.py +0 -0
  39. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/crashhandler.py +0 -0
  40. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/debugger.py +0 -0
  41. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/display.py +0 -0
  42. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/display_functions.py +0 -0
  43. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/display_trap.py +0 -0
  44. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/displayhook.py +0 -0
  45. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/displaypub.py +0 -0
  46. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/error.py +0 -0
  47. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/events.py +0 -0
  48. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/excolors.py +0 -0
  49. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/extensions.py +0 -0
  50. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/formatters.py +0 -0
  51. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/getipython.py +0 -0
  52. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/guarded_eval.py +0 -0
  53. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/history.py +0 -0
  54. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/historyapp.py +0 -0
  55. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/hooks.py +0 -0
  56. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/inputsplitter.py +0 -0
  57. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/inputtransformer.py +0 -0
  58. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/inputtransformer2.py +0 -0
  59. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/interactiveshell.py +0 -0
  60. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/latex_symbols.py +0 -0
  61. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/logger.py +0 -0
  62. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/macro.py +0 -0
  63. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magic.py +0 -0
  64. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magic_arguments.py +0 -0
  65. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/__init__.py +0 -0
  66. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/ast_mod.py +0 -0
  67. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/auto.py +0 -0
  68. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/basic.py +0 -0
  69. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/code.py +0 -0
  70. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/config.py +0 -0
  71. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/display.py +0 -0
  72. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/execution.py +0 -0
  73. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/extension.py +0 -0
  74. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/history.py +0 -0
  75. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/logging.py +0 -0
  76. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/namespace.py +0 -0
  77. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/osm.py +0 -0
  78. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/packaging.py +0 -0
  79. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/magics/script.py +0 -0
  80. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/oinspect.py +0 -0
  81. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/page.py +0 -0
  82. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/payload.py +0 -0
  83. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/payloadpage.py +0 -0
  84. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/profile/README_STARTUP +0 -0
  85. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/profileapp.py +0 -0
  86. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/prompts.py +0 -0
  87. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/pylabtools.py +0 -0
  88. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/shellapp.py +0 -0
  89. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/2x2.jpg +0 -0
  90. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/2x2.png +0 -0
  91. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/__init__.py +0 -0
  92. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/bad_all.py +0 -0
  93. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
  94. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/nonascii.py +0 -0
  95. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/nonascii2.py +0 -0
  96. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/print_argv.py +0 -0
  97. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/refbug.py +0 -0
  98. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/simpleerr.py +0 -0
  99. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/tclass.py +0 -0
  100. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_alias.py +0 -0
  101. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_application.py +0 -0
  102. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_async_helpers.py +0 -0
  103. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_autocall.py +0 -0
  104. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_compilerop.py +0 -0
  105. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_completerlib.py +0 -0
  106. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_display.py +0 -0
  107. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_displayhook.py +0 -0
  108. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_events.py +0 -0
  109. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
  110. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_extension.py +0 -0
  111. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_formatters.py +0 -0
  112. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_guarded_eval.py +0 -0
  113. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_history.py +0 -0
  114. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_hooks.py +0 -0
  115. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_imports.py +0 -0
  116. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_inputsplitter.py +0 -0
  117. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_inputtransformer.py +0 -0
  118. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
  119. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
  120. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_interactiveshell.py +0 -0
  121. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_iplib.py +0 -0
  122. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_logger.py +0 -0
  123. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_magic.py +0 -0
  124. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_magic_arguments.py +0 -0
  125. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_magic_terminal.py +0 -0
  126. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_page.py +0 -0
  127. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_paths.py +0 -0
  128. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_profile.py +0 -0
  129. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_prompts.py +0 -0
  130. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_run.py +0 -0
  131. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/tests/test_shellapp.py +0 -0
  132. {ipython-8.26.0 → ipython-8.27.0}/IPython/core/usage.py +0 -0
  133. {ipython-8.26.0 → ipython-8.27.0}/IPython/display.py +0 -0
  134. {ipython-8.26.0 → ipython-8.27.0}/IPython/extensions/__init__.py +0 -0
  135. {ipython-8.26.0 → ipython-8.27.0}/IPython/extensions/autoreload.py +0 -0
  136. {ipython-8.26.0 → ipython-8.27.0}/IPython/extensions/storemagic.py +0 -0
  137. {ipython-8.26.0 → ipython-8.27.0}/IPython/extensions/tests/__init__.py +0 -0
  138. {ipython-8.26.0 → ipython-8.27.0}/IPython/extensions/tests/test_autoreload.py +0 -0
  139. {ipython-8.26.0 → ipython-8.27.0}/IPython/extensions/tests/test_storemagic.py +0 -0
  140. {ipython-8.26.0 → ipython-8.27.0}/IPython/external/__init__.py +0 -0
  141. {ipython-8.26.0 → ipython-8.27.0}/IPython/external/qt_for_kernel.py +0 -0
  142. {ipython-8.26.0 → ipython-8.27.0}/IPython/external/qt_loaders.py +0 -0
  143. {ipython-8.26.0 → ipython-8.27.0}/IPython/external/tests/__init__.py +0 -0
  144. {ipython-8.26.0 → ipython-8.27.0}/IPython/external/tests/test_qt_loaders.py +0 -0
  145. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/__init__.py +0 -0
  146. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/backgroundjobs.py +0 -0
  147. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/clipboard.py +0 -0
  148. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/deepreload.py +0 -0
  149. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/demo.py +0 -0
  150. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/display.py +0 -0
  151. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/editorhooks.py +0 -0
  152. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/guisupport.py +0 -0
  153. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/latextools.py +0 -0
  154. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/lexers.py +0 -0
  155. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/pretty.py +0 -0
  156. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/__init__.py +0 -0
  157. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test.wav +0 -0
  158. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
  159. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_clipboard.py +0 -0
  160. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_deepreload.py +0 -0
  161. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_display.py +0 -0
  162. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_editorhooks.py +0 -0
  163. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_imports.py +0 -0
  164. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_latextools.py +0 -0
  165. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_lexers.py +0 -0
  166. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_pretty.py +0 -0
  167. {ipython-8.26.0 → ipython-8.27.0}/IPython/lib/tests/test_pygments.py +0 -0
  168. {ipython-8.26.0 → ipython-8.27.0}/IPython/paths.py +0 -0
  169. {ipython-8.26.0 → ipython-8.27.0}/IPython/py.typed +0 -0
  170. {ipython-8.26.0 → ipython-8.27.0}/IPython/sphinxext/__init__.py +0 -0
  171. {ipython-8.26.0 → ipython-8.27.0}/IPython/sphinxext/custom_doctests.py +0 -0
  172. {ipython-8.26.0 → ipython-8.27.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  173. {ipython-8.26.0 → ipython-8.27.0}/IPython/sphinxext/ipython_directive.py +0 -0
  174. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/__init__.py +0 -0
  175. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/console.py +0 -0
  176. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/debugger.py +0 -0
  177. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/embed.py +0 -0
  178. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/interactiveshell.py +0 -0
  179. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/ipapp.py +0 -0
  180. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/magics.py +0 -0
  181. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/prompts.py +0 -0
  182. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  183. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  184. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  185. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  186. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  187. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  188. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  189. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  190. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  191. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  192. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  193. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/ptutils.py +0 -0
  194. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  195. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  196. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  197. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/shortcuts/filters.py +0 -0
  198. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/__init__.py +0 -0
  199. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
  200. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/test_embed.py +0 -0
  201. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/test_help.py +0 -0
  202. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
  203. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
  204. {ipython-8.26.0 → ipython-8.27.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
  205. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/__init__.py +0 -0
  206. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/decorators.py +0 -0
  207. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/globalipapp.py +0 -0
  208. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/ipunittest.py +0 -0
  209. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/Makefile +0 -0
  210. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/README.txt +0 -0
  211. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/__init__.py +0 -0
  212. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/dtexample.py +0 -0
  213. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  214. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  215. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/setup.py +0 -0
  216. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/simple.py +0 -0
  217. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/simplevars.py +0 -0
  218. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/test_combo.txt +0 -0
  219. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/test_example.txt +0 -0
  220. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  221. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  222. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/plugin/test_refs.py +0 -0
  223. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/skipdoctest.py +0 -0
  224. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/tests/__init__.py +0 -0
  225. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/tests/test_decorators.py +0 -0
  226. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/tests/test_ipunittest.py +0 -0
  227. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/tests/test_tools.py +0 -0
  228. {ipython-8.26.0 → ipython-8.27.0}/IPython/testing/tools.py +0 -0
  229. {ipython-8.26.0 → ipython-8.27.0}/IPython/tests/cve.py +0 -0
  230. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/PyColorize.py +0 -0
  231. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/__init__.py +0 -0
  232. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_process_cli.py +0 -0
  233. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_process_common.py +0 -0
  234. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_process_emscripten.py +0 -0
  235. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_process_posix.py +0 -0
  236. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_process_win32.py +0 -0
  237. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/_process_win32_controller.py +0 -0
  238. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/capture.py +0 -0
  239. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/colorable.py +0 -0
  240. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/coloransi.py +0 -0
  241. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/contexts.py +0 -0
  242. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/daemonize.py +0 -0
  243. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/data.py +0 -0
  244. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/decorators.py +0 -0
  245. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/dir2.py +0 -0
  246. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/docs.py +0 -0
  247. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/encoding.py +0 -0
  248. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/eventful.py +0 -0
  249. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/frame.py +0 -0
  250. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/generics.py +0 -0
  251. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/importstring.py +0 -0
  252. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/io.py +0 -0
  253. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/ipstruct.py +0 -0
  254. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/jsonutil.py +0 -0
  255. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/localinterfaces.py +0 -0
  256. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/log.py +0 -0
  257. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/module_paths.py +0 -0
  258. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/openpy.py +0 -0
  259. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/path.py +0 -0
  260. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/process.py +0 -0
  261. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/py3compat.py +0 -0
  262. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/sentinel.py +0 -0
  263. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/shimmodule.py +0 -0
  264. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/signatures.py +0 -0
  265. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/strdispatch.py +0 -0
  266. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/sysinfo.py +0 -0
  267. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/syspathcontext.py +0 -0
  268. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tempdir.py +0 -0
  269. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/terminal.py +0 -0
  270. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/__init__.py +0 -0
  271. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_capture.py +0 -0
  272. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_decorators.py +0 -0
  273. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_deprecated.py +0 -0
  274. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_dir2.py +0 -0
  275. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_imports.py +0 -0
  276. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_importstring.py +0 -0
  277. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_io.py +0 -0
  278. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_module_paths.py +0 -0
  279. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_openpy.py +0 -0
  280. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_path.py +0 -0
  281. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_process.py +0 -0
  282. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_pycolorize.py +0 -0
  283. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_shimmodule.py +0 -0
  284. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_sysinfo.py +0 -0
  285. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_tempdir.py +0 -0
  286. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_text.py +0 -0
  287. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_tokenutil.py +0 -0
  288. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tests/test_wildcard.py +0 -0
  289. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/text.py +0 -0
  290. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/timing.py +0 -0
  291. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tokenutil.py +0 -0
  292. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/traitlets.py +0 -0
  293. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/tz.py +0 -0
  294. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/ulinecache.py +0 -0
  295. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/version.py +0 -0
  296. {ipython-8.26.0 → ipython-8.27.0}/IPython/utils/wildcard.py +0 -0
  297. {ipython-8.26.0 → ipython-8.27.0}/LICENSE +0 -0
  298. {ipython-8.26.0 → ipython-8.27.0}/MANIFEST.in +0 -0
  299. {ipython-8.26.0 → ipython-8.27.0}/README.rst +0 -0
  300. {ipython-8.26.0 → ipython-8.27.0}/_build_meta.py +0 -0
  301. {ipython-8.26.0 → ipython-8.27.0}/docs/Makefile +0 -0
  302. {ipython-8.26.0 → ipython-8.27.0}/docs/README.rst +0 -0
  303. {ipython-8.26.0 → ipython-8.27.0}/docs/autogen_api.py +0 -0
  304. {ipython-8.26.0 → ipython-8.27.0}/docs/autogen_config.py +0 -0
  305. {ipython-8.26.0 → ipython-8.27.0}/docs/autogen_magics.py +0 -0
  306. {ipython-8.26.0 → ipython-8.27.0}/docs/autogen_shortcuts.py +0 -0
  307. {ipython-8.26.0 → ipython-8.27.0}/docs/make.cmd +0 -0
  308. {ipython-8.26.0 → ipython-8.27.0}/docs/man/ipython.1 +0 -0
  309. {ipython-8.26.0 → ipython-8.27.0}/docs/requirements.txt +0 -0
  310. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/2.0/running-crop.png +0 -0
  311. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/2.0/running.png +0 -0
  312. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/2.0/treeview.png +0 -0
  313. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/2.0/user-interface.png +0 -0
  314. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/2.0/widgets.png +0 -0
  315. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  316. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  317. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  318. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  319. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  320. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  321. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  322. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  323. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  324. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  325. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  326. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/autosuggest.gif +0 -0
  327. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  328. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  329. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  330. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  331. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  332. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  333. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  334. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  335. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  336. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  337. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  338. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  339. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  340. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  341. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  342. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ms_visual_studio.png +0 -0
  343. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/notebook_specgram.png +0 -0
  344. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/ptshell_features.png +0 -0
  345. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/qtconsole.png +0 -0
  346. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  347. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_images/unicode_completion.png +0 -0
  348. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_static/favicon.ico +0 -0
  349. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_static/logo.png +0 -0
  350. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_static/theme_overrides.css +0 -0
  351. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_templates/breadcrumbs.html +0 -0
  352. {ipython-8.26.0 → ipython-8.27.0}/docs/source/_templates/notebook_redirect.html +0 -0
  353. {ipython-8.26.0 → ipython-8.27.0}/docs/source/about/history.rst +0 -0
  354. {ipython-8.26.0 → ipython-8.27.0}/docs/source/about/index.rst +0 -0
  355. {ipython-8.26.0 → ipython-8.27.0}/docs/source/about/license_and_copyright.rst +0 -0
  356. {ipython-8.26.0 → ipython-8.27.0}/docs/source/api/index.rst +0 -0
  357. {ipython-8.26.0 → ipython-8.27.0}/docs/source/conf.py +0 -0
  358. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/callbacks.rst +0 -0
  359. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/details.rst +0 -0
  360. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/eventloops.rst +0 -0
  361. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/extensions/autoreload.rst +0 -0
  362. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/extensions/index.rst +0 -0
  363. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/extensions/storemagic.rst +0 -0
  364. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/index.rst +0 -0
  365. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/inputtransforms.rst +0 -0
  366. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/integrating.rst +0 -0
  367. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/intro.rst +0 -0
  368. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/options/index.rst +0 -0
  369. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  370. {ipython-8.26.0 → ipython-8.27.0}/docs/source/config/shortcuts/index.rst +0 -0
  371. {ipython-8.26.0 → ipython-8.27.0}/docs/source/coredev/index.rst +0 -0
  372. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/config.rst +0 -0
  373. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/execution.rst +0 -0
  374. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  375. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  376. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/figs/other_kernels.png +0 -0
  377. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/figs/other_kernels.svg +0 -0
  378. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/how_ipython_works.rst +0 -0
  379. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/index.rst +0 -0
  380. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/inputhook_app.rst +0 -0
  381. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/kernels.rst +0 -0
  382. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/lexer.rst +0 -0
  383. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/messaging.rst +0 -0
  384. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/pycompat.rst +0 -0
  385. {ipython-8.26.0 → ipython-8.27.0}/docs/source/development/wrapperkernels.rst +0 -0
  386. {ipython-8.26.0 → ipython-8.27.0}/docs/source/index.rst +0 -0
  387. {ipython-8.26.0 → ipython-8.27.0}/docs/source/install/index.rst +0 -0
  388. {ipython-8.26.0 → ipython-8.27.0}/docs/source/install/install.rst +0 -0
  389. {ipython-8.26.0 → ipython-8.27.0}/docs/source/install/kernel_install.rst +0 -0
  390. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/autoawait.rst +0 -0
  391. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/figs/besselj.png +0 -0
  392. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/figs/colors_dark.png +0 -0
  393. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/figs/jn.html +0 -0
  394. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/figs/jn.xhtml +0 -0
  395. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/index.rst +0 -0
  396. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/magics.rst +0 -0
  397. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/plotting.rst +0 -0
  398. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  399. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/reference.rst +0 -0
  400. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/shell.rst +0 -0
  401. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/tips.rst +0 -0
  402. {ipython-8.26.0 → ipython-8.27.0}/docs/source/interactive/tutorial.rst +0 -0
  403. {ipython-8.26.0 → ipython-8.27.0}/docs/source/links.txt +0 -0
  404. {ipython-8.26.0 → ipython-8.27.0}/docs/source/overview.rst +0 -0
  405. {ipython-8.26.0 → ipython-8.27.0}/docs/source/parallel/index.rst +0 -0
  406. {ipython-8.26.0 → ipython-8.27.0}/docs/source/sphinx.toml +0 -0
  407. {ipython-8.26.0 → ipython-8.27.0}/docs/source/sphinxext.rst +0 -0
  408. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/development.rst +0 -0
  409. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  410. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  411. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  412. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  413. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  414. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  415. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  416. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  417. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  418. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  419. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  420. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/index.rst +0 -0
  421. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/pr/README.md +0 -0
  422. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  423. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  424. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version0.10.rst +0 -0
  425. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version0.11.rst +0 -0
  426. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version0.12.rst +0 -0
  427. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version0.13.rst +0 -0
  428. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version0.8.rst +0 -0
  429. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version0.9.rst +0 -0
  430. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version1.0.rst +0 -0
  431. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version2.0.rst +0 -0
  432. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version3.rst +0 -0
  433. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  434. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version4.rst +0 -0
  435. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version5.rst +0 -0
  436. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version6.rst +0 -0
  437. {ipython-8.26.0 → ipython-8.27.0}/docs/source/whatsnew/version7.rst +0 -0
  438. {ipython-8.26.0 → ipython-8.27.0}/docs/sphinxext/apigen.py +0 -0
  439. {ipython-8.26.0 → ipython-8.27.0}/docs/sphinxext/configtraits.py +0 -0
  440. {ipython-8.26.0 → ipython-8.27.0}/docs/sphinxext/github.py +0 -0
  441. {ipython-8.26.0 → ipython-8.27.0}/docs/sphinxext/magics.py +0 -0
  442. {ipython-8.26.0 → ipython-8.27.0}/examples/Embedding/Index.ipynb +0 -0
  443. {ipython-8.26.0 → ipython-8.27.0}/examples/Embedding/embed_class_long.py +0 -0
  444. {ipython-8.26.0 → ipython-8.27.0}/examples/Embedding/embed_class_short.py +0 -0
  445. {ipython-8.26.0 → ipython-8.27.0}/examples/Embedding/embed_function.py +0 -0
  446. {ipython-8.26.0 → ipython-8.27.0}/examples/Embedding/start_ipython_config.py +0 -0
  447. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
  448. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
  449. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
  450. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
  451. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
  452. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
  453. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
  454. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Index.ipynb +0 -0
  455. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
  456. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
  457. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
  458. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
  459. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
  460. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
  461. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
  462. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
  463. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
  464. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
  465. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/data/flare.json +0 -0
  466. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/example-demo.py +0 -0
  467. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  468. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  469. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  470. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  471. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  472. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/ipython.desktop +0 -0
  473. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
  474. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
  475. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
  476. {ipython-8.26.0 → ipython-8.27.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
  477. {ipython-8.26.0 → ipython-8.27.0}/examples/Index.ipynb +0 -0
  478. {ipython-8.26.0 → ipython-8.27.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
  479. {ipython-8.26.0 → ipython-8.27.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
  480. {ipython-8.26.0 → ipython-8.27.0}/examples/images/FrontendKernel.png +0 -0
  481. {ipython-8.26.0 → ipython-8.27.0}/examples/images/animation.m4v +0 -0
  482. {ipython-8.26.0 → ipython-8.27.0}/examples/images/ipython_logo.png +0 -0
  483. {ipython-8.26.0 → ipython-8.27.0}/examples/images/python_logo.svg +0 -0
  484. {ipython-8.26.0 → ipython-8.27.0}/examples/utils/cwd_prompt.py +0 -0
  485. {ipython-8.26.0 → ipython-8.27.0}/examples/utils/list_pyfiles.ipy +0 -0
  486. {ipython-8.26.0 → ipython-8.27.0}/examples/utils/list_subdirs.ipy +0 -0
  487. {ipython-8.26.0 → ipython-8.27.0}/ipython.egg-info/dependency_links.txt +0 -0
  488. {ipython-8.26.0 → ipython-8.27.0}/ipython.egg-info/entry_points.txt +0 -0
  489. {ipython-8.26.0 → ipython-8.27.0}/ipython.egg-info/not-zip-safe +0 -0
  490. {ipython-8.26.0 → ipython-8.27.0}/ipython.egg-info/requires.txt +0 -0
  491. {ipython-8.26.0 → ipython-8.27.0}/ipython.egg-info/top_level.txt +0 -0
  492. {ipython-8.26.0 → ipython-8.27.0}/long_description.rst +0 -0
  493. {ipython-8.26.0 → ipython-8.27.0}/pyproject.toml +0 -0
  494. {ipython-8.26.0 → ipython-8.27.0}/scripts/ipython.ico +0 -0
  495. {ipython-8.26.0 → ipython-8.27.0}/scripts/ipython_nb.ico +0 -0
  496. {ipython-8.26.0 → ipython-8.27.0}/setup.cfg +0 -0
  497. {ipython-8.26.0 → ipython-8.27.0}/setup.py +0 -0
  498. {ipython-8.26.0 → ipython-8.27.0}/setupbase.py +0 -0
@@ -898,7 +898,7 @@ def rectify_completions(text: str, completions: _IC, *, _debug: bool = False) ->
898
898
  new_text = text[new_start:c.start] + c.text + text[c.end:new_end]
899
899
  if c._origin == 'jedi':
900
900
  seen_jedi.add(new_text)
901
- elif c._origin == 'IPCompleter.python_matches':
901
+ elif c._origin == "IPCompleter.python_matcher":
902
902
  seen_python_matches.add(new_text)
903
903
  yield Completion(new_start, new_end, new_text, type=c.type, _origin=c._origin, signature=c.signature)
904
904
  diff = seen_python_matches.difference(seen_jedi)
@@ -1139,15 +1139,18 @@ class Completer(Configurable):
1139
1139
  with a __getattr__ hook is evaluated.
1140
1140
 
1141
1141
  """
1142
+ return self._attr_matches(text)[0]
1143
+
1144
+ def _attr_matches(self, text, include_prefix=True) -> Tuple[Sequence[str], str]:
1142
1145
  m2 = re.match(r"(.+)\.(\w*)$", self.line_buffer)
1143
1146
  if not m2:
1144
- return []
1147
+ return [], ""
1145
1148
  expr, attr = m2.group(1, 2)
1146
1149
 
1147
1150
  obj = self._evaluate_expr(expr)
1148
1151
 
1149
1152
  if obj is not_found:
1150
- return []
1153
+ return [], ""
1151
1154
 
1152
1155
  if self.limit_to__all__ and hasattr(obj, '__all__'):
1153
1156
  words = get__all__entries(obj)
@@ -1170,28 +1173,36 @@ class Completer(Configurable):
1170
1173
  # reconciliator would know that we intend to append to rather than
1171
1174
  # replace the input text; this requires refactoring to return range
1172
1175
  # which ought to be replaced (as does jedi).
1173
- tokens = _parse_tokens(expr)
1174
- rev_tokens = reversed(tokens)
1175
- skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE}
1176
- name_turn = True
1177
-
1178
- parts = []
1179
- for token in rev_tokens:
1180
- if token.type in skip_over:
1181
- continue
1182
- if token.type == tokenize.NAME and name_turn:
1183
- parts.append(token.string)
1184
- name_turn = False
1185
- elif token.type == tokenize.OP and token.string == "." and not name_turn:
1186
- parts.append(token.string)
1187
- name_turn = True
1188
- else:
1189
- # short-circuit if not empty nor name token
1190
- break
1176
+ if include_prefix:
1177
+ tokens = _parse_tokens(expr)
1178
+ rev_tokens = reversed(tokens)
1179
+ skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE}
1180
+ name_turn = True
1181
+
1182
+ parts = []
1183
+ for token in rev_tokens:
1184
+ if token.type in skip_over:
1185
+ continue
1186
+ if token.type == tokenize.NAME and name_turn:
1187
+ parts.append(token.string)
1188
+ name_turn = False
1189
+ elif (
1190
+ token.type == tokenize.OP and token.string == "." and not name_turn
1191
+ ):
1192
+ parts.append(token.string)
1193
+ name_turn = True
1194
+ else:
1195
+ # short-circuit if not empty nor name token
1196
+ break
1191
1197
 
1192
- prefix_after_space = "".join(reversed(parts))
1198
+ prefix_after_space = "".join(reversed(parts))
1199
+ else:
1200
+ prefix_after_space = ""
1193
1201
 
1194
- return ["%s.%s" % (prefix_after_space, w) for w in words if w[:n] == attr]
1202
+ return (
1203
+ ["%s.%s" % (prefix_after_space, w) for w in words if w[:n] == attr],
1204
+ "." + attr,
1205
+ )
1195
1206
 
1196
1207
  def _evaluate_expr(self, expr):
1197
1208
  obj = not_found
@@ -1973,9 +1984,8 @@ class IPCompleter(Completer):
1973
1984
  *self.magic_arg_matchers,
1974
1985
  self.custom_completer_matcher,
1975
1986
  self.dict_key_matcher,
1976
- # TODO: convert python_matches to v2 API
1977
1987
  self.magic_matcher,
1978
- self.python_matches,
1988
+ self.python_matcher,
1979
1989
  self.file_matcher,
1980
1990
  self.python_func_kw_matcher,
1981
1991
  ]
@@ -2316,9 +2326,42 @@ class IPCompleter(Completer):
2316
2326
  else:
2317
2327
  return iter([])
2318
2328
 
2329
+ @context_matcher()
2330
+ def python_matcher(self, context: CompletionContext) -> SimpleMatcherResult:
2331
+ """Match attributes or global python names"""
2332
+ text = context.line_with_cursor
2333
+ if "." in text:
2334
+ try:
2335
+ matches, fragment = self._attr_matches(text, include_prefix=False)
2336
+ if text.endswith(".") and self.omit__names:
2337
+ if self.omit__names == 1:
2338
+ # true if txt is _not_ a __ name, false otherwise:
2339
+ no__name = lambda txt: re.match(r".*\.__.*?__", txt) is None
2340
+ else:
2341
+ # true if txt is _not_ a _ name, false otherwise:
2342
+ no__name = (
2343
+ lambda txt: re.match(r"\._.*?", txt[txt.rindex(".") :])
2344
+ is None
2345
+ )
2346
+ matches = filter(no__name, matches)
2347
+ return _convert_matcher_v1_result_to_v2(
2348
+ matches, type="attribute", fragment=fragment
2349
+ )
2350
+ except NameError:
2351
+ # catches <undefined attributes>.<tab>
2352
+ matches = []
2353
+ return _convert_matcher_v1_result_to_v2(matches, type="attribute")
2354
+ else:
2355
+ matches = self.global_matches(context.token)
2356
+ # TODO: maybe distinguish between functions, modules and just "variables"
2357
+ return _convert_matcher_v1_result_to_v2(matches, type="variable")
2358
+
2319
2359
  @completion_matcher(api_version=1)
2320
2360
  def python_matches(self, text: str) -> Iterable[str]:
2321
- """Match attributes or global python names"""
2361
+ """Match attributes or global python names.
2362
+
2363
+ .. deprecated:: 8.27
2364
+ You can use :meth:`python_matcher` instead."""
2322
2365
  if "." in text:
2323
2366
  try:
2324
2367
  matches = self.attr_matches(text)
@@ -100,7 +100,7 @@ class PylabMagics(Magics):
100
100
  % _list_matplotlib_backends_and_gui_loops()
101
101
  )
102
102
  else:
103
- gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui)
103
+ gui, backend = self.shell.enable_matplotlib(args.gui)
104
104
  self._show_matplotlib_backend(args.gui, backend)
105
105
 
106
106
  @skip_doctest
@@ -476,8 +476,8 @@ class PythonOpsChecker(PrefilterChecker):
476
476
  any python operator, we should simply execute the line (regardless of
477
477
  whether or not there's a possible autocall expansion). This avoids
478
478
  spurious (and very confusing) geattr() accesses."""
479
- if line_info.the_rest and line_info.the_rest[0] in '!=()<>,+*/%^&|':
480
- return self.prefilter_manager.get_handler_by_name('normal')
479
+ if line_info.the_rest and line_info.the_rest[0] in "!=()<>,+*/%^&|":
480
+ return self.prefilter_manager.get_handler_by_name("normal")
481
481
  else:
482
482
  return None
483
483
 
@@ -512,6 +512,8 @@ class AutocallChecker(PrefilterChecker):
512
512
  callable(oinfo.obj)
513
513
  and (not self.exclude_regexp.match(line_info.the_rest))
514
514
  and self.function_name_regexp.match(line_info.ifun)
515
+ and line_info.raw_the_rest.startswith(" ")
516
+ or not line_info.raw_the_rest.strip()
515
517
  ):
516
518
  return self.prefilter_manager.get_handler_by_name("auto")
517
519
  else:
@@ -14,6 +14,8 @@ from ..paths import get_ipython_package_dir
14
14
  from ..utils.path import expand_path, ensure_dir_exists
15
15
  from traitlets import Unicode, Bool, observe
16
16
 
17
+ from typing import Optional
18
+
17
19
  #-----------------------------------------------------------------------------
18
20
  # Module errors
19
21
  #-----------------------------------------------------------------------------
@@ -68,18 +70,31 @@ class ProfileDir(LoggingConfigurable):
68
70
  self.pid_dir = os.path.join(new, self.pid_dir_name)
69
71
  self.static_dir = os.path.join(new, self.static_dir_name)
70
72
  self.check_dirs()
71
-
72
- def _mkdir(self, path, mode=None):
73
+
74
+ def _mkdir(self, path: str, mode: Optional[int] = None) -> bool:
73
75
  """ensure a directory exists at a given path
74
76
 
75
77
  This is a version of os.mkdir, with the following differences:
76
78
 
77
- - returns True if it created the directory, False otherwise
79
+ - returns whether the directory has been created or not.
78
80
  - ignores EEXIST, protecting against race conditions where
79
81
  the dir may have been created in between the check and
80
82
  the creation
81
83
  - sets permissions if requested and the dir already exists
84
+
85
+ Parameters
86
+ ----------
87
+ path: str
88
+ path of the dir to create
89
+ mode: int
90
+ see `mode` of `os.mkdir`
91
+
92
+ Returns
93
+ -------
94
+ bool:
95
+ returns True if it created the directory, False otherwise
82
96
  """
97
+
83
98
  if os.path.exists(path):
84
99
  if mode and os.stat(path).st_mode != mode:
85
100
  try:
@@ -109,16 +124,20 @@ class ProfileDir(LoggingConfigurable):
109
124
 
110
125
  @observe('startup_dir')
111
126
  def check_startup_dir(self, change=None):
112
- self._mkdir(self.startup_dir)
113
-
114
- readme = os.path.join(self.startup_dir, 'README')
115
- src = os.path.join(get_ipython_package_dir(), u'core', u'profile', u'README_STARTUP')
116
-
117
- if not os.path.exists(src):
118
- self.log.warning("Could not copy README_STARTUP to startup dir. Source file %s does not exist.", src)
119
-
120
- if os.path.exists(src) and not os.path.exists(readme):
121
- shutil.copy(src, readme)
127
+ if self._mkdir(self.startup_dir):
128
+ readme = os.path.join(self.startup_dir, "README")
129
+ src = os.path.join(
130
+ get_ipython_package_dir(), "core", "profile", "README_STARTUP"
131
+ )
132
+
133
+ if os.path.exists(src):
134
+ if not os.path.exists(readme):
135
+ shutil.copy(src, readme)
136
+ else:
137
+ self.log.warning(
138
+ "Could not copy README_STARTUP to startup dir. Source file %s does not exist.",
139
+ src,
140
+ )
122
141
 
123
142
  @observe('security_dir')
124
143
  def check_security_dir(self, change=None):
@@ -16,7 +16,7 @@
16
16
  # release. 'dev' as a _version_extra string means this is a development
17
17
  # version
18
18
  _version_major = 8
19
- _version_minor = 26
19
+ _version_minor = 27
20
20
  _version_patch = 0
21
21
  _version_extra = ".dev"
22
22
  # _version_extra = "rc1"
@@ -76,7 +76,7 @@ def split_user_input(line, pattern=None):
76
76
 
77
77
  # print('line:<%s>' % line) # dbg
78
78
  # print('pre <%s> ifun <%s> rest <%s>' % (pre,ifun.strip(),the_rest)) # dbg
79
- return pre, esc or '', ifun.strip(), the_rest.lstrip()
79
+ return pre, esc or "", ifun.strip(), the_rest
80
80
 
81
81
 
82
82
  class LineInfo(object):
@@ -107,11 +107,15 @@ class LineInfo(object):
107
107
 
108
108
  the_rest
109
109
  Everything else on the line.
110
+
111
+ raw_the_rest
112
+ the_rest without whitespace stripped.
110
113
  """
111
114
  def __init__(self, line, continue_prompt=False):
112
115
  self.line = line
113
116
  self.continue_prompt = continue_prompt
114
- self.pre, self.esc, self.ifun, self.the_rest = split_user_input(line)
117
+ self.pre, self.esc, self.ifun, self.raw_the_rest = split_user_input(line)
118
+ self.the_rest = self.raw_the_rest.lstrip()
115
119
 
116
120
  self.pre_char = self.pre.strip()
117
121
  if self.pre_char:
@@ -136,3 +140,6 @@ class LineInfo(object):
136
140
 
137
141
  def __str__(self):
138
142
  return "LineInfo [%s|%s|%s|%s]" %(self.pre, self.esc, self.ifun, self.the_rest)
143
+
144
+ def __repr__(self):
145
+ return "<" + str(self) + ">"
@@ -462,7 +462,10 @@ class TestCompleter(unittest.TestCase):
462
462
  matches = c.all_completions("TestClass.")
463
463
  assert len(matches) > 2, (jedi_status, matches)
464
464
  matches = c.all_completions("TestClass.a")
465
- assert matches == ['TestClass.a', 'TestClass.a1'], jedi_status
465
+ if jedi_status:
466
+ assert matches == ["TestClass.a", "TestClass.a1"], jedi_status
467
+ else:
468
+ assert matches == [".a", ".a1"], jedi_status
466
469
 
467
470
  @pytest.mark.xfail(
468
471
  sys.version_info.releaselevel in ("alpha",),
@@ -594,7 +597,7 @@ class TestCompleter(unittest.TestCase):
594
597
  ip.Completer.use_jedi = True
595
598
  with provisionalcompleter():
596
599
  completions = ip.Completer.completions(line, cursor_pos)
597
- self.assertIn(completion, completions)
600
+ self.assertIn(completion, list(completions))
598
601
 
599
602
  with provisionalcompleter():
600
603
  _(
@@ -622,7 +625,7 @@ class TestCompleter(unittest.TestCase):
622
625
  _(
623
626
  "assert str.star",
624
627
  14,
625
- "str.startswith",
628
+ ".startswith",
626
629
  "Should have completed on `assert str.star`: %s",
627
630
  Completion(11, 14, "startswith"),
628
631
  )
@@ -633,6 +636,13 @@ class TestCompleter(unittest.TestCase):
633
636
  "Should have completed on `d['a b'].str`: %s",
634
637
  Completion(9, 12, "strip"),
635
638
  )
639
+ _(
640
+ "a.app",
641
+ 4,
642
+ ".append",
643
+ "Should have completed on `a.app`: %s",
644
+ Completion(2, 4, "append"),
645
+ )
636
646
 
637
647
  def test_omit__names(self):
638
648
  # also happens to test IPCompleter as a configurable
@@ -647,8 +657,8 @@ class TestCompleter(unittest.TestCase):
647
657
  with provisionalcompleter():
648
658
  c.use_jedi = False
649
659
  s, matches = c.complete("ip.")
650
- self.assertIn("ip.__str__", matches)
651
- self.assertIn("ip._hidden_attr", matches)
660
+ self.assertIn(".__str__", matches)
661
+ self.assertIn("._hidden_attr", matches)
652
662
 
653
663
  # c.use_jedi = True
654
664
  # completions = set(c.completions('ip.', 3))
@@ -661,7 +671,7 @@ class TestCompleter(unittest.TestCase):
661
671
  with provisionalcompleter():
662
672
  c.use_jedi = False
663
673
  s, matches = c.complete("ip.")
664
- self.assertNotIn("ip.__str__", matches)
674
+ self.assertNotIn(".__str__", matches)
665
675
  # self.assertIn('ip._hidden_attr', matches)
666
676
 
667
677
  # c.use_jedi = True
@@ -675,8 +685,8 @@ class TestCompleter(unittest.TestCase):
675
685
  with provisionalcompleter():
676
686
  c.use_jedi = False
677
687
  s, matches = c.complete("ip.")
678
- self.assertNotIn("ip.__str__", matches)
679
- self.assertNotIn("ip._hidden_attr", matches)
688
+ self.assertNotIn(".__str__", matches)
689
+ self.assertNotIn("._hidden_attr", matches)
680
690
 
681
691
  # c.use_jedi = True
682
692
  # completions = set(c.completions('ip.', 3))
@@ -686,7 +696,7 @@ class TestCompleter(unittest.TestCase):
686
696
  with provisionalcompleter():
687
697
  c.use_jedi = False
688
698
  s, matches = c.complete("ip._x.")
689
- self.assertIn("ip._x.keys", matches)
699
+ self.assertIn(".keys", matches)
690
700
 
691
701
  # c.use_jedi = True
692
702
  # completions = set(c.completions('ip._x.', 6))
@@ -697,7 +707,7 @@ class TestCompleter(unittest.TestCase):
697
707
 
698
708
  def test_limit_to__all__False_ok(self):
699
709
  """
700
- Limit to all is deprecated, once we remove it this test can go away.
710
+ Limit to all is deprecated, once we remove it this test can go away.
701
711
  """
702
712
  ip = get_ipython()
703
713
  c = ip.Completer
@@ -708,7 +718,7 @@ class TestCompleter(unittest.TestCase):
708
718
  cfg.IPCompleter.limit_to__all__ = False
709
719
  c.update_config(cfg)
710
720
  s, matches = c.complete("d.")
711
- self.assertIn("d.x", matches)
721
+ self.assertIn(".x", matches)
712
722
 
713
723
  def test_get__all__entries_ok(self):
714
724
  class A:
@@ -59,40 +59,43 @@ def test_ipdb_magics():
59
59
 
60
60
  First, set up some test functions and classes which we can inspect.
61
61
 
62
- >>> class ExampleClass(object):
63
- ... """Docstring for ExampleClass."""
64
- ... def __init__(self):
65
- ... """Docstring for ExampleClass.__init__"""
66
- ... pass
67
- ... def __str__(self):
68
- ... return "ExampleClass()"
69
-
70
- >>> def example_function(x, y, z="hello"):
71
- ... """Docstring for example_function."""
72
- ... pass
62
+ In [1]: class ExampleClass(object):
63
+ ...: """Docstring for ExampleClass."""
64
+ ...: def __init__(self):
65
+ ...: """Docstring for ExampleClass.__init__"""
66
+ ...: pass
67
+ ...: def __str__(self):
68
+ ...: return "ExampleClass()"
73
69
 
74
- >>> old_trace = sys.gettrace()
70
+ In [2]: def example_function(x, y, z="hello"):
71
+ ...: """Docstring for example_function."""
72
+ ...: pass
75
73
 
76
- Create a function which triggers ipdb.
74
+ In [3]: old_trace = sys.gettrace()
77
75
 
78
- >>> def trigger_ipdb():
79
- ... a = ExampleClass()
80
- ... debugger.Pdb().set_trace()
76
+ Create a function which triggers ipdb.
81
77
 
82
- >>> with PdbTestInput([
83
- ... 'pdef example_function',
84
- ... 'pdoc ExampleClass',
85
- ... 'up',
86
- ... 'down',
87
- ... 'list',
88
- ... 'pinfo a',
89
- ... 'll',
90
- ... 'continue',
91
- ... ]):
92
- ... trigger_ipdb()
93
- --Return--
94
- None
95
- > <doctest ...>(3)trigger_ipdb()
78
+ In [4]: def trigger_ipdb():
79
+ ...: a = ExampleClass()
80
+ ...: debugger.Pdb().set_trace()
81
+
82
+ Run ipdb with faked input & check output. Because of a difference between
83
+ Python 3.13 & older versions, the first bit of the output is inconsistent.
84
+ We need to use ... to accommodate that, so the examples have to use IPython
85
+ prompts so that ... is distinct from the Python PS2 prompt.
86
+
87
+ In [5]: with PdbTestInput([
88
+ ...: 'pdef example_function',
89
+ ...: 'pdoc ExampleClass',
90
+ ...: 'up',
91
+ ...: 'down',
92
+ ...: 'list',
93
+ ...: 'pinfo a',
94
+ ...: 'll',
95
+ ...: 'continue',
96
+ ...: ]):
97
+ ...: trigger_ipdb()
98
+ ...> <doctest ...>(3)trigger_ipdb()
96
99
  1 def trigger_ipdb():
97
100
  2 a = ExampleClass()
98
101
  ----> 3 debugger.Pdb().set_trace()
@@ -112,8 +115,7 @@ def test_ipdb_magics():
112
115
  10 ]):
113
116
  ---> 11 trigger_ipdb()
114
117
  <BLANKLINE>
115
- ipdb> down
116
- None
118
+ ipdb> down...
117
119
  > <doctest ...>(3)trigger_ipdb()
118
120
  1 def trigger_ipdb():
119
121
  2 a = ExampleClass()
@@ -136,10 +138,10 @@ def test_ipdb_magics():
136
138
  ----> 3 debugger.Pdb().set_trace()
137
139
  <BLANKLINE>
138
140
  ipdb> continue
139
-
140
- Restore previous trace function, e.g. for coverage.py
141
-
142
- >>> sys.settrace(old_trace)
141
+
142
+ Restore previous trace function, e.g. for coverage.py
143
+
144
+ In [6]: sys.settrace(old_trace)
143
145
  '''
144
146
 
145
147
  def test_ipdb_magics2():
@@ -495,15 +497,26 @@ def test_decorator_skip_with_breakpoint():
495
497
  child.expect_exact(line)
496
498
  child.sendline("")
497
499
 
498
- # as the filename does not exists, we'll rely on the filename prompt
499
- child.expect_exact("47 bar(3, 4)")
500
-
501
- for input_, expected in [
502
- (f"b {name}.py:3", ""),
503
- ("step", "1---> 3 pass # should not stop here except"),
504
- ("step", "---> 38 @pdb_skipped_decorator"),
505
- ("continue", ""),
506
- ]:
500
+ # From 3.13, set_trace()/breakpoint() stop on the line where they're
501
+ # called, instead of the next line.
502
+ if sys.version_info >= (3, 13):
503
+ child.expect_exact("--> 46 ipdb.set_trace()")
504
+ extra_step = [("step", "--> 47 bar(3, 4)")]
505
+ else:
506
+ child.expect_exact("--> 47 bar(3, 4)")
507
+ extra_step = []
508
+
509
+ for input_, expected in (
510
+ [
511
+ (f"b {name}.py:3", ""),
512
+ ]
513
+ + extra_step
514
+ + [
515
+ ("step", "1---> 3 pass # should not stop here except"),
516
+ ("step", "---> 38 @pdb_skipped_decorator"),
517
+ ("continue", ""),
518
+ ]
519
+ ):
507
520
  child.expect("ipdb>")
508
521
  child.sendline(input_)
509
522
  child.expect_exact(input_)
@@ -0,0 +1,75 @@
1
+ """Tests for input handlers.
2
+ """
3
+ #-----------------------------------------------------------------------------
4
+ # Module imports
5
+ #-----------------------------------------------------------------------------
6
+
7
+ # our own packages
8
+ from IPython.core import autocall
9
+ from IPython.testing import tools as tt
10
+ import pytest
11
+ from collections.abc import Callable
12
+
13
+ #-----------------------------------------------------------------------------
14
+ # Globals
15
+ #-----------------------------------------------------------------------------
16
+
17
+ # Test functions
18
+ #-----------------------------------------------------------------------------
19
+
20
+ class CallableIndexable(object):
21
+ def __getitem__(self, idx): return True
22
+ def __call__(self, *args, **kws): return True
23
+
24
+
25
+ class Autocallable(autocall.IPyAutocall):
26
+ def __call__(self):
27
+ return "called"
28
+
29
+
30
+ @pytest.mark.parametrize(
31
+ "autocall, input, output",
32
+ [
33
+ # For many of the below, we're also checking that leading whitespace
34
+ # turns off the esc char, which it should unless there is a continuation
35
+ # line.
36
+ ("1", '"no change"', '"no change"'), # normal
37
+ ("1", "lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), # magic
38
+ # Only explicit escapes or instances of IPyAutocallable should get
39
+ # expanded
40
+ ("0", 'len "abc"', 'len "abc"'),
41
+ ("0", "autocallable", "autocallable()"),
42
+ # Don't add extra brackets (gh-1117)
43
+ ("0", "autocallable()", "autocallable()"),
44
+ ("1", 'len "abc"', 'len("abc")'),
45
+ ("1", 'len "abc";', 'len("abc");'), # ; is special -- moves out of parens
46
+ # Autocall is turned off if first arg is [] and the object
47
+ # is both callable and indexable. Like so:
48
+ ("1", "len [1,2]", "len([1,2])"), # len doesn't support __getitem__...
49
+ ("1", "call_idx [1]", "call_idx [1]"), # call_idx *does*..
50
+ ("1", "call_idx 1", "call_idx(1)"),
51
+ ("1", "len", "len"), # only at 2 does it auto-call on single args
52
+ ("2", 'len "abc"', 'len("abc")'),
53
+ ("2", 'len "abc";', 'len("abc");'),
54
+ ("2", "len [1,2]", "len([1,2])"),
55
+ ("2", "call_idx [1]", "call_idx [1]"),
56
+ ("2", "call_idx 1", "call_idx(1)"),
57
+ # T his is what's different:
58
+ ("2", "len", "len()"), # only at 2 does it auto-call on single args
59
+ ("0", "Callable[[int], None]", "Callable[[int], None]"),
60
+ ("1", "Callable[[int], None]", "Callable[[int], None]"),
61
+ ("1", "Callable[[int], None]", "Callable[[int], None]"),
62
+ ],
63
+ )
64
+ def test_handlers_I(autocall, input, output):
65
+ autocallable = Autocallable()
66
+ ip.user_ns["autocallable"] = autocallable
67
+
68
+ call_idx = CallableIndexable()
69
+ ip.user_ns["call_idx"] = call_idx
70
+
71
+ ip.user_ns["Callable"] = Callable
72
+
73
+ ip.run_line_magic("autocall", autocall)
74
+ assert ip.prefilter_manager.prefilter_lines(input) == output
75
+ ip.run_line_magic("autocall", "1")
@@ -516,23 +516,23 @@ def test_pinfo_docstring_dynamic(capsys):
516
516
 
517
517
  ip.run_line_magic("pinfo", "b.prop")
518
518
  captured = capsys.readouterr()
519
- assert "Docstring: cdoc for prop" in captured.out
519
+ assert re.search(r"Docstring:\s+cdoc for prop", captured.out)
520
520
 
521
521
  ip.run_line_magic("pinfo", "b.non_exist")
522
522
  captured = capsys.readouterr()
523
- assert "Docstring: cdoc for non_exist" in captured.out
523
+ assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out)
524
524
 
525
525
  ip.run_cell("b.prop?")
526
526
  captured = capsys.readouterr()
527
- assert "Docstring: cdoc for prop" in captured.out
527
+ assert re.search(r"Docstring:\s+cdoc for prop", captured.out)
528
528
 
529
529
  ip.run_cell("b.non_exist?")
530
530
  captured = capsys.readouterr()
531
- assert "Docstring: cdoc for non_exist" in captured.out
531
+ assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out)
532
532
 
533
533
  ip.run_cell("b.undefined?")
534
534
  captured = capsys.readouterr()
535
- assert "Docstring: <no docstring>" in captured.out
535
+ assert re.search(r"Type:\s+NoneType", captured.out)
536
536
 
537
537
 
538
538
  def test_pinfo_magic():