ipython 8.26.0__tar.gz → 8.28.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.28.0}/IPython/core/completer.py +69 -26
  2. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/debugger.py +27 -4
  3. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/display.py +5 -1
  4. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/packaging.py +15 -2
  5. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/pylab.py +1 -1
  6. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/prefilter.py +4 -2
  7. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/profiledir.py +32 -13
  8. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/release.py +1 -1
  9. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/splitinput.py +9 -2
  10. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_completer.py +21 -11
  11. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_debugger.py +58 -45
  12. ipython-8.28.0/IPython/core/tests/test_handlers.py +75 -0
  13. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_oinspect.py +5 -5
  14. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_prefilter.py +23 -11
  15. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_pylabtools.py +23 -0
  16. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_splitinput.py +7 -5
  17. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_ultratb.py +12 -0
  18. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/ultratb.py +27 -24
  19. {ipython-8.26.0 → ipython-8.28.0}/IPython/external/qt_loaders.py +14 -2
  20. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_sysinfo.py +1 -1
  21. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/terminal.py +7 -1
  22. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_path.py +85 -88
  23. {ipython-8.26.0/ipython.egg-info → ipython-8.28.0}/PKG-INFO +1 -1
  24. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/custommagics.rst +2 -2
  25. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version8.rst +87 -8
  26. {ipython-8.26.0 → ipython-8.28.0/ipython.egg-info}/PKG-INFO +1 -1
  27. {ipython-8.26.0 → ipython-8.28.0}/ipython.egg-info/SOURCES.txt +0 -2
  28. ipython-8.26.0/IPython/core/tests/test_handlers.py +0 -97
  29. {ipython-8.26.0 → ipython-8.28.0}/.flake8 +0 -0
  30. {ipython-8.26.0 → ipython-8.28.0}/.mailmap +0 -0
  31. {ipython-8.26.0 → ipython-8.28.0}/.pre-commit-config.yaml +0 -0
  32. {ipython-8.26.0 → ipython-8.28.0}/COPYING.rst +0 -0
  33. {ipython-8.26.0 → ipython-8.28.0}/IPython/__init__.py +0 -0
  34. {ipython-8.26.0 → ipython-8.28.0}/IPython/__main__.py +0 -0
  35. {ipython-8.26.0 → ipython-8.28.0}/IPython/conftest.py +0 -0
  36. {ipython-8.26.0 → ipython-8.28.0}/IPython/consoleapp.py +0 -0
  37. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/__init__.py +0 -0
  38. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/alias.py +0 -0
  39. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/application.py +0 -0
  40. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/async_helpers.py +0 -0
  41. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/autocall.py +0 -0
  42. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/builtin_trap.py +0 -0
  43. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/compilerop.py +0 -0
  44. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/completerlib.py +0 -0
  45. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/crashhandler.py +0 -0
  46. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/display_functions.py +0 -0
  47. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/display_trap.py +0 -0
  48. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/displayhook.py +0 -0
  49. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/displaypub.py +0 -0
  50. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/error.py +0 -0
  51. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/events.py +0 -0
  52. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/excolors.py +0 -0
  53. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/extensions.py +0 -0
  54. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/formatters.py +0 -0
  55. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/getipython.py +0 -0
  56. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/guarded_eval.py +0 -0
  57. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/history.py +0 -0
  58. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/historyapp.py +0 -0
  59. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/hooks.py +0 -0
  60. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/inputsplitter.py +0 -0
  61. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/inputtransformer.py +0 -0
  62. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/inputtransformer2.py +0 -0
  63. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/interactiveshell.py +0 -0
  64. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/latex_symbols.py +0 -0
  65. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/logger.py +0 -0
  66. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/macro.py +0 -0
  67. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magic.py +0 -0
  68. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magic_arguments.py +0 -0
  69. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/__init__.py +0 -0
  70. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/ast_mod.py +0 -0
  71. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/auto.py +0 -0
  72. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/basic.py +0 -0
  73. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/code.py +0 -0
  74. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/config.py +0 -0
  75. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/display.py +0 -0
  76. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/execution.py +0 -0
  77. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/extension.py +0 -0
  78. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/history.py +0 -0
  79. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/logging.py +0 -0
  80. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/namespace.py +0 -0
  81. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/osm.py +0 -0
  82. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/magics/script.py +0 -0
  83. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/oinspect.py +0 -0
  84. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/page.py +0 -0
  85. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/payload.py +0 -0
  86. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/payloadpage.py +0 -0
  87. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/profile/README_STARTUP +0 -0
  88. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/profileapp.py +0 -0
  89. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/prompts.py +0 -0
  90. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/pylabtools.py +0 -0
  91. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/shellapp.py +0 -0
  92. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/2x2.jpg +0 -0
  93. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/2x2.png +0 -0
  94. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/__init__.py +0 -0
  95. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/bad_all.py +0 -0
  96. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
  97. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/nonascii.py +0 -0
  98. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/nonascii2.py +0 -0
  99. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/print_argv.py +0 -0
  100. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/refbug.py +0 -0
  101. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/simpleerr.py +0 -0
  102. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/tclass.py +0 -0
  103. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_alias.py +0 -0
  104. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_application.py +0 -0
  105. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_async_helpers.py +0 -0
  106. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_autocall.py +0 -0
  107. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_compilerop.py +0 -0
  108. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_completerlib.py +0 -0
  109. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_display.py +0 -0
  110. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_displayhook.py +0 -0
  111. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_events.py +0 -0
  112. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
  113. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_extension.py +0 -0
  114. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_formatters.py +0 -0
  115. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_guarded_eval.py +0 -0
  116. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_history.py +0 -0
  117. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_hooks.py +0 -0
  118. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_imports.py +0 -0
  119. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_inputsplitter.py +0 -0
  120. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_inputtransformer.py +0 -0
  121. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
  122. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
  123. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_interactiveshell.py +0 -0
  124. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_iplib.py +0 -0
  125. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_logger.py +0 -0
  126. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_magic.py +0 -0
  127. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_magic_arguments.py +0 -0
  128. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_magic_terminal.py +0 -0
  129. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_page.py +0 -0
  130. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_paths.py +0 -0
  131. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_profile.py +0 -0
  132. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_prompts.py +0 -0
  133. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_run.py +0 -0
  134. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/tests/test_shellapp.py +0 -0
  135. {ipython-8.26.0 → ipython-8.28.0}/IPython/core/usage.py +0 -0
  136. {ipython-8.26.0 → ipython-8.28.0}/IPython/display.py +0 -0
  137. {ipython-8.26.0 → ipython-8.28.0}/IPython/extensions/__init__.py +0 -0
  138. {ipython-8.26.0 → ipython-8.28.0}/IPython/extensions/autoreload.py +0 -0
  139. {ipython-8.26.0 → ipython-8.28.0}/IPython/extensions/storemagic.py +0 -0
  140. {ipython-8.26.0 → ipython-8.28.0}/IPython/extensions/tests/__init__.py +0 -0
  141. {ipython-8.26.0 → ipython-8.28.0}/IPython/extensions/tests/test_autoreload.py +0 -0
  142. {ipython-8.26.0 → ipython-8.28.0}/IPython/extensions/tests/test_storemagic.py +0 -0
  143. {ipython-8.26.0 → ipython-8.28.0}/IPython/external/__init__.py +0 -0
  144. {ipython-8.26.0 → ipython-8.28.0}/IPython/external/qt_for_kernel.py +0 -0
  145. {ipython-8.26.0 → ipython-8.28.0}/IPython/external/tests/__init__.py +0 -0
  146. {ipython-8.26.0 → ipython-8.28.0}/IPython/external/tests/test_qt_loaders.py +0 -0
  147. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/__init__.py +0 -0
  148. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/backgroundjobs.py +0 -0
  149. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/clipboard.py +0 -0
  150. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/deepreload.py +0 -0
  151. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/demo.py +0 -0
  152. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/display.py +0 -0
  153. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/editorhooks.py +0 -0
  154. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/guisupport.py +0 -0
  155. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/latextools.py +0 -0
  156. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/lexers.py +0 -0
  157. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/pretty.py +0 -0
  158. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/__init__.py +0 -0
  159. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test.wav +0 -0
  160. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
  161. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_clipboard.py +0 -0
  162. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_deepreload.py +0 -0
  163. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_display.py +0 -0
  164. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_editorhooks.py +0 -0
  165. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_imports.py +0 -0
  166. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_latextools.py +0 -0
  167. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_lexers.py +0 -0
  168. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_pretty.py +0 -0
  169. {ipython-8.26.0 → ipython-8.28.0}/IPython/lib/tests/test_pygments.py +0 -0
  170. {ipython-8.26.0 → ipython-8.28.0}/IPython/paths.py +0 -0
  171. {ipython-8.26.0 → ipython-8.28.0}/IPython/py.typed +0 -0
  172. {ipython-8.26.0 → ipython-8.28.0}/IPython/sphinxext/__init__.py +0 -0
  173. {ipython-8.26.0 → ipython-8.28.0}/IPython/sphinxext/custom_doctests.py +0 -0
  174. {ipython-8.26.0 → ipython-8.28.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  175. {ipython-8.26.0 → ipython-8.28.0}/IPython/sphinxext/ipython_directive.py +0 -0
  176. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/__init__.py +0 -0
  177. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/console.py +0 -0
  178. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/debugger.py +0 -0
  179. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/embed.py +0 -0
  180. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/interactiveshell.py +0 -0
  181. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/ipapp.py +0 -0
  182. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/magics.py +0 -0
  183. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/prompts.py +0 -0
  184. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  185. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  186. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  187. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  188. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  189. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  190. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  191. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  192. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  193. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  194. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  195. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/ptutils.py +0 -0
  196. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  197. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  198. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  199. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/shortcuts/filters.py +0 -0
  200. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/__init__.py +0 -0
  201. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
  202. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/test_embed.py +0 -0
  203. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/test_help.py +0 -0
  204. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
  205. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
  206. {ipython-8.26.0 → ipython-8.28.0}/IPython/terminal/tests/test_shortcuts.py +0 -0
  207. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/__init__.py +0 -0
  208. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/decorators.py +0 -0
  209. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/globalipapp.py +0 -0
  210. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/ipunittest.py +0 -0
  211. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/Makefile +0 -0
  212. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/README.txt +0 -0
  213. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/__init__.py +0 -0
  214. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/dtexample.py +0 -0
  215. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  216. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  217. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/setup.py +0 -0
  218. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/simple.py +0 -0
  219. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/simplevars.py +0 -0
  220. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/test_combo.txt +0 -0
  221. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/test_example.txt +0 -0
  222. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  223. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  224. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/plugin/test_refs.py +0 -0
  225. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/skipdoctest.py +0 -0
  226. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/tests/__init__.py +0 -0
  227. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/tests/test_decorators.py +0 -0
  228. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/tests/test_ipunittest.py +0 -0
  229. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/tests/test_tools.py +0 -0
  230. {ipython-8.26.0 → ipython-8.28.0}/IPython/testing/tools.py +0 -0
  231. {ipython-8.26.0 → ipython-8.28.0}/IPython/tests/cve.py +0 -0
  232. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/PyColorize.py +0 -0
  233. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/__init__.py +0 -0
  234. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_process_cli.py +0 -0
  235. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_process_common.py +0 -0
  236. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_process_emscripten.py +0 -0
  237. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_process_posix.py +0 -0
  238. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_process_win32.py +0 -0
  239. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/_process_win32_controller.py +0 -0
  240. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/capture.py +0 -0
  241. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/colorable.py +0 -0
  242. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/coloransi.py +0 -0
  243. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/contexts.py +0 -0
  244. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/daemonize.py +0 -0
  245. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/data.py +0 -0
  246. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/decorators.py +0 -0
  247. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/dir2.py +0 -0
  248. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/docs.py +0 -0
  249. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/encoding.py +0 -0
  250. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/eventful.py +0 -0
  251. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/frame.py +0 -0
  252. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/generics.py +0 -0
  253. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/importstring.py +0 -0
  254. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/io.py +0 -0
  255. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/ipstruct.py +0 -0
  256. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/jsonutil.py +0 -0
  257. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/localinterfaces.py +0 -0
  258. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/log.py +0 -0
  259. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/module_paths.py +0 -0
  260. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/openpy.py +0 -0
  261. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/path.py +0 -0
  262. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/process.py +0 -0
  263. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/py3compat.py +0 -0
  264. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/sentinel.py +0 -0
  265. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/shimmodule.py +0 -0
  266. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/signatures.py +0 -0
  267. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/strdispatch.py +0 -0
  268. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/sysinfo.py +0 -0
  269. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/syspathcontext.py +0 -0
  270. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tempdir.py +0 -0
  271. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/__init__.py +0 -0
  272. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_capture.py +0 -0
  273. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_decorators.py +0 -0
  274. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_deprecated.py +0 -0
  275. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_dir2.py +0 -0
  276. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_imports.py +0 -0
  277. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_importstring.py +0 -0
  278. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_io.py +0 -0
  279. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_module_paths.py +0 -0
  280. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_openpy.py +0 -0
  281. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_process.py +0 -0
  282. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_pycolorize.py +0 -0
  283. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_shimmodule.py +0 -0
  284. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_sysinfo.py +0 -0
  285. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_tempdir.py +0 -0
  286. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_text.py +0 -0
  287. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_tokenutil.py +0 -0
  288. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tests/test_wildcard.py +0 -0
  289. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/text.py +0 -0
  290. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/timing.py +0 -0
  291. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tokenutil.py +0 -0
  292. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/traitlets.py +0 -0
  293. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/tz.py +0 -0
  294. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/ulinecache.py +0 -0
  295. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/version.py +0 -0
  296. {ipython-8.26.0 → ipython-8.28.0}/IPython/utils/wildcard.py +0 -0
  297. {ipython-8.26.0 → ipython-8.28.0}/LICENSE +0 -0
  298. {ipython-8.26.0 → ipython-8.28.0}/MANIFEST.in +0 -0
  299. {ipython-8.26.0 → ipython-8.28.0}/README.rst +0 -0
  300. {ipython-8.26.0 → ipython-8.28.0}/_build_meta.py +0 -0
  301. {ipython-8.26.0 → ipython-8.28.0}/docs/Makefile +0 -0
  302. {ipython-8.26.0 → ipython-8.28.0}/docs/README.rst +0 -0
  303. {ipython-8.26.0 → ipython-8.28.0}/docs/autogen_api.py +0 -0
  304. {ipython-8.26.0 → ipython-8.28.0}/docs/autogen_config.py +0 -0
  305. {ipython-8.26.0 → ipython-8.28.0}/docs/autogen_magics.py +0 -0
  306. {ipython-8.26.0 → ipython-8.28.0}/docs/autogen_shortcuts.py +0 -0
  307. {ipython-8.26.0 → ipython-8.28.0}/docs/make.cmd +0 -0
  308. {ipython-8.26.0 → ipython-8.28.0}/docs/man/ipython.1 +0 -0
  309. {ipython-8.26.0 → ipython-8.28.0}/docs/requirements.txt +0 -0
  310. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/2.0/running-crop.png +0 -0
  311. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/2.0/running.png +0 -0
  312. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/2.0/treeview.png +0 -0
  313. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/2.0/user-interface.png +0 -0
  314. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/2.0/widgets.png +0 -0
  315. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  316. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  317. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  318. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  319. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  320. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  321. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  322. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  323. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  324. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  325. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  326. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/autosuggest.gif +0 -0
  327. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  328. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  329. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  330. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  331. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  332. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  333. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  334. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  335. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  336. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  337. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  338. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  339. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  340. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  341. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  342. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ms_visual_studio.png +0 -0
  343. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/notebook_specgram.png +0 -0
  344. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/ptshell_features.png +0 -0
  345. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/qtconsole.png +0 -0
  346. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  347. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_images/unicode_completion.png +0 -0
  348. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_static/favicon.ico +0 -0
  349. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_static/logo.png +0 -0
  350. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_static/theme_overrides.css +0 -0
  351. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_templates/breadcrumbs.html +0 -0
  352. {ipython-8.26.0 → ipython-8.28.0}/docs/source/_templates/notebook_redirect.html +0 -0
  353. {ipython-8.26.0 → ipython-8.28.0}/docs/source/about/history.rst +0 -0
  354. {ipython-8.26.0 → ipython-8.28.0}/docs/source/about/index.rst +0 -0
  355. {ipython-8.26.0 → ipython-8.28.0}/docs/source/about/license_and_copyright.rst +0 -0
  356. {ipython-8.26.0 → ipython-8.28.0}/docs/source/api/index.rst +0 -0
  357. {ipython-8.26.0 → ipython-8.28.0}/docs/source/conf.py +0 -0
  358. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/callbacks.rst +0 -0
  359. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/details.rst +0 -0
  360. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/eventloops.rst +0 -0
  361. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/extensions/autoreload.rst +0 -0
  362. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/extensions/index.rst +0 -0
  363. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/extensions/storemagic.rst +0 -0
  364. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/index.rst +0 -0
  365. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/inputtransforms.rst +0 -0
  366. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/integrating.rst +0 -0
  367. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/intro.rst +0 -0
  368. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/options/index.rst +0 -0
  369. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  370. {ipython-8.26.0 → ipython-8.28.0}/docs/source/config/shortcuts/index.rst +0 -0
  371. {ipython-8.26.0 → ipython-8.28.0}/docs/source/coredev/index.rst +0 -0
  372. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/config.rst +0 -0
  373. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/execution.rst +0 -0
  374. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  375. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  376. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/figs/other_kernels.png +0 -0
  377. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/figs/other_kernels.svg +0 -0
  378. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/how_ipython_works.rst +0 -0
  379. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/index.rst +0 -0
  380. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/inputhook_app.rst +0 -0
  381. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/kernels.rst +0 -0
  382. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/lexer.rst +0 -0
  383. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/messaging.rst +0 -0
  384. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/pycompat.rst +0 -0
  385. {ipython-8.26.0 → ipython-8.28.0}/docs/source/development/wrapperkernels.rst +0 -0
  386. {ipython-8.26.0 → ipython-8.28.0}/docs/source/index.rst +0 -0
  387. {ipython-8.26.0 → ipython-8.28.0}/docs/source/install/index.rst +0 -0
  388. {ipython-8.26.0 → ipython-8.28.0}/docs/source/install/install.rst +0 -0
  389. {ipython-8.26.0 → ipython-8.28.0}/docs/source/install/kernel_install.rst +0 -0
  390. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/autoawait.rst +0 -0
  391. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/figs/besselj.png +0 -0
  392. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/figs/colors_dark.png +0 -0
  393. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/figs/jn.html +0 -0
  394. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/figs/jn.xhtml +0 -0
  395. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/index.rst +0 -0
  396. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/magics.rst +0 -0
  397. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/plotting.rst +0 -0
  398. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  399. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/reference.rst +0 -0
  400. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/shell.rst +0 -0
  401. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/tips.rst +0 -0
  402. {ipython-8.26.0 → ipython-8.28.0}/docs/source/interactive/tutorial.rst +0 -0
  403. {ipython-8.26.0 → ipython-8.28.0}/docs/source/links.txt +0 -0
  404. {ipython-8.26.0 → ipython-8.28.0}/docs/source/overview.rst +0 -0
  405. {ipython-8.26.0 → ipython-8.28.0}/docs/source/parallel/index.rst +0 -0
  406. {ipython-8.26.0 → ipython-8.28.0}/docs/source/sphinx.toml +0 -0
  407. {ipython-8.26.0 → ipython-8.28.0}/docs/source/sphinxext.rst +0 -0
  408. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/development.rst +0 -0
  409. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  410. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  411. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  412. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  413. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  414. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  415. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  416. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  417. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  418. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  419. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  420. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/index.rst +0 -0
  421. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/pr/README.md +0 -0
  422. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  423. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  424. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version0.10.rst +0 -0
  425. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version0.11.rst +0 -0
  426. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version0.12.rst +0 -0
  427. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version0.13.rst +0 -0
  428. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version0.8.rst +0 -0
  429. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version0.9.rst +0 -0
  430. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version1.0.rst +0 -0
  431. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version2.0.rst +0 -0
  432. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version3.rst +0 -0
  433. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  434. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version4.rst +0 -0
  435. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version5.rst +0 -0
  436. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version6.rst +0 -0
  437. {ipython-8.26.0 → ipython-8.28.0}/docs/source/whatsnew/version7.rst +0 -0
  438. {ipython-8.26.0 → ipython-8.28.0}/docs/sphinxext/apigen.py +0 -0
  439. {ipython-8.26.0 → ipython-8.28.0}/docs/sphinxext/configtraits.py +0 -0
  440. {ipython-8.26.0 → ipython-8.28.0}/docs/sphinxext/github.py +0 -0
  441. {ipython-8.26.0 → ipython-8.28.0}/docs/sphinxext/magics.py +0 -0
  442. {ipython-8.26.0 → ipython-8.28.0}/examples/Embedding/Index.ipynb +0 -0
  443. {ipython-8.26.0 → ipython-8.28.0}/examples/Embedding/embed_class_long.py +0 -0
  444. {ipython-8.26.0 → ipython-8.28.0}/examples/Embedding/embed_class_short.py +0 -0
  445. {ipython-8.26.0 → ipython-8.28.0}/examples/Embedding/embed_function.py +0 -0
  446. {ipython-8.26.0 → ipython-8.28.0}/examples/Embedding/start_ipython_config.py +0 -0
  447. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
  448. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
  449. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
  450. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Capturing Output.ipynb +0 -0
  451. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
  452. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Custom Display Logic.ipynb +0 -0
  453. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
  454. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Index.ipynb +0 -0
  455. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
  456. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
  457. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
  458. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
  459. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
  460. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
  461. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
  462. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
  463. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
  464. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
  465. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/data/flare.json +0 -0
  466. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/example-demo.py +0 -0
  467. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  468. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  469. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  470. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  471. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  472. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/ipython.desktop +0 -0
  473. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/nbpackage/__init__.py +0 -0
  474. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
  475. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
  476. {ipython-8.26.0 → ipython-8.28.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
  477. {ipython-8.26.0 → ipython-8.28.0}/examples/Index.ipynb +0 -0
  478. {ipython-8.26.0 → ipython-8.28.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
  479. {ipython-8.26.0 → ipython-8.28.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
  480. {ipython-8.26.0 → ipython-8.28.0}/examples/images/FrontendKernel.png +0 -0
  481. {ipython-8.26.0 → ipython-8.28.0}/examples/images/animation.m4v +0 -0
  482. {ipython-8.26.0 → ipython-8.28.0}/examples/images/ipython_logo.png +0 -0
  483. {ipython-8.26.0 → ipython-8.28.0}/examples/images/python_logo.svg +0 -0
  484. {ipython-8.26.0 → ipython-8.28.0}/examples/utils/cwd_prompt.py +0 -0
  485. {ipython-8.26.0 → ipython-8.28.0}/examples/utils/list_pyfiles.ipy +0 -0
  486. {ipython-8.26.0 → ipython-8.28.0}/examples/utils/list_subdirs.ipy +0 -0
  487. {ipython-8.26.0 → ipython-8.28.0}/ipython.egg-info/dependency_links.txt +0 -0
  488. {ipython-8.26.0 → ipython-8.28.0}/ipython.egg-info/entry_points.txt +0 -0
  489. {ipython-8.26.0 → ipython-8.28.0}/ipython.egg-info/not-zip-safe +0 -0
  490. {ipython-8.26.0 → ipython-8.28.0}/ipython.egg-info/requires.txt +0 -0
  491. {ipython-8.26.0 → ipython-8.28.0}/ipython.egg-info/top_level.txt +0 -0
  492. {ipython-8.26.0 → ipython-8.28.0}/long_description.rst +0 -0
  493. {ipython-8.26.0 → ipython-8.28.0}/pyproject.toml +0 -0
  494. {ipython-8.26.0 → ipython-8.28.0}/scripts/ipython.ico +0 -0
  495. {ipython-8.26.0 → ipython-8.28.0}/scripts/ipython_nb.ico +0 -0
  496. {ipython-8.26.0 → ipython-8.28.0}/setup.cfg +0 -0
  497. {ipython-8.26.0 → ipython-8.28.0}/setup.py +0 -0
  498. {ipython-8.26.0 → ipython-8.28.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)
@@ -14,14 +14,35 @@ Among other things, this subclass of PDB:
14
14
  - hide frames in tracebacks based on `__tracebackhide__`
15
15
  - allows to skip frames based on `__debuggerskip__`
16
16
 
17
+
18
+ Global Configuration
19
+ --------------------
20
+
21
+ The IPython debugger will by read the global ``~/.pdbrc`` file.
22
+ That is to say you can list all comands supported by ipdb in your `~/.pdbrc`
23
+ configuration file, to globally configure pdb.
24
+
25
+ Example::
26
+
27
+ # ~/.pdbrc
28
+ skip_predicates debuggerskip false
29
+ skip_hidden false
30
+ context 25
31
+
32
+ Features
33
+ --------
34
+
35
+ The IPython debugger can hide and skip frames when printing or moving through
36
+ the stack. This can have a performance impact, so can be configures.
37
+
17
38
  The skipping and hiding frames are configurable via the `skip_predicates`
18
39
  command.
19
40
 
20
41
  By default, frames from readonly files will be hidden, frames containing
21
- ``__tracebackhide__=True`` will be hidden.
42
+ ``__tracebackhide__ = True`` will be hidden.
22
43
 
23
- Frames containing ``__debuggerskip__`` will be stepped over, frames who's parent
24
- frames value of ``__debuggerskip__`` is ``True`` will be skipped.
44
+ Frames containing ``__debuggerskip__`` will be stepped over, frames whose parent
45
+ frames value of ``__debuggerskip__`` is ``True`` will also be skipped.
25
46
 
26
47
  >>> def helpers_helper():
27
48
  ... pass
@@ -1070,7 +1091,9 @@ class Pdb(OldPdb):
1070
1091
  raise ValueError()
1071
1092
  self.context = new_context
1072
1093
  except ValueError:
1073
- self.error("The 'context' command requires a positive integer argument.")
1094
+ self.error(
1095
+ f"The 'context' command requires a positive integer argument (current value {self.context})."
1096
+ )
1074
1097
 
1075
1098
 
1076
1099
  class InterruptiblePdb(Pdb):
@@ -41,7 +41,11 @@ from warnings import warn
41
41
 
42
42
  def __getattr__(name):
43
43
  if name in _deprecated_names:
44
- warn(f"Importing {name} from IPython.core.display is deprecated since IPython 7.14, please import from IPython display", DeprecationWarning, stacklevel=2)
44
+ warn(
45
+ f"Importing {name} from IPython.core.display is deprecated since IPython 7.14, please import from IPython.display",
46
+ DeprecationWarning,
47
+ stacklevel=2,
48
+ )
45
49
  return getattr(display_functions, name)
46
50
 
47
51
  if name in globals().keys():
@@ -9,6 +9,7 @@
9
9
  #-----------------------------------------------------------------------------
10
10
 
11
11
  import functools
12
+ import os
12
13
  import re
13
14
  import shlex
14
15
  import sys
@@ -41,6 +42,16 @@ def _get_conda_like_executable(command):
41
42
  executable: string
42
43
  Value should be: conda, mamba or micromamba
43
44
  """
45
+ # Check for a environment variable bound to the base executable, both conda and mamba
46
+ # set these when activating an environment.
47
+ base_executable = "CONDA_EXE"
48
+ if "mamba" in command.lower():
49
+ base_executable = "MAMBA_EXE"
50
+ if base_executable in os.environ:
51
+ executable = Path(os.environ[base_executable])
52
+ if executable.is_file():
53
+ return str(executable.resolve())
54
+
44
55
  # Check if there is a conda executable in the same directory as the Python executable.
45
56
  # This is the case within conda's root environment.
46
57
  executable = Path(sys.executable).parent / command
@@ -48,10 +59,12 @@ def _get_conda_like_executable(command):
48
59
  return str(executable)
49
60
 
50
61
  # Otherwise, attempt to extract the executable from conda history.
51
- # This applies in any conda environment.
62
+ # This applies in any conda environment. Parsing this way is error prone because
63
+ # different versions of conda and mamba include differing cmd values such as
64
+ # `conda`, `conda-script.py`, or `path/to/conda`, here use the raw command provided.
52
65
  history = Path(sys.prefix, "conda-meta", "history").read_text(encoding="utf-8")
53
66
  match = re.search(
54
- rf"^#\s*cmd:\s*(?P<command>.*{executable})\s[create|install]",
67
+ rf"^#\s*cmd:\s*(?P<command>.*{command})\s[create|install]",
55
68
  history,
56
69
  flags=re.MULTILINE,
57
70
  )
@@ -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 = 28
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_)