ipython 9.2.0__tar.gz → 9.4.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 (557) hide show
  1. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/completer.py +93 -7
  2. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/debugger.py +11 -1
  3. ipython-9.4.0/IPython/core/debugger_backport.py +206 -0
  4. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/guarded_eval.py +23 -8
  5. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/interactiveshell.py +44 -15
  6. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/execution.py +64 -11
  7. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/namespace.py +19 -5
  8. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/script.py +8 -1
  9. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/release.py +1 -1
  10. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/autoreload.py +165 -6
  11. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/deduperreload/deduperreload.py +1 -10
  12. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/tests/test_deduperreload.py +39 -0
  13. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/interactiveshell.py +8 -5
  14. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/auto_suggest.py +22 -9
  15. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_sysinfo.py +1 -1
  16. {ipython-9.2.0/ipython.egg-info → ipython-9.4.0}/PKG-INFO +1 -1
  17. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version8.rst +10 -0
  18. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version9.rst +51 -2
  19. {ipython-9.2.0 → ipython-9.4.0}/examples/auto_suggest_llm.py +2 -2
  20. {ipython-9.2.0 → ipython-9.4.0/ipython.egg-info}/PKG-INFO +1 -1
  21. {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/SOURCES.txt +1 -114
  22. {ipython-9.2.0 → ipython-9.4.0}/pyproject.toml +10 -2
  23. {ipython-9.2.0 → ipython-9.4.0}/tests/fake_llm.py +15 -1
  24. {ipython-9.2.0 → ipython-9.4.0}/tests/test_completer.py +61 -1
  25. {ipython-9.2.0 → ipython-9.4.0}/tests/test_debugger.py +28 -0
  26. {ipython-9.2.0 → ipython-9.4.0}/tests/test_guarded_eval.py +25 -0
  27. {ipython-9.2.0 → ipython-9.4.0}/tests/test_magic.py +17 -2
  28. {ipython-9.2.0 → ipython-9.4.0}/tests/test_shortcuts.py +12 -0
  29. {ipython-9.2.0 → ipython-9.4.0}/tests/test_zzz_autoreload.py +445 -1
  30. ipython-9.2.0/docs/source/.jupyter/desktop-workspaces/default-37a8.jupyterlab-workspace +0 -1
  31. ipython-9.2.0/docs/source/api/generated/IPython.core.alias.rst +0 -36
  32. ipython-9.2.0/docs/source/api/generated/IPython.core.application.rst +0 -20
  33. ipython-9.2.0/docs/source/api/generated/IPython.core.async_helpers.rst +0 -13
  34. ipython-9.2.0/docs/source/api/generated/IPython.core.autocall.rst +0 -24
  35. ipython-9.2.0/docs/source/api/generated/IPython.core.builtin_trap.rst +0 -16
  36. ipython-9.2.0/docs/source/api/generated/IPython.core.compilerop.rst +0 -22
  37. ipython-9.2.0/docs/source/api/generated/IPython.core.completer.rst +0 -107
  38. ipython-9.2.0/docs/source/api/generated/IPython.core.completerlib.rst +0 -43
  39. ipython-9.2.0/docs/source/api/generated/IPython.core.crashhandler.rst +0 -22
  40. ipython-9.2.0/docs/source/api/generated/IPython.core.debugger.rst +0 -35
  41. ipython-9.2.0/docs/source/api/generated/IPython.core.doctb.rst +0 -16
  42. ipython-9.2.0/docs/source/api/generated/IPython.core.error.rst +0 -30
  43. ipython-9.2.0/docs/source/api/generated/IPython.core.events.rst +0 -34
  44. ipython-9.2.0/docs/source/api/generated/IPython.core.extensions.rst +0 -16
  45. ipython-9.2.0/docs/source/api/generated/IPython.core.formatters.rst +0 -83
  46. ipython-9.2.0/docs/source/api/generated/IPython.core.getipython.rst +0 -13
  47. ipython-9.2.0/docs/source/api/generated/IPython.core.guarded_eval.rst +0 -31
  48. ipython-9.2.0/docs/source/api/generated/IPython.core.history.rst +0 -59
  49. ipython-9.2.0/docs/source/api/generated/IPython.core.historyapp.rst +0 -22
  50. ipython-9.2.0/docs/source/api/generated/IPython.core.hooks.rst +0 -31
  51. ipython-9.2.0/docs/source/api/generated/IPython.core.inputtransformer2.rst +0 -85
  52. ipython-9.2.0/docs/source/api/generated/IPython.core.interactiveshell.rst +0 -56
  53. ipython-9.2.0/docs/source/api/generated/IPython.core.logger.rst +0 -16
  54. ipython-9.2.0/docs/source/api/generated/IPython.core.macro.rst +0 -16
  55. ipython-9.2.0/docs/source/api/generated/IPython.core.magic.rst +0 -59
  56. ipython-9.2.0/docs/source/api/generated/IPython.core.magic_arguments.rst +0 -62
  57. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.ast_mod.rst +0 -22
  58. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.auto.rst +0 -16
  59. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.basic.rst +0 -24
  60. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.code.rst +0 -38
  61. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.config.rst +0 -16
  62. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.display.rst +0 -14
  63. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.execution.rst +0 -38
  64. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.extension.rst +0 -14
  65. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.history.rst +0 -14
  66. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.logging.rst +0 -14
  67. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.namespace.rst +0 -14
  68. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.osm.rst +0 -16
  69. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.packaging.rst +0 -20
  70. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.pylab.rst +0 -14
  71. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.rst +0 -14
  72. ipython-9.2.0/docs/source/api/generated/IPython.core.magics.script.rst +0 -26
  73. ipython-9.2.0/docs/source/api/generated/IPython.core.oinspect.rst +0 -52
  74. ipython-9.2.0/docs/source/api/generated/IPython.core.page.rst +0 -37
  75. ipython-9.2.0/docs/source/api/generated/IPython.core.payload.rst +0 -14
  76. ipython-9.2.0/docs/source/api/generated/IPython.core.payloadpage.rst +0 -13
  77. ipython-9.2.0/docs/source/api/generated/IPython.core.prefilter.rst +0 -88
  78. ipython-9.2.0/docs/source/api/generated/IPython.core.profileapp.rst +0 -35
  79. ipython-9.2.0/docs/source/api/generated/IPython.core.profiledir.rst +0 -18
  80. ipython-9.2.0/docs/source/api/generated/IPython.core.pylabtools.rst +0 -37
  81. ipython-9.2.0/docs/source/api/generated/IPython.core.shellapp.rst +0 -20
  82. ipython-9.2.0/docs/source/api/generated/IPython.core.splitinput.rst +0 -22
  83. ipython-9.2.0/docs/source/api/generated/IPython.core.tbtools.rst +0 -40
  84. ipython-9.2.0/docs/source/api/generated/IPython.core.tips.rst +0 -13
  85. ipython-9.2.0/docs/source/api/generated/IPython.core.ultratb.rst +0 -42
  86. ipython-9.2.0/docs/source/api/generated/IPython.display.rst +0 -181
  87. ipython-9.2.0/docs/source/api/generated/IPython.lib.backgroundjobs.rst +0 -34
  88. ipython-9.2.0/docs/source/api/generated/IPython.lib.clipboard.rst +0 -29
  89. ipython-9.2.0/docs/source/api/generated/IPython.lib.deepreload.rst +0 -37
  90. ipython-9.2.0/docs/source/api/generated/IPython.lib.demo.rst +0 -53
  91. ipython-9.2.0/docs/source/api/generated/IPython.lib.editorhooks.rst +0 -43
  92. ipython-9.2.0/docs/source/api/generated/IPython.lib.guisupport.rst +0 -28
  93. ipython-9.2.0/docs/source/api/generated/IPython.lib.latextools.rst +0 -35
  94. ipython-9.2.0/docs/source/api/generated/IPython.lib.pretty.rst +0 -83
  95. ipython-9.2.0/docs/source/api/generated/IPython.paths.rst +0 -25
  96. ipython-9.2.0/docs/source/api/generated/IPython.rst +0 -19
  97. ipython-9.2.0/docs/source/api/generated/IPython.terminal.debugger.rst +0 -22
  98. ipython-9.2.0/docs/source/api/generated/IPython.terminal.embed.rst +0 -30
  99. ipython-9.2.0/docs/source/api/generated/IPython.terminal.interactiveshell.rst +0 -34
  100. ipython-9.2.0/docs/source/api/generated/IPython.terminal.ipapp.rst +0 -30
  101. ipython-9.2.0/docs/source/api/generated/IPython.terminal.magics.rst +0 -22
  102. ipython-9.2.0/docs/source/api/generated/IPython.terminal.prompts.rst +0 -24
  103. ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.auto_match.rst +0 -46
  104. ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.auto_suggest.rst +0 -67
  105. ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.filters.rst +0 -58
  106. ipython-9.2.0/docs/source/api/generated/IPython.terminal.shortcuts.rst +0 -76
  107. ipython-9.2.0/docs/source/api/generated/IPython.testing.decorators.rst +0 -25
  108. ipython-9.2.0/docs/source/api/generated/IPython.testing.globalipapp.rst +0 -19
  109. ipython-9.2.0/docs/source/api/generated/IPython.testing.ipunittest.rst +0 -31
  110. ipython-9.2.0/docs/source/api/generated/IPython.testing.skipdoctest.rst +0 -13
  111. ipython-9.2.0/docs/source/api/generated/IPython.testing.tools.rst +0 -60
  112. ipython-9.2.0/docs/source/api/generated/IPython.utils.PyColorize.rst +0 -26
  113. ipython-9.2.0/docs/source/api/generated/IPython.utils.capture.rst +0 -28
  114. ipython-9.2.0/docs/source/api/generated/IPython.utils.coloransi.rst +0 -14
  115. ipython-9.2.0/docs/source/api/generated/IPython.utils.contexts.rst +0 -16
  116. ipython-9.2.0/docs/source/api/generated/IPython.utils.data.rst +0 -16
  117. ipython-9.2.0/docs/source/api/generated/IPython.utils.decorators.rst +0 -19
  118. ipython-9.2.0/docs/source/api/generated/IPython.utils.dir2.rst +0 -19
  119. ipython-9.2.0/docs/source/api/generated/IPython.utils.encoding.rst +0 -16
  120. ipython-9.2.0/docs/source/api/generated/IPython.utils.frame.rst +0 -22
  121. ipython-9.2.0/docs/source/api/generated/IPython.utils.generics.rst +0 -16
  122. ipython-9.2.0/docs/source/api/generated/IPython.utils.importstring.rst +0 -13
  123. ipython-9.2.0/docs/source/api/generated/IPython.utils.io.rst +0 -25
  124. ipython-9.2.0/docs/source/api/generated/IPython.utils.ipstruct.rst +0 -16
  125. ipython-9.2.0/docs/source/api/generated/IPython.utils.module_paths.rst +0 -13
  126. ipython-9.2.0/docs/source/api/generated/IPython.utils.openpy.rst +0 -22
  127. ipython-9.2.0/docs/source/api/generated/IPython.utils.path.rst +0 -56
  128. ipython-9.2.0/docs/source/api/generated/IPython.utils.process.rst +0 -23
  129. ipython-9.2.0/docs/source/api/generated/IPython.utils.sentinel.rst +0 -16
  130. ipython-9.2.0/docs/source/api/generated/IPython.utils.strdispatch.rst +0 -16
  131. ipython-9.2.0/docs/source/api/generated/IPython.utils.sysinfo.rst +0 -22
  132. ipython-9.2.0/docs/source/api/generated/IPython.utils.syspathcontext.rst +0 -16
  133. ipython-9.2.0/docs/source/api/generated/IPython.utils.tempdir.rst +0 -20
  134. ipython-9.2.0/docs/source/api/generated/IPython.utils.terminal.rst +0 -22
  135. ipython-9.2.0/docs/source/api/generated/IPython.utils.text.rst +0 -54
  136. ipython-9.2.0/docs/source/api/generated/IPython.utils.timing.rst +0 -31
  137. ipython-9.2.0/docs/source/api/generated/IPython.utils.tokenutil.rst +0 -29
  138. ipython-9.2.0/docs/source/api/generated/IPython.utils.wildcard.rst +0 -28
  139. ipython-9.2.0/docs/source/api/generated/gen.txt +0 -113
  140. ipython-9.2.0/docs/source/config/options/config-generated.txt +0 -0
  141. ipython-9.2.0/docs/source/config/options/terminal.rst +0 -2016
  142. ipython-9.2.0/docs/source/config/shortcuts/table.tsv +0 -79
  143. ipython-9.2.0/docs/source/interactive/magics-generated.txt +0 -2493
  144. {ipython-9.2.0 → ipython-9.4.0}/.flake8 +0 -0
  145. {ipython-9.2.0 → ipython-9.4.0}/.mailmap +0 -0
  146. {ipython-9.2.0 → ipython-9.4.0}/.pre-commit-config.yaml +0 -0
  147. {ipython-9.2.0 → ipython-9.4.0}/COPYING.rst +0 -0
  148. {ipython-9.2.0 → ipython-9.4.0}/IPython/__init__.py +0 -0
  149. {ipython-9.2.0 → ipython-9.4.0}/IPython/__main__.py +0 -0
  150. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/__init__.py +0 -0
  151. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/alias.py +0 -0
  152. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/application.py +0 -0
  153. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/async_helpers.py +0 -0
  154. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/autocall.py +0 -0
  155. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/builtin_trap.py +0 -0
  156. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/compilerop.py +0 -0
  157. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/completerlib.py +0 -0
  158. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/crashhandler.py +0 -0
  159. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/display.py +0 -0
  160. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/display_functions.py +0 -0
  161. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/display_trap.py +0 -0
  162. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/displayhook.py +0 -0
  163. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/displaypub.py +0 -0
  164. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/doctb.py +0 -0
  165. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/error.py +0 -0
  166. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/events.py +0 -0
  167. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/extensions.py +0 -0
  168. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/formatters.py +0 -0
  169. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/getipython.py +0 -0
  170. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/history.py +0 -0
  171. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/historyapp.py +0 -0
  172. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/hooks.py +0 -0
  173. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/inputtransformer2.py +0 -0
  174. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/latex_symbols.py +0 -0
  175. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/logger.py +0 -0
  176. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/macro.py +0 -0
  177. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magic.py +0 -0
  178. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magic_arguments.py +0 -0
  179. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/__init__.py +0 -0
  180. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/ast_mod.py +0 -0
  181. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/auto.py +0 -0
  182. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/basic.py +0 -0
  183. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/code.py +0 -0
  184. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/config.py +0 -0
  185. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/display.py +0 -0
  186. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/extension.py +0 -0
  187. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/history.py +0 -0
  188. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/logging.py +0 -0
  189. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/osm.py +0 -0
  190. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/packaging.py +0 -0
  191. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/magics/pylab.py +0 -0
  192. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/oinspect.py +0 -0
  193. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/page.py +0 -0
  194. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/payload.py +0 -0
  195. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/payloadpage.py +0 -0
  196. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/prefilter.py +0 -0
  197. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/profile/README_STARTUP +0 -0
  198. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/profileapp.py +0 -0
  199. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/profiledir.py +0 -0
  200. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/pylabtools.py +0 -0
  201. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/shellapp.py +0 -0
  202. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/splitinput.py +0 -0
  203. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/tbtools.py +0 -0
  204. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/tips.py +0 -0
  205. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/ultratb.py +0 -0
  206. {ipython-9.2.0 → ipython-9.4.0}/IPython/core/usage.py +0 -0
  207. {ipython-9.2.0 → ipython-9.4.0}/IPython/display.py +0 -0
  208. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/__init__.py +0 -0
  209. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/deduperreload/__init__.py +0 -0
  210. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/deduperreload/deduperreload_patching.py +0 -0
  211. {ipython-9.2.0 → ipython-9.4.0}/IPython/extensions/storemagic.py +0 -0
  212. {ipython-9.2.0 → ipython-9.4.0}/IPython/external/__init__.py +0 -0
  213. {ipython-9.2.0 → ipython-9.4.0}/IPython/external/pickleshare.py +0 -0
  214. {ipython-9.2.0 → ipython-9.4.0}/IPython/external/qt_for_kernel.py +0 -0
  215. {ipython-9.2.0 → ipython-9.4.0}/IPython/external/qt_loaders.py +0 -0
  216. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/__init__.py +0 -0
  217. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/backgroundjobs.py +0 -0
  218. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/clipboard.py +0 -0
  219. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/deepreload.py +0 -0
  220. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/demo.py +0 -0
  221. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/display.py +0 -0
  222. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/editorhooks.py +0 -0
  223. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/guisupport.py +0 -0
  224. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/latextools.py +0 -0
  225. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/lexers.py +0 -0
  226. {ipython-9.2.0 → ipython-9.4.0}/IPython/lib/pretty.py +0 -0
  227. {ipython-9.2.0 → ipython-9.4.0}/IPython/paths.py +0 -0
  228. {ipython-9.2.0 → ipython-9.4.0}/IPython/py.typed +0 -0
  229. {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/__init__.py +0 -0
  230. {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/custom_doctests.py +0 -0
  231. {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/ipython_console_highlighting.py +0 -0
  232. {ipython-9.2.0 → ipython-9.4.0}/IPython/sphinxext/ipython_directive.py +0 -0
  233. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/__init__.py +0 -0
  234. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/debugger.py +0 -0
  235. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/embed.py +0 -0
  236. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/ipapp.py +0 -0
  237. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/magics.py +0 -0
  238. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/prompts.py +0 -0
  239. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/__init__.py +0 -0
  240. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/asyncio.py +0 -0
  241. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/glut.py +0 -0
  242. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/gtk.py +0 -0
  243. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/gtk3.py +0 -0
  244. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/gtk4.py +0 -0
  245. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/osx.py +0 -0
  246. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/pyglet.py +0 -0
  247. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/qt.py +0 -0
  248. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/tk.py +0 -0
  249. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/pt_inputhooks/wx.py +0 -0
  250. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/ptutils.py +0 -0
  251. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/__init__.py +0 -0
  252. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/auto_match.py +0 -0
  253. {ipython-9.2.0 → ipython-9.4.0}/IPython/terminal/shortcuts/filters.py +0 -0
  254. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/__init__.py +0 -0
  255. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/decorators.py +0 -0
  256. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/globalipapp.py +0 -0
  257. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/ipunittest.py +0 -0
  258. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/Makefile +0 -0
  259. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/__init__.py +0 -0
  260. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/dtexample.py +0 -0
  261. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/ipdoctest.py +0 -0
  262. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/pytest_ipdoctest.py +0 -0
  263. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/setup.py +0 -0
  264. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/simple.py +0 -0
  265. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/simplevars.py +0 -0
  266. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_combo.txt +0 -0
  267. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_example.txt +0 -0
  268. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_exampleip.txt +0 -0
  269. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_ipdoctest.py +0 -0
  270. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/plugin/test_refs.py +0 -0
  271. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/skipdoctest.py +0 -0
  272. {ipython-9.2.0 → ipython-9.4.0}/IPython/testing/tools.py +0 -0
  273. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/PyColorize.py +0 -0
  274. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/__init__.py +0 -0
  275. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_cli.py +0 -0
  276. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_common.py +0 -0
  277. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_emscripten.py +0 -0
  278. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_posix.py +0 -0
  279. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_win32.py +0 -0
  280. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/_process_win32_controller.py +0 -0
  281. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/capture.py +0 -0
  282. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/coloransi.py +0 -0
  283. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/contexts.py +0 -0
  284. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/data.py +0 -0
  285. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/decorators.py +0 -0
  286. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/dir2.py +0 -0
  287. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/docs.py +0 -0
  288. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/encoding.py +0 -0
  289. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/eventful.py +0 -0
  290. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/frame.py +0 -0
  291. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/generics.py +0 -0
  292. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/importstring.py +0 -0
  293. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/io.py +0 -0
  294. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/ipstruct.py +0 -0
  295. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/jsonutil.py +0 -0
  296. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/log.py +0 -0
  297. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/module_paths.py +0 -0
  298. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/openpy.py +0 -0
  299. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/path.py +0 -0
  300. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/process.py +0 -0
  301. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/py3compat.py +0 -0
  302. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/sentinel.py +0 -0
  303. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/strdispatch.py +0 -0
  304. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/sysinfo.py +0 -0
  305. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/syspathcontext.py +0 -0
  306. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/tempdir.py +0 -0
  307. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/terminal.py +0 -0
  308. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/text.py +0 -0
  309. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/timing.py +0 -0
  310. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/tokenutil.py +0 -0
  311. {ipython-9.2.0 → ipython-9.4.0}/IPython/utils/wildcard.py +0 -0
  312. {ipython-9.2.0 → ipython-9.4.0}/LICENSE +0 -0
  313. {ipython-9.2.0 → ipython-9.4.0}/MANIFEST.in +0 -0
  314. {ipython-9.2.0 → ipython-9.4.0}/README.rst +0 -0
  315. {ipython-9.2.0 → ipython-9.4.0}/_build_meta.py +0 -0
  316. {ipython-9.2.0 → ipython-9.4.0}/docs/Makefile +0 -0
  317. {ipython-9.2.0 → ipython-9.4.0}/docs/README.rst +0 -0
  318. {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_api.py +0 -0
  319. {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_config.py +0 -0
  320. {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_magics.py +0 -0
  321. {ipython-9.2.0 → ipython-9.4.0}/docs/autogen_shortcuts.py +0 -0
  322. {ipython-9.2.0 → ipython-9.4.0}/docs/make.cmd +0 -0
  323. {ipython-9.2.0 → ipython-9.4.0}/docs/man/ipython.1 +0 -0
  324. {ipython-9.2.0 → ipython-9.4.0}/docs/requirements.txt +0 -0
  325. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/running-crop.png +0 -0
  326. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/running.png +0 -0
  327. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/treeview.png +0 -0
  328. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/user-interface.png +0 -0
  329. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/2.0/widgets.png +0 -0
  330. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_1_prompt_no_text.png +0 -0
  331. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_2_print_hello_suggest.png +0 -0
  332. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_3_print_hello_suggest.png +0 -0
  333. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_4_print_hello.png +0 -0
  334. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_d_completions.png +0 -0
  335. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_d_phantom.png +0 -0
  336. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_def_completions.png +0 -0
  337. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_def_phantom.png +0 -0
  338. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_match_parens.png +0 -0
  339. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/auto_suggest_second_prompt.png +0 -0
  340. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/8.0/pathlib_pathlib_everywhere.jpg +0 -0
  341. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/autosuggest.gif +0 -0
  342. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_dashboard.png +0 -0
  343. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_dashboard_cluster.png +0 -0
  344. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_cythonmagic.png +0 -0
  345. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_long_out.png +0 -0
  346. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_octavemagic.png +0 -0
  347. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_rmagic.png +0 -0
  348. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_script_cells.png +0 -0
  349. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_spectrogram.png +0 -0
  350. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_notebook_tooltip.png +0 -0
  351. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_par_tb.png +0 -0
  352. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_qtconsole_baboon.png +0 -0
  353. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipy_013_qtconsole_completer.png +0 -0
  354. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ipython-6-screenshot.png +0 -0
  355. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/jedi_type_inference_60.png +0 -0
  356. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/kernel_selector_screenshot.png +0 -0
  357. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ms_visual_studio.png +0 -0
  358. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/notebook_specgram.png +0 -0
  359. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/ptshell_features.png +0 -0
  360. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/qtconsole.png +0 -0
  361. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/qtconsole_tabbed.png +0 -0
  362. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_images/unicode_completion.png +0 -0
  363. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_static/favicon.ico +0 -0
  364. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_static/logo.png +0 -0
  365. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_static/theme_overrides.css +0 -0
  366. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_templates/breadcrumbs.html +0 -0
  367. {ipython-9.2.0 → ipython-9.4.0}/docs/source/_templates/notebook_redirect.html +0 -0
  368. {ipython-9.2.0 → ipython-9.4.0}/docs/source/about/history.rst +0 -0
  369. {ipython-9.2.0 → ipython-9.4.0}/docs/source/about/index.rst +0 -0
  370. {ipython-9.2.0 → ipython-9.4.0}/docs/source/about/license_and_copyright.rst +0 -0
  371. {ipython-9.2.0 → ipython-9.4.0}/docs/source/api/index.rst +0 -0
  372. {ipython-9.2.0 → ipython-9.4.0}/docs/source/conf.py +0 -0
  373. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/callbacks.rst +0 -0
  374. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/custommagics.rst +0 -0
  375. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/details.rst +0 -0
  376. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/eventloops.rst +0 -0
  377. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/extensions/autoreload.rst +0 -0
  378. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/extensions/index.rst +0 -0
  379. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/extensions/storemagic.rst +0 -0
  380. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/index.rst +0 -0
  381. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/inputtransforms.rst +0 -0
  382. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/integrating.rst +0 -0
  383. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/intro.rst +0 -0
  384. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/options/index.rst +0 -0
  385. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/shell_mimerenderer.rst +0 -0
  386. {ipython-9.2.0 → ipython-9.4.0}/docs/source/config/shortcuts/index.rst +0 -0
  387. {ipython-9.2.0 → ipython-9.4.0}/docs/source/coredev/index.rst +0 -0
  388. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/config.rst +0 -0
  389. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/execution.rst +0 -0
  390. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/ipy_kernel_and_terminal.png +0 -0
  391. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/ipy_kernel_and_terminal.svg +0 -0
  392. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/other_kernels.png +0 -0
  393. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/figs/other_kernels.svg +0 -0
  394. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/how_ipython_works.rst +0 -0
  395. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/index.rst +0 -0
  396. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/inputhook_app.rst +0 -0
  397. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/kernels.rst +0 -0
  398. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/messaging.rst +0 -0
  399. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/pycompat.rst +0 -0
  400. {ipython-9.2.0 → ipython-9.4.0}/docs/source/development/wrapperkernels.rst +0 -0
  401. {ipython-9.2.0 → ipython-9.4.0}/docs/source/index.rst +0 -0
  402. {ipython-9.2.0 → ipython-9.4.0}/docs/source/install/index.rst +0 -0
  403. {ipython-9.2.0 → ipython-9.4.0}/docs/source/install/install.rst +0 -0
  404. {ipython-9.2.0 → ipython-9.4.0}/docs/source/install/kernel_install.rst +0 -0
  405. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/autoawait.rst +0 -0
  406. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/index.rst +0 -0
  407. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/magics.rst +0 -0
  408. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/plotting.rst +0 -0
  409. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/python-ipython-diff.rst +0 -0
  410. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/reference.rst +0 -0
  411. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/shell.rst +0 -0
  412. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/tips.rst +0 -0
  413. {ipython-9.2.0 → ipython-9.4.0}/docs/source/interactive/tutorial.rst +0 -0
  414. {ipython-9.2.0 → ipython-9.4.0}/docs/source/links.txt +0 -0
  415. {ipython-9.2.0 → ipython-9.4.0}/docs/source/overview.rst +0 -0
  416. {ipython-9.2.0 → ipython-9.4.0}/docs/source/parallel/index.rst +0 -0
  417. {ipython-9.2.0 → ipython-9.4.0}/docs/source/sphinx.toml +0 -0
  418. {ipython-9.2.0 → ipython-9.4.0}/docs/source/sphinxext.rst +0 -0
  419. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/development.rst +0 -0
  420. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-0.11.rst +0 -0
  421. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-0.12.rst +0 -0
  422. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-0.13.rst +0 -0
  423. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-1.0.rst +0 -0
  424. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-2.0.rst +0 -0
  425. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-3.rst +0 -0
  426. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-4.rst +0 -0
  427. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-5.rst +0 -0
  428. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-6.rst +0 -0
  429. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-7.rst +0 -0
  430. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/github-stats-8.rst +0 -0
  431. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/index.rst +0 -0
  432. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/pr/README.md +0 -0
  433. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/pr/antigravity-feature.rst +0 -0
  434. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/pr/incompat-switching-to-perl.rst +0 -0
  435. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.10.rst +0 -0
  436. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.11.rst +0 -0
  437. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.12.rst +0 -0
  438. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.13.rst +0 -0
  439. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.8.rst +0 -0
  440. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version0.9.rst +0 -0
  441. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version1.0.rst +0 -0
  442. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version2.0.rst +0 -0
  443. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version3.rst +0 -0
  444. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version3_widget_migration.rst +0 -0
  445. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version4.rst +0 -0
  446. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version5.rst +0 -0
  447. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version6.rst +0 -0
  448. {ipython-9.2.0 → ipython-9.4.0}/docs/source/whatsnew/version7.rst +0 -0
  449. {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/apigen.py +0 -0
  450. {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/configtraits.py +0 -0
  451. {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/github.py +0 -0
  452. {ipython-9.2.0 → ipython-9.4.0}/docs/sphinxext/magics.py +0 -0
  453. {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/embed_class_long.py +0 -0
  454. {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/embed_class_short.py +0 -0
  455. {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/embed_function.py +0 -0
  456. {ipython-9.2.0 → ipython-9.4.0}/examples/Embedding/start_ipython_config.py +0 -0
  457. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/example-demo.py +0 -0
  458. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/gui/gui-glut.py +0 -0
  459. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/gui/gui-gtk4.py +0 -0
  460. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/gui/gui-qt.py +0 -0
  461. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/ipython-completion.bash +0 -0
  462. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/ipython-get-history.py +0 -0
  463. {ipython-9.2.0 → ipython-9.4.0}/examples/IPython Kernel/ipython.desktop +0 -0
  464. {ipython-9.2.0 → ipython-9.4.0}/examples/utils/cwd_prompt.py +0 -0
  465. {ipython-9.2.0 → ipython-9.4.0}/examples/utils/list_pyfiles.ipy +0 -0
  466. {ipython-9.2.0 → ipython-9.4.0}/examples/utils/list_subdirs.ipy +0 -0
  467. {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/dependency_links.txt +0 -0
  468. {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/entry_points.txt +0 -0
  469. {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/not-zip-safe +0 -0
  470. {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/requires.txt +0 -0
  471. {ipython-9.2.0 → ipython-9.4.0}/ipython.egg-info/top_level.txt +0 -0
  472. {ipython-9.2.0 → ipython-9.4.0}/long_description.rst +0 -0
  473. {ipython-9.2.0 → ipython-9.4.0}/scripts/ipython.ico +0 -0
  474. {ipython-9.2.0 → ipython-9.4.0}/scripts/ipython_nb.ico +0 -0
  475. {ipython-9.2.0 → ipython-9.4.0}/setup.cfg +0 -0
  476. {ipython-9.2.0 → ipython-9.4.0}/setup.py +0 -0
  477. {ipython-9.2.0 → ipython-9.4.0}/setupbase.py +0 -0
  478. {ipython-9.2.0 → ipython-9.4.0}/tests/2x2.jpg +0 -0
  479. {ipython-9.2.0 → ipython-9.4.0}/tests/2x2.png +0 -0
  480. {ipython-9.2.0 → ipython-9.4.0}/tests/__init__.py +0 -0
  481. {ipython-9.2.0 → ipython-9.4.0}/tests/bad_all.py +0 -0
  482. {ipython-9.2.0 → ipython-9.4.0}/tests/conftest.py +0 -0
  483. {ipython-9.2.0 → ipython-9.4.0}/tests/cve.py +0 -0
  484. {ipython-9.2.0 → ipython-9.4.0}/tests/fake_ext_dir/daft_extension.py +0 -0
  485. {ipython-9.2.0 → ipython-9.4.0}/tests/nonascii.py +0 -0
  486. {ipython-9.2.0 → ipython-9.4.0}/tests/nonascii2.py +0 -0
  487. {ipython-9.2.0 → ipython-9.4.0}/tests/print_argv.py +0 -0
  488. {ipython-9.2.0 → ipython-9.4.0}/tests/refbug.py +0 -0
  489. {ipython-9.2.0 → ipython-9.4.0}/tests/simpleerr.py +0 -0
  490. {ipython-9.2.0 → ipython-9.4.0}/tests/tclass.py +0 -0
  491. {ipython-9.2.0 → ipython-9.4.0}/tests/test.wav +0 -0
  492. {ipython-9.2.0 → ipython-9.4.0}/tests/test_alias.py +0 -0
  493. {ipython-9.2.0 → ipython-9.4.0}/tests/test_application.py +0 -0
  494. {ipython-9.2.0 → ipython-9.4.0}/tests/test_async_helpers.py +0 -0
  495. {ipython-9.2.0 → ipython-9.4.0}/tests/test_autocall.py +0 -0
  496. {ipython-9.2.0 → ipython-9.4.0}/tests/test_backgroundjobs.py +0 -0
  497. {ipython-9.2.0 → ipython-9.4.0}/tests/test_capture.py +0 -0
  498. {ipython-9.2.0 → ipython-9.4.0}/tests/test_clipboard.py +0 -0
  499. {ipython-9.2.0 → ipython-9.4.0}/tests/test_compilerop.py +0 -0
  500. {ipython-9.2.0 → ipython-9.4.0}/tests/test_completerlib.py +0 -0
  501. {ipython-9.2.0 → ipython-9.4.0}/tests/test_debug_magic.py +0 -0
  502. {ipython-9.2.0 → ipython-9.4.0}/tests/test_decorators.py +0 -0
  503. {ipython-9.2.0 → ipython-9.4.0}/tests/test_decorators_2.py +0 -0
  504. {ipython-9.2.0 → ipython-9.4.0}/tests/test_deepreload.py +0 -0
  505. {ipython-9.2.0 → ipython-9.4.0}/tests/test_dir2.py +0 -0
  506. {ipython-9.2.0 → ipython-9.4.0}/tests/test_display.py +0 -0
  507. {ipython-9.2.0 → ipython-9.4.0}/tests/test_display_2.py +0 -0
  508. {ipython-9.2.0 → ipython-9.4.0}/tests/test_displayhook.py +0 -0
  509. {ipython-9.2.0 → ipython-9.4.0}/tests/test_editorhooks.py +0 -0
  510. {ipython-9.2.0 → ipython-9.4.0}/tests/test_embed.py +0 -0
  511. {ipython-9.2.0 → ipython-9.4.0}/tests/test_events.py +0 -0
  512. {ipython-9.2.0 → ipython-9.4.0}/tests/test_exceptiongroup_tb.py +0 -0
  513. {ipython-9.2.0 → ipython-9.4.0}/tests/test_extension.py +0 -0
  514. {ipython-9.2.0 → ipython-9.4.0}/tests/test_formatters.py +0 -0
  515. {ipython-9.2.0 → ipython-9.4.0}/tests/test_handlers.py +0 -0
  516. {ipython-9.2.0 → ipython-9.4.0}/tests/test_help.py +0 -0
  517. {ipython-9.2.0 → ipython-9.4.0}/tests/test_history.py +0 -0
  518. {ipython-9.2.0 → ipython-9.4.0}/tests/test_hooks.py +0 -0
  519. {ipython-9.2.0 → ipython-9.4.0}/tests/test_imports.py +0 -0
  520. {ipython-9.2.0 → ipython-9.4.0}/tests/test_importstring.py +0 -0
  521. {ipython-9.2.0 → ipython-9.4.0}/tests/test_inputtransformer2.py +0 -0
  522. {ipython-9.2.0 → ipython-9.4.0}/tests/test_inputtransformer2_line.py +0 -0
  523. {ipython-9.2.0 → ipython-9.4.0}/tests/test_interactiveshell.py +0 -0
  524. {ipython-9.2.0 → ipython-9.4.0}/tests/test_interactivshell.py +0 -0
  525. {ipython-9.2.0 → ipython-9.4.0}/tests/test_io.py +0 -0
  526. {ipython-9.2.0 → ipython-9.4.0}/tests/test_iplib.py +0 -0
  527. {ipython-9.2.0 → ipython-9.4.0}/tests/test_ipunittest.py +0 -0
  528. {ipython-9.2.0 → ipython-9.4.0}/tests/test_latextools.py +0 -0
  529. {ipython-9.2.0 → ipython-9.4.0}/tests/test_logger.py +0 -0
  530. {ipython-9.2.0 → ipython-9.4.0}/tests/test_magic_arguments.py +0 -0
  531. {ipython-9.2.0 → ipython-9.4.0}/tests/test_magic_terminal.py +0 -0
  532. {ipython-9.2.0 → ipython-9.4.0}/tests/test_module_paths.py +0 -0
  533. {ipython-9.2.0 → ipython-9.4.0}/tests/test_oinspect.py +0 -0
  534. {ipython-9.2.0 → ipython-9.4.0}/tests/test_openpy.py +0 -0
  535. {ipython-9.2.0 → ipython-9.4.0}/tests/test_page.py +0 -0
  536. {ipython-9.2.0 → ipython-9.4.0}/tests/test_path.py +0 -0
  537. {ipython-9.2.0 → ipython-9.4.0}/tests/test_paths.py +0 -0
  538. {ipython-9.2.0 → ipython-9.4.0}/tests/test_prefilter.py +0 -0
  539. {ipython-9.2.0 → ipython-9.4.0}/tests/test_pretty.py +0 -0
  540. {ipython-9.2.0 → ipython-9.4.0}/tests/test_process.py +0 -0
  541. {ipython-9.2.0 → ipython-9.4.0}/tests/test_profile.py +0 -0
  542. {ipython-9.2.0 → ipython-9.4.0}/tests/test_pt_inputhooks.py +0 -0
  543. {ipython-9.2.0 → ipython-9.4.0}/tests/test_pycolorize.py +0 -0
  544. {ipython-9.2.0 → ipython-9.4.0}/tests/test_pylabtools.py +0 -0
  545. {ipython-9.2.0 → ipython-9.4.0}/tests/test_qt_loaders.py +0 -0
  546. {ipython-9.2.0 → ipython-9.4.0}/tests/test_run.py +0 -0
  547. {ipython-9.2.0 → ipython-9.4.0}/tests/test_shellapp.py +0 -0
  548. {ipython-9.2.0 → ipython-9.4.0}/tests/test_splitinput.py +0 -0
  549. {ipython-9.2.0 → ipython-9.4.0}/tests/test_storemagic.py +0 -0
  550. {ipython-9.2.0 → ipython-9.4.0}/tests/test_sysinfo.py +0 -0
  551. {ipython-9.2.0 → ipython-9.4.0}/tests/test_tempdir.py +0 -0
  552. {ipython-9.2.0 → ipython-9.4.0}/tests/test_text.py +0 -0
  553. {ipython-9.2.0 → ipython-9.4.0}/tests/test_tips.py +0 -0
  554. {ipython-9.2.0 → ipython-9.4.0}/tests/test_tokenutil.py +0 -0
  555. {ipython-9.2.0 → ipython-9.4.0}/tests/test_tools.py +0 -0
  556. {ipython-9.2.0 → ipython-9.4.0}/tests/test_ultratb.py +0 -0
  557. {ipython-9.2.0 → ipython-9.4.0}/tests/test_wildcard.py +0 -0
@@ -203,15 +203,11 @@ from types import SimpleNamespace
203
203
  from typing import (
204
204
  Iterable,
205
205
  Iterator,
206
- List,
207
- Tuple,
208
206
  Union,
209
207
  Any,
210
208
  Sequence,
211
- Dict,
212
209
  Optional,
213
210
  TYPE_CHECKING,
214
- Set,
215
211
  Sized,
216
212
  TypeVar,
217
213
  Literal,
@@ -236,10 +232,12 @@ from traitlets import (
236
232
  List as ListTrait,
237
233
  Unicode,
238
234
  Dict as DictTrait,
235
+ DottedObjectName,
239
236
  Union as UnionTrait,
240
237
  observe,
241
238
  )
242
239
  from traitlets.config.configurable import Configurable
240
+ from traitlets.utils.importstring import import_item
243
241
 
244
242
  import __main__
245
243
 
@@ -987,7 +985,7 @@ class Completer(Configurable):
987
985
 
988
986
  - ``forbidden``: no evaluation of code is permitted,
989
987
  - ``minimal``: evaluation of literals and access to built-in namespace;
990
- no item/attribute evaluationm no access to locals/globals,
988
+ no item/attribute evaluation, no access to locals/globals,
991
989
  no evaluation of any operations or comparisons.
992
990
  - ``limited``: access to all namespaces, evaluation of hard-coded methods
993
991
  (for example: :any:`dict.keys`, :any:`object.__getattr__`,
@@ -995,7 +993,9 @@ class Completer(Configurable):
995
993
  :any:`dict`, :any:`list`, :any:`tuple`, ``pandas.Series``),
996
994
  - ``unsafe``: evaluation of all methods and function calls but not of
997
995
  syntax with side-effects like `del x`,
998
- - ``dangerous``: completely arbitrary evaluation.
996
+ - ``dangerous``: completely arbitrary evaluation; does not support auto-import.
997
+
998
+ To override specific elements of the policy, you can use ``policy_overrides`` trait.
999
999
  """,
1000
1000
  ).tag(config=True)
1001
1001
 
@@ -1031,6 +1031,35 @@ class Completer(Configurable):
1031
1031
  """,
1032
1032
  ).tag(config=True)
1033
1033
 
1034
+ policy_overrides = DictTrait(
1035
+ default_value={},
1036
+ key_trait=Unicode(),
1037
+ help="""Overrides for policy evaluation.
1038
+
1039
+ For example, to enable auto-import on completion specify:
1040
+
1041
+ .. code-block::
1042
+
1043
+ ipython --Completer.policy_overrides='{"allow_auto_import": True}' --Completer.use_jedi=False
1044
+
1045
+ """,
1046
+ ).tag(config=True)
1047
+
1048
+ auto_import_method = DottedObjectName(
1049
+ default_value="importlib.import_module",
1050
+ allow_none=True,
1051
+ help="""\
1052
+ Provisional:
1053
+ This is a provisional API in IPython 9.3, it may change without warnings.
1054
+
1055
+ A fully qualified path to an auto-import method for use by completer.
1056
+ The function should take a single string and return `ModuleType` and
1057
+ can raise `ImportError` exception if module is not found.
1058
+
1059
+ The default auto-import implementation does not populate the user namespace with the imported module.
1060
+ """,
1061
+ ).tag(config=True)
1062
+
1034
1063
  def __init__(self, namespace=None, global_namespace=None, **kwargs):
1035
1064
  """Create a new completer for the command line.
1036
1065
 
@@ -1134,6 +1163,48 @@ class Completer(Configurable):
1134
1163
  # we simple attribute matching with normal identifiers.
1135
1164
  _ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$")
1136
1165
 
1166
+ def _strip_code_before_operator(self, code: str) -> str:
1167
+ o_parens = {"(", "[", "{"}
1168
+ c_parens = {")", "]", "}"}
1169
+
1170
+ # Dry-run tokenize to catch errors
1171
+ try:
1172
+ _ = list(tokenize.generate_tokens(iter(code.splitlines()).__next__))
1173
+ except tokenize.TokenError:
1174
+ # Try trimming the expression and retrying
1175
+ trimmed_code = self._trim_expr(code)
1176
+ try:
1177
+ _ = list(
1178
+ tokenize.generate_tokens(iter(trimmed_code.splitlines()).__next__)
1179
+ )
1180
+ code = trimmed_code
1181
+ except tokenize.TokenError:
1182
+ return code
1183
+
1184
+ tokens = _parse_tokens(code)
1185
+ encountered_operator = False
1186
+ after_operator = []
1187
+ nesting_level = 0
1188
+
1189
+ for t in tokens:
1190
+ if t.type == tokenize.OP:
1191
+ if t.string in o_parens:
1192
+ nesting_level += 1
1193
+ elif t.string in c_parens:
1194
+ nesting_level -= 1
1195
+ elif t.string != "." and nesting_level == 0:
1196
+ encountered_operator = True
1197
+ after_operator = []
1198
+ continue
1199
+
1200
+ if encountered_operator:
1201
+ after_operator.append(t.string)
1202
+
1203
+ if encountered_operator:
1204
+ return "".join(after_operator)
1205
+ else:
1206
+ return code
1207
+
1137
1208
  def _attr_matches(
1138
1209
  self, text: str, include_prefix: bool = True
1139
1210
  ) -> tuple[Sequence[str], str]:
@@ -1141,9 +1212,12 @@ class Completer(Configurable):
1141
1212
  if not m2:
1142
1213
  return [], ""
1143
1214
  expr, attr = m2.group(1, 2)
1215
+ try:
1216
+ expr = self._strip_code_before_operator(expr)
1217
+ except tokenize.TokenError:
1218
+ pass
1144
1219
 
1145
1220
  obj = self._evaluate_expr(expr)
1146
-
1147
1221
  if obj is not_found:
1148
1222
  return [], ""
1149
1223
 
@@ -1234,6 +1308,8 @@ class Completer(Configurable):
1234
1308
  globals=self.global_namespace,
1235
1309
  locals=self.namespace,
1236
1310
  evaluation=self.evaluation,
1311
+ auto_import=self._auto_import,
1312
+ policy_overrides=self.policy_overrides,
1237
1313
  ),
1238
1314
  )
1239
1315
  done = True
@@ -1247,6 +1323,14 @@ class Completer(Configurable):
1247
1323
  expr = self._trim_expr(expr)
1248
1324
  return obj
1249
1325
 
1326
+ @property
1327
+ def _auto_import(self):
1328
+ if self.auto_import_method is None:
1329
+ return None
1330
+ if not hasattr(self, "_auto_import_func"):
1331
+ self._auto_import_func = import_item(self.auto_import_method)
1332
+ return self._auto_import_func
1333
+
1250
1334
  def get__all__entries(obj):
1251
1335
  """returns the strings in the __all__ attribute"""
1252
1336
  try:
@@ -2787,6 +2871,8 @@ class IPCompleter(Completer):
2787
2871
  locals=self.namespace,
2788
2872
  evaluation=self.evaluation, # type: ignore
2789
2873
  in_subscript=True,
2874
+ auto_import=self._auto_import,
2875
+ policy_overrides=self.policy_overrides,
2790
2876
  ),
2791
2877
  )
2792
2878
 
@@ -133,6 +133,7 @@ from contextlib import contextmanager
133
133
  from functools import lru_cache
134
134
 
135
135
  from IPython import get_ipython
136
+ from IPython.core.debugger_backport import PdbClosureBackport
136
137
  from IPython.utils import PyColorize
137
138
  from IPython.utils.PyColorize import TokenStream
138
139
 
@@ -140,9 +141,18 @@ from typing import TYPE_CHECKING
140
141
  from types import FrameType
141
142
 
142
143
  # We have to check this directly from sys.argv, config struct not yet available
143
- from pdb import Pdb as OldPdb
144
+ from pdb import Pdb as _OldPdb
144
145
  from pygments.token import Token
145
146
 
147
+
148
+ if sys.version_info < (3, 13):
149
+
150
+ class OldPdb(PdbClosureBackport, _OldPdb):
151
+ pass
152
+
153
+ else:
154
+ OldPdb = _OldPdb
155
+
146
156
  if TYPE_CHECKING:
147
157
  # otherwise circular import
148
158
  from IPython.core.interactiveshell import InteractiveShell
@@ -0,0 +1,206 @@
1
+ """
2
+ The code in this module is a backport of cPython changes in Pdb
3
+ that were introduced in Python 3.13 by gh-83151: Make closure work on pdb
4
+ https://github.com/python/cpython/pull/111094.
5
+ This file should be removed once IPython drops supports for Python 3.12.
6
+
7
+ The only changes are:
8
+ - reformatting by darker (black) formatter
9
+ - addition of type-ignore comments to satisfy mypy
10
+
11
+ Copyright (c) 2001 Python Software Foundation; All Rights Reserved
12
+
13
+ PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
14
+ --------------------------------------------
15
+
16
+ 1. This LICENSE AGREEMENT is between the Python Software Foundation
17
+ ("PSF"), and the Individual or Organization ("Licensee") accessing and
18
+ otherwise using this software ("Python") in source or binary form and
19
+ its associated documentation.
20
+
21
+ 2. Subject to the terms and conditions of this License Agreement, PSF hereby
22
+ grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
23
+ analyze, test, perform and/or display publicly, prepare derivative works,
24
+ distribute, and otherwise use Python alone or in any derivative version,
25
+ provided, however, that PSF's License Agreement and PSF's notice of copyright,
26
+ i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved"
27
+ are retained in Python alone or in any derivative version prepared by Licensee.
28
+
29
+ 3. In the event Licensee prepares a derivative work that is based on
30
+ or incorporates Python or any part thereof, and wants to make
31
+ the derivative work available to others as provided herein, then
32
+ Licensee hereby agrees to include in any such work a brief summary of
33
+ the changes made to Python.
34
+
35
+ 4. PSF is making Python available to Licensee on an "AS IS"
36
+ basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
37
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
38
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
39
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
40
+ INFRINGE ANY THIRD PARTY RIGHTS.
41
+
42
+ 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
43
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
44
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
45
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
46
+
47
+ 6. This License Agreement will automatically terminate upon a material
48
+ breach of its terms and conditions.
49
+
50
+ 7. Nothing in this License Agreement shall be deemed to create any
51
+ relationship of agency, partnership, or joint venture between PSF and
52
+ Licensee. This License Agreement does not grant permission to use PSF
53
+ trademarks or trade name in a trademark sense to endorse or promote
54
+ products or services of Licensee, or any third party.
55
+
56
+ 8. By copying, installing or otherwise using Python, Licensee
57
+ agrees to be bound by the terms and conditions of this License
58
+ Agreement.
59
+ """
60
+
61
+ import sys
62
+ import types
63
+ import codeop
64
+ import textwrap
65
+ from types import CodeType
66
+
67
+
68
+ class PdbClosureBackport:
69
+ def _exec_in_closure(self, source, globals, locals): # type: ignore[no-untyped-def]
70
+ """Run source code in closure so code object created within source
71
+ can find variables in locals correctly
72
+ returns True if the source is executed, False otherwise
73
+ """
74
+
75
+ # Determine if the source should be executed in closure. Only when the
76
+ # source compiled to multiple code objects, we should use this feature.
77
+ # Otherwise, we can just raise an exception and normal exec will be used.
78
+
79
+ code = compile(source, "<string>", "exec")
80
+ if not any(isinstance(const, CodeType) for const in code.co_consts):
81
+ return False
82
+
83
+ # locals could be a proxy which does not support pop
84
+ # copy it first to avoid modifying the original locals
85
+ locals_copy = dict(locals)
86
+
87
+ locals_copy["__pdb_eval__"] = {"result": None, "write_back": {}}
88
+
89
+ # If the source is an expression, we need to print its value
90
+ try:
91
+ compile(source, "<string>", "eval")
92
+ except SyntaxError:
93
+ pass
94
+ else:
95
+ source = "__pdb_eval__['result'] = " + source
96
+
97
+ # Add write-back to update the locals
98
+ source = (
99
+ "try:\n"
100
+ + textwrap.indent(source, " ")
101
+ + "\n"
102
+ + "finally:\n"
103
+ + " __pdb_eval__['write_back'] = locals()"
104
+ )
105
+
106
+ # Build a closure source code with freevars from locals like:
107
+ # def __pdb_outer():
108
+ # var = None
109
+ # def __pdb_scope(): # This is the code object we want to execute
110
+ # nonlocal var
111
+ # <source>
112
+ # return __pdb_scope.__code__
113
+ source_with_closure = (
114
+ "def __pdb_outer():\n"
115
+ + "\n".join(f" {var} = None" for var in locals_copy)
116
+ + "\n"
117
+ + " def __pdb_scope():\n"
118
+ + "\n".join(f" nonlocal {var}" for var in locals_copy)
119
+ + "\n"
120
+ + textwrap.indent(source, " ")
121
+ + "\n"
122
+ + " return __pdb_scope.__code__"
123
+ )
124
+
125
+ # Get the code object of __pdb_scope()
126
+ # The exec fills locals_copy with the __pdb_outer() function and we can call
127
+ # that to get the code object of __pdb_scope()
128
+ ns = {}
129
+ try:
130
+ exec(source_with_closure, {}, ns)
131
+ except Exception:
132
+ return False
133
+ code = ns["__pdb_outer"]()
134
+
135
+ cells = tuple(types.CellType(locals_copy.get(var)) for var in code.co_freevars)
136
+
137
+ try:
138
+ exec(code, globals, locals_copy, closure=cells)
139
+ except Exception:
140
+ return False
141
+
142
+ # get the data we need from the statement
143
+ pdb_eval = locals_copy["__pdb_eval__"]
144
+
145
+ # __pdb_eval__ should not be updated back to locals
146
+ pdb_eval["write_back"].pop("__pdb_eval__")
147
+
148
+ # Write all local variables back to locals
149
+ locals.update(pdb_eval["write_back"])
150
+ eval_result = pdb_eval["result"]
151
+ if eval_result is not None:
152
+ print(repr(eval_result))
153
+
154
+ return True
155
+
156
+ def default(self, line): # type: ignore[no-untyped-def]
157
+ if line[:1] == "!":
158
+ line = line[1:].strip()
159
+ locals = self.curframe_locals
160
+ globals = self.curframe.f_globals
161
+ try:
162
+ buffer = line
163
+ if (
164
+ code := codeop.compile_command(line + "\n", "<stdin>", "single")
165
+ ) is None:
166
+ # Multi-line mode
167
+ with self._disable_command_completion():
168
+ buffer = line
169
+ continue_prompt = "... "
170
+ while (
171
+ code := codeop.compile_command(buffer, "<stdin>", "single")
172
+ ) is None:
173
+ if self.use_rawinput:
174
+ try:
175
+ line = input(continue_prompt)
176
+ except (EOFError, KeyboardInterrupt):
177
+ self.lastcmd = ""
178
+ print("\n")
179
+ return
180
+ else:
181
+ self.stdout.write(continue_prompt)
182
+ self.stdout.flush()
183
+ line = self.stdin.readline()
184
+ if not len(line):
185
+ self.lastcmd = ""
186
+ self.stdout.write("\n")
187
+ self.stdout.flush()
188
+ return
189
+ else:
190
+ line = line.rstrip("\r\n")
191
+ buffer += "\n" + line
192
+ save_stdout = sys.stdout
193
+ save_stdin = sys.stdin
194
+ save_displayhook = sys.displayhook
195
+ try:
196
+ sys.stdin = self.stdin
197
+ sys.stdout = self.stdout
198
+ sys.displayhook = self.displayhook
199
+ if not self._exec_in_closure(buffer, globals, locals):
200
+ exec(code, globals, locals)
201
+ finally:
202
+ sys.stdout = save_stdout
203
+ sys.stdin = save_stdin
204
+ sys.displayhook = save_displayhook
205
+ except:
206
+ self._error_exc()
@@ -1,19 +1,15 @@
1
+ from copy import copy
1
2
  from inspect import isclass, signature, Signature
2
- from pygments.formatters.terminal256 import Terminal256Formatter
3
3
  from typing import (
4
4
  Annotated,
5
5
  AnyStr,
6
6
  Callable,
7
- Dict,
8
7
  Literal,
9
8
  NamedTuple,
10
9
  NewType,
11
10
  Optional,
12
11
  Protocol,
13
- Set,
14
12
  Sequence,
15
- Tuple,
16
- Type,
17
13
  TypeGuard,
18
14
  Union,
19
15
  get_args,
@@ -97,6 +93,7 @@ class EvaluationPolicy:
97
93
  allow_builtins_access: bool = False
98
94
  allow_all_operations: bool = False
99
95
  allow_any_calls: bool = False
96
+ allow_auto_import: bool = False
100
97
  allowed_calls: set[Callable] = field(default_factory=set)
101
98
 
102
99
  def can_get_item(self, value, item):
@@ -330,6 +327,10 @@ class EvaluationContext(NamedTuple):
330
327
  #: Whether the evaluation of code takes place inside of a subscript.
331
328
  #: Useful for evaluating ``:-1, 'col'`` in ``df[:-1, 'col']``.
332
329
  in_subscript: bool = False
330
+ #: Auto import method
331
+ auto_import: Callable[list[str], ModuleType] | None = None
332
+ #: Overrides for evaluation policy
333
+ policy_overrides: dict = {}
333
334
 
334
335
 
335
336
  class _IdentitySubscript:
@@ -463,6 +464,17 @@ def _find_dunder(node_op, dunders) -> Union[tuple[str, ...], None]:
463
464
  return dunder
464
465
 
465
466
 
467
+ def get_policy(context: EvaluationContext) -> EvaluationPolicy:
468
+ policy = copy(EVALUATION_POLICIES[context.evaluation])
469
+
470
+ for key, value in context.policy_overrides.items():
471
+ if hasattr(policy, key):
472
+ setattr(policy, key, value)
473
+ else:
474
+ print(f"Incorrect policy override key: {key}")
475
+ return policy
476
+
477
+
466
478
  def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
467
479
  """Evaluate AST node in provided context.
468
480
 
@@ -490,7 +502,8 @@ def eval_node(node: Union[ast.AST, None], context: EvaluationContext):
490
502
  The purpose of this function is to guard against unwanted side-effects;
491
503
  it does not give guarantees on protection from malicious code execution.
492
504
  """
493
- policy = EVALUATION_POLICIES[context.evaluation]
505
+ policy = get_policy(context)
506
+
494
507
  if node is None:
495
508
  return None
496
509
  if isinstance(node, ast.Expression):
@@ -711,7 +724,7 @@ def _resolve_annotation(
711
724
 
712
725
 
713
726
  def _eval_node_name(node_id: str, context: EvaluationContext):
714
- policy = EVALUATION_POLICIES[context.evaluation]
727
+ policy = get_policy(context)
715
728
  if policy.allow_locals_access and node_id in context.locals:
716
729
  return context.locals[node_id]
717
730
  if policy.allow_globals_access and node_id in context.globals:
@@ -719,6 +732,8 @@ def _eval_node_name(node_id: str, context: EvaluationContext):
719
732
  if policy.allow_builtins_access and hasattr(builtins, node_id):
720
733
  # note: do not use __builtins__, it is implementation detail of cPython
721
734
  return getattr(builtins, node_id)
735
+ if policy.allow_auto_import and context.auto_import:
736
+ return context.auto_import(node_id)
722
737
  if not policy.allow_globals_access and not policy.allow_locals_access:
723
738
  raise GuardRejection(
724
739
  f"Namespace access not allowed in {context.evaluation} mode"
@@ -728,7 +743,7 @@ def _eval_node_name(node_id: str, context: EvaluationContext):
728
743
 
729
744
 
730
745
  def _eval_or_create_duck(duck_type, node: ast.Call, context: EvaluationContext):
731
- policy = EVALUATION_POLICIES[context.evaluation]
746
+ policy = get_policy(context)
732
747
  # if allow-listed builtin is on type annotation, instantiate it
733
748
  if policy.can_call(duck_type) and not node.keywords:
734
749
  args = [eval_node(arg, context) for arg in node.args]
@@ -252,13 +252,23 @@ class ExecutionInfo:
252
252
  Stores information about what is going to happen.
253
253
  """
254
254
  raw_cell = None
255
+ transformed_cell = None
255
256
  store_history = False
256
257
  silent = False
257
258
  shell_futures = True
258
259
  cell_id = None
259
260
 
260
- def __init__(self, raw_cell, store_history, silent, shell_futures, cell_id):
261
+ def __init__(
262
+ self,
263
+ raw_cell,
264
+ store_history,
265
+ silent,
266
+ shell_futures,
267
+ cell_id,
268
+ transformed_cell=None,
269
+ ):
261
270
  self.raw_cell = raw_cell
271
+ self.transformed_cell = transformed_cell
262
272
  self.store_history = store_history
263
273
  self.silent = silent
264
274
  self.shell_futures = shell_futures
@@ -269,12 +279,18 @@ class ExecutionInfo:
269
279
  raw_cell = (
270
280
  (self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell
271
281
  )
282
+ transformed_cell = (
283
+ (self.transformed_cell[:50] + "..")
284
+ if self.transformed_cell and len(self.transformed_cell) > 50
285
+ else self.transformed_cell
286
+ )
272
287
  return (
273
- '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
288
+ '<%s object at %x, raw_cell="%s" transformed_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
274
289
  % (
275
290
  name,
276
291
  id(self),
277
292
  raw_cell,
293
+ transformed_cell,
278
294
  self.store_history,
279
295
  self.silent,
280
296
  self.shell_futures,
@@ -290,7 +306,7 @@ class ExecutionResult:
290
306
  """
291
307
 
292
308
  execution_count: Optional[int] = None
293
- error_before_exec: Optional[bool] = None
309
+ error_before_exec: Optional[BaseException] = None
294
310
  error_in_exec: Optional[BaseException] = None
295
311
  info = None
296
312
  result = None
@@ -314,6 +330,7 @@ class ExecutionResult:
314
330
  return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
315
331
  (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
316
332
 
333
+
317
334
  @functools.wraps(io_open)
318
335
  def _modified_open(file, *args, **kwargs):
319
336
  if file in {0, 1, 2}:
@@ -331,7 +348,7 @@ class InteractiveShell(SingletonConfigurable):
331
348
 
332
349
  _instance = None
333
350
  _user_ns: dict
334
- _sys_modules_keys: set[str, AnyType]
351
+ _sys_modules_keys: set[str]
335
352
 
336
353
  inspector: oinspect.Inspector
337
354
 
@@ -1572,7 +1589,7 @@ class InteractiveShell(SingletonConfigurable):
1572
1589
  if isinstance(variables, str):
1573
1590
  vlist = variables.split()
1574
1591
  else:
1575
- vlist = variables
1592
+ vlist = list(variables)
1576
1593
  vdict = {}
1577
1594
  cf = sys._getframe(1)
1578
1595
  for name in vlist:
@@ -1887,11 +1904,12 @@ class InteractiveShell(SingletonConfigurable):
1887
1904
  with self.builtin_trap:
1888
1905
  info = self._object_find(oname)
1889
1906
  if info.found:
1890
- docformat = (
1891
- sphinxify(self.object_inspect(oname))
1892
- if self.sphinxify_docstring
1893
- else None
1894
- )
1907
+ if self.sphinxify_docstring:
1908
+ if sphinxify is None:
1909
+ raise ImportError("Module ``docrepr`` required but missing")
1910
+ docformat = sphinxify(self.object_inspect(oname))
1911
+ else:
1912
+ docformat = None
1895
1913
  return self.inspector._get_info(
1896
1914
  info.obj,
1897
1915
  oname,
@@ -2196,7 +2214,7 @@ class InteractiveShell(SingletonConfigurable):
2196
2214
  except KeyboardInterrupt:
2197
2215
  print('\n' + self.get_exception_only(), file=sys.stderr)
2198
2216
 
2199
- def _showtraceback(self, etype, evalue, stb: str):
2217
+ def _showtraceback(self, etype, evalue, stb: list[str]):
2200
2218
  """Actually show a traceback.
2201
2219
 
2202
2220
  Subclasses may override this method to put the traceback on a different
@@ -3154,14 +3172,18 @@ class InteractiveShell(SingletonConfigurable):
3154
3172
  except BaseException as e:
3155
3173
  try:
3156
3174
  info = ExecutionInfo(
3157
- raw_cell, store_history, silent, shell_futures, cell_id
3175
+ raw_cell,
3176
+ store_history,
3177
+ silent,
3178
+ shell_futures,
3179
+ cell_id,
3180
+ transformed_cell=transformed_cell,
3158
3181
  )
3159
3182
  result = ExecutionResult(info)
3160
3183
  result.error_in_exec = e
3161
3184
  self.showtraceback(running_compiled_code=True)
3162
3185
  except:
3163
3186
  pass
3164
-
3165
3187
  return result
3166
3188
 
3167
3189
  def should_run_async(
@@ -3246,7 +3268,14 @@ class InteractiveShell(SingletonConfigurable):
3246
3268
 
3247
3269
  .. versionadded:: 7.0
3248
3270
  """
3249
- info = ExecutionInfo(raw_cell, store_history, silent, shell_futures, cell_id)
3271
+ info = ExecutionInfo(
3272
+ raw_cell,
3273
+ store_history,
3274
+ silent,
3275
+ shell_futures,
3276
+ cell_id,
3277
+ transformed_cell=transformed_cell,
3278
+ )
3250
3279
  result = ExecutionResult(info)
3251
3280
 
3252
3281
  if (not raw_cell) or raw_cell.isspace():
@@ -3599,7 +3628,7 @@ class InteractiveShell(SingletonConfigurable):
3599
3628
  if mode == "exec":
3600
3629
  mod = Module([node], [])
3601
3630
  elif mode == "single":
3602
- mod = ast.Interactive([node]) # type: ignore
3631
+ mod = ast.Interactive([node])
3603
3632
  with compiler.extra_flags(
3604
3633
  getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
3605
3634
  if self.autoawait