ipython 9.8.0__tar.gz → 9.10.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 (442) hide show
  1. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/async_helpers.py +4 -9
  2. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/completer.py +2 -2
  3. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/history.py +30 -4
  4. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/inputtransformer2.py +92 -2
  5. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/interactiveshell.py +1 -1
  6. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/prefilter.py +2 -2
  7. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/release.py +1 -1
  8. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/splitinput.py +45 -35
  9. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/tips.py +10 -0
  10. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/autoreload.py +4 -0
  11. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/deduperreload/deduperreload.py +22 -6
  12. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/deduperreload/deduperreload_patching.py +3 -8
  13. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/pretty.py +8 -0
  14. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/__init__.py +1 -0
  15. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_sysinfo.py +1 -1
  16. {ipython-9.8.0/ipython.egg-info → ipython-9.10.0}/PKG-INFO +3 -2
  17. {ipython-9.8.0 → ipython-9.10.0}/docs/source/conf.py +6 -0
  18. {ipython-9.8.0 → ipython-9.10.0}/docs/source/install/install.rst +26 -0
  19. {ipython-9.8.0 → ipython-9.10.0}/docs/source/sphinx.toml +1 -1
  20. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version9.rst +96 -5
  21. {ipython-9.8.0 → ipython-9.10.0/ipython.egg-info}/PKG-INFO +3 -2
  22. {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/SOURCES.txt +1 -2
  23. {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/requires.txt +2 -1
  24. {ipython-9.8.0 → ipython-9.10.0}/pyproject.toml +2 -1
  25. {ipython-9.8.0 → ipython-9.10.0}/tests/test_async_helpers.py +11 -0
  26. {ipython-9.8.0 → ipython-9.10.0}/tests/test_completer.py +23 -0
  27. {ipython-9.8.0 → ipython-9.10.0}/tests/test_inputtransformer2_line.py +57 -2
  28. {ipython-9.8.0 → ipython-9.10.0}/tests/test_pretty.py +25 -0
  29. ipython-9.8.0/docs/sphinxext/github.py +0 -168
  30. {ipython-9.8.0 → ipython-9.10.0}/.flake8 +0 -0
  31. {ipython-9.8.0 → ipython-9.10.0}/.mailmap +0 -0
  32. {ipython-9.8.0 → ipython-9.10.0}/.pre-commit-config.yaml +0 -0
  33. {ipython-9.8.0 → ipython-9.10.0}/COPYING.rst +0 -0
  34. {ipython-9.8.0 → ipython-9.10.0}/IPython/__init__.py +0 -0
  35. {ipython-9.8.0 → ipython-9.10.0}/IPython/__main__.py +0 -0
  36. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/__init__.py +0 -0
  37. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/alias.py +0 -0
  38. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/application.py +0 -0
  39. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/autocall.py +0 -0
  40. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/builtin_trap.py +0 -0
  41. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/compilerop.py +0 -0
  42. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/completerlib.py +0 -0
  43. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/crashhandler.py +0 -0
  44. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/debugger.py +0 -0
  45. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/debugger_backport.py +0 -0
  46. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/display.py +0 -0
  47. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/display_functions.py +0 -0
  48. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/display_trap.py +0 -0
  49. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/displayhook.py +0 -0
  50. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/displaypub.py +0 -0
  51. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/doctb.py +0 -0
  52. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/error.py +0 -0
  53. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/events.py +0 -0
  54. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/extensions.py +0 -0
  55. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/formatters.py +0 -0
  56. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/getipython.py +0 -0
  57. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/guarded_eval.py +0 -0
  58. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/historyapp.py +0 -0
  59. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/hooks.py +0 -0
  60. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/latex_symbols.py +0 -0
  61. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/logger.py +0 -0
  62. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/macro.py +0 -0
  63. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magic.py +0 -0
  64. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magic_arguments.py +0 -0
  65. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/__init__.py +0 -0
  66. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/ast_mod.py +0 -0
  67. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/auto.py +0 -0
  68. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/basic.py +0 -0
  69. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/code.py +0 -0
  70. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/config.py +0 -0
  71. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/display.py +0 -0
  72. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/execution.py +0 -0
  73. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/extension.py +0 -0
  74. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/history.py +0 -0
  75. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/logging.py +0 -0
  76. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/namespace.py +0 -0
  77. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/osm.py +0 -0
  78. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/packaging.py +0 -0
  79. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/pylab.py +0 -0
  80. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/magics/script.py +0 -0
  81. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/oinspect.py +0 -0
  82. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/page.py +0 -0
  83. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/payload.py +0 -0
  84. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/payloadpage.py +0 -0
  85. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/profile/README_STARTUP +0 -0
  86. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/profileapp.py +0 -0
  87. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/profiledir.py +0 -0
  88. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/pylabtools.py +0 -0
  89. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/shellapp.py +0 -0
  90. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/tbtools.py +0 -0
  91. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/ultratb.py +0 -0
  92. {ipython-9.8.0 → ipython-9.10.0}/IPython/core/usage.py +0 -0
  93. {ipython-9.8.0 → ipython-9.10.0}/IPython/display.py +0 -0
  94. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/__init__.py +0 -0
  95. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/deduperreload/__init__.py +0 -0
  96. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/storemagic.py +0 -0
  97. {ipython-9.8.0 → ipython-9.10.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
  98. {ipython-9.8.0 → ipython-9.10.0}/IPython/external/__init__.py +0 -0
  99. {ipython-9.8.0 → ipython-9.10.0}/IPython/external/pickleshare.py +0 -0
  100. {ipython-9.8.0 → ipython-9.10.0}/IPython/external/qt_for_kernel.py +0 -0
  101. {ipython-9.8.0 → ipython-9.10.0}/IPython/external/qt_loaders.py +0 -0
  102. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/__init__.py +0 -0
  103. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/backgroundjobs.py +0 -0
  104. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/clipboard.py +0 -0
  105. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/deepreload.py +0 -0
  106. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/demo.py +0 -0
  107. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/display.py +0 -0
  108. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/editorhooks.py +0 -0
  109. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/guisupport.py +0 -0
  110. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/latextools.py +0 -0
  111. {ipython-9.8.0 → ipython-9.10.0}/IPython/lib/lexers.py +0 -0
  112. {ipython-9.8.0 → ipython-9.10.0}/IPython/paths.py +0 -0
  113. {ipython-9.8.0 → ipython-9.10.0}/IPython/py.typed +0 -0
  114. {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/__init__.py +0 -0
  115. {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/custom_doctests.py +0 -0
  116. {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  117. {ipython-9.8.0 → ipython-9.10.0}/IPython/sphinxext/ipython_directive.py +0 -0
  118. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/__init__.py +0 -0
  119. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/debugger.py +0 -0
  120. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/embed.py +0 -0
  121. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/interactiveshell.py +0 -0
  122. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/ipapp.py +0 -0
  123. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/magics.py +0 -0
  124. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/prompts.py +0 -0
  125. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  126. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  127. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  128. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  129. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  130. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  131. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  132. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  133. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  134. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  135. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  136. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/ptutils.py +0 -0
  137. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  138. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  139. {ipython-9.8.0 → ipython-9.10.0}/IPython/terminal/shortcuts/filters.py +0 -0
  140. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/__init__.py +0 -0
  141. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/decorators.py +0 -0
  142. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/globalipapp.py +0 -0
  143. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/ipunittest.py +0 -0
  144. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/Makefile +0 -0
  145. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/__init__.py +0 -0
  146. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/dtexample.py +0 -0
  147. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  148. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  149. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/setup.py +0 -0
  150. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/simple.py +0 -0
  151. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/simplevars.py +0 -0
  152. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_combo.txt +0 -0
  153. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_example.txt +0 -0
  154. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  155. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  156. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/plugin/test_refs.py +0 -0
  157. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/skipdoctest.py +0 -0
  158. {ipython-9.8.0 → ipython-9.10.0}/IPython/testing/tools.py +0 -0
  159. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/PyColorize.py +0 -0
  160. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/__init__.py +0 -0
  161. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_cli.py +0 -0
  162. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_common.py +0 -0
  163. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_emscripten.py +0 -0
  164. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_posix.py +0 -0
  165. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_win32.py +0 -0
  166. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/_process_win32_controller.py +0 -0
  167. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/capture.py +0 -0
  168. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/coloransi.py +0 -0
  169. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/contexts.py +0 -0
  170. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/data.py +0 -0
  171. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/decorators.py +0 -0
  172. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/dir2.py +0 -0
  173. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/docs.py +0 -0
  174. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/encoding.py +0 -0
  175. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/eventful.py +0 -0
  176. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/frame.py +0 -0
  177. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/generics.py +0 -0
  178. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/importstring.py +0 -0
  179. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/io.py +0 -0
  180. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/ipstruct.py +0 -0
  181. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/jsonutil.py +0 -0
  182. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/log.py +0 -0
  183. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/module_paths.py +0 -0
  184. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/openpy.py +0 -0
  185. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/path.py +0 -0
  186. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/process.py +0 -0
  187. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/py3compat.py +0 -0
  188. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/sentinel.py +0 -0
  189. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/strdispatch.py +0 -0
  190. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/sysinfo.py +0 -0
  191. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/syspathcontext.py +0 -0
  192. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/tempdir.py +0 -0
  193. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/terminal.py +0 -0
  194. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/text.py +0 -0
  195. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/timing.py +0 -0
  196. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/tokenutil.py +0 -0
  197. {ipython-9.8.0 → ipython-9.10.0}/IPython/utils/wildcard.py +0 -0
  198. {ipython-9.8.0 → ipython-9.10.0}/LICENSE +0 -0
  199. {ipython-9.8.0 → ipython-9.10.0}/MANIFEST.in +0 -0
  200. {ipython-9.8.0 → ipython-9.10.0}/README.rst +0 -0
  201. {ipython-9.8.0 → ipython-9.10.0}/_build_meta.py +0 -0
  202. {ipython-9.8.0 → ipython-9.10.0}/docs/Makefile +0 -0
  203. {ipython-9.8.0 → ipython-9.10.0}/docs/README.rst +0 -0
  204. {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_api.py +0 -0
  205. {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_config.py +0 -0
  206. {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_magics.py +0 -0
  207. {ipython-9.8.0 → ipython-9.10.0}/docs/autogen_shortcuts.py +0 -0
  208. {ipython-9.8.0 → ipython-9.10.0}/docs/make.cmd +0 -0
  209. {ipython-9.8.0 → ipython-9.10.0}/docs/man/ipython.1 +0 -0
  210. {ipython-9.8.0 → ipython-9.10.0}/docs/requirements.txt +0 -0
  211. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/running-crop.png +0 -0
  212. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/running.png +0 -0
  213. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/treeview.png +0 -0
  214. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/user-interface.png +0 -0
  215. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/2.0/widgets.png +0 -0
  216. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  217. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  218. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  219. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  220. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  221. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  222. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  223. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  224. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  225. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  226. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  227. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/autosuggest.gif +0 -0
  228. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  229. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  230. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  231. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  232. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  233. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  234. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  235. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  236. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  237. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  238. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  239. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  240. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  241. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  242. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  243. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ms_visual_studio.png +0 -0
  244. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/notebook_specgram.png +0 -0
  245. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/ptshell_features.png +0 -0
  246. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/qtconsole.png +0 -0
  247. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  248. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_images/unicode_completion.png +0 -0
  249. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_static/favicon.ico +0 -0
  250. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_static/logo.png +0 -0
  251. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_static/theme_overrides.css +0 -0
  252. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_templates/breadcrumbs.html +0 -0
  253. {ipython-9.8.0 → ipython-9.10.0}/docs/source/_templates/notebook_redirect.html +0 -0
  254. {ipython-9.8.0 → ipython-9.10.0}/docs/source/about/history.rst +0 -0
  255. {ipython-9.8.0 → ipython-9.10.0}/docs/source/about/index.rst +0 -0
  256. {ipython-9.8.0 → ipython-9.10.0}/docs/source/about/license_and_copyright.rst +0 -0
  257. {ipython-9.8.0 → ipython-9.10.0}/docs/source/api/index.rst +0 -0
  258. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/callbacks.rst +0 -0
  259. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/custommagics.rst +0 -0
  260. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/details.rst +0 -0
  261. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/eventloops.rst +0 -0
  262. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/extensions/autoreload.rst +0 -0
  263. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/extensions/index.rst +0 -0
  264. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/extensions/storemagic.rst +0 -0
  265. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/index.rst +0 -0
  266. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/inputtransforms.rst +0 -0
  267. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/integrating.rst +0 -0
  268. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/intro.rst +0 -0
  269. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/options/index.rst +0 -0
  270. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  271. {ipython-9.8.0 → ipython-9.10.0}/docs/source/config/shortcuts/index.rst +0 -0
  272. {ipython-9.8.0 → ipython-9.10.0}/docs/source/coredev/index.rst +0 -0
  273. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/config.rst +0 -0
  274. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/execution.rst +0 -0
  275. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  276. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  277. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/other_kernels.png +0 -0
  278. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/figs/other_kernels.svg +0 -0
  279. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/how_ipython_works.rst +0 -0
  280. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/index.rst +0 -0
  281. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/inputhook_app.rst +0 -0
  282. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/kernels.rst +0 -0
  283. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/messaging.rst +0 -0
  284. {ipython-9.8.0 → ipython-9.10.0}/docs/source/development/wrapperkernels.rst +0 -0
  285. {ipython-9.8.0 → ipython-9.10.0}/docs/source/index.rst +0 -0
  286. {ipython-9.8.0 → ipython-9.10.0}/docs/source/install/index.rst +0 -0
  287. {ipython-9.8.0 → ipython-9.10.0}/docs/source/install/kernel_install.rst +0 -0
  288. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/autoawait.rst +0 -0
  289. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/index.rst +0 -0
  290. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/magics.rst +0 -0
  291. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/plotting.rst +0 -0
  292. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  293. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/reference.rst +0 -0
  294. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/shell.rst +0 -0
  295. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/tips.rst +0 -0
  296. {ipython-9.8.0 → ipython-9.10.0}/docs/source/interactive/tutorial.rst +0 -0
  297. {ipython-9.8.0 → ipython-9.10.0}/docs/source/links.txt +0 -0
  298. {ipython-9.8.0 → ipython-9.10.0}/docs/source/overview.rst +0 -0
  299. {ipython-9.8.0 → ipython-9.10.0}/docs/source/parallel/index.rst +0 -0
  300. {ipython-9.8.0 → ipython-9.10.0}/docs/source/sphinxext.rst +0 -0
  301. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/development.rst +0 -0
  302. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  303. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  304. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  305. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  306. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  307. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  308. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  309. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  310. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  311. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  312. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  313. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/index.rst +0 -0
  314. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/pr/README.md +0 -0
  315. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  316. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  317. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.10.rst +0 -0
  318. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.11.rst +0 -0
  319. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.12.rst +0 -0
  320. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.13.rst +0 -0
  321. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.8.rst +0 -0
  322. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version0.9.rst +0 -0
  323. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version1.0.rst +0 -0
  324. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version2.0.rst +0 -0
  325. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version3.rst +0 -0
  326. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  327. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version4.rst +0 -0
  328. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version5.rst +0 -0
  329. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version6.rst +0 -0
  330. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version7.rst +0 -0
  331. {ipython-9.8.0 → ipython-9.10.0}/docs/source/whatsnew/version8.rst +0 -0
  332. {ipython-9.8.0 → ipython-9.10.0}/docs/sphinxext/apigen.py +0 -0
  333. {ipython-9.8.0 → ipython-9.10.0}/docs/sphinxext/configtraits.py +0 -0
  334. {ipython-9.8.0 → ipython-9.10.0}/docs/sphinxext/magics.py +0 -0
  335. {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/embed_class_long.py +0 -0
  336. {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/embed_class_short.py +0 -0
  337. {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/embed_function.py +0 -0
  338. {ipython-9.8.0 → ipython-9.10.0}/examples/Embedding/start_ipython_config.py +0 -0
  339. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/example-demo.py +0 -0
  340. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  341. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  342. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  343. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  344. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  345. {ipython-9.8.0 → ipython-9.10.0}/examples/IPython Kernel/ipython.desktop +0 -0
  346. {ipython-9.8.0 → ipython-9.10.0}/examples/auto_suggest_llm.py +0 -0
  347. {ipython-9.8.0 → ipython-9.10.0}/examples/utils/cwd_prompt.py +0 -0
  348. {ipython-9.8.0 → ipython-9.10.0}/examples/utils/list_pyfiles.ipy +0 -0
  349. {ipython-9.8.0 → ipython-9.10.0}/examples/utils/list_subdirs.ipy +0 -0
  350. {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/dependency_links.txt +0 -0
  351. {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/entry_points.txt +0 -0
  352. {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/not-zip-safe +0 -0
  353. {ipython-9.8.0 → ipython-9.10.0}/ipython.egg-info/top_level.txt +0 -0
  354. {ipython-9.8.0 → ipython-9.10.0}/long_description.rst +0 -0
  355. {ipython-9.8.0 → ipython-9.10.0}/scripts/ipython.ico +0 -0
  356. {ipython-9.8.0 → ipython-9.10.0}/scripts/ipython_nb.ico +0 -0
  357. {ipython-9.8.0 → ipython-9.10.0}/setup.cfg +0 -0
  358. {ipython-9.8.0 → ipython-9.10.0}/setup.py +0 -0
  359. {ipython-9.8.0 → ipython-9.10.0}/setupbase.py +0 -0
  360. {ipython-9.8.0 → ipython-9.10.0}/tests/2x2.jpg +0 -0
  361. {ipython-9.8.0 → ipython-9.10.0}/tests/2x2.png +0 -0
  362. {ipython-9.8.0 → ipython-9.10.0}/tests/__init__.py +0 -0
  363. {ipython-9.8.0 → ipython-9.10.0}/tests/bad_all.py +0 -0
  364. {ipython-9.8.0 → ipython-9.10.0}/tests/conftest.py +0 -0
  365. {ipython-9.8.0 → ipython-9.10.0}/tests/fake_ext_dir/daft_extension.py +0 -0
  366. {ipython-9.8.0 → ipython-9.10.0}/tests/fake_llm.py +0 -0
  367. {ipython-9.8.0 → ipython-9.10.0}/tests/nonascii.py +0 -0
  368. {ipython-9.8.0 → ipython-9.10.0}/tests/nonascii2.py +0 -0
  369. {ipython-9.8.0 → ipython-9.10.0}/tests/print_argv.py +0 -0
  370. {ipython-9.8.0 → ipython-9.10.0}/tests/refbug.py +0 -0
  371. {ipython-9.8.0 → ipython-9.10.0}/tests/simpleerr.py +0 -0
  372. {ipython-9.8.0 → ipython-9.10.0}/tests/tclass.py +0 -0
  373. {ipython-9.8.0 → ipython-9.10.0}/tests/test.wav +0 -0
  374. {ipython-9.8.0 → ipython-9.10.0}/tests/test_alias.py +0 -0
  375. {ipython-9.8.0 → ipython-9.10.0}/tests/test_application.py +0 -0
  376. {ipython-9.8.0 → ipython-9.10.0}/tests/test_autocall.py +0 -0
  377. {ipython-9.8.0 → ipython-9.10.0}/tests/test_backgroundjobs.py +0 -0
  378. {ipython-9.8.0 → ipython-9.10.0}/tests/test_capture.py +0 -0
  379. {ipython-9.8.0 → ipython-9.10.0}/tests/test_clipboard.py +0 -0
  380. {ipython-9.8.0 → ipython-9.10.0}/tests/test_compilerop.py +0 -0
  381. {ipython-9.8.0 → ipython-9.10.0}/tests/test_completerlib.py +0 -0
  382. /ipython-9.8.0/tests/cve.py → /ipython-9.10.0/tests/test_cve.py +0 -0
  383. {ipython-9.8.0 → ipython-9.10.0}/tests/test_debug_magic.py +0 -0
  384. {ipython-9.8.0 → ipython-9.10.0}/tests/test_debugger.py +0 -0
  385. {ipython-9.8.0 → ipython-9.10.0}/tests/test_decorators.py +0 -0
  386. {ipython-9.8.0 → ipython-9.10.0}/tests/test_decorators_2.py +0 -0
  387. {ipython-9.8.0 → ipython-9.10.0}/tests/test_deepreload.py +0 -0
  388. {ipython-9.8.0 → ipython-9.10.0}/tests/test_dir2.py +0 -0
  389. {ipython-9.8.0 → ipython-9.10.0}/tests/test_display.py +0 -0
  390. {ipython-9.8.0 → ipython-9.10.0}/tests/test_display_2.py +0 -0
  391. {ipython-9.8.0 → ipython-9.10.0}/tests/test_displayhook.py +0 -0
  392. {ipython-9.8.0 → ipython-9.10.0}/tests/test_editorhooks.py +0 -0
  393. {ipython-9.8.0 → ipython-9.10.0}/tests/test_embed.py +0 -0
  394. {ipython-9.8.0 → ipython-9.10.0}/tests/test_events.py +0 -0
  395. {ipython-9.8.0 → ipython-9.10.0}/tests/test_exceptiongroup_tb.py +0 -0
  396. {ipython-9.8.0 → ipython-9.10.0}/tests/test_extension.py +0 -0
  397. {ipython-9.8.0 → ipython-9.10.0}/tests/test_formatters.py +0 -0
  398. {ipython-9.8.0 → ipython-9.10.0}/tests/test_guarded_eval.py +0 -0
  399. {ipython-9.8.0 → ipython-9.10.0}/tests/test_handlers.py +0 -0
  400. {ipython-9.8.0 → ipython-9.10.0}/tests/test_help.py +0 -0
  401. {ipython-9.8.0 → ipython-9.10.0}/tests/test_history.py +0 -0
  402. {ipython-9.8.0 → ipython-9.10.0}/tests/test_hooks.py +0 -0
  403. {ipython-9.8.0 → ipython-9.10.0}/tests/test_imports.py +0 -0
  404. {ipython-9.8.0 → ipython-9.10.0}/tests/test_importstring.py +0 -0
  405. {ipython-9.8.0 → ipython-9.10.0}/tests/test_inputtransformer2.py +0 -0
  406. {ipython-9.8.0 → ipython-9.10.0}/tests/test_interactiveshell.py +0 -0
  407. {ipython-9.8.0 → ipython-9.10.0}/tests/test_interactivshell.py +0 -0
  408. {ipython-9.8.0 → ipython-9.10.0}/tests/test_io.py +0 -0
  409. {ipython-9.8.0 → ipython-9.10.0}/tests/test_iplib.py +0 -0
  410. {ipython-9.8.0 → ipython-9.10.0}/tests/test_ipunittest.py +0 -0
  411. {ipython-9.8.0 → ipython-9.10.0}/tests/test_latextools.py +0 -0
  412. {ipython-9.8.0 → ipython-9.10.0}/tests/test_logger.py +0 -0
  413. {ipython-9.8.0 → ipython-9.10.0}/tests/test_magic.py +0 -0
  414. {ipython-9.8.0 → ipython-9.10.0}/tests/test_magic_arguments.py +0 -0
  415. {ipython-9.8.0 → ipython-9.10.0}/tests/test_magic_terminal.py +0 -0
  416. {ipython-9.8.0 → ipython-9.10.0}/tests/test_module_paths.py +0 -0
  417. {ipython-9.8.0 → ipython-9.10.0}/tests/test_oinspect.py +0 -0
  418. {ipython-9.8.0 → ipython-9.10.0}/tests/test_openpy.py +0 -0
  419. {ipython-9.8.0 → ipython-9.10.0}/tests/test_page.py +0 -0
  420. {ipython-9.8.0 → ipython-9.10.0}/tests/test_path.py +0 -0
  421. {ipython-9.8.0 → ipython-9.10.0}/tests/test_paths.py +0 -0
  422. {ipython-9.8.0 → ipython-9.10.0}/tests/test_prefilter.py +0 -0
  423. {ipython-9.8.0 → ipython-9.10.0}/tests/test_process.py +0 -0
  424. {ipython-9.8.0 → ipython-9.10.0}/tests/test_profile.py +0 -0
  425. {ipython-9.8.0 → ipython-9.10.0}/tests/test_pt_inputhooks.py +0 -0
  426. {ipython-9.8.0 → ipython-9.10.0}/tests/test_pycolorize.py +0 -0
  427. {ipython-9.8.0 → ipython-9.10.0}/tests/test_pylabtools.py +0 -0
  428. {ipython-9.8.0 → ipython-9.10.0}/tests/test_qt_loaders.py +0 -0
  429. {ipython-9.8.0 → ipython-9.10.0}/tests/test_run.py +0 -0
  430. {ipython-9.8.0 → ipython-9.10.0}/tests/test_shellapp.py +0 -0
  431. {ipython-9.8.0 → ipython-9.10.0}/tests/test_shortcuts.py +0 -0
  432. {ipython-9.8.0 → ipython-9.10.0}/tests/test_splitinput.py +0 -0
  433. {ipython-9.8.0 → ipython-9.10.0}/tests/test_storemagic.py +0 -0
  434. {ipython-9.8.0 → ipython-9.10.0}/tests/test_sysinfo.py +0 -0
  435. {ipython-9.8.0 → ipython-9.10.0}/tests/test_tempdir.py +0 -0
  436. {ipython-9.8.0 → ipython-9.10.0}/tests/test_text.py +0 -0
  437. {ipython-9.8.0 → ipython-9.10.0}/tests/test_tips.py +0 -0
  438. {ipython-9.8.0 → ipython-9.10.0}/tests/test_tokenutil.py +0 -0
  439. {ipython-9.8.0 → ipython-9.10.0}/tests/test_tools.py +0 -0
  440. {ipython-9.8.0 → ipython-9.10.0}/tests/test_ultratb.py +0 -0
  441. {ipython-9.8.0 → ipython-9.10.0}/tests/test_wildcard.py +0 -0
  442. {ipython-9.8.0 → ipython-9.10.0}/tests/test_zzz_autoreload.py +0 -0
@@ -136,20 +136,15 @@ def _pseudo_sync_runner(coro):
136
136
 
137
137
 
138
138
  def _should_be_async(cell: str) -> bool:
139
- """Detect if a block of code need to be wrapped in an `async def`
139
+ """Detect if a block of code needs to be wrapped in an `async def`
140
140
 
141
- Attempt to parse the block of code, it it compile we're fine.
142
- Otherwise we wrap if and try to compile.
143
-
144
- If it works, assume it should be async. Otherwise Return False.
145
-
146
- Not handled yet: If the block of code has a return statement as the top
147
- level, it will be seen as async. This is a know limitation.
141
+ If the code block has a top-level return statement or is otherwise
142
+ invalid, `False` will be returned.
148
143
  """
149
144
  try:
150
145
  code = compile(
151
146
  cell, "<>", "exec", flags=getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
152
147
  )
153
148
  return inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE
154
- except (SyntaxError, MemoryError):
149
+ except (SyntaxError, ValueError, MemoryError):
155
150
  return False
@@ -2608,8 +2608,8 @@ class IPCompleter(Completer):
2608
2608
  if re.search(r"(?<!\w)(?<!\d\.)([-+]?\d+\.(\d+)?)(?!\w)$", line):
2609
2609
  return self._CompletionContextType.GLOBAL
2610
2610
 
2611
- # Handle all other attribute matches np.ran, d[0].k, (a,b).count
2612
- chain_match = re.search(r".*(.+(?<!\s)\.(?:[a-zA-Z]\w*)?)$", line)
2611
+ # Handle all other attribute matches np.ran, d[0].k, (a,b).count, obj._private
2612
+ chain_match = re.search(r".*(.+(?<!\s)\.(?:[a-zA-Z_]\w*)?)$", line)
2613
2613
  if chain_match:
2614
2614
  return self._CompletionContextType.ATTRIBUTE
2615
2615
 
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import atexit
10
10
  import datetime
11
+ import os
11
12
  import re
12
13
 
13
14
 
@@ -689,6 +690,7 @@ class HistoryManager(HistoryAccessor):
689
690
  )
690
691
  self.hist_file = ":memory:"
691
692
 
693
+ self.using_thread = False
692
694
  if self.enabled and self.hist_file != ":memory:":
693
695
  self.save_thread = HistorySavingThread(self)
694
696
  try:
@@ -699,6 +701,8 @@ class HistoryManager(HistoryAccessor):
699
701
  exc_info=True,
700
702
  )
701
703
  self.hist_file = ":memory:"
704
+ else:
705
+ self.using_thread = True
702
706
  self._instances.add(self)
703
707
  assert len(HistoryManager._instances) <= HistoryManager._max_inst, (
704
708
  len(HistoryManager._instances),
@@ -709,6 +713,20 @@ class HistoryManager(HistoryAccessor):
709
713
  if self.save_thread is not None:
710
714
  self.save_thread.stop()
711
715
 
716
+ @classmethod
717
+ def _stop_thread(cls) -> None:
718
+ # Used before forking so the thread isn't running at fork
719
+ for inst in cls._instances:
720
+ if inst.save_thread is not None:
721
+ inst.save_thread.stop()
722
+ inst.save_thread = None
723
+
724
+ def _restart_thread_if_stopped(self) -> None:
725
+ # Start the thread again after it was stopped for forking
726
+ if self.save_thread is None and self.using_thread:
727
+ self.save_thread = HistorySavingThread(self)
728
+ self.save_thread.start()
729
+
712
730
  def _get_hist_file_name(self, profile: Optional[str] = None) -> Path:
713
731
  """Get default history file name based on the Shell's profile.
714
732
 
@@ -970,8 +988,10 @@ class HistoryManager(HistoryAccessor):
970
988
  self.db_input_cache.append((line_num, source, source_raw))
971
989
  # Trigger to flush cache and write to DB.
972
990
  if len(self.db_input_cache) >= self.db_cache_size:
973
- if self.save_flag:
974
- self.save_flag.set()
991
+ if self.using_thread:
992
+ self._restart_thread_if_stopped()
993
+ if self.save_flag is not None:
994
+ self.save_flag.set()
975
995
 
976
996
  # update the auto _i variables
977
997
  self._iii = self._ii
@@ -1003,8 +1023,10 @@ class HistoryManager(HistoryAccessor):
1003
1023
 
1004
1024
  with self.db_output_cache_lock:
1005
1025
  self.db_output_cache.append((line_num, output))
1006
- if self.db_cache_size <= 1 and self.save_flag is not None:
1007
- self.save_flag.set()
1026
+ if self.db_cache_size <= 1 and self.using_thread:
1027
+ self._restart_thread_if_stopped()
1028
+ if self.save_flag is not None:
1029
+ self.save_flag.set()
1008
1030
 
1009
1031
  def _writeout_input_cache(self, conn: sqlite3.Connection) -> None:
1010
1032
  with conn:
@@ -1059,6 +1081,10 @@ class HistoryManager(HistoryAccessor):
1059
1081
  self.db_output_cache = []
1060
1082
 
1061
1083
 
1084
+ if hasattr(os, "register_at_fork"):
1085
+ os.register_at_fork(before=HistoryManager._stop_thread)
1086
+
1087
+
1062
1088
  from collections.abc import Callable, Iterator
1063
1089
  from weakref import ReferenceType
1064
1090
 
@@ -67,9 +67,47 @@ class PromptStripper:
67
67
  If any prompt is found on the first two lines,
68
68
  prompts will be stripped from the rest of the block.
69
69
  """
70
- def __init__(self, prompt_re, initial_re=None):
70
+ def __init__(self, prompt_re, initial_re=None, *, doctest=False):
71
71
  self.prompt_re = prompt_re
72
72
  self.initial_re = initial_re or prompt_re
73
+ self.doctest = doctest
74
+ if doctest:
75
+ # Doctest/xdoctest prompts may be indented (e.g. " >>>").
76
+ # We only treat "..." as a continuation prompt when the same pasted
77
+ # block contains at least one ">>>" line, to avoid ambiguity with the
78
+ # Python Ellipsis literal.
79
+ self._doctest_initial_re = re.compile(r'^\s*>>>')
80
+ self._doctest_ps1_re = re.compile(r'^\s*>>>\s?')
81
+ self._doctest_ps2_re = re.compile(r'^\s*\.\.\.\s?')
82
+
83
+ # Very small state machine to detect triple-quoted strings in the
84
+ # *same* input block (e.g. user typed """ then pasted doctest).
85
+ # We preserve literal >>> / ... inside triple-quoted strings.
86
+ self._triple_quote_re = re.compile(r"(?<!\\)(\"\"\"|''')")
87
+
88
+
89
+ def _triple_quote_mask(self, lines: List[str]) -> List[bool]:
90
+ """
91
+ Return a boolean mask: True if the corresponding line is considered
92
+ inside a triple-quoted string literal.
93
+
94
+ This is intentionally heuristic (fast + good enough for paste handling).
95
+ """
96
+ mask: List[bool] = []
97
+ in_triple: str | None = None # either ''' or """
98
+ for line in lines:
99
+ mask.append(in_triple is not None)
100
+ # Toggle state for each occurrence of """ or ''' in the line.
101
+ for m in self._triple_quote_re.finditer(line):
102
+ q = m.group(1)
103
+ if in_triple is None:
104
+ in_triple = q
105
+ mask[-1] = True # current line is inside triple quotes
106
+ elif in_triple == q:
107
+ in_triple = None
108
+ # else: ignore mismatched triple quote while inside
109
+ return mask
110
+
73
111
 
74
112
  def _strip(self, lines):
75
113
  return [self.prompt_re.sub('', l, count=1) for l in lines]
@@ -77,6 +115,57 @@ class PromptStripper:
77
115
  def __call__(self, lines):
78
116
  if not lines:
79
117
  return lines
118
+
119
+ if self.doctest:
120
+ triple_mask = self._triple_quote_mask(lines)
121
+
122
+ # Detect doctest prompts only outside triple-quoted strings.
123
+ has_doctest_outside = any(
124
+ (not in_triple) and self._doctest_initial_re.match(l)
125
+ for l, in_triple in zip(lines, triple_mask)
126
+ )
127
+ if not has_doctest_outside:
128
+ return lines
129
+
130
+ out_lines: List[str] = []
131
+ stripped_mask: List[bool] = []
132
+
133
+ for l, in_triple in zip(lines, triple_mask):
134
+ if in_triple:
135
+ out_lines.append(l)
136
+ stripped_mask.append(False)
137
+ continue
138
+
139
+ if self._doctest_ps1_re.match(l):
140
+ new_l = self._doctest_ps1_re.sub('', l, count=1)
141
+ elif self._doctest_ps2_re.match(l):
142
+ new_l = self._doctest_ps2_re.sub('', l, count=1)
143
+ else:
144
+ new_l = l
145
+ out_lines.append(new_l)
146
+ stripped_mask.append(new_l != l)
147
+
148
+ # Dedent only the non-triple-quoted segments where stripping occurred.
149
+ dedented: List[str] = []
150
+ i = 0
151
+ while i < len(out_lines):
152
+ j = i
153
+ in_triple = triple_mask[i]
154
+ while j < len(out_lines) and triple_mask[j] == in_triple:
155
+ j += 1
156
+
157
+ segment = out_lines[i:j]
158
+ seg_stripped = any(stripped_mask[i:j])
159
+
160
+ if (not in_triple) and seg_stripped:
161
+ dedented.extend(dedent(''.join(segment)).splitlines(keepends=True))
162
+ else:
163
+ dedented.extend(segment)
164
+
165
+ i = j
166
+
167
+ return dedented
168
+
80
169
  if self.initial_re.match(lines[0]) or \
81
170
  (len(lines) > 1 and self.prompt_re.match(lines[1])):
82
171
  return self._strip(lines)
@@ -84,7 +173,8 @@ class PromptStripper:
84
173
 
85
174
  classic_prompt = PromptStripper(
86
175
  prompt_re=re.compile(r'^(>>>|\.\.\.)( |$)'),
87
- initial_re=re.compile(r'^>>>( |$)')
176
+ initial_re=re.compile(r'^>>>( |$)'),
177
+ doctest=True,
88
178
  )
89
179
 
90
180
  ipython_prompt = PromptStripper(
@@ -2141,7 +2141,7 @@ class InteractiveShell(SingletonConfigurable):
2141
2141
 
2142
2142
  def showtraceback(
2143
2143
  self,
2144
- exc_tuple: tuple[type[BaseException], BaseException, Any] | None = None,
2144
+ exc_tuple: tuple[type[BaseException], BaseException, AnyType] | None = None,
2145
2145
  filename: str | None = None,
2146
2146
  tb_offset: int | None = None,
2147
2147
  exception_only: bool = False,
@@ -498,7 +498,7 @@ class AutocallChecker(PrefilterChecker):
498
498
  if not self.shell.autocall:
499
499
  return None
500
500
 
501
- oinfo = line_info.ofind(self.shell) # This can mutate state via getattr
501
+ oinfo = self.shell._ofind(line_info.ifun) # This can mutate state via getattr
502
502
  if not oinfo.found:
503
503
  return None
504
504
 
@@ -610,7 +610,7 @@ class AutoHandler(PrefilterHandler):
610
610
  the_rest = line_info.the_rest
611
611
  esc = line_info.esc
612
612
  continue_prompt = line_info.continue_prompt
613
- obj = line_info.ofind(self.shell).obj
613
+ obj = self.shell._ofind(line_info.ifun).obj
614
614
 
615
615
  # This should only be active for single-line input!
616
616
  if continue_prompt:
@@ -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 = 9
19
- _version_minor = 8
19
+ _version_minor = 10
20
20
  _version_patch = 0
21
21
  _version_extra = ".dev"
22
22
  # _version_extra = "b2"
@@ -1,35 +1,21 @@
1
- # encoding: utf-8
2
1
  """
3
2
  Simple utility for splitting user input. This is used by both inputsplitter and
4
3
  prefilter.
5
-
6
- Authors:
7
-
8
- * Brian Granger
9
- * Fernando Perez
10
4
  """
11
5
 
12
- #-----------------------------------------------------------------------------
13
- # Copyright (C) 2008-2011 The IPython Development Team
14
- #
15
- # Distributed under the terms of the BSD License. The full license is in
16
- # the file COPYING, distributed as part of this software.
17
- #-----------------------------------------------------------------------------
18
-
19
- #-----------------------------------------------------------------------------
6
+ # -----------------------------------------------------------------------------
20
7
  # Imports
21
- #-----------------------------------------------------------------------------
8
+ # -----------------------------------------------------------------------------
22
9
 
23
10
  import re
24
11
  import sys
12
+ import warnings
25
13
 
26
- from IPython.utils import py3compat
27
- from IPython.utils.encoding import get_stream_enc
28
14
  from IPython.core.oinspect import OInfo
29
15
 
30
- #-----------------------------------------------------------------------------
16
+ # -----------------------------------------------------------------------------
31
17
  # Main function
32
- #-----------------------------------------------------------------------------
18
+ # -----------------------------------------------------------------------------
33
19
 
34
20
  # RegExp for splitting line contents into pre-char//first word-method//rest.
35
21
  # For clarity, each group in on one line.
@@ -42,22 +28,25 @@ from IPython.core.oinspect import OInfo
42
28
  # ! and !! trigger if they are first char(s) *or* follow an indent
43
29
  # ? triggers as first or last char.
44
30
 
45
- line_split = re.compile(r"""
31
+ line_split = re.compile(
32
+ r"""
46
33
  ^(\s*) # any leading space
47
34
  ([,;/%]|!!?|\?\??)? # escape character or characters
48
35
  \s*(%{0,2}[\w\.\*]*) # function/method, possibly with leading %
49
36
  # to correctly treat things like '?%magic'
50
37
  (.*?$|$) # rest of line
51
- """, re.VERBOSE)
38
+ """,
39
+ re.VERBOSE,
40
+ )
52
41
 
53
42
 
54
- def split_user_input(line, pattern=None):
43
+ def split_user_input(
44
+ line: str, pattern: re.Pattern[str] | None = None
45
+ ) -> tuple[str, str, str, str]:
55
46
  """Split user input into initial whitespace, escape character, function part
56
47
  and the rest.
57
48
  """
58
- # We need to ensure that the rest of this routine deals only with unicode
59
- encoding = get_stream_enc(sys.stdin, 'utf-8')
60
- line = py3compat.cast_unicode(line, encoding)
49
+ assert isinstance(line, str)
61
50
 
62
51
  if pattern is None:
63
52
  pattern = line_split
@@ -65,11 +54,11 @@ def split_user_input(line, pattern=None):
65
54
  if not match:
66
55
  # print("match failed for line '%s'" % line)
67
56
  try:
68
- ifun, the_rest = line.split(None,1)
57
+ ifun, the_rest = line.split(None, 1)
69
58
  except ValueError:
70
59
  # print("split failed for line '%s'" % line)
71
- ifun, the_rest = line, u''
72
- pre = re.match(r'^(\s*)(.*)',line).groups()[0]
60
+ ifun, the_rest = line, ""
61
+ pre = re.match(r"^(\s*)(.*)", line).groups()[0]
73
62
  esc = ""
74
63
  else:
75
64
  pre, esc, ifun, the_rest = match.groups()
@@ -111,15 +100,27 @@ class LineInfo:
111
100
  raw_the_rest
112
101
  the_rest without whitespace stripped.
113
102
  """
114
- def __init__(self, line, continue_prompt=False):
115
- self.line = line
103
+
104
+ line: str
105
+ continue_prompt: bool
106
+ pre: str
107
+ esc: str
108
+ ifun: str
109
+ raw_the_rest: str
110
+ the_rest: str
111
+ pre_char: str
112
+ pre_whitespace: str
113
+
114
+ def __init__(self, line: str, continue_prompt: bool = False) -> None:
115
+ assert isinstance(line, str)
116
+ self.line = line
116
117
  self.continue_prompt = continue_prompt
117
118
  self.pre, self.esc, self.ifun, self.raw_the_rest = split_user_input(line)
118
119
  self.the_rest = self.raw_the_rest.lstrip()
119
120
 
120
- self.pre_char = self.pre.strip()
121
+ self.pre_char = self.pre.strip()
121
122
  if self.pre_char:
122
- self.pre_whitespace = '' # No whitespace allowed before esc chars
123
+ self.pre_whitespace = "" # No whitespace allowed before esc chars
123
124
  else:
124
125
  self.pre_whitespace = self.pre
125
126
 
@@ -135,11 +136,20 @@ class LineInfo:
135
136
 
136
137
  Does cache the results of the call, so can be called multiple times
137
138
  without worrying about *further* damaging state.
139
+
140
+ .. deprecated:: 9.8
141
+ Use ``shell._ofind(line_info.ifun)`` directly instead.
138
142
  """
143
+ warnings.warn(
144
+ "LineInfo.ofind() is deprecated since IPython 9.9. "
145
+ "Use shell._ofind(line_info.ifun) directly instead.",
146
+ DeprecationWarning,
147
+ stacklevel=2,
148
+ )
139
149
  return ip._ofind(self.ifun)
140
150
 
141
- def __str__(self):
142
- return "LineInfo [%s|%s|%s|%s]" %(self.pre, self.esc, self.ifun, self.the_rest)
151
+ def __str__(self) -> str:
152
+ return "LineInfo [%s|%s|%s|%s]" % (self.pre, self.esc, self.ifun, self.the_rest)
143
153
 
144
- def __repr__(self):
154
+ def __repr__(self) -> str:
145
155
  return "<" + str(self) + ">"
@@ -107,6 +107,16 @@ else:
107
107
  ]
108
108
  )
109
109
 
110
+ # Check if argcomplete is installed and add tip
111
+ try:
112
+ import argcomplete
113
+
114
+ _tips["random"].append(
115
+ "Run `activate-global-python-argcomplete` from your shell to enable CLI completion for IPython"
116
+ )
117
+ except ModuleNotFoundError:
118
+ pass
119
+
110
120
 
111
121
  def pick_tip() -> str:
112
122
  current_date = datetime.now()
@@ -327,6 +327,10 @@ class ModuleReloader:
327
327
  del self.failed[py_filename]
328
328
  except:
329
329
  if not self.hide_errors:
330
+ logger = logging.getLogger("autoreload")
331
+ logger.exception(
332
+ f"Failed to reload module '{modname}' from file '{py_filename}'"
333
+ )
330
334
  print(
331
335
  "[autoreload of {} failed: {}]".format(
332
336
  modname, traceback.format_exc(10)
@@ -3,6 +3,7 @@ import ast
3
3
  import builtins
4
4
  import contextlib
5
5
  import itertools
6
+ import logging
6
7
  import os
7
8
  import pickle
8
9
  import platform
@@ -209,11 +210,19 @@ class DeduperReloader(DeduperReloaderPatchingMixin):
209
210
  ):
210
211
  self.source_by_modname[new_modname] = ""
211
212
  continue
212
- with open(fname, "r") as f:
213
- try:
213
+ # Skip binary files (e.g., .so, .pyd, .pyo)
214
+ if not fname.endswith(".py"):
215
+ self.source_by_modname[new_modname] = ""
216
+ continue
217
+ try:
218
+ with open(fname, "r") as f:
214
219
  self.source_by_modname[new_modname] = f.read()
215
- except Exception:
216
- self.source_by_modname[new_modname] = ""
220
+ except Exception as e:
221
+ logger = logging.getLogger("autoreload")
222
+ logger.exception(
223
+ f"Failed to read module file '{fname}' for module '{new_modname}': {type(e).__name__}"
224
+ )
225
+ self.source_by_modname[new_modname] = ""
217
226
 
218
227
  constexpr_detector = ConstexprDetector()
219
228
 
@@ -542,8 +551,15 @@ class DeduperReloader(DeduperReloaderPatchingMixin):
542
551
  return False
543
552
  if (fname := get_module_file_name(module)) is None:
544
553
  return False
545
- with open(fname, "r") as f:
546
- new_source_code = f.read()
554
+ try:
555
+ with open(fname, "r") as f:
556
+ new_source_code = f.read()
557
+ except Exception as e:
558
+ logger = logging.getLogger("autoreload")
559
+ logger.exception(
560
+ f"Failed to read module file '{fname}' for module '{modname}': {type(e).__name__}"
561
+ )
562
+ return False
547
563
  patched_flag = False
548
564
  if old_source_code := self.source_by_modname.get(modname):
549
565
  # get old/new module ast
@@ -7,12 +7,7 @@ NOT_FOUND: object = object()
7
7
  NULL: object = object()
8
8
  _MAX_FIELD_SEARCH_OFFSET = 50
9
9
 
10
- if sys.maxsize > 2**32:
11
- WORD_TYPE: type[ctypes.c_int32] | type[ctypes.c_int64] = ctypes.c_int64
12
- WORD_N_BYTES = 8
13
- else:
14
- WORD_TYPE = ctypes.c_int32
15
- WORD_N_BYTES = 4
10
+ POINTER_N_BYTES = ctypes.sizeof(ctypes.c_void_p)
16
11
 
17
12
 
18
13
  class DeduperReloaderPatchingMixin:
@@ -32,7 +27,7 @@ class DeduperReloaderPatchingMixin:
32
27
  for offset in range(1, _MAX_FIELD_SEARCH_OFFSET):
33
28
  if (
34
29
  ctypes.cast(
35
- obj_addr + WORD_N_BYTES * offset, ctypes.POINTER(WORD_TYPE)
30
+ obj_addr + POINTER_N_BYTES * offset, ctypes.POINTER(ctypes.c_void_p)
36
31
  ).contents.value
37
32
  == field_addr
38
33
  ):
@@ -69,7 +64,7 @@ class DeduperReloaderPatchingMixin:
69
64
  if new_value not in (None, NULL):
70
65
  ctypes.pythonapi.Py_IncRef(ctypes.py_object(new_value))
71
66
  ctypes.cast(
72
- obj_addr + WORD_N_BYTES * offset, ctypes.POINTER(WORD_TYPE)
67
+ obj_addr + POINTER_N_BYTES * offset, ctypes.POINTER(ctypes.c_void_p)
73
68
  ).contents.value = new_value_addr
74
69
 
75
70
  @classmethod
@@ -109,6 +109,14 @@ from IPython.utils.py3compat import PYPY
109
109
 
110
110
  from typing import Dict
111
111
 
112
+ # Allow pretty-printing of functions with PEP-649 annotations
113
+ if sys.version_info >= (3, 14):
114
+ from annotationlib import Format
115
+ from functools import partial
116
+
117
+ signature = partial(signature, annotation_format=Format.FORWARDREF)
118
+
119
+
112
120
  __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
113
121
  'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression']
114
122
 
@@ -635,4 +635,5 @@ UNASSIGNED_ALLOWED_COMMANDS = [
635
635
  nc.forward_char,
636
636
  nc.forward_word,
637
637
  nc.unix_line_discard,
638
+ nc.unix_word_rubout,
638
639
  ]
@@ -1,2 +1,2 @@
1
1
  # GENERATED BY setup.py
2
- commit = "2fc1f45"
2
+ commit = "178fef7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ipython
3
- Version: 9.8.0
3
+ Version: 9.10.0
4
4
  Summary: IPython: Productive Interactive Computing
5
5
  Author: The IPython Development Team
6
6
  Author-email: ipython-dev@python.org
@@ -70,7 +70,8 @@ Requires-Dist: trio>=0.1.0; extra == "test-extra"
70
70
  Provides-Extra: matplotlib
71
71
  Requires-Dist: matplotlib>3.9; extra == "matplotlib"
72
72
  Provides-Extra: all
73
- Requires-Dist: ipython[doc,matplotlib,test,test_extra]; extra == "all"
73
+ Requires-Dist: ipython[doc,matplotlib,terminal,test,test_extra]; extra == "all"
74
+ Requires-Dist: argcomplete>=3.0; extra == "all"
74
75
  Dynamic: author
75
76
  Dynamic: author-email
76
77
  Dynamic: license-file
@@ -92,6 +92,12 @@ intersphinx_mapping = get_intersphinx_mapping(
92
92
  }
93
93
  )
94
94
 
95
+ # External links configuration (replaces custom github extension)
96
+ extlinks = {
97
+ "ghissue": ("https://github.com/ipython/ipython/issues/%s/", "#%s"),
98
+ "ghpull": ("https://github.com/ipython/ipython/pull/%s/", "PR #%s"),
99
+ }
100
+
95
101
 
96
102
  # Options for HTML output
97
103
  # -----------------------
@@ -78,6 +78,32 @@ The quickest way to get up and running with IPython is to install it with pip:
78
78
  That's it.
79
79
 
80
80
 
81
+ Optional: Command-line completion
82
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
83
+
84
+ IPython supports command-line completion via the ``argcomplete`` package.
85
+ To enable tab completion for IPython and other Python programs that support
86
+ argcomplete, install IPython with the ``terminal`` extra:
87
+
88
+ .. code-block:: bash
89
+
90
+ $ pip install ipython[all]
91
+ $ activate-global-python-argcomplete
92
+
93
+ Alternatively, you can install argcomplete separately:
94
+
95
+ .. code-block:: bash
96
+
97
+ $ pip install argcomplete
98
+ $ activate-global-python-argcomplete
99
+
100
+ This will enable shell completion for all Python programs that support argcomplete,
101
+ including IPython. Note that you may need to restart your shell for the changes
102
+ to take effect.
103
+
104
+ For more information, see the `argcomplete documentation <https://github.com/kislyuk/argcomplete>`_.
105
+
106
+
81
107
  .. _devinstall:
82
108
 
83
109
  Installing the development version
@@ -13,11 +13,11 @@ extensions = [
13
13
  "sphinx.ext.inheritance_diagram",
14
14
  "sphinx.ext.intersphinx",
15
15
  "sphinx.ext.graphviz",
16
+ "sphinx.ext.extlinks", # for easy GitHub links
16
17
  "sphinxcontrib.jquery",
17
18
  "IPython.sphinxext.ipython_console_highlighting",
18
19
  "IPython.sphinxext.ipython_directive",
19
20
  "sphinx.ext.napoleon", # to preprocess docstrings
20
- "github", # for easy GitHub links
21
21
  "magics",
22
22
  "configtraits",
23
23
  ]