ipython 9.8.0__tar.gz → 9.9.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.9.0}/IPython/core/async_helpers.py +4 -9
  2. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/completer.py +2 -2
  3. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/interactiveshell.py +1 -1
  4. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/prefilter.py +2 -2
  5. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/release.py +1 -1
  6. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/splitinput.py +45 -35
  7. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/tips.py +10 -0
  8. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/deduperreload/deduperreload_patching.py +3 -8
  9. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/pretty.py +8 -0
  10. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/shortcuts/__init__.py +1 -0
  11. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_sysinfo.py +1 -1
  12. {ipython-9.8.0/ipython.egg-info → ipython-9.9.0}/PKG-INFO +3 -2
  13. {ipython-9.8.0 → ipython-9.9.0}/docs/source/conf.py +6 -0
  14. {ipython-9.8.0 → ipython-9.9.0}/docs/source/install/install.rst +26 -0
  15. {ipython-9.8.0 → ipython-9.9.0}/docs/source/sphinx.toml +1 -1
  16. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version9.rst +56 -4
  17. {ipython-9.8.0 → ipython-9.9.0/ipython.egg-info}/PKG-INFO +3 -2
  18. {ipython-9.8.0 → ipython-9.9.0}/ipython.egg-info/SOURCES.txt +1 -2
  19. {ipython-9.8.0 → ipython-9.9.0}/ipython.egg-info/requires.txt +2 -1
  20. {ipython-9.8.0 → ipython-9.9.0}/pyproject.toml +2 -1
  21. {ipython-9.8.0 → ipython-9.9.0}/tests/test_async_helpers.py +11 -0
  22. {ipython-9.8.0 → ipython-9.9.0}/tests/test_completer.py +23 -0
  23. {ipython-9.8.0 → ipython-9.9.0}/tests/test_pretty.py +25 -0
  24. ipython-9.8.0/docs/sphinxext/github.py +0 -168
  25. {ipython-9.8.0 → ipython-9.9.0}/.flake8 +0 -0
  26. {ipython-9.8.0 → ipython-9.9.0}/.mailmap +0 -0
  27. {ipython-9.8.0 → ipython-9.9.0}/.pre-commit-config.yaml +0 -0
  28. {ipython-9.8.0 → ipython-9.9.0}/COPYING.rst +0 -0
  29. {ipython-9.8.0 → ipython-9.9.0}/IPython/__init__.py +0 -0
  30. {ipython-9.8.0 → ipython-9.9.0}/IPython/__main__.py +0 -0
  31. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/__init__.py +0 -0
  32. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/alias.py +0 -0
  33. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/application.py +0 -0
  34. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/autocall.py +0 -0
  35. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/builtin_trap.py +0 -0
  36. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/compilerop.py +0 -0
  37. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/completerlib.py +0 -0
  38. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/crashhandler.py +0 -0
  39. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/debugger.py +0 -0
  40. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/debugger_backport.py +0 -0
  41. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/display.py +0 -0
  42. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/display_functions.py +0 -0
  43. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/display_trap.py +0 -0
  44. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/displayhook.py +0 -0
  45. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/displaypub.py +0 -0
  46. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/doctb.py +0 -0
  47. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/error.py +0 -0
  48. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/events.py +0 -0
  49. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/extensions.py +0 -0
  50. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/formatters.py +0 -0
  51. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/getipython.py +0 -0
  52. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/guarded_eval.py +0 -0
  53. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/history.py +0 -0
  54. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/historyapp.py +0 -0
  55. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/hooks.py +0 -0
  56. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/inputtransformer2.py +0 -0
  57. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/latex_symbols.py +0 -0
  58. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/logger.py +0 -0
  59. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/macro.py +0 -0
  60. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magic.py +0 -0
  61. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magic_arguments.py +0 -0
  62. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/__init__.py +0 -0
  63. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/ast_mod.py +0 -0
  64. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/auto.py +0 -0
  65. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/basic.py +0 -0
  66. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/code.py +0 -0
  67. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/config.py +0 -0
  68. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/display.py +0 -0
  69. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/execution.py +0 -0
  70. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/extension.py +0 -0
  71. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/history.py +0 -0
  72. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/logging.py +0 -0
  73. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/namespace.py +0 -0
  74. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/osm.py +0 -0
  75. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/packaging.py +0 -0
  76. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/pylab.py +0 -0
  77. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/magics/script.py +0 -0
  78. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/oinspect.py +0 -0
  79. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/page.py +0 -0
  80. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/payload.py +0 -0
  81. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/payloadpage.py +0 -0
  82. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/profile/README_STARTUP +0 -0
  83. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/profileapp.py +0 -0
  84. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/profiledir.py +0 -0
  85. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/pylabtools.py +0 -0
  86. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/shellapp.py +0 -0
  87. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/tbtools.py +0 -0
  88. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/ultratb.py +0 -0
  89. {ipython-9.8.0 → ipython-9.9.0}/IPython/core/usage.py +0 -0
  90. {ipython-9.8.0 → ipython-9.9.0}/IPython/display.py +0 -0
  91. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/__init__.py +0 -0
  92. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/autoreload.py +0 -0
  93. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/deduperreload/__init__.py +0 -0
  94. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/deduperreload/deduperreload.py +0 -0
  95. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/storemagic.py +0 -0
  96. {ipython-9.8.0 → ipython-9.9.0}/IPython/extensions/tests/test_deduperreload.py +0 -0
  97. {ipython-9.8.0 → ipython-9.9.0}/IPython/external/__init__.py +0 -0
  98. {ipython-9.8.0 → ipython-9.9.0}/IPython/external/pickleshare.py +0 -0
  99. {ipython-9.8.0 → ipython-9.9.0}/IPython/external/qt_for_kernel.py +0 -0
  100. {ipython-9.8.0 → ipython-9.9.0}/IPython/external/qt_loaders.py +0 -0
  101. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/__init__.py +0 -0
  102. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/backgroundjobs.py +0 -0
  103. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/clipboard.py +0 -0
  104. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/deepreload.py +0 -0
  105. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/demo.py +0 -0
  106. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/display.py +0 -0
  107. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/editorhooks.py +0 -0
  108. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/guisupport.py +0 -0
  109. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/latextools.py +0 -0
  110. {ipython-9.8.0 → ipython-9.9.0}/IPython/lib/lexers.py +0 -0
  111. {ipython-9.8.0 → ipython-9.9.0}/IPython/paths.py +0 -0
  112. {ipython-9.8.0 → ipython-9.9.0}/IPython/py.typed +0 -0
  113. {ipython-9.8.0 → ipython-9.9.0}/IPython/sphinxext/__init__.py +0 -0
  114. {ipython-9.8.0 → ipython-9.9.0}/IPython/sphinxext/custom_doctests.py +0 -0
  115. {ipython-9.8.0 → ipython-9.9.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  116. {ipython-9.8.0 → ipython-9.9.0}/IPython/sphinxext/ipython_directive.py +0 -0
  117. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/__init__.py +0 -0
  118. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/debugger.py +0 -0
  119. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/embed.py +0 -0
  120. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/interactiveshell.py +0 -0
  121. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/ipapp.py +0 -0
  122. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/magics.py +0 -0
  123. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/prompts.py +0 -0
  124. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  125. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  126. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  127. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  128. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  129. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  130. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  131. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  132. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  133. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  134. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  135. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/ptutils.py +0 -0
  136. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  137. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/shortcuts/auto_suggest.py +0 -0
  138. {ipython-9.8.0 → ipython-9.9.0}/IPython/terminal/shortcuts/filters.py +0 -0
  139. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/__init__.py +0 -0
  140. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/decorators.py +0 -0
  141. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/globalipapp.py +0 -0
  142. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/ipunittest.py +0 -0
  143. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/Makefile +0 -0
  144. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/__init__.py +0 -0
  145. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/dtexample.py +0 -0
  146. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  147. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  148. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/setup.py +0 -0
  149. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/simple.py +0 -0
  150. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/simplevars.py +0 -0
  151. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/test_combo.txt +0 -0
  152. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/test_example.txt +0 -0
  153. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  154. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  155. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/plugin/test_refs.py +0 -0
  156. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/skipdoctest.py +0 -0
  157. {ipython-9.8.0 → ipython-9.9.0}/IPython/testing/tools.py +0 -0
  158. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/PyColorize.py +0 -0
  159. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/__init__.py +0 -0
  160. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_process_cli.py +0 -0
  161. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_process_common.py +0 -0
  162. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_process_emscripten.py +0 -0
  163. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_process_posix.py +0 -0
  164. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_process_win32.py +0 -0
  165. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/_process_win32_controller.py +0 -0
  166. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/capture.py +0 -0
  167. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/coloransi.py +0 -0
  168. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/contexts.py +0 -0
  169. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/data.py +0 -0
  170. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/decorators.py +0 -0
  171. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/dir2.py +0 -0
  172. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/docs.py +0 -0
  173. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/encoding.py +0 -0
  174. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/eventful.py +0 -0
  175. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/frame.py +0 -0
  176. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/generics.py +0 -0
  177. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/importstring.py +0 -0
  178. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/io.py +0 -0
  179. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/ipstruct.py +0 -0
  180. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/jsonutil.py +0 -0
  181. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/log.py +0 -0
  182. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/module_paths.py +0 -0
  183. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/openpy.py +0 -0
  184. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/path.py +0 -0
  185. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/process.py +0 -0
  186. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/py3compat.py +0 -0
  187. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/sentinel.py +0 -0
  188. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/strdispatch.py +0 -0
  189. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/sysinfo.py +0 -0
  190. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/syspathcontext.py +0 -0
  191. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/tempdir.py +0 -0
  192. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/terminal.py +0 -0
  193. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/text.py +0 -0
  194. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/timing.py +0 -0
  195. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/tokenutil.py +0 -0
  196. {ipython-9.8.0 → ipython-9.9.0}/IPython/utils/wildcard.py +0 -0
  197. {ipython-9.8.0 → ipython-9.9.0}/LICENSE +0 -0
  198. {ipython-9.8.0 → ipython-9.9.0}/MANIFEST.in +0 -0
  199. {ipython-9.8.0 → ipython-9.9.0}/README.rst +0 -0
  200. {ipython-9.8.0 → ipython-9.9.0}/_build_meta.py +0 -0
  201. {ipython-9.8.0 → ipython-9.9.0}/docs/Makefile +0 -0
  202. {ipython-9.8.0 → ipython-9.9.0}/docs/README.rst +0 -0
  203. {ipython-9.8.0 → ipython-9.9.0}/docs/autogen_api.py +0 -0
  204. {ipython-9.8.0 → ipython-9.9.0}/docs/autogen_config.py +0 -0
  205. {ipython-9.8.0 → ipython-9.9.0}/docs/autogen_magics.py +0 -0
  206. {ipython-9.8.0 → ipython-9.9.0}/docs/autogen_shortcuts.py +0 -0
  207. {ipython-9.8.0 → ipython-9.9.0}/docs/make.cmd +0 -0
  208. {ipython-9.8.0 → ipython-9.9.0}/docs/man/ipython.1 +0 -0
  209. {ipython-9.8.0 → ipython-9.9.0}/docs/requirements.txt +0 -0
  210. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/2.0/running-crop.png +0 -0
  211. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/2.0/running.png +0 -0
  212. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/2.0/treeview.png +0 -0
  213. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/2.0/user-interface.png +0 -0
  214. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/2.0/widgets.png +0 -0
  215. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  216. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  217. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  218. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  219. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  220. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  221. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  222. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  223. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  224. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  225. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  226. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/autosuggest.gif +0 -0
  227. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  228. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  229. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  230. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  231. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  232. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  233. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  234. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  235. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  236. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  237. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  238. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  239. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  240. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  241. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  242. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ms_visual_studio.png +0 -0
  243. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/notebook_specgram.png +0 -0
  244. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/ptshell_features.png +0 -0
  245. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/qtconsole.png +0 -0
  246. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  247. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_images/unicode_completion.png +0 -0
  248. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_static/favicon.ico +0 -0
  249. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_static/logo.png +0 -0
  250. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_static/theme_overrides.css +0 -0
  251. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_templates/breadcrumbs.html +0 -0
  252. {ipython-9.8.0 → ipython-9.9.0}/docs/source/_templates/notebook_redirect.html +0 -0
  253. {ipython-9.8.0 → ipython-9.9.0}/docs/source/about/history.rst +0 -0
  254. {ipython-9.8.0 → ipython-9.9.0}/docs/source/about/index.rst +0 -0
  255. {ipython-9.8.0 → ipython-9.9.0}/docs/source/about/license_and_copyright.rst +0 -0
  256. {ipython-9.8.0 → ipython-9.9.0}/docs/source/api/index.rst +0 -0
  257. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/callbacks.rst +0 -0
  258. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/custommagics.rst +0 -0
  259. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/details.rst +0 -0
  260. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/eventloops.rst +0 -0
  261. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/extensions/autoreload.rst +0 -0
  262. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/extensions/index.rst +0 -0
  263. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/extensions/storemagic.rst +0 -0
  264. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/index.rst +0 -0
  265. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/inputtransforms.rst +0 -0
  266. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/integrating.rst +0 -0
  267. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/intro.rst +0 -0
  268. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/options/index.rst +0 -0
  269. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  270. {ipython-9.8.0 → ipython-9.9.0}/docs/source/config/shortcuts/index.rst +0 -0
  271. {ipython-9.8.0 → ipython-9.9.0}/docs/source/coredev/index.rst +0 -0
  272. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/config.rst +0 -0
  273. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/execution.rst +0 -0
  274. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  275. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  276. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/figs/other_kernels.png +0 -0
  277. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/figs/other_kernels.svg +0 -0
  278. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/how_ipython_works.rst +0 -0
  279. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/index.rst +0 -0
  280. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/inputhook_app.rst +0 -0
  281. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/kernels.rst +0 -0
  282. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/messaging.rst +0 -0
  283. {ipython-9.8.0 → ipython-9.9.0}/docs/source/development/wrapperkernels.rst +0 -0
  284. {ipython-9.8.0 → ipython-9.9.0}/docs/source/index.rst +0 -0
  285. {ipython-9.8.0 → ipython-9.9.0}/docs/source/install/index.rst +0 -0
  286. {ipython-9.8.0 → ipython-9.9.0}/docs/source/install/kernel_install.rst +0 -0
  287. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/autoawait.rst +0 -0
  288. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/index.rst +0 -0
  289. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/magics.rst +0 -0
  290. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/plotting.rst +0 -0
  291. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  292. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/reference.rst +0 -0
  293. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/shell.rst +0 -0
  294. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/tips.rst +0 -0
  295. {ipython-9.8.0 → ipython-9.9.0}/docs/source/interactive/tutorial.rst +0 -0
  296. {ipython-9.8.0 → ipython-9.9.0}/docs/source/links.txt +0 -0
  297. {ipython-9.8.0 → ipython-9.9.0}/docs/source/overview.rst +0 -0
  298. {ipython-9.8.0 → ipython-9.9.0}/docs/source/parallel/index.rst +0 -0
  299. {ipython-9.8.0 → ipython-9.9.0}/docs/source/sphinxext.rst +0 -0
  300. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/development.rst +0 -0
  301. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  302. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  303. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  304. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  305. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  306. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  307. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  308. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  309. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  310. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  311. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  312. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/index.rst +0 -0
  313. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/pr/README.md +0 -0
  314. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  315. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  316. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version0.10.rst +0 -0
  317. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version0.11.rst +0 -0
  318. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version0.12.rst +0 -0
  319. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version0.13.rst +0 -0
  320. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version0.8.rst +0 -0
  321. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version0.9.rst +0 -0
  322. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version1.0.rst +0 -0
  323. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version2.0.rst +0 -0
  324. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version3.rst +0 -0
  325. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  326. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version4.rst +0 -0
  327. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version5.rst +0 -0
  328. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version6.rst +0 -0
  329. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version7.rst +0 -0
  330. {ipython-9.8.0 → ipython-9.9.0}/docs/source/whatsnew/version8.rst +0 -0
  331. {ipython-9.8.0 → ipython-9.9.0}/docs/sphinxext/apigen.py +0 -0
  332. {ipython-9.8.0 → ipython-9.9.0}/docs/sphinxext/configtraits.py +0 -0
  333. {ipython-9.8.0 → ipython-9.9.0}/docs/sphinxext/magics.py +0 -0
  334. {ipython-9.8.0 → ipython-9.9.0}/examples/Embedding/embed_class_long.py +0 -0
  335. {ipython-9.8.0 → ipython-9.9.0}/examples/Embedding/embed_class_short.py +0 -0
  336. {ipython-9.8.0 → ipython-9.9.0}/examples/Embedding/embed_function.py +0 -0
  337. {ipython-9.8.0 → ipython-9.9.0}/examples/Embedding/start_ipython_config.py +0 -0
  338. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/example-demo.py +0 -0
  339. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  340. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  341. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  342. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  343. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  344. {ipython-9.8.0 → ipython-9.9.0}/examples/IPython Kernel/ipython.desktop +0 -0
  345. {ipython-9.8.0 → ipython-9.9.0}/examples/auto_suggest_llm.py +0 -0
  346. {ipython-9.8.0 → ipython-9.9.0}/examples/utils/cwd_prompt.py +0 -0
  347. {ipython-9.8.0 → ipython-9.9.0}/examples/utils/list_pyfiles.ipy +0 -0
  348. {ipython-9.8.0 → ipython-9.9.0}/examples/utils/list_subdirs.ipy +0 -0
  349. {ipython-9.8.0 → ipython-9.9.0}/ipython.egg-info/dependency_links.txt +0 -0
  350. {ipython-9.8.0 → ipython-9.9.0}/ipython.egg-info/entry_points.txt +0 -0
  351. {ipython-9.8.0 → ipython-9.9.0}/ipython.egg-info/not-zip-safe +0 -0
  352. {ipython-9.8.0 → ipython-9.9.0}/ipython.egg-info/top_level.txt +0 -0
  353. {ipython-9.8.0 → ipython-9.9.0}/long_description.rst +0 -0
  354. {ipython-9.8.0 → ipython-9.9.0}/scripts/ipython.ico +0 -0
  355. {ipython-9.8.0 → ipython-9.9.0}/scripts/ipython_nb.ico +0 -0
  356. {ipython-9.8.0 → ipython-9.9.0}/setup.cfg +0 -0
  357. {ipython-9.8.0 → ipython-9.9.0}/setup.py +0 -0
  358. {ipython-9.8.0 → ipython-9.9.0}/setupbase.py +0 -0
  359. {ipython-9.8.0 → ipython-9.9.0}/tests/2x2.jpg +0 -0
  360. {ipython-9.8.0 → ipython-9.9.0}/tests/2x2.png +0 -0
  361. {ipython-9.8.0 → ipython-9.9.0}/tests/__init__.py +0 -0
  362. {ipython-9.8.0 → ipython-9.9.0}/tests/bad_all.py +0 -0
  363. {ipython-9.8.0 → ipython-9.9.0}/tests/conftest.py +0 -0
  364. {ipython-9.8.0 → ipython-9.9.0}/tests/fake_ext_dir/daft_extension.py +0 -0
  365. {ipython-9.8.0 → ipython-9.9.0}/tests/fake_llm.py +0 -0
  366. {ipython-9.8.0 → ipython-9.9.0}/tests/nonascii.py +0 -0
  367. {ipython-9.8.0 → ipython-9.9.0}/tests/nonascii2.py +0 -0
  368. {ipython-9.8.0 → ipython-9.9.0}/tests/print_argv.py +0 -0
  369. {ipython-9.8.0 → ipython-9.9.0}/tests/refbug.py +0 -0
  370. {ipython-9.8.0 → ipython-9.9.0}/tests/simpleerr.py +0 -0
  371. {ipython-9.8.0 → ipython-9.9.0}/tests/tclass.py +0 -0
  372. {ipython-9.8.0 → ipython-9.9.0}/tests/test.wav +0 -0
  373. {ipython-9.8.0 → ipython-9.9.0}/tests/test_alias.py +0 -0
  374. {ipython-9.8.0 → ipython-9.9.0}/tests/test_application.py +0 -0
  375. {ipython-9.8.0 → ipython-9.9.0}/tests/test_autocall.py +0 -0
  376. {ipython-9.8.0 → ipython-9.9.0}/tests/test_backgroundjobs.py +0 -0
  377. {ipython-9.8.0 → ipython-9.9.0}/tests/test_capture.py +0 -0
  378. {ipython-9.8.0 → ipython-9.9.0}/tests/test_clipboard.py +0 -0
  379. {ipython-9.8.0 → ipython-9.9.0}/tests/test_compilerop.py +0 -0
  380. {ipython-9.8.0 → ipython-9.9.0}/tests/test_completerlib.py +0 -0
  381. /ipython-9.8.0/tests/cve.py → /ipython-9.9.0/tests/test_cve.py +0 -0
  382. {ipython-9.8.0 → ipython-9.9.0}/tests/test_debug_magic.py +0 -0
  383. {ipython-9.8.0 → ipython-9.9.0}/tests/test_debugger.py +0 -0
  384. {ipython-9.8.0 → ipython-9.9.0}/tests/test_decorators.py +0 -0
  385. {ipython-9.8.0 → ipython-9.9.0}/tests/test_decorators_2.py +0 -0
  386. {ipython-9.8.0 → ipython-9.9.0}/tests/test_deepreload.py +0 -0
  387. {ipython-9.8.0 → ipython-9.9.0}/tests/test_dir2.py +0 -0
  388. {ipython-9.8.0 → ipython-9.9.0}/tests/test_display.py +0 -0
  389. {ipython-9.8.0 → ipython-9.9.0}/tests/test_display_2.py +0 -0
  390. {ipython-9.8.0 → ipython-9.9.0}/tests/test_displayhook.py +0 -0
  391. {ipython-9.8.0 → ipython-9.9.0}/tests/test_editorhooks.py +0 -0
  392. {ipython-9.8.0 → ipython-9.9.0}/tests/test_embed.py +0 -0
  393. {ipython-9.8.0 → ipython-9.9.0}/tests/test_events.py +0 -0
  394. {ipython-9.8.0 → ipython-9.9.0}/tests/test_exceptiongroup_tb.py +0 -0
  395. {ipython-9.8.0 → ipython-9.9.0}/tests/test_extension.py +0 -0
  396. {ipython-9.8.0 → ipython-9.9.0}/tests/test_formatters.py +0 -0
  397. {ipython-9.8.0 → ipython-9.9.0}/tests/test_guarded_eval.py +0 -0
  398. {ipython-9.8.0 → ipython-9.9.0}/tests/test_handlers.py +0 -0
  399. {ipython-9.8.0 → ipython-9.9.0}/tests/test_help.py +0 -0
  400. {ipython-9.8.0 → ipython-9.9.0}/tests/test_history.py +0 -0
  401. {ipython-9.8.0 → ipython-9.9.0}/tests/test_hooks.py +0 -0
  402. {ipython-9.8.0 → ipython-9.9.0}/tests/test_imports.py +0 -0
  403. {ipython-9.8.0 → ipython-9.9.0}/tests/test_importstring.py +0 -0
  404. {ipython-9.8.0 → ipython-9.9.0}/tests/test_inputtransformer2.py +0 -0
  405. {ipython-9.8.0 → ipython-9.9.0}/tests/test_inputtransformer2_line.py +0 -0
  406. {ipython-9.8.0 → ipython-9.9.0}/tests/test_interactiveshell.py +0 -0
  407. {ipython-9.8.0 → ipython-9.9.0}/tests/test_interactivshell.py +0 -0
  408. {ipython-9.8.0 → ipython-9.9.0}/tests/test_io.py +0 -0
  409. {ipython-9.8.0 → ipython-9.9.0}/tests/test_iplib.py +0 -0
  410. {ipython-9.8.0 → ipython-9.9.0}/tests/test_ipunittest.py +0 -0
  411. {ipython-9.8.0 → ipython-9.9.0}/tests/test_latextools.py +0 -0
  412. {ipython-9.8.0 → ipython-9.9.0}/tests/test_logger.py +0 -0
  413. {ipython-9.8.0 → ipython-9.9.0}/tests/test_magic.py +0 -0
  414. {ipython-9.8.0 → ipython-9.9.0}/tests/test_magic_arguments.py +0 -0
  415. {ipython-9.8.0 → ipython-9.9.0}/tests/test_magic_terminal.py +0 -0
  416. {ipython-9.8.0 → ipython-9.9.0}/tests/test_module_paths.py +0 -0
  417. {ipython-9.8.0 → ipython-9.9.0}/tests/test_oinspect.py +0 -0
  418. {ipython-9.8.0 → ipython-9.9.0}/tests/test_openpy.py +0 -0
  419. {ipython-9.8.0 → ipython-9.9.0}/tests/test_page.py +0 -0
  420. {ipython-9.8.0 → ipython-9.9.0}/tests/test_path.py +0 -0
  421. {ipython-9.8.0 → ipython-9.9.0}/tests/test_paths.py +0 -0
  422. {ipython-9.8.0 → ipython-9.9.0}/tests/test_prefilter.py +0 -0
  423. {ipython-9.8.0 → ipython-9.9.0}/tests/test_process.py +0 -0
  424. {ipython-9.8.0 → ipython-9.9.0}/tests/test_profile.py +0 -0
  425. {ipython-9.8.0 → ipython-9.9.0}/tests/test_pt_inputhooks.py +0 -0
  426. {ipython-9.8.0 → ipython-9.9.0}/tests/test_pycolorize.py +0 -0
  427. {ipython-9.8.0 → ipython-9.9.0}/tests/test_pylabtools.py +0 -0
  428. {ipython-9.8.0 → ipython-9.9.0}/tests/test_qt_loaders.py +0 -0
  429. {ipython-9.8.0 → ipython-9.9.0}/tests/test_run.py +0 -0
  430. {ipython-9.8.0 → ipython-9.9.0}/tests/test_shellapp.py +0 -0
  431. {ipython-9.8.0 → ipython-9.9.0}/tests/test_shortcuts.py +0 -0
  432. {ipython-9.8.0 → ipython-9.9.0}/tests/test_splitinput.py +0 -0
  433. {ipython-9.8.0 → ipython-9.9.0}/tests/test_storemagic.py +0 -0
  434. {ipython-9.8.0 → ipython-9.9.0}/tests/test_sysinfo.py +0 -0
  435. {ipython-9.8.0 → ipython-9.9.0}/tests/test_tempdir.py +0 -0
  436. {ipython-9.8.0 → ipython-9.9.0}/tests/test_text.py +0 -0
  437. {ipython-9.8.0 → ipython-9.9.0}/tests/test_tips.py +0 -0
  438. {ipython-9.8.0 → ipython-9.9.0}/tests/test_tokenutil.py +0 -0
  439. {ipython-9.8.0 → ipython-9.9.0}/tests/test_tools.py +0 -0
  440. {ipython-9.8.0 → ipython-9.9.0}/tests/test_ultratb.py +0 -0
  441. {ipython-9.8.0 → ipython-9.9.0}/tests/test_wildcard.py +0 -0
  442. {ipython-9.8.0 → ipython-9.9.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
 
@@ -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 = 9
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()
@@ -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 = "0c28fe5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ipython
3
- Version: 9.8.0
3
+ Version: 9.9.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
  ]
@@ -3,6 +3,55 @@
3
3
  ============
4
4
 
5
5
 
6
+ .. _version 9.9:
7
+
8
+ IPython 9.9
9
+ ===========
10
+
11
+ This release includes several bug fixes and improvements across completions, type annotations, and developer experience.
12
+
13
+ - :ghpull:`15092` Fix formatting for completion suggestions section
14
+ - :ghpull:`15057` Reduce types in splitinput.py
15
+ - :ghpull:`15096` Use Any type in traceback tuple
16
+ - :ghpull:`15099` Fix filename of CVE test
17
+ - :ghpull:`15091` Skip downstream CI if only docs changes
18
+ - :ghpull:`15093` Replace sphinxext/github with extlink configuration
19
+ - :ghpull:`15103` Tips and docs about argcomplete
20
+ - :ghpull:`15105` Add prompt_toolkit's unix_word_rubout to assignable commands for shortcuts
21
+ - :ghpull:`15095` Enable pretty-printing for PEP-649 annotated functions
22
+ - :ghpull:`15106` Fix completions for methods starting with ``_``
23
+ - :ghpull:`15111` Stop assuming that memory addresses are signed
24
+ - :ghpull:`15102` Bump macOS runner version in GitHub Actions
25
+ - :ghpull:`15101` Fix crash on literal with surrogate
26
+
27
+ Improvements to PEP-649 Support
28
+ -------------------------------
29
+
30
+ IPython now properly pretty-prints functions with PEP-649 style annotations. This improves the display of functions in interactive sessions when using Python 3.14+ annotation semantics.
31
+
32
+
33
+ Shell Shortcuts Enhancement
34
+ -----------------------------
35
+
36
+ The ``unix_word_rubout`` command from prompt_toolkit is now available as an assignable command for terminal shortcuts, giving users more flexibility in customizing their keybindings.
37
+
38
+
39
+ Type Annotation Improvements
40
+ ----------------------------
41
+
42
+ Various type annotation improvements have been made throughout the codebase for better static analysis support, including fixes for tracebacks and improved type inference in the completion engine.
43
+
44
+
45
+ Thanks
46
+ ------
47
+
48
+ Thanks as well to the `D. E. Shaw group <https://deshaw.com/>`_ for sponsoring
49
+ work on IPython.
50
+
51
+ As usual, you can find the full list of PRs on GitHub under `the 9.9
52
+ <https://github.com/ipython/ipython/milestone/157?closed=1>`__ milestone.
53
+
54
+
6
55
  .. _version 9.8:
7
56
 
8
57
  IPython 9.8
@@ -59,10 +108,13 @@ disabled:
59
108
  attribute completions.
60
109
 
61
110
  - File path completions are now strictly suppressed when completing attributes,
62
- preventing confusion when typing patterns like ``obj.file``. - Union types in
63
- annotations (e.g., ``x: int | str``) are now properly handled for completion
64
- suggestions. - The completer now falls back to type annotations when runtime
65
- evaluation is not available, improving completion accuracy for typed code.
111
+ preventing confusion when typing patterns like ``obj.file``.
112
+
113
+ - Union types in annotations (e.g., ``x: int | str``) are now properly handled
114
+ for completion suggestions.
115
+
116
+ - The completer now falls back to type annotations when runtime evaluation is
117
+ not available, improving completion accuracy for typed code.
66
118
 
67
119
 
68
120
  Thanks
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ipython
3
- Version: 9.8.0
3
+ Version: 9.9.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
@@ -326,7 +326,6 @@ docs/source/whatsnew/pr/antigravity-feature.rst
326
326
  docs/source/whatsnew/pr/incompat-switching-to-perl.rst
327
327
  docs/sphinxext/apigen.py
328
328
  docs/sphinxext/configtraits.py
329
- docs/sphinxext/github.py
330
329
  docs/sphinxext/magics.py
331
330
  examples/auto_suggest_llm.py
332
331
  examples/Embedding/embed_class_long.py
@@ -357,7 +356,6 @@ tests/2x2.png
357
356
  tests/__init__.py
358
357
  tests/bad_all.py
359
358
  tests/conftest.py
360
- tests/cve.py
361
359
  tests/fake_llm.py
362
360
  tests/nonascii.py
363
361
  tests/nonascii2.py
@@ -376,6 +374,7 @@ tests/test_clipboard.py
376
374
  tests/test_compilerop.py
377
375
  tests/test_completer.py
378
376
  tests/test_completerlib.py
377
+ tests/test_cve.py
379
378
  tests/test_debug_magic.py
380
379
  tests/test_debugger.py
381
380
  tests/test_decorators.py
@@ -17,7 +17,8 @@ pexpect>4.3
17
17
  colorama>=0.4.4
18
18
 
19
19
  [all]
20
- ipython[doc,matplotlib,test,test_extra]
20
+ ipython[doc,matplotlib,terminal,test,test_extra]
21
+ argcomplete>=3.0
21
22
 
22
23
  [black]
23
24
  black
@@ -91,7 +91,8 @@ matplotlib = [
91
91
  "matplotlib>3.9"
92
92
  ]
93
93
  all = [
94
- "ipython[doc,matplotlib,test,test_extra]",
94
+ "ipython[doc,matplotlib,terminal,test,test_extra]",
95
+ "argcomplete>=3.0",
95
96
  ]
96
97
 
97
98
 
@@ -4,6 +4,7 @@ Test for async helpers.
4
4
  Should only trigger on python 3.5+ or will have syntax errors.
5
5
  """
6
6
 
7
+ import sys
7
8
  from itertools import chain, repeat
8
9
  from textwrap import dedent, indent
9
10
  from typing import TYPE_CHECKING
@@ -44,6 +45,16 @@ class AsyncTest(TestCase):
44
45
  )
45
46
  )
46
47
 
48
+ self.assertFalse(_should_be_async("return await foo()"))
49
+ self.assertFalse(_should_be_async("return bar()"))
50
+ self.assertFalse(_should_be_async("some invalid Python code"))
51
+
52
+ self.assertFalse(_should_be_async("'\\ud800'"))
53
+
54
+ if sys.version_info >= (3, 13):
55
+ # Note: the next assert assumes the tests run without the `-OO` flag
56
+ self.assertFalse(_should_be_async("'\\ud800'\nawait foo"))
57
+
47
58
  def _get_top_level_cases(self):
48
59
  # These are test cases that should be valid in a function
49
60
  # but invalid outside of a function.
@@ -2068,6 +2068,27 @@ class TestCompleter(unittest.TestCase):
2068
2068
  a_matcher.matcher_priority = 3
2069
2069
  _(["completion_a"])
2070
2070
 
2071
+ def test_private_attr_completions(self):
2072
+ ip = get_ipython()
2073
+ ip.user_ns["Test"] = type("Test", (), {"_test1": 1, "__test2": 2})
2074
+ ip.user_ns["t"] = ip.user_ns["Test"]()
2075
+ ip.Completer.use_jedi = False
2076
+
2077
+ try:
2078
+ with provisionalcompleter():
2079
+ completions = list(ip.Completer.completions(text="t._", offset=3))
2080
+ completion_texts = [c.text for c in completions]
2081
+
2082
+ assert (
2083
+ "._test1" in completion_texts
2084
+ ), f"_test1 not found in {completion_texts}"
2085
+ assert (
2086
+ ".__test2" in completion_texts
2087
+ ), f"__test2 not found in {completion_texts}"
2088
+ finally:
2089
+ del ip.user_ns["Test"]
2090
+ del ip.user_ns["t"]
2091
+
2071
2092
 
2072
2093
  @pytest.mark.parametrize(
2073
2094
  "use_jedi,evaluation",
@@ -2739,6 +2760,8 @@ def test_no_file_completions_in_attr_access(code):
2739
2760
  ("dict_with_dots = {'key.with.dots': value.attr", "attribute"),
2740
2761
  ("d[f'{a}']['{a.", "global"),
2741
2762
  ("ls .", "global"),
2763
+ ("t._", "attribute"),
2764
+ ("t.__a", "attribute"),
2742
2765
  ],
2743
2766
  )
2744
2767
  def test_completion_context(line, expected):
@@ -543,6 +543,31 @@ def test_function_pretty():
543
543
  assert "meaning_of_life(question=None)" in pretty.pretty(meaning_of_life)
544
544
 
545
545
 
546
+ def test_annotated_function_pretty():
547
+ "Test pretty print of a function with PEP-649 annotations"
548
+ # Confirm that the name is not in scope
549
+ try:
550
+ b
551
+ except NameError:
552
+ pass
553
+ else:
554
+ assert False, "Unexpected 'b' found in scope"
555
+ try:
556
+ def f(a: b): pass
557
+ except NameError as e:
558
+ if e.name == 'b':
559
+ # PEP-649 not available
560
+ return
561
+ raise
562
+ # Check whether __future__.annotations is in effect
563
+ # It probably shouldn't be, but to be sure:
564
+ import __future__
565
+ if f.__code__.co_flags & __future__.annotations.compiler_flag:
566
+ assert "f(a: 'b')" in pretty.pretty(f)
567
+ else:
568
+ assert "f(a: b)" in pretty.pretty(f)
569
+
570
+
546
571
  class OrderedCounter(Counter, OrderedDict):
547
572
  "Counter that remembers the order elements are first encountered"
548
573