ipython 8.34.0__tar.gz → 8.36.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 (622) hide show
  1. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/completer.py +155 -3
  2. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/execution.py +27 -21
  3. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/release.py +1 -1
  4. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_completer.py +119 -1
  5. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_magic.py +20 -2
  6. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/interactiveshell.py +54 -10
  7. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/shortcuts/auto_suggest.py +32 -23
  8. ipython-8.36.0/IPython/terminal/tests/fake_llm.py +89 -0
  9. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/test_shortcuts.py +29 -0
  10. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_sysinfo.py +1 -1
  11. {ipython-8.34.0/ipython.egg-info → ipython-8.36.0}/PKG-INFO +4 -2
  12. ipython-8.36.0/docs/hist_simple.png +0 -0
  13. ipython-8.36.0/docs/hist_with_text.png +0 -0
  14. ipython-8.36.0/docs/plot_simple.png +0 -0
  15. ipython-8.36.0/docs/plot_simple_python.png +0 -0
  16. ipython-8.36.0/docs/source/api/generated/IPython.conftest.rst +28 -0
  17. ipython-8.36.0/docs/source/api/generated/IPython.core.alias.rst +36 -0
  18. ipython-8.36.0/docs/source/api/generated/IPython.core.application.rst +20 -0
  19. ipython-8.36.0/docs/source/api/generated/IPython.core.async_helpers.rst +13 -0
  20. ipython-8.36.0/docs/source/api/generated/IPython.core.autocall.rst +24 -0
  21. ipython-8.36.0/docs/source/api/generated/IPython.core.builtin_trap.rst +16 -0
  22. ipython-8.36.0/docs/source/api/generated/IPython.core.compilerop.rst +25 -0
  23. ipython-8.36.0/docs/source/api/generated/IPython.core.completer.rst +113 -0
  24. ipython-8.36.0/docs/source/api/generated/IPython.core.completerlib.rst +43 -0
  25. ipython-8.36.0/docs/source/api/generated/IPython.core.crashhandler.rst +22 -0
  26. ipython-8.36.0/docs/source/api/generated/IPython.core.debugger.rst +38 -0
  27. ipython-8.36.0/docs/source/api/generated/IPython.core.error.rst +30 -0
  28. ipython-8.36.0/docs/source/api/generated/IPython.core.events.rst +34 -0
  29. ipython-8.36.0/docs/source/api/generated/IPython.core.excolors.rst +13 -0
  30. ipython-8.36.0/docs/source/api/generated/IPython.core.extensions.rst +16 -0
  31. ipython-8.36.0/docs/source/api/generated/IPython.core.formatters.rst +83 -0
  32. ipython-8.36.0/docs/source/api/generated/IPython.core.getipython.rst +13 -0
  33. ipython-8.36.0/docs/source/api/generated/IPython.core.guarded_eval.rst +31 -0
  34. ipython-8.36.0/docs/source/api/generated/IPython.core.history.rst +44 -0
  35. ipython-8.36.0/docs/source/api/generated/IPython.core.historyapp.rst +22 -0
  36. ipython-8.36.0/docs/source/api/generated/IPython.core.hooks.rst +34 -0
  37. ipython-8.36.0/docs/source/api/generated/IPython.core.inputsplitter.rst +58 -0
  38. ipython-8.36.0/docs/source/api/generated/IPython.core.inputtransformer.rst +76 -0
  39. ipython-8.36.0/docs/source/api/generated/IPython.core.inputtransformer2.rst +88 -0
  40. ipython-8.36.0/docs/source/api/generated/IPython.core.interactiveshell.rst +59 -0
  41. ipython-8.36.0/docs/source/api/generated/IPython.core.logger.rst +16 -0
  42. ipython-8.36.0/docs/source/api/generated/IPython.core.macro.rst +16 -0
  43. ipython-8.36.0/docs/source/api/generated/IPython.core.magic.rst +59 -0
  44. ipython-8.36.0/docs/source/api/generated/IPython.core.magic_arguments.rst +62 -0
  45. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.ast_mod.rst +22 -0
  46. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.auto.rst +16 -0
  47. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.basic.rst +24 -0
  48. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.code.rst +38 -0
  49. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.display.rst +14 -0
  50. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.execution.rst +38 -0
  51. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.extension.rst +14 -0
  52. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.history.rst +14 -0
  53. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.logging.rst +14 -0
  54. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.namespace.rst +14 -0
  55. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.osm.rst +16 -0
  56. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.packaging.rst +20 -0
  57. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.pylab.rst +14 -0
  58. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.rst +14 -0
  59. ipython-8.36.0/docs/source/api/generated/IPython.core.magics.script.rst +26 -0
  60. ipython-8.36.0/docs/source/api/generated/IPython.core.oinspect.rst +52 -0
  61. ipython-8.36.0/docs/source/api/generated/IPython.core.page.rst +37 -0
  62. ipython-8.36.0/docs/source/api/generated/IPython.core.payload.rst +14 -0
  63. ipython-8.36.0/docs/source/api/generated/IPython.core.payloadpage.rst +16 -0
  64. ipython-8.36.0/docs/source/api/generated/IPython.core.prefilter.rst +88 -0
  65. ipython-8.36.0/docs/source/api/generated/IPython.core.profileapp.rst +35 -0
  66. ipython-8.36.0/docs/source/api/generated/IPython.core.profiledir.rst +18 -0
  67. ipython-8.36.0/docs/source/api/generated/IPython.core.prompts.rst +16 -0
  68. ipython-8.36.0/docs/source/api/generated/IPython.core.pylabtools.rst +40 -0
  69. ipython-8.36.0/docs/source/api/generated/IPython.core.shellapp.rst +20 -0
  70. ipython-8.36.0/docs/source/api/generated/IPython.core.splitinput.rst +22 -0
  71. ipython-8.36.0/docs/source/api/generated/IPython.core.ultratb.rst +72 -0
  72. ipython-8.36.0/docs/source/api/generated/IPython.display.rst +187 -0
  73. ipython-8.36.0/docs/source/api/generated/IPython.lib.backgroundjobs.rst +34 -0
  74. ipython-8.36.0/docs/source/api/generated/IPython.lib.clipboard.rst +29 -0
  75. ipython-8.36.0/docs/source/api/generated/IPython.lib.deepreload.rst +37 -0
  76. ipython-8.36.0/docs/source/api/generated/IPython.lib.demo.rst +53 -0
  77. ipython-8.36.0/docs/source/api/generated/IPython.lib.editorhooks.rst +43 -0
  78. ipython-8.36.0/docs/source/api/generated/IPython.lib.guisupport.rst +28 -0
  79. ipython-8.36.0/docs/source/api/generated/IPython.lib.latextools.rst +35 -0
  80. ipython-8.36.0/docs/source/api/generated/IPython.lib.lexers.rst +38 -0
  81. ipython-8.36.0/docs/source/api/generated/IPython.lib.pretty.rst +83 -0
  82. ipython-8.36.0/docs/source/api/generated/IPython.paths.rst +25 -0
  83. ipython-8.36.0/docs/source/api/generated/IPython.rst +22 -0
  84. ipython-8.36.0/docs/source/api/generated/IPython.terminal.debugger.rst +22 -0
  85. ipython-8.36.0/docs/source/api/generated/IPython.terminal.embed.rst +30 -0
  86. ipython-8.36.0/docs/source/api/generated/IPython.terminal.interactiveshell.rst +34 -0
  87. ipython-8.36.0/docs/source/api/generated/IPython.terminal.ipapp.rst +30 -0
  88. ipython-8.36.0/docs/source/api/generated/IPython.terminal.magics.rst +22 -0
  89. ipython-8.36.0/docs/source/api/generated/IPython.terminal.prompts.rst +24 -0
  90. ipython-8.36.0/docs/source/api/generated/IPython.terminal.shortcuts.auto_match.rst +46 -0
  91. ipython-8.36.0/docs/source/api/generated/IPython.terminal.shortcuts.auto_suggest.rst +67 -0
  92. ipython-8.36.0/docs/source/api/generated/IPython.terminal.shortcuts.filters.rst +58 -0
  93. ipython-8.36.0/docs/source/api/generated/IPython.terminal.shortcuts.rst +76 -0
  94. ipython-8.36.0/docs/source/api/generated/IPython.testing.decorators.rst +28 -0
  95. ipython-8.36.0/docs/source/api/generated/IPython.testing.globalipapp.rst +19 -0
  96. ipython-8.36.0/docs/source/api/generated/IPython.testing.ipunittest.rst +31 -0
  97. ipython-8.36.0/docs/source/api/generated/IPython.testing.skipdoctest.rst +13 -0
  98. ipython-8.36.0/docs/source/api/generated/IPython.testing.tools.rst +66 -0
  99. ipython-8.36.0/docs/source/api/generated/IPython.utils.PyColorize.rst +16 -0
  100. ipython-8.36.0/docs/source/api/generated/IPython.utils.capture.rst +28 -0
  101. ipython-8.36.0/docs/source/api/generated/IPython.utils.colorable.rst +14 -0
  102. ipython-8.36.0/docs/source/api/generated/IPython.utils.coloransi.rst +40 -0
  103. ipython-8.36.0/docs/source/api/generated/IPython.utils.contexts.rst +16 -0
  104. ipython-8.36.0/docs/source/api/generated/IPython.utils.data.rst +16 -0
  105. ipython-8.36.0/docs/source/api/generated/IPython.utils.decorators.rst +19 -0
  106. ipython-8.36.0/docs/source/api/generated/IPython.utils.dir2.rst +19 -0
  107. ipython-8.36.0/docs/source/api/generated/IPython.utils.encoding.rst +16 -0
  108. ipython-8.36.0/docs/source/api/generated/IPython.utils.frame.rst +22 -0
  109. ipython-8.36.0/docs/source/api/generated/IPython.utils.generics.rst +16 -0
  110. ipython-8.36.0/docs/source/api/generated/IPython.utils.importstring.rst +13 -0
  111. ipython-8.36.0/docs/source/api/generated/IPython.utils.io.rst +25 -0
  112. ipython-8.36.0/docs/source/api/generated/IPython.utils.ipstruct.rst +16 -0
  113. ipython-8.36.0/docs/source/api/generated/IPython.utils.module_paths.rst +13 -0
  114. ipython-8.36.0/docs/source/api/generated/IPython.utils.openpy.rst +22 -0
  115. ipython-8.36.0/docs/source/api/generated/IPython.utils.path.rst +62 -0
  116. ipython-8.36.0/docs/source/api/generated/IPython.utils.process.rst +23 -0
  117. ipython-8.36.0/docs/source/api/generated/IPython.utils.sentinel.rst +16 -0
  118. ipython-8.36.0/docs/source/api/generated/IPython.utils.shimmodule.rst +26 -0
  119. ipython-8.36.0/docs/source/api/generated/IPython.utils.strdispatch.rst +16 -0
  120. ipython-8.36.0/docs/source/api/generated/IPython.utils.sysinfo.rst +25 -0
  121. ipython-8.36.0/docs/source/api/generated/IPython.utils.syspathcontext.rst +22 -0
  122. ipython-8.36.0/docs/source/api/generated/IPython.utils.tempdir.rst +20 -0
  123. ipython-8.36.0/docs/source/api/generated/IPython.utils.terminal.rst +25 -0
  124. ipython-8.36.0/docs/source/api/generated/IPython.utils.text.rst +69 -0
  125. ipython-8.36.0/docs/source/api/generated/IPython.utils.timing.rst +31 -0
  126. ipython-8.36.0/docs/source/api/generated/IPython.utils.tokenutil.rst +22 -0
  127. ipython-8.36.0/docs/source/api/generated/IPython.utils.tz.rst +20 -0
  128. ipython-8.36.0/docs/source/api/generated/IPython.utils.ulinecache.rst +13 -0
  129. ipython-8.36.0/docs/source/api/generated/IPython.utils.wildcard.rst +28 -0
  130. ipython-8.36.0/docs/source/api/generated/gen.txt +119 -0
  131. ipython-8.36.0/docs/source/config/options/terminal.rst +2025 -0
  132. ipython-8.36.0/docs/source/config/shortcuts/table.tsv +79 -0
  133. ipython-8.36.0/docs/source/interactive/magics-generated.txt +2488 -0
  134. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version8.rst +48 -0
  135. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Capturing Output.ipynb +1 -1
  136. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Custom Display Logic.ipynb +1 -1
  137. ipython-8.36.0/examples/IPython Kernel/nbpackage/nbs/__init__.py +0 -0
  138. {ipython-8.34.0 → ipython-8.36.0}/examples/auto_suggest_llm.py +30 -3
  139. {ipython-8.34.0 → ipython-8.36.0/ipython.egg-info}/PKG-INFO +4 -2
  140. {ipython-8.34.0 → ipython-8.36.0}/ipython.egg-info/SOURCES.txt +124 -0
  141. {ipython-8.34.0 → ipython-8.36.0}/ipython.egg-info/requires.txt +1 -0
  142. {ipython-8.34.0 → ipython-8.36.0}/pyproject.toml +1 -0
  143. {ipython-8.34.0 → ipython-8.36.0}/.flake8 +0 -0
  144. {ipython-8.34.0 → ipython-8.36.0}/.mailmap +0 -0
  145. {ipython-8.34.0 → ipython-8.36.0}/.pre-commit-config.yaml +0 -0
  146. {ipython-8.34.0 → ipython-8.36.0}/COPYING.rst +0 -0
  147. {ipython-8.34.0 → ipython-8.36.0}/IPython/__init__.py +0 -0
  148. {ipython-8.34.0 → ipython-8.36.0}/IPython/__main__.py +0 -0
  149. {ipython-8.34.0 → ipython-8.36.0}/IPython/conftest.py +0 -0
  150. {ipython-8.34.0 → ipython-8.36.0}/IPython/consoleapp.py +0 -0
  151. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/__init__.py +0 -0
  152. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/alias.py +0 -0
  153. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/application.py +0 -0
  154. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/async_helpers.py +0 -0
  155. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/autocall.py +0 -0
  156. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/builtin_trap.py +0 -0
  157. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/compilerop.py +0 -0
  158. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/completerlib.py +0 -0
  159. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/crashhandler.py +0 -0
  160. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/debugger.py +0 -0
  161. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/display.py +0 -0
  162. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/display_functions.py +0 -0
  163. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/display_trap.py +0 -0
  164. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/displayhook.py +0 -0
  165. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/displaypub.py +0 -0
  166. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/error.py +0 -0
  167. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/events.py +0 -0
  168. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/excolors.py +0 -0
  169. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/extensions.py +0 -0
  170. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/formatters.py +0 -0
  171. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/getipython.py +0 -0
  172. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/guarded_eval.py +0 -0
  173. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/history.py +0 -0
  174. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/historyapp.py +0 -0
  175. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/hooks.py +0 -0
  176. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/inputsplitter.py +0 -0
  177. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/inputtransformer.py +0 -0
  178. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/inputtransformer2.py +0 -0
  179. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/interactiveshell.py +0 -0
  180. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/latex_symbols.py +0 -0
  181. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/logger.py +0 -0
  182. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/macro.py +0 -0
  183. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magic.py +0 -0
  184. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magic_arguments.py +0 -0
  185. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/__init__.py +0 -0
  186. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/ast_mod.py +0 -0
  187. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/auto.py +0 -0
  188. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/basic.py +0 -0
  189. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/code.py +0 -0
  190. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/config.py +0 -0
  191. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/display.py +0 -0
  192. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/extension.py +0 -0
  193. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/history.py +0 -0
  194. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/logging.py +0 -0
  195. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/namespace.py +0 -0
  196. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/osm.py +0 -0
  197. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/packaging.py +0 -0
  198. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/pylab.py +0 -0
  199. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/magics/script.py +0 -0
  200. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/oinspect.py +0 -0
  201. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/page.py +0 -0
  202. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/payload.py +0 -0
  203. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/payloadpage.py +0 -0
  204. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/prefilter.py +0 -0
  205. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/profile/README_STARTUP +0 -0
  206. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/profileapp.py +0 -0
  207. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/profiledir.py +0 -0
  208. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/prompts.py +0 -0
  209. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/pylabtools.py +0 -0
  210. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/shellapp.py +0 -0
  211. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/splitinput.py +0 -0
  212. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/2x2.jpg +0 -0
  213. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/2x2.png +0 -0
  214. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/__init__.py +0 -0
  215. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/bad_all.py +0 -0
  216. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/daft_extension/daft_extension.py +0 -0
  217. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/nonascii.py +0 -0
  218. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/nonascii2.py +0 -0
  219. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/print_argv.py +0 -0
  220. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/refbug.py +0 -0
  221. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/simpleerr.py +0 -0
  222. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/tclass.py +0 -0
  223. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_alias.py +0 -0
  224. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_application.py +0 -0
  225. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_async_helpers.py +0 -0
  226. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_autocall.py +0 -0
  227. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_compilerop.py +0 -0
  228. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_completerlib.py +0 -0
  229. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_debugger.py +0 -0
  230. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_display.py +0 -0
  231. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_displayhook.py +0 -0
  232. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_events.py +0 -0
  233. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_exceptiongroup_tb.py +0 -0
  234. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_extension.py +0 -0
  235. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_formatters.py +0 -0
  236. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_guarded_eval.py +0 -0
  237. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_handlers.py +0 -0
  238. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_history.py +0 -0
  239. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_hooks.py +0 -0
  240. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_imports.py +0 -0
  241. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_inputsplitter.py +0 -0
  242. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_inputtransformer.py +0 -0
  243. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_inputtransformer2.py +0 -0
  244. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_inputtransformer2_line.py +0 -0
  245. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_interactiveshell.py +0 -0
  246. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_iplib.py +0 -0
  247. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_logger.py +0 -0
  248. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_magic_arguments.py +0 -0
  249. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_magic_terminal.py +0 -0
  250. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_oinspect.py +0 -0
  251. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_page.py +0 -0
  252. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_paths.py +0 -0
  253. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_prefilter.py +0 -0
  254. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_profile.py +0 -0
  255. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_prompts.py +0 -0
  256. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_pylabtools.py +0 -0
  257. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_run.py +0 -0
  258. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_shellapp.py +0 -0
  259. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_splitinput.py +0 -0
  260. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/tests/test_ultratb.py +0 -0
  261. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/ultratb.py +0 -0
  262. {ipython-8.34.0 → ipython-8.36.0}/IPython/core/usage.py +0 -0
  263. {ipython-8.34.0 → ipython-8.36.0}/IPython/display.py +0 -0
  264. {ipython-8.34.0 → ipython-8.36.0}/IPython/extensions/__init__.py +0 -0
  265. {ipython-8.34.0 → ipython-8.36.0}/IPython/extensions/autoreload.py +0 -0
  266. {ipython-8.34.0 → ipython-8.36.0}/IPython/extensions/storemagic.py +0 -0
  267. {ipython-8.34.0 → ipython-8.36.0}/IPython/extensions/tests/__init__.py +0 -0
  268. {ipython-8.34.0 → ipython-8.36.0}/IPython/extensions/tests/test_autoreload.py +0 -0
  269. {ipython-8.34.0 → ipython-8.36.0}/IPython/extensions/tests/test_storemagic.py +0 -0
  270. {ipython-8.34.0 → ipython-8.36.0}/IPython/external/__init__.py +0 -0
  271. {ipython-8.34.0 → ipython-8.36.0}/IPython/external/qt_for_kernel.py +0 -0
  272. {ipython-8.34.0 → ipython-8.36.0}/IPython/external/qt_loaders.py +0 -0
  273. {ipython-8.34.0 → ipython-8.36.0}/IPython/external/tests/__init__.py +0 -0
  274. {ipython-8.34.0 → ipython-8.36.0}/IPython/external/tests/test_qt_loaders.py +0 -0
  275. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/__init__.py +0 -0
  276. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/backgroundjobs.py +0 -0
  277. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/clipboard.py +0 -0
  278. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/deepreload.py +0 -0
  279. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/demo.py +0 -0
  280. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/display.py +0 -0
  281. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/editorhooks.py +0 -0
  282. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/guisupport.py +0 -0
  283. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/latextools.py +0 -0
  284. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/lexers.py +0 -0
  285. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/pretty.py +0 -0
  286. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/__init__.py +0 -0
  287. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test.wav +0 -0
  288. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_backgroundjobs.py +0 -0
  289. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_clipboard.py +0 -0
  290. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_deepreload.py +0 -0
  291. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_display.py +0 -0
  292. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_editorhooks.py +0 -0
  293. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_imports.py +0 -0
  294. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_latextools.py +0 -0
  295. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_lexers.py +0 -0
  296. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_pretty.py +0 -0
  297. {ipython-8.34.0 → ipython-8.36.0}/IPython/lib/tests/test_pygments.py +0 -0
  298. {ipython-8.34.0 → ipython-8.36.0}/IPython/paths.py +0 -0
  299. {ipython-8.34.0 → ipython-8.36.0}/IPython/py.typed +0 -0
  300. {ipython-8.34.0 → ipython-8.36.0}/IPython/sphinxext/__init__.py +0 -0
  301. {ipython-8.34.0 → ipython-8.36.0}/IPython/sphinxext/custom_doctests.py +0 -0
  302. {ipython-8.34.0 → ipython-8.36.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  303. {ipython-8.34.0 → ipython-8.36.0}/IPython/sphinxext/ipython_directive.py +0 -0
  304. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/__init__.py +0 -0
  305. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/console.py +0 -0
  306. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/debugger.py +0 -0
  307. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/embed.py +0 -0
  308. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/ipapp.py +0 -0
  309. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/magics.py +0 -0
  310. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/prompts.py +0 -0
  311. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  312. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  313. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  314. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  315. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  316. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  317. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  318. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  319. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  320. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  321. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  322. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/ptutils.py +0 -0
  323. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  324. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  325. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/shortcuts/filters.py +0 -0
  326. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/__init__.py +0 -0
  327. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/test_debug_magic.py +0 -0
  328. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/test_embed.py +0 -0
  329. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/test_help.py +0 -0
  330. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/test_interactivshell.py +0 -0
  331. {ipython-8.34.0 → ipython-8.36.0}/IPython/terminal/tests/test_pt_inputhooks.py +0 -0
  332. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/__init__.py +0 -0
  333. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/decorators.py +0 -0
  334. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/globalipapp.py +0 -0
  335. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/ipunittest.py +0 -0
  336. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/Makefile +0 -0
  337. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/README.txt +0 -0
  338. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/__init__.py +0 -0
  339. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/dtexample.py +0 -0
  340. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  341. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  342. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/setup.py +0 -0
  343. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/simple.py +0 -0
  344. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/simplevars.py +0 -0
  345. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/test_combo.txt +0 -0
  346. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/test_example.txt +0 -0
  347. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  348. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  349. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/plugin/test_refs.py +0 -0
  350. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/skipdoctest.py +0 -0
  351. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/tests/__init__.py +0 -0
  352. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/tests/test_decorators.py +0 -0
  353. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/tests/test_ipunittest.py +0 -0
  354. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/tests/test_tools.py +0 -0
  355. {ipython-8.34.0 → ipython-8.36.0}/IPython/testing/tools.py +0 -0
  356. {ipython-8.34.0 → ipython-8.36.0}/IPython/tests/cve.py +0 -0
  357. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/PyColorize.py +0 -0
  358. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/__init__.py +0 -0
  359. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_process_cli.py +0 -0
  360. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_process_common.py +0 -0
  361. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_process_emscripten.py +0 -0
  362. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_process_posix.py +0 -0
  363. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_process_win32.py +0 -0
  364. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/_process_win32_controller.py +0 -0
  365. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/capture.py +0 -0
  366. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/colorable.py +0 -0
  367. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/coloransi.py +0 -0
  368. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/contexts.py +0 -0
  369. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/daemonize.py +0 -0
  370. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/data.py +0 -0
  371. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/decorators.py +0 -0
  372. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/dir2.py +0 -0
  373. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/docs.py +0 -0
  374. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/encoding.py +0 -0
  375. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/eventful.py +0 -0
  376. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/frame.py +0 -0
  377. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/generics.py +0 -0
  378. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/importstring.py +0 -0
  379. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/io.py +0 -0
  380. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/ipstruct.py +0 -0
  381. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/jsonutil.py +0 -0
  382. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/localinterfaces.py +0 -0
  383. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/log.py +0 -0
  384. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/module_paths.py +0 -0
  385. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/openpy.py +0 -0
  386. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/path.py +0 -0
  387. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/process.py +0 -0
  388. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/py3compat.py +0 -0
  389. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/sentinel.py +0 -0
  390. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/shimmodule.py +0 -0
  391. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/signatures.py +0 -0
  392. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/strdispatch.py +0 -0
  393. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/sysinfo.py +0 -0
  394. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/syspathcontext.py +0 -0
  395. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tempdir.py +0 -0
  396. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/terminal.py +0 -0
  397. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/__init__.py +0 -0
  398. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_capture.py +0 -0
  399. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_decorators.py +0 -0
  400. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_deprecated.py +0 -0
  401. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_dir2.py +0 -0
  402. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_imports.py +0 -0
  403. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_importstring.py +0 -0
  404. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_io.py +0 -0
  405. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_module_paths.py +0 -0
  406. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_openpy.py +0 -0
  407. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_path.py +0 -0
  408. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_process.py +0 -0
  409. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_pycolorize.py +0 -0
  410. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_shimmodule.py +0 -0
  411. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_sysinfo.py +0 -0
  412. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_tempdir.py +0 -0
  413. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_text.py +0 -0
  414. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_tokenutil.py +0 -0
  415. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tests/test_wildcard.py +0 -0
  416. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/text.py +0 -0
  417. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/timing.py +0 -0
  418. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tokenutil.py +0 -0
  419. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/traitlets.py +0 -0
  420. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/tz.py +0 -0
  421. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/ulinecache.py +0 -0
  422. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/version.py +0 -0
  423. {ipython-8.34.0 → ipython-8.36.0}/IPython/utils/wildcard.py +0 -0
  424. {ipython-8.34.0 → ipython-8.36.0}/LICENSE +0 -0
  425. {ipython-8.34.0 → ipython-8.36.0}/MANIFEST.in +0 -0
  426. {ipython-8.34.0 → ipython-8.36.0}/README.rst +0 -0
  427. {ipython-8.34.0 → ipython-8.36.0}/_build_meta.py +0 -0
  428. {ipython-8.34.0 → ipython-8.36.0}/docs/Makefile +0 -0
  429. {ipython-8.34.0 → ipython-8.36.0}/docs/README.rst +0 -0
  430. {ipython-8.34.0 → ipython-8.36.0}/docs/autogen_api.py +0 -0
  431. {ipython-8.34.0 → ipython-8.36.0}/docs/autogen_config.py +0 -0
  432. {ipython-8.34.0 → ipython-8.36.0}/docs/autogen_magics.py +0 -0
  433. {ipython-8.34.0 → ipython-8.36.0}/docs/autogen_shortcuts.py +0 -0
  434. {ipython-8.34.0 → ipython-8.36.0}/docs/make.cmd +0 -0
  435. {ipython-8.34.0 → ipython-8.36.0}/docs/man/ipython.1 +0 -0
  436. {ipython-8.34.0 → ipython-8.36.0}/docs/requirements.txt +0 -0
  437. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/2.0/running-crop.png +0 -0
  438. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/2.0/running.png +0 -0
  439. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/2.0/treeview.png +0 -0
  440. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/2.0/user-interface.png +0 -0
  441. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/2.0/widgets.png +0 -0
  442. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  443. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  444. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  445. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  446. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  447. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  448. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  449. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  450. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  451. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  452. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  453. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/autosuggest.gif +0 -0
  454. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  455. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  456. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  457. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  458. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  459. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  460. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  461. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  462. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  463. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  464. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  465. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  466. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  467. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  468. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  469. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ms_visual_studio.png +0 -0
  470. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/notebook_specgram.png +0 -0
  471. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/ptshell_features.png +0 -0
  472. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/qtconsole.png +0 -0
  473. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  474. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_images/unicode_completion.png +0 -0
  475. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_static/favicon.ico +0 -0
  476. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_static/logo.png +0 -0
  477. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_static/theme_overrides.css +0 -0
  478. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_templates/breadcrumbs.html +0 -0
  479. {ipython-8.34.0 → ipython-8.36.0}/docs/source/_templates/notebook_redirect.html +0 -0
  480. {ipython-8.34.0 → ipython-8.36.0}/docs/source/about/history.rst +0 -0
  481. {ipython-8.34.0 → ipython-8.36.0}/docs/source/about/index.rst +0 -0
  482. {ipython-8.34.0 → ipython-8.36.0}/docs/source/about/license_and_copyright.rst +0 -0
  483. {ipython-8.34.0 → ipython-8.36.0}/docs/source/api/index.rst +0 -0
  484. {ipython-8.34.0 → ipython-8.36.0}/docs/source/conf.py +0 -0
  485. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/callbacks.rst +0 -0
  486. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/custommagics.rst +0 -0
  487. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/details.rst +0 -0
  488. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/eventloops.rst +0 -0
  489. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/extensions/autoreload.rst +0 -0
  490. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/extensions/index.rst +0 -0
  491. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/extensions/storemagic.rst +0 -0
  492. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/index.rst +0 -0
  493. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/inputtransforms.rst +0 -0
  494. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/integrating.rst +0 -0
  495. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/intro.rst +0 -0
  496. /ipython-8.34.0/examples/IPython Kernel/nbpackage/__init__.py → /ipython-8.36.0/docs/source/config/options/config-generated.txt +0 -0
  497. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/options/index.rst +0 -0
  498. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  499. {ipython-8.34.0 → ipython-8.36.0}/docs/source/config/shortcuts/index.rst +0 -0
  500. {ipython-8.34.0 → ipython-8.36.0}/docs/source/coredev/index.rst +0 -0
  501. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/config.rst +0 -0
  502. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/execution.rst +0 -0
  503. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  504. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  505. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/figs/other_kernels.png +0 -0
  506. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/figs/other_kernels.svg +0 -0
  507. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/how_ipython_works.rst +0 -0
  508. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/index.rst +0 -0
  509. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/inputhook_app.rst +0 -0
  510. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/kernels.rst +0 -0
  511. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/lexer.rst +0 -0
  512. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/messaging.rst +0 -0
  513. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/pycompat.rst +0 -0
  514. {ipython-8.34.0 → ipython-8.36.0}/docs/source/development/wrapperkernels.rst +0 -0
  515. {ipython-8.34.0 → ipython-8.36.0}/docs/source/index.rst +0 -0
  516. {ipython-8.34.0 → ipython-8.36.0}/docs/source/install/index.rst +0 -0
  517. {ipython-8.34.0 → ipython-8.36.0}/docs/source/install/install.rst +0 -0
  518. {ipython-8.34.0 → ipython-8.36.0}/docs/source/install/kernel_install.rst +0 -0
  519. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/autoawait.rst +0 -0
  520. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/figs/besselj.png +0 -0
  521. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/figs/colors_dark.png +0 -0
  522. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/figs/jn.html +0 -0
  523. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/figs/jn.xhtml +0 -0
  524. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/index.rst +0 -0
  525. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/magics.rst +0 -0
  526. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/plotting.rst +0 -0
  527. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  528. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/reference.rst +0 -0
  529. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/shell.rst +0 -0
  530. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/tips.rst +0 -0
  531. {ipython-8.34.0 → ipython-8.36.0}/docs/source/interactive/tutorial.rst +0 -0
  532. {ipython-8.34.0 → ipython-8.36.0}/docs/source/links.txt +0 -0
  533. {ipython-8.34.0 → ipython-8.36.0}/docs/source/overview.rst +0 -0
  534. {ipython-8.34.0 → ipython-8.36.0}/docs/source/parallel/index.rst +0 -0
  535. {ipython-8.34.0 → ipython-8.36.0}/docs/source/sphinx.toml +0 -0
  536. {ipython-8.34.0 → ipython-8.36.0}/docs/source/sphinxext.rst +0 -0
  537. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/development.rst +0 -0
  538. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  539. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  540. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  541. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  542. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  543. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  544. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  545. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  546. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  547. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  548. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  549. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/index.rst +0 -0
  550. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/pr/README.md +0 -0
  551. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  552. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  553. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version0.10.rst +0 -0
  554. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version0.11.rst +0 -0
  555. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version0.12.rst +0 -0
  556. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version0.13.rst +0 -0
  557. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version0.8.rst +0 -0
  558. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version0.9.rst +0 -0
  559. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version1.0.rst +0 -0
  560. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version2.0.rst +0 -0
  561. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version3.rst +0 -0
  562. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  563. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version4.rst +0 -0
  564. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version5.rst +0 -0
  565. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version6.rst +0 -0
  566. {ipython-8.34.0 → ipython-8.36.0}/docs/source/whatsnew/version7.rst +0 -0
  567. {ipython-8.34.0 → ipython-8.36.0}/docs/sphinxext/apigen.py +0 -0
  568. {ipython-8.34.0 → ipython-8.36.0}/docs/sphinxext/configtraits.py +0 -0
  569. {ipython-8.34.0 → ipython-8.36.0}/docs/sphinxext/github.py +0 -0
  570. {ipython-8.34.0 → ipython-8.36.0}/docs/sphinxext/magics.py +0 -0
  571. {ipython-8.34.0 → ipython-8.36.0}/examples/Embedding/Index.ipynb +0 -0
  572. {ipython-8.34.0 → ipython-8.36.0}/examples/Embedding/embed_class_long.py +0 -0
  573. {ipython-8.34.0 → ipython-8.36.0}/examples/Embedding/embed_class_short.py +0 -0
  574. {ipython-8.34.0 → ipython-8.36.0}/examples/Embedding/embed_function.py +0 -0
  575. {ipython-8.34.0 → ipython-8.36.0}/examples/Embedding/start_ipython_config.py +0 -0
  576. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Animations Using clear_output.ipynb +0 -0
  577. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Background Jobs.ipynb +0 -0
  578. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Beyond Plain Python.ipynb +0 -0
  579. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Cell Magics.ipynb +0 -0
  580. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Importing Notebooks.ipynb +0 -0
  581. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Index.ipynb +0 -0
  582. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Plotting in the Notebook.ipynb +0 -0
  583. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Raw Input in the Notebook.ipynb +0 -0
  584. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Rich Output.ipynb +0 -0
  585. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Script Magics.ipynb +0 -0
  586. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/SymPy.ipynb +0 -0
  587. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Terminal Usage.ipynb +0 -0
  588. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Third Party Rich Output.ipynb +0 -0
  589. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Trapezoid Rule.ipynb +0 -0
  590. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Updating Displays.ipynb +0 -0
  591. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/Working With External Code.ipynb +0 -0
  592. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/data/flare.json +0 -0
  593. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/example-demo.py +0 -0
  594. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  595. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  596. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  597. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  598. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  599. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/ipython.desktop +0 -0
  600. {ipython-8.34.0/examples/IPython Kernel/nbpackage/nbs → ipython-8.36.0/examples/IPython Kernel/nbpackage}/__init__.py +0 -0
  601. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/nbpackage/mynotebook.ipynb +0 -0
  602. {ipython-8.34.0 → ipython-8.36.0}/examples/IPython Kernel/nbpackage/nbs/other.ipynb +0 -0
  603. {ipython-8.34.0 → ipython-8.36.0}/examples/Index.ipynb +0 -0
  604. {ipython-8.34.0 → ipython-8.36.0}/examples/images/FrontendKernel.graffle/data.plist +0 -0
  605. {ipython-8.34.0 → ipython-8.36.0}/examples/images/FrontendKernel.graffle/image1.png +0 -0
  606. {ipython-8.34.0 → ipython-8.36.0}/examples/images/FrontendKernel.png +0 -0
  607. {ipython-8.34.0 → ipython-8.36.0}/examples/images/animation.m4v +0 -0
  608. {ipython-8.34.0 → ipython-8.36.0}/examples/images/ipython_logo.png +0 -0
  609. {ipython-8.34.0 → ipython-8.36.0}/examples/images/python_logo.svg +0 -0
  610. {ipython-8.34.0 → ipython-8.36.0}/examples/utils/cwd_prompt.py +0 -0
  611. {ipython-8.34.0 → ipython-8.36.0}/examples/utils/list_pyfiles.ipy +0 -0
  612. {ipython-8.34.0 → ipython-8.36.0}/examples/utils/list_subdirs.ipy +0 -0
  613. {ipython-8.34.0 → ipython-8.36.0}/ipython.egg-info/dependency_links.txt +0 -0
  614. {ipython-8.34.0 → ipython-8.36.0}/ipython.egg-info/entry_points.txt +0 -0
  615. {ipython-8.34.0 → ipython-8.36.0}/ipython.egg-info/not-zip-safe +0 -0
  616. {ipython-8.34.0 → ipython-8.36.0}/ipython.egg-info/top_level.txt +0 -0
  617. {ipython-8.34.0 → ipython-8.36.0}/long_description.rst +0 -0
  618. {ipython-8.34.0 → ipython-8.36.0}/scripts/ipython.ico +0 -0
  619. {ipython-8.34.0 → ipython-8.36.0}/scripts/ipython_nb.ico +0 -0
  620. {ipython-8.34.0 → ipython-8.36.0}/setup.cfg +0 -0
  621. {ipython-8.34.0 → ipython-8.36.0}/setup.py +0 -0
  622. {ipython-8.34.0 → ipython-8.36.0}/setupbase.py +0 -0
@@ -1148,7 +1148,7 @@ class Completer(Configurable):
1148
1148
  def _attr_matches(
1149
1149
  self, text: str, include_prefix: bool = True
1150
1150
  ) -> Tuple[Sequence[str], str]:
1151
- m2 = self._ATTR_MATCH_RE.match(self.line_buffer)
1151
+ m2 = self._ATTR_MATCH_RE.match(text)
1152
1152
  if not m2:
1153
1153
  return [], ""
1154
1154
  expr, attr = m2.group(1, 2)
@@ -2356,11 +2356,163 @@ class IPCompleter(Completer):
2356
2356
  else:
2357
2357
  return iter([])
2358
2358
 
2359
+ class _CompletionContextType(enum.Enum):
2360
+ ATTRIBUTE = "attribute" # For attribute completion
2361
+ GLOBAL = "global" # For global completion
2362
+
2363
+ def _determine_completion_context(self, line):
2364
+ """
2365
+ Determine whether the cursor is in an attribute or global completion context.
2366
+ """
2367
+ # Cursor in string/comment → GLOBAL.
2368
+ is_string, is_in_expression = self._is_in_string_or_comment(line)
2369
+ if is_string and not is_in_expression:
2370
+ return self._CompletionContextType.GLOBAL
2371
+
2372
+ # If we're in a template string expression, handle specially
2373
+ if is_string and is_in_expression:
2374
+ # Extract the expression part - look for the last { that isn't closed
2375
+ expr_start = line.rfind("{")
2376
+ if expr_start >= 0:
2377
+ # We're looking at the expression inside a template string
2378
+ expr = line[expr_start + 1 :]
2379
+ # Recursively determine the context of the expression
2380
+ return self._determine_completion_context(expr)
2381
+
2382
+ # Handle plain number literals - should be global context
2383
+ # Ex: 3. -42.14 but not 3.1.
2384
+ if re.search(r"(?<!\w)(?<!\d\.)([-+]?\d+\.(\d+)?)(?!\w)$", line):
2385
+ return self._CompletionContextType.GLOBAL
2386
+
2387
+ # Handle all other attribute matches np.ran, d[0].k, (a,b).count
2388
+ chain_match = re.search(r".*(.+\.(?:[a-zA-Z]\w*)?)$", line)
2389
+ if chain_match:
2390
+ return self._CompletionContextType.ATTRIBUTE
2391
+
2392
+ return self._CompletionContextType.GLOBAL
2393
+
2394
+ def _is_in_string_or_comment(self, text):
2395
+ """
2396
+ Determine if the cursor is inside a string or comment.
2397
+ Returns (is_string, is_in_expression) tuple:
2398
+ - is_string: True if in any kind of string
2399
+ - is_in_expression: True if inside an f-string/t-string expression
2400
+ """
2401
+ in_single_quote = False
2402
+ in_double_quote = False
2403
+ in_triple_single = False
2404
+ in_triple_double = False
2405
+ in_template_string = False # Covers both f-strings and t-strings
2406
+ in_expression = False # For expressions in f/t-strings
2407
+ expression_depth = 0 # Track nested braces in expressions
2408
+ i = 0
2409
+
2410
+ while i < len(text):
2411
+ # Check for f-string or t-string start
2412
+ if (
2413
+ i + 1 < len(text)
2414
+ and text[i] in ("f", "t")
2415
+ and (text[i + 1] == '"' or text[i + 1] == "'")
2416
+ and not (
2417
+ in_single_quote
2418
+ or in_double_quote
2419
+ or in_triple_single
2420
+ or in_triple_double
2421
+ )
2422
+ ):
2423
+ in_template_string = True
2424
+ i += 1 # Skip the 'f' or 't'
2425
+
2426
+ # Handle triple quotes
2427
+ if i + 2 < len(text):
2428
+ if (
2429
+ text[i : i + 3] == '"""'
2430
+ and not in_single_quote
2431
+ and not in_triple_single
2432
+ ):
2433
+ in_triple_double = not in_triple_double
2434
+ if not in_triple_double:
2435
+ in_template_string = False
2436
+ i += 3
2437
+ continue
2438
+ if (
2439
+ text[i : i + 3] == "'''"
2440
+ and not in_double_quote
2441
+ and not in_triple_double
2442
+ ):
2443
+ in_triple_single = not in_triple_single
2444
+ if not in_triple_single:
2445
+ in_template_string = False
2446
+ i += 3
2447
+ continue
2448
+
2449
+ # Handle escapes
2450
+ if text[i] == "\\" and i + 1 < len(text):
2451
+ i += 2
2452
+ continue
2453
+
2454
+ # Handle nested braces within f-strings
2455
+ if in_template_string:
2456
+ # Special handling for consecutive opening braces
2457
+ if i + 1 < len(text) and text[i : i + 2] == "{{":
2458
+ i += 2
2459
+ continue
2460
+
2461
+ # Detect start of an expression
2462
+ if text[i] == "{":
2463
+ # Only increment depth and mark as expression if not already in an expression
2464
+ # or if we're at a top-level nested brace
2465
+ if not in_expression or (in_expression and expression_depth == 0):
2466
+ in_expression = True
2467
+ expression_depth += 1
2468
+ i += 1
2469
+ continue
2470
+
2471
+ # Detect end of an expression
2472
+ if text[i] == "}":
2473
+ expression_depth -= 1
2474
+ if expression_depth <= 0:
2475
+ in_expression = False
2476
+ expression_depth = 0
2477
+ i += 1
2478
+ continue
2479
+
2480
+ in_triple_quote = in_triple_single or in_triple_double
2481
+
2482
+ # Handle quotes - also reset template string when closing quotes are encountered
2483
+ if text[i] == '"' and not in_single_quote and not in_triple_quote:
2484
+ in_double_quote = not in_double_quote
2485
+ if not in_double_quote and not in_triple_quote:
2486
+ in_template_string = False
2487
+ elif text[i] == "'" and not in_double_quote and not in_triple_quote:
2488
+ in_single_quote = not in_single_quote
2489
+ if not in_single_quote and not in_triple_quote:
2490
+ in_template_string = False
2491
+
2492
+ # Check for comment
2493
+ if text[i] == "#" and not (
2494
+ in_single_quote or in_double_quote or in_triple_quote
2495
+ ):
2496
+ return True, False
2497
+
2498
+ i += 1
2499
+
2500
+ is_string = (
2501
+ in_single_quote or in_double_quote or in_triple_single or in_triple_double
2502
+ )
2503
+
2504
+ # Return tuple (is_string, is_in_expression)
2505
+ return (
2506
+ is_string or (in_template_string and not in_expression),
2507
+ in_expression and expression_depth > 0,
2508
+ )
2509
+
2359
2510
  @context_matcher()
2360
2511
  def python_matcher(self, context: CompletionContext) -> SimpleMatcherResult:
2361
2512
  """Match attributes or global python names"""
2362
- text = context.line_with_cursor
2363
- if "." in text:
2513
+ text = context.text_until_cursor
2514
+ completion_type = self._determine_completion_context(text)
2515
+ if completion_type == self._CompletionContextType.ATTRIBUTE:
2364
2516
  try:
2365
2517
  matches, fragment = self._attr_matches(text, include_prefix=False)
2366
2518
  if text.endswith(".") and self.omit__names:
@@ -151,10 +151,11 @@ class TimeitTemplateFiller(ast.NodeTransformer):
151
151
 
152
152
  class Timer(timeit.Timer):
153
153
  """Timer class that explicitly uses self.inner
154
-
154
+
155
155
  which is an undocumented implementation detail of CPython,
156
156
  not shared by PyPy.
157
157
  """
158
+
158
159
  # Timer.timeit copied from CPython 3.4.2
159
160
  def timeit(self, number=timeit.default_number):
160
161
  """Time 'number' executions of the main statement.
@@ -192,7 +193,6 @@ class ExecutionMagics(Magics):
192
193
  @no_var_expand
193
194
  @line_cell_magic
194
195
  def prun(self, parameter_s='', cell=None):
195
-
196
196
  """Run a statement through the python code profiler.
197
197
 
198
198
  **Usage, in line mode:**
@@ -993,7 +993,7 @@ class ExecutionMagics(Magics):
993
993
  # Stop iteration is raised on quit command
994
994
  pass
995
995
 
996
- except:
996
+ except Exception:
997
997
  etype, value, tb = sys.exc_info()
998
998
  # Skip three frames in the traceback: the %run one,
999
999
  # one inside bdb.py, and the command-line typed by the
@@ -1127,7 +1127,7 @@ class ExecutionMagics(Magics):
1127
1127
  )
1128
1128
  if stmt == "" and cell is None:
1129
1129
  return
1130
-
1130
+
1131
1131
  timefunc = timeit.default_timer
1132
1132
  number = int(getattr(opts, "n", 0))
1133
1133
  default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
@@ -1242,7 +1242,7 @@ class ExecutionMagics(Magics):
1242
1242
  @needs_local_scope
1243
1243
  @line_cell_magic
1244
1244
  @output_can_be_silenced
1245
- def time(self,line='', cell=None, local_ns=None):
1245
+ def time(self, line="", cell=None, local_ns=None):
1246
1246
  """Time execution of a Python statement or expression.
1247
1247
 
1248
1248
  The CPU and wall clock times are printed, and the value of the
@@ -1257,13 +1257,19 @@ class ExecutionMagics(Magics):
1257
1257
  - In cell mode, you can time the cell body (a directly
1258
1258
  following statement raises an error).
1259
1259
 
1260
- This function provides very basic timing functionality. Use the timeit
1260
+ This function provides very basic timing functionality. Use the timeit
1261
1261
  magic for more control over the measurement.
1262
1262
 
1263
1263
  .. versionchanged:: 7.3
1264
1264
  User variables are no longer expanded,
1265
1265
  the magic line is always left unmodified.
1266
1266
 
1267
+ .. versionchanged:: 8.3
1268
+ The time magic now correctly propagates system-exiting exceptions
1269
+ (such as ``KeyboardInterrupt`` invoked when interrupting execution)
1270
+ rather than just printing out the exception traceback.
1271
+ The non-system-exception will still be caught as before.
1272
+
1267
1273
  Examples
1268
1274
  --------
1269
1275
  ::
@@ -1304,10 +1310,10 @@ class ExecutionMagics(Magics):
1304
1310
  Compiler : 0.78 s
1305
1311
  """
1306
1312
  # fail immediately if the given expression can't be compiled
1307
-
1313
+
1308
1314
  if line and cell:
1309
1315
  raise UsageError("Can't use statement directly after '%%time'!")
1310
-
1316
+
1311
1317
  if cell:
1312
1318
  expr = self.shell.transform_cell(cell)
1313
1319
  else:
@@ -1318,7 +1324,7 @@ class ExecutionMagics(Magics):
1318
1324
 
1319
1325
  t0 = clock()
1320
1326
  expr_ast = self.shell.compile.ast_parse(expr)
1321
- tp = clock()-t0
1327
+ tp = clock() - t0
1322
1328
 
1323
1329
  # Apply AST transformations
1324
1330
  expr_ast = self.shell.transform_ast(expr_ast)
@@ -1326,8 +1332,8 @@ class ExecutionMagics(Magics):
1326
1332
  # Minimum time above which compilation time will be reported
1327
1333
  tc_min = 0.1
1328
1334
 
1329
- expr_val=None
1330
- if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1335
+ expr_val = None
1336
+ if len(expr_ast.body) == 1 and isinstance(expr_ast.body[0], ast.Expr):
1331
1337
  mode = 'eval'
1332
1338
  source = '<timed eval>'
1333
1339
  expr_ast = ast.Expression(expr_ast.body[0].value)
@@ -1336,25 +1342,25 @@ class ExecutionMagics(Magics):
1336
1342
  source = '<timed exec>'
1337
1343
  # multi-line %%time case
1338
1344
  if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1339
- expr_val= expr_ast.body[-1]
1345
+ expr_val = expr_ast.body[-1]
1340
1346
  expr_ast = expr_ast.body[:-1]
1341
1347
  expr_ast = Module(expr_ast, [])
1342
1348
  expr_val = ast.Expression(expr_val.value)
1343
1349
 
1344
1350
  t0 = clock()
1345
1351
  code = self.shell.compile(expr_ast, source, mode)
1346
- tc = clock()-t0
1352
+ tc = clock() - t0
1347
1353
 
1348
1354
  # skew measurement as little as possible
1349
1355
  glob = self.shell.user_ns
1350
1356
  wtime = time.time
1351
1357
  # time execution
1352
1358
  wall_st = wtime()
1353
- if mode=='eval':
1359
+ if mode == "eval":
1354
1360
  st = clock2()
1355
1361
  try:
1356
1362
  out = eval(code, glob, local_ns)
1357
- except:
1363
+ except Exception:
1358
1364
  self.shell.showtraceback()
1359
1365
  return
1360
1366
  end = clock2()
@@ -1362,12 +1368,12 @@ class ExecutionMagics(Magics):
1362
1368
  st = clock2()
1363
1369
  try:
1364
1370
  exec(code, glob, local_ns)
1365
- out=None
1371
+ out = None
1366
1372
  # multi-line %%time case
1367
1373
  if expr_val is not None:
1368
1374
  code_2 = self.shell.compile(expr_val, source, 'eval')
1369
1375
  out = eval(code_2, glob, local_ns)
1370
- except:
1376
+ except Exception:
1371
1377
  self.shell.showtraceback()
1372
1378
  return
1373
1379
  end = clock2()
@@ -1597,14 +1603,15 @@ def parse_breakpoint(text, current_file):
1597
1603
  return current_file, int(text)
1598
1604
  else:
1599
1605
  return text[:colon], int(text[colon+1:])
1600
-
1606
+
1607
+
1601
1608
  def _format_time(timespan, precision=3):
1602
1609
  """Formats the timespan in a human readable form"""
1603
1610
 
1604
1611
  if timespan >= 60.0:
1605
1612
  # we have more than a minute, format that in a human readable form
1606
1613
  # Idea from http://snipplr.com/view/5713/
1607
- parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1614
+ parts = [("d", 60 * 60 * 24), ("h", 60 * 60), ("min", 60), ("s", 1)]
1608
1615
  time = []
1609
1616
  leftover = timespan
1610
1617
  for suffix, length in parts:
@@ -1616,7 +1623,6 @@ def _format_time(timespan, precision=3):
1616
1623
  break
1617
1624
  return " ".join(time)
1618
1625
 
1619
-
1620
1626
  # Unfortunately characters outside of range(128) can cause problems in
1621
1627
  # certain terminals.
1622
1628
  # See bug: https://bugs.launchpad.net/ipython/+bug/348466
@@ -1630,7 +1636,7 @@ def _format_time(timespan, precision=3):
1630
1636
  except:
1631
1637
  pass
1632
1638
  scaling = [1, 1e3, 1e6, 1e9]
1633
-
1639
+
1634
1640
  if timespan > 0.0:
1635
1641
  order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1636
1642
  else:
@@ -16,7 +16,7 @@
16
16
  # release. 'dev' as a _version_extra string means this is a development
17
17
  # version
18
18
  _version_major = 8
19
- _version_minor = 34
19
+ _version_minor = 36
20
20
  _version_patch = 0
21
21
  _version_extra = ".dev"
22
22
  # _version_extra = "rc1"
@@ -625,7 +625,6 @@ class TestCompleter(unittest.TestCase):
625
625
  "Should have completed on a[0].r: %s",
626
626
  Completion(5, 6, "real"),
627
627
  )
628
-
629
628
  _(
630
629
  "a[0].from_",
631
630
  10,
@@ -745,6 +744,46 @@ class TestCompleter(unittest.TestCase):
745
744
  words = completer.get__all__entries(A())
746
745
  self.assertEqual(words, [])
747
746
 
747
+ def test_completes_globals_as_args_of_methods(self):
748
+ ip = get_ipython()
749
+ c = ip.Completer
750
+ c.use_jedi = False
751
+ ip.ex("long_variable_name = 1")
752
+ ip.ex("a = []")
753
+ s, matches = c.complete(None, "a.sort(lo")
754
+ self.assertIn("long_variable_name", matches)
755
+
756
+ def test_completes_attributes_in_fstring_expressions(self):
757
+ ip = get_ipython()
758
+ c = ip.Completer
759
+ c.use_jedi = False
760
+
761
+ class CustomClass:
762
+ def method_one(self):
763
+ pass
764
+
765
+ ip.user_ns["custom_obj"] = CustomClass()
766
+
767
+ # Test completion inside f-string expressions
768
+ s, matches = c.complete(None, "f'{custom_obj.meth")
769
+ self.assertIn(".method_one", matches)
770
+
771
+ def test_completes_in_dict_expressions(self):
772
+ ip = get_ipython()
773
+ c = ip.Completer
774
+ c.use_jedi = False
775
+ ip.ex("class Test: pass")
776
+ ip.ex("test_obj = Test()")
777
+ ip.ex("test_obj.attribute = 'value'")
778
+
779
+ # Test completion in dictionary expressions
780
+ s, matches = c.complete(None, "d = {'key': test_obj.attr")
781
+ self.assertIn(".attribute", matches)
782
+
783
+ # Test global completion in dictionary expressions with dots
784
+ s, matches = c.complete(None, "d = {'k.e.y': Te")
785
+ self.assertIn("Test", matches)
786
+
748
787
  def test_func_kw_completions(self):
749
788
  ip = get_ipython()
750
789
  c = ip.Completer
@@ -1745,6 +1784,85 @@ class TestCompleter(unittest.TestCase):
1745
1784
  _(["completion_a"])
1746
1785
 
1747
1786
 
1787
+ @pytest.mark.parametrize(
1788
+ "line,expected",
1789
+ [
1790
+ # Basic test cases
1791
+ ("np.", "attribute"),
1792
+ ("np.ran", "attribute"),
1793
+ ("np.random.rand(np.random.ran", "attribute"),
1794
+ ("np.random.rand(n", "global"),
1795
+ ("d['k.e.y.'](ran", "global"),
1796
+ ("d[0].k", "attribute"),
1797
+ ("a = { 'a': np.ran", "attribute"),
1798
+ ("n", "global"),
1799
+ ("", "global"),
1800
+ # Dots in string literals
1801
+ ('some_var = "this is a string with a dot.', "global"),
1802
+ ("text = 'another string with a dot.", "global"),
1803
+ ('f"greeting {user.na', "attribute"), # Cursor in f-string expression
1804
+ ('t"welcome {guest.na', "attribute"), # Cursor in t-string expression
1805
+ ('f"hello {name} worl', "global"), # Cursor in f-string outside expression
1806
+ ('f"hello {{a.', "global"),
1807
+ ('f"hello {{{a.', "attribute"),
1808
+ # Backslash escapes in strings
1809
+ ('var = "string with \\"escaped quote and a dot.', "global"),
1810
+ ("escaped = 'single \\'quote\\' with a dot.", "global"),
1811
+ # Multi-line strings
1812
+ ('multi = """This is line one\nwith a dot.', "global"),
1813
+ ("multi_single = '''Another\nmulti-line\nwith a dot.", "global"),
1814
+ # Inline comments
1815
+ ("x = 5 # This is a comment", "global"),
1816
+ ("y = obj.method() # Comment after dot.method", "global"),
1817
+ # Hash symbol within string literals should not be treated as comments
1818
+ ("d['#'] = np.", "attribute"),
1819
+ # Nested parentheses with dots
1820
+ ("complex_expr = (func((obj.method(param.attr", "attribute"),
1821
+ ("multiple_nesting = {key: [value.attr", "attribute"),
1822
+ # Numbers
1823
+ ("3.", "global"),
1824
+ ("3.14", "global"),
1825
+ ("-42.14", "global"),
1826
+ ("x = func(3.14", "global"),
1827
+ ("x = func(a3.", "attribute"),
1828
+ ("x = func(a3.12", "global"),
1829
+ ("3.1.", "attribute"),
1830
+ ("-3.1.", "attribute"),
1831
+ ("(3).", "attribute"),
1832
+ # Additional cases
1833
+ ("", "global"),
1834
+ ('str_with_code = "x.attr', "global"),
1835
+ ('f"formatted {obj.attr', "attribute"),
1836
+ ('f"formatted {obj.attr}', "global"),
1837
+ ("dict_with_dots = {'key.with.dots': value.attr", "attribute"),
1838
+ ("d[f'{a}']['{a.", "global"),
1839
+ ],
1840
+ )
1841
+ def test_completion_context(line, expected):
1842
+ """Test completion context"""
1843
+ ip = get_ipython()
1844
+ get_context = ip.Completer._determine_completion_context
1845
+ result = get_context(line)
1846
+ assert result.value == expected, f"Failed on input: '{line}'"
1847
+
1848
+
1849
+ @pytest.mark.xfail(reason="Completion context not yet supported")
1850
+ @pytest.mark.parametrize(
1851
+ "line, expected",
1852
+ [
1853
+ ("f'{f'a.", "global"), # Nested f-string
1854
+ ("3a.", "global"), # names starting with numbers or other symbols
1855
+ ("$).", "global"), # random things with dot at end
1856
+ ],
1857
+ )
1858
+ def test_unsupported_completion_context(line, expected):
1859
+ """Test unsupported completion context"""
1860
+ ip = get_ipython()
1861
+ get_context = ip.Completer._determine_completion_context
1862
+ result = get_context(line)
1863
+ assert result.value == expected, f"Failed on input: '{line}'"
1864
+
1865
+
1748
1866
  @pytest.mark.parametrize(
1749
1867
  "setup,code,expected,not_expected",
1750
1868
  [
@@ -16,8 +16,6 @@ from time import sleep
16
16
  from threading import Thread
17
17
  from subprocess import CalledProcessError
18
18
  from textwrap import dedent
19
- from time import sleep
20
- from threading import Thread
21
19
  from unittest import TestCase, mock
22
20
 
23
21
  import pytest
@@ -814,6 +812,16 @@ def test_timeit_invalid_return():
814
812
  with pytest.raises(SyntaxError):
815
813
  _ip.run_line_magic('timeit', 'return')
816
814
 
815
+ def test_timeit_raise_on_interrupt():
816
+ ip = get_ipython()
817
+
818
+ with pytest.raises(KeyboardInterrupt):
819
+ thread = Thread(target=_interrupt_after_1s)
820
+ thread.start()
821
+ ip.run_cell_magic("timeit", "", "from time import sleep; sleep(2)")
822
+ thread.join()
823
+
824
+
817
825
  @dec.skipif(execution.profile is None)
818
826
  def test_prun_special_syntax():
819
827
  "Test %%prun with IPython special syntax"
@@ -1542,6 +1550,16 @@ def test_timeit_arguments():
1542
1550
  _ip.run_line_magic("timeit", "-n1 -r1 a=('#')")
1543
1551
 
1544
1552
 
1553
+ def test_time_raise_on_interrupt():
1554
+ ip = get_ipython()
1555
+
1556
+ with pytest.raises(KeyboardInterrupt):
1557
+ thread = Thread(target=_interrupt_after_1s)
1558
+ thread.start()
1559
+ ip.run_cell_magic("time", "", "from time import sleep; sleep(2)")
1560
+ thread.join()
1561
+
1562
+
1545
1563
  MINIMAL_LAZY_MAGIC = """
1546
1564
  from IPython.core.magic import (
1547
1565
  Magics,
@@ -425,6 +425,7 @@ class TerminalInteractiveShell(InteractiveShell):
425
425
  "Default is `'NavigableAutoSuggestFromHistory`'.",
426
426
  allow_none=True,
427
427
  ).tag(config=True)
428
+ _autosuggestions_provider: Any
428
429
 
429
430
  llm_constructor_kwargs = Dict(
430
431
  {},
@@ -434,6 +435,31 @@ class TerminalInteractiveShell(InteractiveShell):
434
435
  This is used to – for example – set the `model_id`""",
435
436
  ).tag(config=True)
436
437
 
438
+ llm_prefix_from_history = DottedObjectName(
439
+ "input_history",
440
+ help="""\
441
+ Fully Qualifed name of a function that takes an IPython history manager and
442
+ return a prefix to pass the llm provider in addition to the current buffer
443
+ text.
444
+
445
+ You can use:
446
+
447
+ - no_prefix
448
+ - input_history
449
+
450
+ As default value. `input_history` (default), will use all the input history
451
+ of current IPython session
452
+
453
+ """,
454
+ ).tag(config=True)
455
+ _llm_prefix_from_history: Any
456
+
457
+ @observe("llm_prefix_from_history")
458
+ def _llm_prefix_from_history_changed(self, change):
459
+ name = change.new
460
+ self._llm_prefix_from_history = name
461
+ self._set_autosuggestions()
462
+
437
463
  llm_provider_class = DottedObjectName(
438
464
  None,
439
465
  allow_none=True,
@@ -448,6 +474,7 @@ class TerminalInteractiveShell(InteractiveShell):
448
474
  `stream_inline_completions`
449
475
  """,
450
476
  ).tag(config=True)
477
+ _llm_provider_class: Any = None
451
478
 
452
479
  @observe("llm_provider_class")
453
480
  def _llm_provider_class_changed(self, change):
@@ -457,15 +484,12 @@ class TerminalInteractiveShell(InteractiveShell):
457
484
  "TerminalInteractiveShell.llm_provider_class is a provisional"
458
485
  " API as of IPython 8.32, and may change without warnings."
459
486
  )
460
- if isinstance(self.auto_suggest, NavigableAutoSuggestFromHistory):
461
- self.auto_suggest._llm_provider = provider_class()
462
- else:
463
- self.log.warn(
464
- "llm_provider_class only has effects when using"
465
- "`NavigableAutoSuggestFromHistory` as auto_suggest."
466
- )
487
+ self._llm_provider_class = provider_class
488
+ self._set_autosuggestions()
467
489
 
468
- def _set_autosuggestions(self, provider):
490
+ def _set_autosuggestions(self, provider=None):
491
+ if provider is None:
492
+ provider = self.autosuggestions_provider
469
493
  # disconnect old handler
470
494
  if self.auto_suggest and isinstance(
471
495
  self.auto_suggest, NavigableAutoSuggestFromHistory
@@ -477,14 +501,34 @@ class TerminalInteractiveShell(InteractiveShell):
477
501
  self.auto_suggest = AutoSuggestFromHistory()
478
502
  elif provider == "NavigableAutoSuggestFromHistory":
479
503
  # LLM stuff are all Provisional in 8.32
480
- if self.llm_provider_class:
481
- llm_provider_constructor = import_item(self.llm_provider_class)
504
+ if self._llm_provider_class:
505
+ llm_provider_constructor = import_item(self._llm_provider_class)
482
506
  llm_provider = llm_provider_constructor(**self.llm_constructor_kwargs)
483
507
  else:
484
508
  llm_provider = None
485
509
  self.auto_suggest = NavigableAutoSuggestFromHistory()
486
510
  # Provisinal in 8.32
487
511
  self.auto_suggest._llm_provider = llm_provider
512
+
513
+ name = self.llm_prefix_from_history
514
+
515
+ if name == "no_prefix":
516
+
517
+ def no_prefix(history_manager):
518
+ return ""
519
+
520
+ fun = no_prefix
521
+
522
+ elif name == "input_history":
523
+
524
+ def input_history(history_manager):
525
+ return "\n".join([s[2] for s in history_manager.get_range()]) + "\n"
526
+
527
+ fun = input_history
528
+
529
+ else:
530
+ fun = import_item(name)
531
+ self.auto_suggest._llm_prefixer = fun
488
532
  else:
489
533
  raise ValueError("No valid provider.")
490
534
  if self.pt_app: