superacli 1.1.5 → 1.1.7

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 (1081) hide show
  1. package/README.md +77 -53
  2. package/__tests__/azd-plugin.test.js +109 -0
  3. package/__tests__/config.test.js +4 -3
  4. package/__tests__/discover.test.js +59 -0
  5. package/__tests__/goose-plugin.test.js +149 -0
  6. package/__tests__/help-json.test.js +2 -0
  7. package/__tests__/openhands-plugin.test.js +106 -0
  8. package/__tests__/plugin-cocoindex-code-uninstall.test.js +19 -0
  9. package/__tests__/plugin-cocoindex-code.test.js +37 -0
  10. package/__tests__/plugin-install-guidance.test.js +81 -0
  11. package/__tests__/plugins-registry.test.js +44 -0
  12. package/__tests__/plugins-store.test.js +40 -5
  13. package/__tests__/process-adapter.test.js +50 -1
  14. package/__tests__/resend-plugin.test.js +22 -1
  15. package/__tests__/server-app.test.js +1 -0
  16. package/__tests__/server-routes-commands.test.js +20 -2
  17. package/__tests__/server-routes-plugins.test.js +130 -0
  18. package/__tests__/skills.test.js +26 -0
  19. package/__tests__/squirrelscan-plugin.test.js +129 -0
  20. package/__tests__/uipath-plugin.test.js +104 -0
  21. package/__tests__/uipathcli-plugin.test.js +95 -0
  22. package/cli/adapters/mcp.js +2 -0
  23. package/cli/adapters/process.js +49 -2
  24. package/cli/config.js +240 -3
  25. package/cli/discover.js +157 -0
  26. package/cli/help-json.js +16 -1
  27. package/cli/plugin-install-guidance.js +92 -37
  28. package/cli/plugins-manager.js +1 -0
  29. package/cli/plugins-registry.js +74 -8
  30. package/cli/plugins-store.js +78 -17
  31. package/cli/skills-mcp.js +1 -1
  32. package/cli/skills.js +39 -2
  33. package/cli/supercli.js +87 -11
  34. package/docs/feature-gaps.md +8 -8
  35. package/docs/features/azd-uipath-plugins.md +43 -0
  36. package/docs/features/server-plugins.md +62 -0
  37. package/docs/features/skills.md +9 -5
  38. package/docs/{supported-harnesses.md → plugins-available.md} +4 -3
  39. package/docs/{plugin-harness-guide.md → plugins-how-to.md} +1 -1
  40. package/docs/plugins.md +26 -20
  41. package/docs/server-plugins-usage-guide.md +182 -0
  42. package/docs/skills-catalog.md +12 -10
  43. package/package.json +1 -1
  44. package/plugins/agent-browser/README.md +69 -0
  45. package/plugins/agent-browser/plugin.json +111 -0
  46. package/plugins/agent-browser/skills/quickstart/SKILL.md +66 -0
  47. package/plugins/aider/README.md +53 -0
  48. package/plugins/aider/plugin.json +105 -0
  49. package/plugins/aider/scripts/aider-wrapper.js +243 -0
  50. package/plugins/aider/scripts/setup-aider.js +37 -0
  51. package/plugins/aider/skills/dry-run-review.md +24 -0
  52. package/plugins/aider/skills/model-and-provider.md +24 -0
  53. package/plugins/aider/skills/one-shot-edits.md +30 -0
  54. package/plugins/aider/skills/quickstart/SKILL.md +51 -0
  55. package/plugins/azd/README.md +28 -0
  56. package/plugins/azd/plugin.json +87 -0
  57. package/plugins/azd/skills/quickstart/SKILL.md +41 -0
  58. package/plugins/blogwatcher/README.md +3 -3
  59. package/plugins/boxlite/Dockerfile +9 -0
  60. package/plugins/boxlite/README.md +62 -0
  61. package/plugins/boxlite/plugin.json +201 -0
  62. package/plugins/boxlite/scripts/run-boxlite.js +106 -0
  63. package/plugins/boxlite/skills/quickstart/SKILL.md +40 -0
  64. package/plugins/cass/plugin.json +150 -0
  65. package/plugins/cass/scripts/setup-cass.js +47 -0
  66. package/plugins/cass/skills/quickstart/SKILL.md +46 -0
  67. package/plugins/clever/README.md +46 -0
  68. package/plugins/clever/plugin.json +119 -0
  69. package/plugins/clever/scripts/setup-clever.js +28 -0
  70. package/plugins/clever/skills/auth-and-profile.md +29 -0
  71. package/plugins/clever/skills/passthrough-safety.md +21 -0
  72. package/plugins/clever/skills/quickstart/SKILL.md +45 -0
  73. package/plugins/clever/skills/resource-inventory.md +24 -0
  74. package/plugins/clix/README.md +4 -4
  75. package/plugins/cocoindex-code/README.md +64 -0
  76. package/plugins/cocoindex-code/plugin.json +81 -0
  77. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-310.pyc +0 -0
  78. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-311.pyc +0 -0
  79. package/plugins/cocoindex-code/scripts/post-install.js +61 -0
  80. package/plugins/cocoindex-code/scripts/post-uninstall.js +25 -0
  81. package/plugins/cocoindex-code/scripts/query.py +88 -0
  82. package/plugins/cocoindex-code/scripts/run-query.js +50 -0
  83. package/plugins/cocoindex-code/skills/quickstart/SKILL.md +73 -0
  84. package/plugins/copilot/README.md +24 -0
  85. package/plugins/copilot/plugin.json +80 -0
  86. package/plugins/copilot/skills/quickstart/SKILL.md +44 -0
  87. package/plugins/gemini/README.md +24 -0
  88. package/plugins/gemini/plugin.json +98 -0
  89. package/plugins/gemini/skills/quickstart/SKILL.md +44 -0
  90. package/plugins/gifcap/plugin.json +119 -0
  91. package/plugins/gifcap/scripts/setup-gifcap.js +44 -0
  92. package/plugins/gifcap/skills/quickstart/SKILL.md +34 -0
  93. package/plugins/gifcap/test-record-quiet.gif +0 -0
  94. package/plugins/gifcap/test-record.gif +0 -0
  95. package/plugins/goose/README.md +36 -0
  96. package/plugins/goose/plugin.json +183 -0
  97. package/plugins/goose/skills/quickstart/SKILL.md +44 -0
  98. package/plugins/json-server/README.md +58 -0
  99. package/plugins/json-server/plugin.json +113 -0
  100. package/plugins/json-server/skills/quickstart/SKILL.md +57 -0
  101. package/plugins/lightpanda/README.md +145 -0
  102. package/plugins/lightpanda/package-lock.json +1375 -0
  103. package/plugins/lightpanda/package.json +12 -0
  104. package/plugins/lightpanda/plugin.json +116 -0
  105. package/plugins/lightpanda/scripts/lightpanda-contacts.js +494 -0
  106. package/plugins/lightpanda/scripts/lightpanda-generic-extract.js +403 -0
  107. package/plugins/lightpanda/scripts/lightpanda-wrapper.js +480 -0
  108. package/plugins/lightpanda/scripts/setup-lightpanda.js +39 -0
  109. package/plugins/lightpanda/skills/contact-discovery.md +51 -0
  110. package/plugins/lightpanda/skills/generic-extraction.md +66 -0
  111. package/plugins/lightpanda/skills/quickstart/SKILL.md +103 -0
  112. package/plugins/lightpanda/skills/resilient-navigation.md +42 -0
  113. package/plugins/monty/README.md +2 -2
  114. package/plugins/nullclaw/README.md +3 -3
  115. package/plugins/offline-ai/README.md +23 -0
  116. package/plugins/offline-ai/plugin.json +82 -0
  117. package/plugins/offline-ai/skills/quickstart/SKILL.md +43 -0
  118. package/plugins/openhands/README.md +25 -0
  119. package/plugins/openhands/plugin.json +116 -0
  120. package/plugins/openhands/skills/quickstart/SKILL.md +26 -0
  121. package/plugins/plandex/README.md +25 -0
  122. package/plugins/plandex/plugin.json +130 -0
  123. package/plugins/plandex/skills/quickstart/SKILL.md +50 -0
  124. package/plugins/plugins.json +190 -2
  125. package/plugins/resend/plugin.json +279 -2
  126. package/plugins/resend/skills/quickstart/SKILL.md +32 -13
  127. package/plugins/squirrelscan/Dockerfile +5 -0
  128. package/plugins/squirrelscan/README.md +47 -0
  129. package/plugins/squirrelscan/plugin.json +493 -0
  130. package/plugins/squirrelscan/scripts/post-install.js +33 -0
  131. package/plugins/squirrelscan/scripts/post-uninstall.js +25 -0
  132. package/plugins/squirrelscan/scripts/run-squirrel.js +73 -0
  133. package/plugins/squirrelscan/skills/audit-workflow/SKILL.md +33 -0
  134. package/plugins/squirrelscan/skills/publish-report/SKILL.md +33 -0
  135. package/plugins/squirrelscan/skills/quickstart/SKILL.md +41 -0
  136. package/plugins/uipath/README.md +27 -0
  137. package/plugins/uipath/plugin.json +86 -0
  138. package/plugins/uipath/skills/quickstart/SKILL.md +47 -0
  139. package/plugins/uipathcli/README.md +28 -0
  140. package/plugins/uipathcli/plugin.json +120 -0
  141. package/plugins/uipathcli/scripts/run-uipath-cli.js +49 -0
  142. package/plugins/uipathcli/skills/quickstart/SKILL.md +22 -0
  143. package/plugins/xurl/README.md +4 -4
  144. package/server/app.js +5 -2
  145. package/server/public/app.js +3 -0
  146. package/server/routes/commands.js +95 -12
  147. package/server/routes/plugins.js +262 -0
  148. package/server/services/pluginsService.js +303 -0
  149. package/server/views/command-edit.ejs +196 -14
  150. package/server/views/partials/head.ejs +1 -0
  151. package/server/views/plugins.ejs +264 -0
  152. package/tests/test-plugins-registry.js +30 -0
  153. package/tests/test-resend-smoke.sh +7 -3
  154. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +0 -20
  155. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +0 -1
  156. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +0 -21
  157. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +0 -1
  158. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +0 -22
  159. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +0 -1
  160. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +0 -23
  161. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +0 -1
  162. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +0 -24
  163. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +0 -1
  164. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +0 -24
  165. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +0 -1
  166. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +0 -24
  167. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +0 -1
  168. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +0 -24
  169. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +0 -1
  170. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +0 -24
  171. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +0 -1
  172. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +0 -24
  173. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +0 -1
  174. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +0 -24
  175. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +0 -1
  176. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +0 -24
  177. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +0 -1
  178. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +0 -24
  179. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +0 -1
  180. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +0 -25
  181. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +0 -1
  182. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +0 -25
  183. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +0 -1
  184. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +0 -25
  185. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +0 -1
  186. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +0 -26
  187. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +0 -1
  188. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +0 -27
  189. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +0 -1
  190. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +0 -28
  191. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +0 -1
  192. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +0 -29
  193. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +0 -1
  194. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +0 -30
  195. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +0 -1
  196. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +0 -31
  197. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +0 -1
  198. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +0 -32
  199. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +0 -1
  200. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +0 -32
  201. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +0 -1
  202. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +0 -32
  203. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +0 -1
  204. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +0 -32
  205. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +0 -1
  206. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +0 -32
  207. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +0 -1
  208. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +0 -32
  209. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +0 -1
  210. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +0 -32
  211. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +0 -1
  212. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +0 -32
  213. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +0 -1
  214. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +0 -32
  215. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +0 -1
  216. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +0 -32
  217. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +0 -1
  218. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +0 -32
  219. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +0 -1
  220. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +0 -32
  221. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +0 -1
  222. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +0 -32
  223. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +0 -1
  224. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +0 -32
  225. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +0 -1
  226. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +0 -33
  227. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +0 -1
  228. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +0 -33
  229. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +0 -1
  230. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +0 -34
  231. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +0 -1
  232. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +0 -34
  233. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +0 -1
  234. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +0 -35
  235. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +0 -1
  236. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +0 -36
  237. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +0 -1
  238. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +0 -37
  239. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +0 -1
  240. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +0 -38
  241. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +0 -1
  242. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +0 -39
  243. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +0 -1
  244. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +0 -40
  245. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +0 -1
  246. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +0 -41
  247. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +0 -1
  248. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +0 -42
  249. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +0 -1
  250. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +0 -43
  251. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +0 -1
  252. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +0 -44
  253. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +0 -1
  254. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +0 -45
  255. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +0 -1
  256. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +0 -46
  257. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +0 -1
  258. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +0 -47
  259. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +0 -1
  260. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +0 -48
  261. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +0 -1
  262. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +0 -49
  263. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +0 -1
  264. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +0 -50
  265. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +0 -1
  266. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +0 -51
  267. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +0 -1
  268. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +0 -52
  269. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +0 -1
  270. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +0 -53
  271. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +0 -1
  272. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +0 -54
  273. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +0 -1
  274. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +0 -55
  275. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +0 -1
  276. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +0 -56
  277. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +0 -1
  278. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +0 -57
  279. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +0 -1
  280. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +0 -57
  281. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +0 -1
  282. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +0 -57
  283. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +0 -1
  284. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +0 -57
  285. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +0 -1
  286. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +0 -57
  287. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +0 -1
  288. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +0 -57
  289. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +0 -1
  290. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +0 -57
  291. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +0 -1
  292. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +0 -57
  293. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +0 -1
  294. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +0 -57
  295. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +0 -1
  296. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +0 -57
  297. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +0 -1
  298. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +0 -57
  299. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +0 -1
  300. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +0 -57
  301. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +0 -1
  302. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +0 -57
  303. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +0 -1
  304. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +0 -57
  305. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +0 -1
  306. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +0 -57
  307. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +0 -1
  308. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +0 -57
  309. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +0 -1
  310. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +0 -57
  311. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +0 -1
  312. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +0 -57
  313. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +0 -1
  314. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +0 -57
  315. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +0 -1
  316. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +0 -57
  317. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +0 -1
  318. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +0 -57
  319. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +0 -1
  320. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +0 -57
  321. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +0 -1
  322. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +0 -57
  323. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +0 -1
  324. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +0 -57
  325. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +0 -1
  326. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +0 -57
  327. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +0 -1
  328. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +0 -57
  329. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +0 -1
  330. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +0 -57
  331. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +0 -1
  332. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +0 -57
  333. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +0 -1
  334. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +0 -57
  335. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +0 -1
  336. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +0 -57
  337. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +0 -1
  338. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +0 -58
  339. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +0 -1
  340. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +0 -59
  341. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +0 -1
  342. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +0 -60
  343. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +0 -1
  344. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +0 -60
  345. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +0 -1
  346. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +0 -60
  347. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +0 -1
  348. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +0 -60
  349. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +0 -1
  350. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +0 -60
  351. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +0 -1
  352. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +0 -60
  353. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +0 -1
  354. package/.beads/config.yaml +0 -4
  355. package/.beads/issues.jsonl +0 -60
  356. package/.beads/metadata.json +0 -4
  357. package/docs/mcp-cheatsheet.md +0 -324
  358. package/docs/visual-overview.md +0 -21
  359. package/ref-monty/.cargo/config.toml +0 -3
  360. package/ref-monty/.claude/settings.json +0 -60
  361. package/ref-monty/.claude/skills/fastmod/SKILL.md +0 -22
  362. package/ref-monty/.claude/skills/python-playground/SKILL.md +0 -47
  363. package/ref-monty/.codecov.yml +0 -12
  364. package/ref-monty/.github/actions/build-pgo-wheel/action.yml +0 -72
  365. package/ref-monty/.github/workflows/ci.yml +0 -776
  366. package/ref-monty/.github/workflows/codspeed.yml +0 -45
  367. package/ref-monty/.github/workflows/init-npm-packages.yml +0 -82
  368. package/ref-monty/.pre-commit-config.yaml +0 -47
  369. package/ref-monty/.python-version +0 -1
  370. package/ref-monty/.rustfmt.toml +0 -4
  371. package/ref-monty/.zed/settings.json +0 -11
  372. package/ref-monty/CLAUDE.md +0 -535
  373. package/ref-monty/Cargo.lock +0 -3798
  374. package/ref-monty/Cargo.toml +0 -87
  375. package/ref-monty/LICENSE +0 -21
  376. package/ref-monty/Makefile +0 -216
  377. package/ref-monty/README.md +0 -430
  378. package/ref-monty/RELEASING.md +0 -47
  379. package/ref-monty/crates/fuzz/Cargo.toml +0 -30
  380. package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +0 -37
  381. package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +0 -552
  382. package/ref-monty/crates/monty/Cargo.toml +0 -68
  383. package/ref-monty/crates/monty/benches/main.rs +0 -247
  384. package/ref-monty/crates/monty/build.rs +0 -10
  385. package/ref-monty/crates/monty/src/args.rs +0 -733
  386. package/ref-monty/crates/monty/src/asyncio.rs +0 -179
  387. package/ref-monty/crates/monty/src/builtins/abs.rs +0 -55
  388. package/ref-monty/crates/monty/src/builtins/all.rs +0 -30
  389. package/ref-monty/crates/monty/src/builtins/any.rs +0 -30
  390. package/ref-monty/crates/monty/src/builtins/bin.rs +0 -59
  391. package/ref-monty/crates/monty/src/builtins/chr.rs +0 -46
  392. package/ref-monty/crates/monty/src/builtins/divmod.rs +0 -164
  393. package/ref-monty/crates/monty/src/builtins/enumerate.rs +0 -52
  394. package/ref-monty/crates/monty/src/builtins/filter.rs +0 -67
  395. package/ref-monty/crates/monty/src/builtins/getattr.rs +0 -65
  396. package/ref-monty/crates/monty/src/builtins/hash.rs +0 -28
  397. package/ref-monty/crates/monty/src/builtins/hex.rs +0 -58
  398. package/ref-monty/crates/monty/src/builtins/id.rs +0 -24
  399. package/ref-monty/crates/monty/src/builtins/isinstance.rs +0 -68
  400. package/ref-monty/crates/monty/src/builtins/len.rs +0 -25
  401. package/ref-monty/crates/monty/src/builtins/map.rs +0 -98
  402. package/ref-monty/crates/monty/src/builtins/min_max.rs +0 -113
  403. package/ref-monty/crates/monty/src/builtins/mod.rs +0 -246
  404. package/ref-monty/crates/monty/src/builtins/next.rs +0 -21
  405. package/ref-monty/crates/monty/src/builtins/oct.rs +0 -59
  406. package/ref-monty/crates/monty/src/builtins/ord.rs +0 -67
  407. package/ref-monty/crates/monty/src/builtins/pow.rs +0 -365
  408. package/ref-monty/crates/monty/src/builtins/print.rs +0 -141
  409. package/ref-monty/crates/monty/src/builtins/repr.rs +0 -16
  410. package/ref-monty/crates/monty/src/builtins/reversed.rs +0 -28
  411. package/ref-monty/crates/monty/src/builtins/round.rs +0 -174
  412. package/ref-monty/crates/monty/src/builtins/sorted.rs +0 -151
  413. package/ref-monty/crates/monty/src/builtins/sum.rs +0 -66
  414. package/ref-monty/crates/monty/src/builtins/type_.rs +0 -16
  415. package/ref-monty/crates/monty/src/builtins/zip.rs +0 -77
  416. package/ref-monty/crates/monty/src/bytecode/builder.rs +0 -699
  417. package/ref-monty/crates/monty/src/bytecode/code.rs +0 -310
  418. package/ref-monty/crates/monty/src/bytecode/compiler.rs +0 -3206
  419. package/ref-monty/crates/monty/src/bytecode/mod.rs +0 -24
  420. package/ref-monty/crates/monty/src/bytecode/op.rs +0 -617
  421. package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +0 -1058
  422. package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +0 -63
  423. package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +0 -487
  424. package/ref-monty/crates/monty/src/bytecode/vm/call.rs +0 -767
  425. package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +0 -741
  426. package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +0 -147
  427. package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +0 -297
  428. package/ref-monty/crates/monty/src/bytecode/vm/format.rs +0 -132
  429. package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +0 -1958
  430. package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +0 -620
  431. package/ref-monty/crates/monty/src/exception_private.rs +0 -1513
  432. package/ref-monty/crates/monty/src/exception_public.rs +0 -346
  433. package/ref-monty/crates/monty/src/expressions.rs +0 -694
  434. package/ref-monty/crates/monty/src/fstring.rs +0 -854
  435. package/ref-monty/crates/monty/src/function.rs +0 -119
  436. package/ref-monty/crates/monty/src/heap.rs +0 -1073
  437. package/ref-monty/crates/monty/src/heap_data.rs +0 -985
  438. package/ref-monty/crates/monty/src/heap_traits.rs +0 -312
  439. package/ref-monty/crates/monty/src/intern.rs +0 -837
  440. package/ref-monty/crates/monty/src/io.rs +0 -106
  441. package/ref-monty/crates/monty/src/lib.rs +0 -52
  442. package/ref-monty/crates/monty/src/modules/asyncio.rs +0 -144
  443. package/ref-monty/crates/monty/src/modules/math.rs +0 -1453
  444. package/ref-monty/crates/monty/src/modules/mod.rs +0 -120
  445. package/ref-monty/crates/monty/src/modules/os.rs +0 -116
  446. package/ref-monty/crates/monty/src/modules/pathlib.rs +0 -33
  447. package/ref-monty/crates/monty/src/modules/re.rs +0 -606
  448. package/ref-monty/crates/monty/src/modules/sys.rs +0 -60
  449. package/ref-monty/crates/monty/src/modules/typing.rs +0 -70
  450. package/ref-monty/crates/monty/src/namespace.rs +0 -21
  451. package/ref-monty/crates/monty/src/object.rs +0 -1040
  452. package/ref-monty/crates/monty/src/os.rs +0 -215
  453. package/ref-monty/crates/monty/src/parse.rs +0 -1730
  454. package/ref-monty/crates/monty/src/prepare.rs +0 -3015
  455. package/ref-monty/crates/monty/src/repl.rs +0 -1109
  456. package/ref-monty/crates/monty/src/resource.rs +0 -559
  457. package/ref-monty/crates/monty/src/run.rs +0 -457
  458. package/ref-monty/crates/monty/src/run_progress.rs +0 -821
  459. package/ref-monty/crates/monty/src/signature.rs +0 -651
  460. package/ref-monty/crates/monty/src/sorting.rs +0 -100
  461. package/ref-monty/crates/monty/src/types/bytes.rs +0 -2356
  462. package/ref-monty/crates/monty/src/types/dataclass.rs +0 -345
  463. package/ref-monty/crates/monty/src/types/dict.rs +0 -879
  464. package/ref-monty/crates/monty/src/types/dict_view.rs +0 -619
  465. package/ref-monty/crates/monty/src/types/iter.rs +0 -799
  466. package/ref-monty/crates/monty/src/types/list.rs +0 -929
  467. package/ref-monty/crates/monty/src/types/long_int.rs +0 -211
  468. package/ref-monty/crates/monty/src/types/mod.rs +0 -48
  469. package/ref-monty/crates/monty/src/types/module.rs +0 -146
  470. package/ref-monty/crates/monty/src/types/namedtuple.rs +0 -261
  471. package/ref-monty/crates/monty/src/types/path.rs +0 -596
  472. package/ref-monty/crates/monty/src/types/property.rs +0 -35
  473. package/ref-monty/crates/monty/src/types/py_trait.rs +0 -322
  474. package/ref-monty/crates/monty/src/types/range.rs +0 -285
  475. package/ref-monty/crates/monty/src/types/re_match.rs +0 -522
  476. package/ref-monty/crates/monty/src/types/re_pattern.rs +0 -726
  477. package/ref-monty/crates/monty/src/types/set.rs +0 -1373
  478. package/ref-monty/crates/monty/src/types/slice.rs +0 -257
  479. package/ref-monty/crates/monty/src/types/str.rs +0 -2051
  480. package/ref-monty/crates/monty/src/types/tuple.rs +0 -376
  481. package/ref-monty/crates/monty/src/types/type.rs +0 -407
  482. package/ref-monty/crates/monty/src/value.rs +0 -2558
  483. package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +0 -3
  484. package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +0 -3
  485. package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +0 -3
  486. package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +0 -3
  487. package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +0 -3
  488. package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +0 -3
  489. package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +0 -3
  490. package/ref-monty/crates/monty/test_cases/args__id_too_many.py +0 -2
  491. package/ref-monty/crates/monty/test_cases/args__len_no_args.py +0 -2
  492. package/ref-monty/crates/monty/test_cases/args__len_too_many.py +0 -2
  493. package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +0 -9
  494. package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +0 -9
  495. package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +0 -3
  496. package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +0 -3
  497. package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +0 -3
  498. package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +0 -3
  499. package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +0 -2
  500. package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +0 -2
  501. package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +0 -2
  502. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +0 -2
  503. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +0 -2
  504. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +0 -2
  505. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +0 -9
  506. package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +0 -2
  507. package/ref-monty/crates/monty/test_cases/assert__fail.py +0 -2
  508. package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +0 -2
  509. package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +0 -3
  510. package/ref-monty/crates/monty/test_cases/assert__ops.py +0 -11
  511. package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +0 -47
  512. package/ref-monty/crates/monty/test_cases/async__basic.py +0 -10
  513. package/ref-monty/crates/monty/test_cases/async__closure.py +0 -14
  514. package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +0 -16
  515. package/ref-monty/crates/monty/test_cases/async__exception.py +0 -10
  516. package/ref-monty/crates/monty/test_cases/async__ext_call.py +0 -73
  517. package/ref-monty/crates/monty/test_cases/async__gather_all.py +0 -85
  518. package/ref-monty/crates/monty/test_cases/async__nested_await.py +0 -15
  519. package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +0 -37
  520. package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +0 -10
  521. package/ref-monty/crates/monty/test_cases/async__not_imported.py +0 -14
  522. package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +0 -27
  523. package/ref-monty/crates/monty/test_cases/async__return_types.py +0 -31
  524. package/ref-monty/crates/monty/test_cases/async__sequential.py +0 -16
  525. package/ref-monty/crates/monty/test_cases/async__traceback.py +0 -19
  526. package/ref-monty/crates/monty/test_cases/async__with_args.py +0 -14
  527. package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +0 -9
  528. package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +0 -9
  529. package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +0 -12
  530. package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +0 -10
  531. package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +0 -10
  532. package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +0 -68
  533. package/ref-monty/crates/monty/test_cases/bool__ops.py +0 -20
  534. package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +0 -2
  535. package/ref-monty/crates/monty/test_cases/builtin__filter.py +0 -62
  536. package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +0 -11
  537. package/ref-monty/crates/monty/test_cases/builtin__getattr.py +0 -84
  538. package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +0 -42
  539. package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +0 -66
  540. package/ref-monty/crates/monty/test_cases/builtin__map.py +0 -74
  541. package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +0 -11
  542. package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +0 -154
  543. package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +0 -148
  544. package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +0 -10
  545. package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +0 -9
  546. package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +0 -12
  547. package/ref-monty/crates/monty/test_cases/builtin__repr.py +0 -3
  548. package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +0 -73
  549. package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +0 -18
  550. package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +0 -10
  551. package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +0 -10
  552. package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +0 -10
  553. package/ref-monty/crates/monty/test_cases/bytes__methods.py +0 -394
  554. package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +0 -9
  555. package/ref-monty/crates/monty/test_cases/bytes__ops.py +0 -90
  556. package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +0 -10
  557. package/ref-monty/crates/monty/test_cases/call_object.py +0 -3
  558. package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +0 -79
  559. package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +0 -81
  560. package/ref-monty/crates/monty/test_cases/closure__pep448.py +0 -203
  561. package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +0 -13
  562. package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +0 -120
  563. package/ref-monty/crates/monty/test_cases/comprehension__all.py +0 -208
  564. package/ref-monty/crates/monty/test_cases/comprehension__scope.py +0 -7
  565. package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +0 -14
  566. package/ref-monty/crates/monty/test_cases/dataclass__basic.py +0 -238
  567. package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +0 -12
  568. package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +0 -12
  569. package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +0 -11
  570. package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +0 -3
  571. package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +0 -2
  572. package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +0 -3
  573. package/ref-monty/crates/monty/test_cases/dict__methods.py +0 -151
  574. package/ref-monty/crates/monty/test_cases/dict__ops.py +0 -133
  575. package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +0 -4
  576. package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +0 -9
  577. package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +0 -3
  578. package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +0 -2
  579. package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +0 -2
  580. package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +0 -2
  581. package/ref-monty/crates/monty/test_cases/dict__views.py +0 -165
  582. package/ref-monty/crates/monty/test_cases/edge__all.py +0 -26
  583. package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +0 -2
  584. package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +0 -2
  585. package/ref-monty/crates/monty/test_cases/exc__args.py +0 -16
  586. package/ref-monty/crates/monty/test_cases/exc__str.py +0 -15
  587. package/ref-monty/crates/monty/test_cases/execute_ok__all.py +0 -54
  588. package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +0 -2
  589. package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +0 -2
  590. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +0 -2
  591. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +0 -2
  592. package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +0 -2
  593. package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +0 -4
  594. package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +0 -2
  595. package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +0 -2
  596. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +0 -4
  597. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +0 -3
  598. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +0 -4
  599. package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +0 -22
  600. package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +0 -17
  601. package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +0 -7
  602. package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +0 -34
  603. package/ref-monty/crates/monty/test_cases/ext_call__basic.py +0 -99
  604. package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +0 -37
  605. package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +0 -17
  606. package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +0 -16
  607. package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +0 -26
  608. package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +0 -18
  609. package/ref-monty/crates/monty/test_cases/ext_call__elif.py +0 -171
  610. package/ref-monty/crates/monty/test_cases/ext_call__exc.py +0 -4
  611. package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +0 -39
  612. package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +0 -17
  613. package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +0 -31
  614. package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +0 -171
  615. package/ref-monty/crates/monty/test_cases/ext_call__for.py +0 -114
  616. package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +0 -12
  617. package/ref-monty/crates/monty/test_cases/ext_call__if.py +0 -135
  618. package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +0 -37
  619. package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +0 -14
  620. package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +0 -40
  621. package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +0 -7
  622. package/ref-monty/crates/monty/test_cases/ext_call__literals.py +0 -17
  623. package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +0 -32
  624. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +0 -69
  625. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +0 -4
  626. package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +0 -14
  627. package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +0 -19
  628. package/ref-monty/crates/monty/test_cases/ext_call__return.py +0 -28
  629. package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +0 -25
  630. package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +0 -7
  631. package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +0 -28
  632. package/ref-monty/crates/monty/test_cases/ext_call__try.py +0 -280
  633. package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +0 -10
  634. package/ref-monty/crates/monty/test_cases/ext_call__unary.py +0 -13
  635. package/ref-monty/crates/monty/test_cases/frozenset__ops.py +0 -178
  636. package/ref-monty/crates/monty/test_cases/fstring__all.py +0 -236
  637. package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +0 -3
  638. package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +0 -3
  639. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +0 -3
  640. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +0 -3
  641. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +0 -4
  642. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +0 -4
  643. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +0 -4
  644. package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +0 -3
  645. package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +0 -6
  646. package/ref-monty/crates/monty/test_cases/function__call_unpack.py +0 -42
  647. package/ref-monty/crates/monty/test_cases/function__defaults.py +0 -117
  648. package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +0 -7
  649. package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +0 -7
  650. package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +0 -9
  651. package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +0 -7
  652. package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +0 -7
  653. package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +0 -9
  654. package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +0 -7
  655. package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +0 -7
  656. package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +0 -7
  657. package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +0 -7
  658. package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +0 -7
  659. package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +0 -7
  660. package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +0 -7
  661. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +0 -7
  662. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +0 -9
  663. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +0 -13
  664. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +0 -7
  665. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +0 -6
  666. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +0 -8
  667. package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +0 -6
  668. package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +0 -6
  669. package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +0 -6
  670. package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +0 -173
  671. package/ref-monty/crates/monty/test_cases/function__ops.py +0 -294
  672. package/ref-monty/crates/monty/test_cases/function__return_none.py +0 -42
  673. package/ref-monty/crates/monty/test_cases/function__signatures.py +0 -47
  674. package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +0 -6
  675. package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +0 -6
  676. package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +0 -6
  677. package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +0 -6
  678. package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +0 -6
  679. package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +0 -6
  680. package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +0 -7
  681. package/ref-monty/crates/monty/test_cases/global__ops.py +0 -163
  682. package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +0 -2
  683. package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +0 -2
  684. package/ref-monty/crates/monty/test_cases/hash__ops.py +0 -153
  685. package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +0 -3
  686. package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +0 -5
  687. package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +0 -3
  688. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +0 -10
  689. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +0 -6
  690. package/ref-monty/crates/monty/test_cases/id__ops.py +0 -97
  691. package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +0 -3
  692. package/ref-monty/crates/monty/test_cases/if__elif_else.py +0 -207
  693. package/ref-monty/crates/monty/test_cases/if__raise_elif.py +0 -11
  694. package/ref-monty/crates/monty/test_cases/if__raise_else.py +0 -13
  695. package/ref-monty/crates/monty/test_cases/if__raise_if.py +0 -9
  696. package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +0 -18
  697. package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +0 -16
  698. package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +0 -55
  699. package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +0 -9
  700. package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +0 -9
  701. package/ref-monty/crates/monty/test_cases/import__local_scope.py +0 -68
  702. package/ref-monty/crates/monty/test_cases/import__os.py +0 -25
  703. package/ref-monty/crates/monty/test_cases/import__relative_error.py +0 -9
  704. package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +0 -9
  705. package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +0 -14
  706. package/ref-monty/crates/monty/test_cases/import__star_error.py +0 -11
  707. package/ref-monty/crates/monty/test_cases/import__sys.py +0 -47
  708. package/ref-monty/crates/monty/test_cases/import__sys_monty.py +0 -28
  709. package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +0 -37
  710. package/ref-monty/crates/monty/test_cases/import__typing.py +0 -25
  711. package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +0 -4
  712. package/ref-monty/crates/monty/test_cases/int__bigint.py +0 -467
  713. package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +0 -260
  714. package/ref-monty/crates/monty/test_cases/int__ops.py +0 -219
  715. package/ref-monty/crates/monty/test_cases/int__overflow_division.py +0 -84
  716. package/ref-monty/crates/monty/test_cases/is_variant__all.py +0 -36
  717. package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +0 -2
  718. package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +0 -2
  719. package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +0 -4
  720. package/ref-monty/crates/monty/test_cases/iter__for.py +0 -243
  721. package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +0 -66
  722. package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +0 -20
  723. package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +0 -7
  724. package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +0 -3
  725. package/ref-monty/crates/monty/test_cases/lambda__all.py +0 -145
  726. package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +0 -7
  727. package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +0 -3
  728. package/ref-monty/crates/monty/test_cases/list__index_not_found.py +0 -9
  729. package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +0 -10
  730. package/ref-monty/crates/monty/test_cases/list__ops.py +0 -473
  731. package/ref-monty/crates/monty/test_cases/list__pop_empty.py +0 -9
  732. package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +0 -9
  733. package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +0 -9
  734. package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +0 -9
  735. package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +0 -13
  736. package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +0 -13
  737. package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +0 -10
  738. package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +0 -10
  739. package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +0 -2
  740. package/ref-monty/crates/monty/test_cases/longint__index_error.py +0 -3
  741. package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +0 -3
  742. package/ref-monty/crates/monty/test_cases/loop__break_continue.py +0 -113
  743. package/ref-monty/crates/monty/test_cases/loop__break_finally.py +0 -69
  744. package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +0 -13
  745. package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +0 -11
  746. package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +0 -55
  747. package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +0 -9
  748. package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +0 -81
  749. package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +0 -13
  750. package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +0 -11
  751. package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +0 -60
  752. package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +0 -9
  753. package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +0 -11
  754. package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +0 -11
  755. package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +0 -11
  756. package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +0 -11
  757. package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +0 -11
  758. package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +0 -11
  759. package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +0 -11
  760. package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +0 -11
  761. package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +0 -11
  762. package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +0 -11
  763. package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +0 -11
  764. package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +0 -11
  765. package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +0 -11
  766. package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +0 -11
  767. package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +0 -11
  768. package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +0 -11
  769. package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +0 -11
  770. package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +0 -11
  771. package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +0 -11
  772. package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +0 -11
  773. package/ref-monty/crates/monty/test_cases/math__module.py +0 -1432
  774. package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +0 -11
  775. package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +0 -11
  776. package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +0 -11
  777. package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +0 -11
  778. package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +0 -11
  779. package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +0 -259
  780. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +0 -19
  781. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +0 -12
  782. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +0 -9
  783. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +0 -9
  784. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +0 -16
  785. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +0 -9
  786. package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +0 -10
  787. package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +0 -11
  788. package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +0 -34
  789. package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +0 -3
  790. package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +0 -353
  791. package/ref-monty/crates/monty/test_cases/os__environ.py +0 -40
  792. package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +0 -5
  793. package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +0 -5
  794. package/ref-monty/crates/monty/test_cases/parse_error__complex.py +0 -3
  795. package/ref-monty/crates/monty/test_cases/pathlib__import.py +0 -11
  796. package/ref-monty/crates/monty/test_cases/pathlib__os.py +0 -136
  797. package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +0 -12
  798. package/ref-monty/crates/monty/test_cases/pathlib__pure.py +0 -81
  799. package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +0 -5
  800. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +0 -6
  801. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +0 -5
  802. package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +0 -6
  803. package/ref-monty/crates/monty/test_cases/range__error_no_args.py +0 -2
  804. package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +0 -2
  805. package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +0 -2
  806. package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +0 -10
  807. package/ref-monty/crates/monty/test_cases/range__ops.py +0 -236
  808. package/ref-monty/crates/monty/test_cases/re__basic.py +0 -756
  809. package/ref-monty/crates/monty/test_cases/re__grouping.py +0 -241
  810. package/ref-monty/crates/monty/test_cases/re__match.py +0 -148
  811. package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +0 -26
  812. package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +0 -23
  813. package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +0 -46
  814. package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +0 -12
  815. package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +0 -13
  816. package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +0 -18
  817. package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +0 -12
  818. package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +0 -5
  819. package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +0 -5
  820. package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +0 -14
  821. package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +0 -6
  822. package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +0 -16
  823. package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +0 -18
  824. package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +0 -25
  825. package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +0 -4
  826. package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +0 -27
  827. package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +0 -6
  828. package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +0 -5
  829. package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +0 -5
  830. package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +0 -5
  831. package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +0 -5
  832. package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +0 -4
  833. package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +0 -37
  834. package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +0 -34
  835. package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +0 -31
  836. package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +0 -4
  837. package/ref-monty/crates/monty/test_cases/refcount__single_list.py +0 -3
  838. package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +0 -24
  839. package/ref-monty/crates/monty/test_cases/set__ops.py +0 -191
  840. package/ref-monty/crates/monty/test_cases/set__review_bugs.py +0 -35
  841. package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +0 -2
  842. package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +0 -2
  843. package/ref-monty/crates/monty/test_cases/slice__kwargs.py +0 -9
  844. package/ref-monty/crates/monty/test_cases/slice__no_args.py +0 -9
  845. package/ref-monty/crates/monty/test_cases/slice__ops.py +0 -149
  846. package/ref-monty/crates/monty/test_cases/slice__step_zero.py +0 -9
  847. package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +0 -9
  848. package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +0 -9
  849. package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +0 -9
  850. package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +0 -9
  851. package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +0 -9
  852. package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +0 -10
  853. package/ref-monty/crates/monty/test_cases/str__index_not_found.py +0 -9
  854. package/ref-monty/crates/monty/test_cases/str__join_no_args.py +0 -9
  855. package/ref-monty/crates/monty/test_cases/str__join_non_string.py +0 -9
  856. package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +0 -9
  857. package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +0 -9
  858. package/ref-monty/crates/monty/test_cases/str__methods.py +0 -327
  859. package/ref-monty/crates/monty/test_cases/str__ops.py +0 -162
  860. package/ref-monty/crates/monty/test_cases/str__partition_empty.py +0 -9
  861. package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +0 -9
  862. package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +0 -9
  863. package/ref-monty/crates/monty/test_cases/sys__types.py +0 -7
  864. package/ref-monty/crates/monty/test_cases/traceback__division_error.py +0 -30
  865. package/ref-monty/crates/monty/test_cases/traceback__index_error.py +0 -17
  866. package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +0 -10
  867. package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +0 -29
  868. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +0 -10
  869. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +0 -24
  870. package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +0 -9
  871. package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +0 -23
  872. package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +0 -11
  873. package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +0 -16
  874. package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +0 -16
  875. package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +0 -16
  876. package/ref-monty/crates/monty/test_cases/try_except__all.py +0 -472
  877. package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +0 -2
  878. package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +0 -5
  879. package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +0 -3
  880. package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +0 -9
  881. package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +0 -10
  882. package/ref-monty/crates/monty/test_cases/tuple__methods.py +0 -19
  883. package/ref-monty/crates/monty/test_cases/tuple__ops.py +0 -133
  884. package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +0 -2
  885. package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +0 -9
  886. package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +0 -2
  887. package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +0 -9
  888. package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +0 -11
  889. package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +0 -2
  890. package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +0 -9
  891. package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +0 -9
  892. package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +0 -9
  893. package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +0 -2
  894. package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +0 -2
  895. package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +0 -9
  896. package/ref-monty/crates/monty/test_cases/type__ops.py +0 -200
  897. package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +0 -3
  898. package/ref-monty/crates/monty/test_cases/type__shadow_int.py +0 -9
  899. package/ref-monty/crates/monty/test_cases/type__shadow_len.py +0 -3
  900. package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +0 -2
  901. package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +0 -2
  902. package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +0 -2
  903. package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +0 -2
  904. package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +0 -3
  905. package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +0 -2
  906. package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +0 -2
  907. package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +0 -2
  908. package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +0 -2
  909. package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +0 -2
  910. package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +0 -6
  911. package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +0 -2
  912. package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +0 -3
  913. package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +0 -3
  914. package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +0 -4
  915. package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +0 -3
  916. package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +0 -4
  917. package/ref-monty/crates/monty/test_cases/typing__types.py +0 -24
  918. package/ref-monty/crates/monty/test_cases/unpack__nested.py +0 -48
  919. package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +0 -9
  920. package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +0 -9
  921. package/ref-monty/crates/monty/test_cases/unpack__ops.py +0 -153
  922. package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +0 -9
  923. package/ref-monty/crates/monty/test_cases/unpack__too_many.py +0 -9
  924. package/ref-monty/crates/monty/test_cases/version__cpython.py +0 -4
  925. package/ref-monty/crates/monty/test_cases/walrus__all.py +0 -178
  926. package/ref-monty/crates/monty/test_cases/while__all.py +0 -206
  927. package/ref-monty/crates/monty/tests/asyncio.rs +0 -764
  928. package/ref-monty/crates/monty/tests/binary_serde.rs +0 -185
  929. package/ref-monty/crates/monty/tests/bytecode_limits.rs +0 -248
  930. package/ref-monty/crates/monty/tests/datatest_runner.rs +0 -2029
  931. package/ref-monty/crates/monty/tests/inputs.rs +0 -420
  932. package/ref-monty/crates/monty/tests/json_serde.rs +0 -250
  933. package/ref-monty/crates/monty/tests/main.rs +0 -71
  934. package/ref-monty/crates/monty/tests/math_module.rs +0 -114
  935. package/ref-monty/crates/monty/tests/name_lookup.rs +0 -482
  936. package/ref-monty/crates/monty/tests/os_tests.rs +0 -459
  937. package/ref-monty/crates/monty/tests/parse_errors.rs +0 -441
  938. package/ref-monty/crates/monty/tests/print_writer.rs +0 -238
  939. package/ref-monty/crates/monty/tests/py_object.rs +0 -121
  940. package/ref-monty/crates/monty/tests/regex.rs +0 -90
  941. package/ref-monty/crates/monty/tests/repl.rs +0 -344
  942. package/ref-monty/crates/monty/tests/resource_limits.rs +0 -1826
  943. package/ref-monty/crates/monty/tests/try_from.rs +0 -167
  944. package/ref-monty/crates/monty-cli/Cargo.toml +0 -25
  945. package/ref-monty/crates/monty-cli/src/main.rs +0 -541
  946. package/ref-monty/crates/monty-js/.cargo/config.toml +0 -2
  947. package/ref-monty/crates/monty-js/.prettierignore +0 -8
  948. package/ref-monty/crates/monty-js/Cargo.toml +0 -32
  949. package/ref-monty/crates/monty-js/README.md +0 -207
  950. package/ref-monty/crates/monty-js/__test__/async.spec.ts +0 -350
  951. package/ref-monty/crates/monty-js/__test__/basic.spec.ts +0 -114
  952. package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +0 -427
  953. package/ref-monty/crates/monty-js/__test__/external.spec.ts +0 -354
  954. package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +0 -143
  955. package/ref-monty/crates/monty-js/__test__/limits.spec.ts +0 -162
  956. package/ref-monty/crates/monty-js/__test__/package.json +0 -3
  957. package/ref-monty/crates/monty-js/__test__/print.spec.ts +0 -229
  958. package/ref-monty/crates/monty-js/__test__/repl.spec.ts +0 -34
  959. package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +0 -205
  960. package/ref-monty/crates/monty-js/__test__/start.spec.ts +0 -443
  961. package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +0 -147
  962. package/ref-monty/crates/monty-js/__test__/types.spec.ts +0 -319
  963. package/ref-monty/crates/monty-js/build.rs +0 -61
  964. package/ref-monty/crates/monty-js/index-header.d.ts +0 -3
  965. package/ref-monty/crates/monty-js/package-lock.json +0 -4694
  966. package/ref-monty/crates/monty-js/package.json +0 -100
  967. package/ref-monty/crates/monty-js/scripts/smoke-test.sh +0 -69
  968. package/ref-monty/crates/monty-js/smoke-test/package.json +0 -17
  969. package/ref-monty/crates/monty-js/smoke-test/test.ts +0 -171
  970. package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +0 -11
  971. package/ref-monty/crates/monty-js/src/convert.rs +0 -648
  972. package/ref-monty/crates/monty-js/src/exceptions.rs +0 -293
  973. package/ref-monty/crates/monty-js/src/lib.rs +0 -41
  974. package/ref-monty/crates/monty-js/src/limits.rs +0 -53
  975. package/ref-monty/crates/monty-js/src/monty_cls.rs +0 -1407
  976. package/ref-monty/crates/monty-js/tsconfig.json +0 -17
  977. package/ref-monty/crates/monty-js/wrapper.ts +0 -701
  978. package/ref-monty/crates/monty-python/Cargo.toml +0 -38
  979. package/ref-monty/crates/monty-python/README.md +0 -134
  980. package/ref-monty/crates/monty-python/build.rs +0 -4
  981. package/ref-monty/crates/monty-python/example.py +0 -40
  982. package/ref-monty/crates/monty-python/exercise.py +0 -46
  983. package/ref-monty/crates/monty-python/pyproject.toml +0 -57
  984. package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +0 -281
  985. package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +0 -677
  986. package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +0 -933
  987. package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
  988. package/ref-monty/crates/monty-python/src/convert.rs +0 -273
  989. package/ref-monty/crates/monty-python/src/dataclass.rs +0 -461
  990. package/ref-monty/crates/monty-python/src/exceptions.rs +0 -557
  991. package/ref-monty/crates/monty-python/src/external.rs +0 -165
  992. package/ref-monty/crates/monty-python/src/lib.rs +0 -77
  993. package/ref-monty/crates/monty-python/src/limits.rs +0 -142
  994. package/ref-monty/crates/monty-python/src/monty_cls.rs +0 -1650
  995. package/ref-monty/crates/monty-python/src/repl.rs +0 -470
  996. package/ref-monty/crates/monty-python/src/serialization.rs +0 -761
  997. package/ref-monty/crates/monty-python/tests/test_async.py +0 -1201
  998. package/ref-monty/crates/monty-python/tests/test_basic.py +0 -66
  999. package/ref-monty/crates/monty-python/tests/test_dataclasses.py +0 -971
  1000. package/ref-monty/crates/monty-python/tests/test_exceptions.py +0 -361
  1001. package/ref-monty/crates/monty-python/tests/test_external.py +0 -367
  1002. package/ref-monty/crates/monty-python/tests/test_inputs.py +0 -126
  1003. package/ref-monty/crates/monty-python/tests/test_limits.py +0 -257
  1004. package/ref-monty/crates/monty-python/tests/test_os_access.py +0 -1286
  1005. package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +0 -731
  1006. package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +0 -483
  1007. package/ref-monty/crates/monty-python/tests/test_os_calls.py +0 -819
  1008. package/ref-monty/crates/monty-python/tests/test_print.py +0 -208
  1009. package/ref-monty/crates/monty-python/tests/test_re.py +0 -170
  1010. package/ref-monty/crates/monty-python/tests/test_readme_examples.py +0 -20
  1011. package/ref-monty/crates/monty-python/tests/test_repl.py +0 -749
  1012. package/ref-monty/crates/monty-python/tests/test_serialize.py +0 -284
  1013. package/ref-monty/crates/monty-python/tests/test_start.py +0 -346
  1014. package/ref-monty/crates/monty-python/tests/test_threading.py +0 -163
  1015. package/ref-monty/crates/monty-python/tests/test_type_check.py +0 -344
  1016. package/ref-monty/crates/monty-python/tests/test_types.py +0 -553
  1017. package/ref-monty/crates/monty-type-checking/Cargo.toml +0 -32
  1018. package/ref-monty/crates/monty-type-checking/src/db.rs +0 -116
  1019. package/ref-monty/crates/monty-type-checking/src/lib.rs +0 -4
  1020. package/ref-monty/crates/monty-type-checking/src/type_check.rs +0 -280
  1021. package/ref-monty/crates/monty-type-checking/tests/bad_types.py +0 -109
  1022. package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +0 -21
  1023. package/ref-monty/crates/monty-type-checking/tests/good_types.py +0 -475
  1024. package/ref-monty/crates/monty-type-checking/tests/main.rs +0 -205
  1025. package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +0 -56
  1026. package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +0 -41
  1027. package/ref-monty/crates/monty-typeshed/Cargo.toml +0 -29
  1028. package/ref-monty/crates/monty-typeshed/README.md +0 -11
  1029. package/ref-monty/crates/monty-typeshed/build.rs +0 -101
  1030. package/ref-monty/crates/monty-typeshed/custom/README.md +0 -1
  1031. package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +0 -138
  1032. package/ref-monty/crates/monty-typeshed/custom/os.pyi +0 -87
  1033. package/ref-monty/crates/monty-typeshed/custom/sys.pyi +0 -33
  1034. package/ref-monty/crates/monty-typeshed/src/lib.rs +0 -56
  1035. package/ref-monty/crates/monty-typeshed/update.py +0 -321
  1036. package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +0 -1
  1037. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +0 -20
  1038. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +0 -105
  1039. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +0 -394
  1040. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +0 -138
  1041. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +0 -1434
  1042. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +0 -527
  1043. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +0 -2
  1044. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +0 -502
  1045. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +0 -376
  1046. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +0 -149
  1047. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +0 -87
  1048. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +0 -395
  1049. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +0 -8
  1050. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +0 -337
  1051. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +0 -33
  1052. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +0 -741
  1053. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +0 -1217
  1054. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +0 -716
  1055. package/ref-monty/docs/usage-guide.md +0 -117
  1056. package/ref-monty/examples/README.md +0 -3
  1057. package/ref-monty/examples/expense_analysis/README.md +0 -3
  1058. package/ref-monty/examples/expense_analysis/data.py +0 -124
  1059. package/ref-monty/examples/expense_analysis/main.py +0 -115
  1060. package/ref-monty/examples/sql_playground/README.md +0 -20
  1061. package/ref-monty/examples/sql_playground/external_functions.py +0 -129
  1062. package/ref-monty/examples/sql_playground/main.py +0 -81
  1063. package/ref-monty/examples/sql_playground/sandbox_code.py +0 -82
  1064. package/ref-monty/examples/sql_playground/type_stubs.pyi +0 -14
  1065. package/ref-monty/examples/web_scraper/README.md +0 -15
  1066. package/ref-monty/examples/web_scraper/browser.py +0 -56
  1067. package/ref-monty/examples/web_scraper/example_code.py +0 -59
  1068. package/ref-monty/examples/web_scraper/external_functions.py +0 -324
  1069. package/ref-monty/examples/web_scraper/main.py +0 -193
  1070. package/ref-monty/examples/web_scraper/sub_agent.py +0 -79
  1071. package/ref-monty/monty-npm.md +0 -235
  1072. package/ref-monty/pyproject.toml +0 -162
  1073. package/ref-monty/scripts/check_imports.py +0 -91
  1074. package/ref-monty/scripts/codecov_diff.py +0 -412
  1075. package/ref-monty/scripts/complete_tests.py +0 -146
  1076. package/ref-monty/scripts/flamegraph_to_text.py +0 -208
  1077. package/ref-monty/scripts/iter_test_methods.py +0 -540
  1078. package/ref-monty/scripts/run_traceback.py +0 -180
  1079. package/ref-monty/scripts/startup_performance.py +0 -130
  1080. package/ref-monty/uv.lock +0 -1779
  1081. /package/docs/{plugin-examples.md → plugins-examples.md} +0 -0
@@ -1,1513 +0,0 @@
1
- use std::{
2
- borrow::Cow,
3
- fmt::{self, Display, Write},
4
- };
5
-
6
- use serde::{Deserialize, Serialize};
7
- use smallvec::smallvec;
8
- use strum::{Display, EnumString, IntoStaticStr};
9
-
10
- use crate::{
11
- args::ArgValues,
12
- bytecode::{CallResult, VM},
13
- defer_drop,
14
- exception_public::{MontyException, StackFrame},
15
- fstring::FormatError,
16
- heap::{Heap, HeapData},
17
- intern::{Interns, StaticStrings, StringId},
18
- parse::CodeRange,
19
- resource::ResourceTracker,
20
- types::{
21
- PyTrait, Str, Type, allocate_tuple,
22
- str::{StringRepr, string_repr_fmt},
23
- },
24
- value::{EitherStr, Value},
25
- };
26
-
27
- /// Result type alias for operations that can produce a runtime error.
28
- pub type RunResult<T> = Result<T, RunError>;
29
-
30
- /// Python exception types supported by the interpreter.
31
- ///
32
- /// Uses strum derives for automatic `Display`, `FromStr`, and `Into<&'static str>` implementations.
33
- /// The string representation matches the variant name exactly (e.g., `ValueError` -> "ValueError").
34
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display, EnumString, IntoStaticStr, Serialize, Deserialize)]
35
- pub enum ExcType {
36
- /// primary exception class - matches any exception in isinstance checks.
37
- Exception,
38
-
39
- /// System exit exceptions
40
- BaseException,
41
- SystemExit,
42
- KeyboardInterrupt,
43
-
44
- // --- ArithmeticError hierarchy ---
45
- /// Intermediate class for arithmetic errors.
46
- ArithmeticError,
47
- /// Subclass of ArithmeticError.
48
- OverflowError,
49
- /// Subclass of ArithmeticError.
50
- ZeroDivisionError,
51
-
52
- // --- LookupError hierarchy ---
53
- /// Intermediate class for lookup errors.
54
- LookupError,
55
- /// Subclass of LookupError.
56
- IndexError,
57
- /// Subclass of LookupError.
58
- KeyError,
59
-
60
- // --- RuntimeError hierarchy ---
61
- /// Intermediate class for runtime errors.
62
- RuntimeError,
63
- /// Subclass of RuntimeError.
64
- NotImplementedError,
65
- /// Subclass of RuntimeError.
66
- RecursionError,
67
-
68
- // --- AttributeError hierarchy ---
69
- AttributeError,
70
- /// Subclass of AttributeError (from dataclasses module).
71
- FrozenInstanceError,
72
-
73
- // --- NameError hierarchy ---
74
- NameError,
75
- /// Subclass of NameError - for accessing local variable before assignment.
76
- UnboundLocalError,
77
-
78
- // --- ValueError hierarchy ---
79
- ValueError,
80
- /// Subclass of ValueError - for encoding/decoding errors.
81
- UnicodeDecodeError,
82
-
83
- // --- ImportError hierarchy ---
84
- /// Import-related errors (module not found, name not in module).
85
- ImportError,
86
- /// Subclass of ImportError - for when a module cannot be found.
87
- ModuleNotFoundError,
88
-
89
- // --- OSError hierarchy ---
90
- /// OS-related errors (file not found, permission denied, etc.)
91
- OSError,
92
- /// Subclass of OSError - for when a file or directory cannot be found.
93
- FileNotFoundError,
94
- /// Subclass of OSError - for when a file already exists.
95
- FileExistsError,
96
- /// Subclass of OSError - for when a path is a directory but a file was expected.
97
- IsADirectoryError,
98
- /// Subclass of OSError - for when a path is not a directory but one was expected.
99
- NotADirectoryError,
100
-
101
- // --- Standalone exception types ---
102
- AssertionError,
103
- MemoryError,
104
- StopIteration,
105
- SyntaxError,
106
- TimeoutError,
107
- TypeError,
108
-
109
- // --- Module-specific exception types ---
110
-
111
- // --- re module ---
112
- /// `re.PatternError` - raised for invalid regex patterns or unsupported regex features.
113
- ///
114
- /// # Behavior Note
115
- ///
116
- /// Limited to monty's exception type, `PatternError` does not provide `pattern`, `pos`,
117
- /// `lineno` and `colno` attributes.
118
- ///
119
- /// As per CPython's implementation, it would be hard to convert `fancy-regex`'s error
120
- /// representations into the required attributes.
121
- #[strum(serialize = "re.PatternError")]
122
- RePatternError,
123
- }
124
-
125
- impl ExcType {
126
- /// Checks if this exception type is a subclass of another exception type.
127
- ///
128
- /// Implements Python's exception hierarchy for try/except matching:
129
- /// - `Exception` is the base class for all standard exceptions
130
- /// - `LookupError` is the base for `KeyError` and `IndexError`
131
- /// - `ArithmeticError` is the base for `ZeroDivisionError` and `OverflowError`
132
- /// - `RuntimeError` is the base for `RecursionError` and `NotImplementedError`
133
- ///
134
- /// Returns true if `self` would be caught by `except handler_type:`.
135
- #[must_use]
136
- pub fn is_subclass_of(self, handler_type: Self) -> bool {
137
- if self == handler_type {
138
- return true;
139
- }
140
- match handler_type {
141
- // BaseException catches all exceptions
142
- Self::BaseException => true,
143
- // Exception catches everything except BaseException, and direct subclasses: KeyboardInterrupt, SystemExit
144
- Self::Exception => !matches!(self, Self::BaseException | Self::KeyboardInterrupt | Self::SystemExit),
145
- // LookupError catches KeyError and IndexError
146
- Self::LookupError => matches!(self, Self::KeyError | Self::IndexError),
147
- // ArithmeticError catches ZeroDivisionError and OverflowError
148
- Self::ArithmeticError => matches!(self, Self::ZeroDivisionError | Self::OverflowError),
149
- // RuntimeError catches RecursionError and NotImplementedError
150
- Self::RuntimeError => matches!(self, Self::RecursionError | Self::NotImplementedError),
151
- // AttributeError catches FrozenInstanceError
152
- Self::AttributeError => matches!(self, Self::FrozenInstanceError),
153
- // NameError catches UnboundLocalError
154
- Self::NameError => matches!(self, Self::UnboundLocalError),
155
- // ValueError catches UnicodeDecodeError
156
- Self::ValueError => matches!(self, Self::UnicodeDecodeError),
157
- // ImportError catches ModuleNotFoundError
158
- Self::ImportError => matches!(self, Self::ModuleNotFoundError),
159
- // OSError catches FileNotFoundError, FileExistsError, IsADirectoryError, NotADirectoryError
160
- Self::OSError => matches!(
161
- self,
162
- Self::FileNotFoundError | Self::FileExistsError | Self::IsADirectoryError | Self::NotADirectoryError
163
- ),
164
- // All other types only match exactly (handled by self == handler_type above)
165
- _ => false,
166
- }
167
- }
168
-
169
- /// Creates an exception instance from an exception type and arguments.
170
- ///
171
- /// Handles exception constructors like `ValueError('message')`.
172
- /// Currently supports zero or one string argument.
173
- ///
174
- /// The `interns` parameter provides access to interned string content.
175
- /// Returns a heap-allocated exception value.
176
- pub(crate) fn call(self, vm: &mut VM<'_, '_, impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
177
- defer_drop!(args, vm);
178
- let exc = match args {
179
- ArgValues::Empty => Ok(SimpleException::new_none(self)),
180
- ArgValues::One(value) => match value {
181
- Value::InternString(string_id) => Ok(SimpleException::new_msg(
182
- self,
183
- vm.interns.get_str(*string_id).to_owned(),
184
- )),
185
- Value::Ref(heap_id) => {
186
- if let HeapData::Str(s) = vm.heap.get(*heap_id) {
187
- Ok(SimpleException::new_msg(self, s.as_str().to_owned()))
188
- } else {
189
- Err(RunError::internal(
190
- "exceptions can only be called with zero or one string argument",
191
- ))
192
- }
193
- }
194
- _ => Err(RunError::internal(
195
- "exceptions can only be called with zero or one string argument",
196
- )),
197
- },
198
- _ => Err(RunError::internal(
199
- "exceptions can only be called with zero or one string argument",
200
- )),
201
- }?;
202
- let heap_id = vm.heap.allocate(HeapData::Exception(exc))?;
203
- Ok(Value::Ref(heap_id))
204
- }
205
-
206
- /// Creates an AttributeError for when an attribute is not found (GET operation).
207
- ///
208
- /// Sets `hide_caret: true` because CPython doesn't show carets for attribute GET errors.
209
- #[must_use]
210
- pub(crate) fn attribute_error(type_name: impl Display, attr: &str) -> RunError {
211
- let exc = SimpleException::new_msg(
212
- Self::AttributeError,
213
- format!("'{type_name}' object has no attribute '{attr}'"),
214
- );
215
- RunError::Exc(ExceptionRaise {
216
- exc,
217
- frame: None,
218
- hide_caret: true, // CPython doesn't show carets for attribute GET errors
219
- })
220
- }
221
-
222
- /// Creates an AttributeError for attribute assignment on types that don't support it.
223
- ///
224
- /// Matches CPython's format for setting attributes on built-in types.
225
- #[must_use]
226
- pub(crate) fn attribute_error_no_setattr(type_: Type, attr_name: &str) -> RunError {
227
- SimpleException::new_msg(
228
- Self::AttributeError,
229
- format!("'{type_}' object has no attribute '{attr_name}' and no __dict__ for setting new attributes"),
230
- )
231
- .into()
232
- }
233
-
234
- /// Creates an AttributeError for a missing module attribute.
235
- ///
236
- /// Matches CPython's format: `AttributeError: module 'name' has no attribute 'attr'`
237
- /// Sets `hide_caret: true` because CPython doesn't show carets for attribute GET errors.
238
- #[must_use]
239
- pub(crate) fn attribute_error_module(module_name: &str, attr_name: &str) -> RunError {
240
- let exc = SimpleException::new_msg(
241
- Self::AttributeError,
242
- format!("module '{module_name}' has no attribute '{attr_name}'"),
243
- );
244
- RunError::Exc(ExceptionRaise {
245
- exc,
246
- frame: None,
247
- hide_caret: true, // CPython doesn't show carets for attribute GET errors
248
- })
249
- }
250
-
251
- /// Creates a FrozenInstanceError for assigning to a frozen dataclass.
252
- ///
253
- /// Matches CPython's `dataclasses.FrozenInstanceError` which is a subclass of `AttributeError`.
254
- /// Message format: "cannot assign to field 'attr_name'"
255
- #[must_use]
256
- pub(crate) fn frozen_instance_error(attr_name: &str) -> RunError {
257
- SimpleException::new_msg(
258
- Self::FrozenInstanceError,
259
- format!("cannot assign to field '{attr_name}'"),
260
- )
261
- .into()
262
- }
263
-
264
- #[must_use]
265
- pub(crate) fn type_error_not_sub(type_: Type) -> RunError {
266
- SimpleException::new_msg(Self::TypeError, format!("'{type_}' object is not subscriptable")).into()
267
- }
268
-
269
- /// Creates a TypeError for awaiting a non-awaitable object.
270
- ///
271
- /// Matches CPython's format: `TypeError: '{type}' object can't be awaited`
272
- #[must_use]
273
- pub(crate) fn object_not_awaitable(type_: Type) -> RunError {
274
- SimpleException::new_msg(Self::TypeError, format!("'{type_}' object can't be awaited")).into()
275
- }
276
-
277
- /// Creates a TypeError for item assignment on types that don't support it.
278
- ///
279
- /// Matches CPython's format: `TypeError: '{type}' object does not support item assignment`
280
- #[must_use]
281
- pub(crate) fn type_error_not_sub_assignment(type_: Type) -> RunError {
282
- SimpleException::new_msg(
283
- Self::TypeError,
284
- format!("'{type_}' object does not support item assignment"),
285
- )
286
- .into()
287
- }
288
-
289
- /// Creates a TypeError for unhashable types when calling `hash()`.
290
- ///
291
- /// This matches Python 3.14's error message: `TypeError: unhashable type: 'list'`
292
- #[must_use]
293
- pub(crate) fn type_error_unhashable(type_: Type) -> RunError {
294
- SimpleException::new_msg(Self::TypeError, format!("unhashable type: '{type_}'")).into()
295
- }
296
-
297
- /// Creates a TypeError for unhashable types used as dict keys.
298
- ///
299
- /// This matches Python 3.14's error message:
300
- /// `TypeError: cannot use 'list' as a dict key (unhashable type: 'list')`
301
- #[must_use]
302
- pub(crate) fn type_error_unhashable_dict_key(type_: Type) -> RunError {
303
- SimpleException::new_msg(
304
- Self::TypeError,
305
- format!("cannot use '{type_}' as a dict key (unhashable type: '{type_}')"),
306
- )
307
- .into()
308
- }
309
-
310
- /// Creates a TypeError for unhashable types used as set elements.
311
- ///
312
- /// This matches Python 3.14's error message:
313
- /// `TypeError: cannot use 'list' as a set element (unhashable type: 'list')`
314
- #[must_use]
315
- pub(crate) fn type_error_unhashable_set_element(type_: Type) -> RunError {
316
- SimpleException::new_msg(
317
- Self::TypeError,
318
- format!("cannot use '{type_}' as a set element (unhashable type: '{type_}')"),
319
- )
320
- .into()
321
- }
322
-
323
- /// Creates a KeyError for a missing dict key.
324
- ///
325
- /// For string keys, uses the raw string value without extra quoting.
326
- #[must_use]
327
- pub(crate) fn key_error(key: &Value, vm: &VM<'_, '_, impl ResourceTracker>) -> RunError {
328
- let key_str = key.py_str(vm).into_owned();
329
- SimpleException::new_msg(Self::KeyError, key_str).into()
330
- }
331
-
332
- /// Creates a KeyError for popping from an empty set.
333
- ///
334
- /// Matches CPython's error format: `KeyError: 'pop from an empty set'`
335
- #[must_use]
336
- pub(crate) fn key_error_pop_empty_set() -> RunError {
337
- SimpleException::new_msg(Self::KeyError, "pop from an empty set").into()
338
- }
339
-
340
- /// Creates a TypeError for when a function receives the wrong number of arguments.
341
- ///
342
- /// Matches CPython's error format exactly:
343
- /// - For 1 expected arg: `{name}() takes exactly one argument ({actual} given)`
344
- /// - For N expected args: `{name} expected {expected} arguments, got {actual}`
345
- ///
346
- /// # Arguments
347
- /// * `name` - The function name (e.g., "len" for builtins, "list.append" for methods)
348
- /// * `expected` - Number of expected arguments
349
- /// * `actual` - Number of arguments actually provided
350
- #[must_use]
351
- pub(crate) fn type_error_arg_count(name: &str, expected: usize, actual: usize) -> RunError {
352
- if expected == 1 {
353
- // CPython: "len() takes exactly one argument (2 given)"
354
- SimpleException::new_msg(
355
- Self::TypeError,
356
- format!("{name}() takes exactly one argument ({actual} given)"),
357
- )
358
- .into()
359
- } else {
360
- // CPython: "insert expected 2 arguments, got 1"
361
- SimpleException::new_msg(
362
- Self::TypeError,
363
- format!("{name} expected {expected} arguments, got {actual}"),
364
- )
365
- .into()
366
- }
367
- }
368
-
369
- /// Creates a TypeError for when a method that takes no arguments receives some.
370
- ///
371
- /// Matches CPython's format: `{name}() takes no arguments ({actual} given)`
372
- ///
373
- /// # Arguments
374
- /// * `name` - The method name (e.g., "dict.keys")
375
- /// * `actual` - Number of arguments actually provided
376
- #[must_use]
377
- pub(crate) fn type_error_no_args(name: &str, actual: usize) -> RunError {
378
- // CPython: "dict.keys() takes no arguments (1 given)"
379
- SimpleException::new_msg(Self::TypeError, format!("{name}() takes no arguments ({actual} given)")).into()
380
- }
381
-
382
- /// Creates a TypeError for when a function receives fewer arguments than required.
383
- ///
384
- /// Matches CPython's format: `{name} expected at least {min} argument, got {actual}`
385
- ///
386
- /// # Arguments
387
- /// * `name` - The function name (e.g., "get", "pop")
388
- /// * `min` - Minimum number of required arguments
389
- /// * `actual` - Number of arguments actually provided
390
- #[must_use]
391
- pub(crate) fn type_error_at_least(name: &str, min: usize, actual: usize) -> RunError {
392
- // CPython: "get expected at least 1 argument, got 0"
393
- let plural = if min == 1 { "" } else { "s" };
394
- SimpleException::new_msg(
395
- Self::TypeError,
396
- format!("{name} expected at least {min} argument{plural}, got {actual}"),
397
- )
398
- .into()
399
- }
400
-
401
- /// Creates a TypeError for when a function receives more arguments than allowed.
402
- ///
403
- /// Matches CPython's format: `{name} expected at most {max} arguments, got {actual}`
404
- ///
405
- /// # Arguments
406
- /// * `name` - The function name (e.g., "get", "pop")
407
- /// * `max` - Maximum number of allowed arguments
408
- /// * `actual` - Number of arguments actually provided
409
- #[must_use]
410
- pub(crate) fn type_error_at_most(name: &str, max: usize, actual: usize) -> RunError {
411
- // CPython: "get expected at most 2 arguments, got 3"
412
- SimpleException::new_msg(
413
- Self::TypeError,
414
- format!("{name} expected at most {max} arguments, got {actual}"),
415
- )
416
- .into()
417
- }
418
-
419
- /// Creates a TypeError for missing positional arguments.
420
- ///
421
- /// Matches CPython's format: `{name}() missing {count} required positional argument(s): 'a' and 'b'`
422
- #[must_use]
423
- pub(crate) fn type_error_missing_positional_with_names(name: &str, missing_names: &[&str]) -> RunError {
424
- let count = missing_names.len();
425
- let names_str = format_param_names(missing_names);
426
- if count == 1 {
427
- SimpleException::new_msg(
428
- Self::TypeError,
429
- format!("{name}() missing 1 required positional argument: {names_str}"),
430
- )
431
- .into()
432
- } else {
433
- SimpleException::new_msg(
434
- Self::TypeError,
435
- format!("{name}() missing {count} required positional arguments: {names_str}"),
436
- )
437
- .into()
438
- }
439
- }
440
-
441
- /// Creates a TypeError for missing keyword-only arguments.
442
- ///
443
- /// Matches CPython's format: `{name}() missing {count} required keyword-only argument(s): 'a' and 'b'`
444
- #[must_use]
445
- pub(crate) fn type_error_missing_kwonly_with_names(name: &str, missing_names: &[&str]) -> RunError {
446
- let count = missing_names.len();
447
- let names_str = format_param_names(missing_names);
448
- if count == 1 {
449
- SimpleException::new_msg(
450
- Self::TypeError,
451
- format!("{name}() missing 1 required keyword-only argument: {names_str}"),
452
- )
453
- .into()
454
- } else {
455
- SimpleException::new_msg(
456
- Self::TypeError,
457
- format!("{name}() missing {count} required keyword-only arguments: {names_str}"),
458
- )
459
- .into()
460
- }
461
- }
462
-
463
- /// Creates a TypeError for too many positional arguments.
464
- ///
465
- /// Matches CPython's format:
466
- /// - Simple: `{name}() takes {max} positional argument(s) but {actual} were given`
467
- /// - With kwonly: `{name}() takes {max} positional argument(s) but {actual} positional argument(s) (and N keyword-only argument(s)) were given`
468
- #[must_use]
469
- pub(crate) fn type_error_too_many_positional(
470
- name: &str,
471
- max: usize,
472
- actual: usize,
473
- kwonly_given: usize,
474
- ) -> RunError {
475
- let takes_word = if max == 1 { "argument" } else { "arguments" };
476
-
477
- if kwonly_given > 0 {
478
- // CPython includes keyword-only args in the "given" part when present
479
- let given_word = if actual == 1 { "argument" } else { "arguments" };
480
- let kwonly_word = if kwonly_given == 1 { "argument" } else { "arguments" };
481
- SimpleException::new_msg(
482
- Self::TypeError,
483
- format!(
484
- "{name}() takes {max} positional {takes_word} but {actual} positional {given_word} (and {kwonly_given} keyword-only {kwonly_word}) were given"
485
- ),
486
- )
487
- .into()
488
- } else if max == 0 {
489
- SimpleException::new_msg(
490
- Self::TypeError,
491
- format!("{name}() takes 0 positional arguments but {actual} were given"),
492
- )
493
- .into()
494
- } else {
495
- SimpleException::new_msg(
496
- Self::TypeError,
497
- format!("{name}() takes {max} positional {takes_word} but {actual} were given"),
498
- )
499
- .into()
500
- }
501
- }
502
-
503
- /// Creates a TypeError for positional-only parameter passed as keyword.
504
- ///
505
- /// Matches CPython's format: `{name}() got some positional-only arguments passed as keyword arguments: '{param}'`
506
- #[must_use]
507
- pub(crate) fn type_error_positional_only(name: &str, param: &str) -> RunError {
508
- SimpleException::new_msg(
509
- Self::TypeError,
510
- format!("{name}() got some positional-only arguments passed as keyword arguments: '{param}'"),
511
- )
512
- .into()
513
- }
514
-
515
- /// Creates a TypeError for duplicate argument.
516
- ///
517
- /// Matches CPython's format: `{name}() got multiple values for argument '{param}'`
518
- #[must_use]
519
- pub(crate) fn type_error_duplicate_arg(name: &str, param: &str) -> RunError {
520
- SimpleException::new_msg(
521
- Self::TypeError,
522
- format!("{name}() got multiple values for argument '{param}'"),
523
- )
524
- .into()
525
- }
526
-
527
- /// Creates a TypeError for duplicate keyword argument.
528
- ///
529
- /// Matches CPython's format: `{name}() got multiple values for keyword argument '{key}'`
530
- #[must_use]
531
- pub(crate) fn type_error_multiple_values(name: &str, key: &str) -> RunError {
532
- SimpleException::new_msg(
533
- Self::TypeError,
534
- format!("{name}() got multiple values for keyword argument '{key}'"),
535
- )
536
- .into()
537
- }
538
-
539
- /// Creates a TypeError for unexpected keyword argument.
540
- ///
541
- /// Matches CPython's format: `{name}() got an unexpected keyword argument '{key}'`
542
- #[must_use]
543
- pub(crate) fn type_error_unexpected_keyword(name: &str, key: &str) -> RunError {
544
- SimpleException::new_msg(
545
- Self::TypeError,
546
- format!("{name}() got an unexpected keyword argument '{key}'"),
547
- )
548
- .into()
549
- }
550
-
551
- /// Creates a TypeError for **kwargs argument that is not a mapping.
552
- ///
553
- /// Matches CPython's format: `{name}() argument after ** must be a mapping, not {type_name}`
554
- #[must_use]
555
- pub(crate) fn type_error_kwargs_not_mapping(name: &str, type_name: &str) -> RunError {
556
- SimpleException::new_msg(
557
- Self::TypeError,
558
- format!("{name}() argument after ** must be a mapping, not {type_name}"),
559
- )
560
- .into()
561
- }
562
-
563
- /// Creates a TypeError for `{**x}` dict-literal unpacking where `x` is not a mapping.
564
- ///
565
- /// Matches CPython's format: `'{type_name}' object is not a mapping`
566
- ///
567
- /// Note: this differs from [`type_error_kwargs_not_mapping`] which is used for
568
- /// function-call `**kwargs` and includes the function name in the message.
569
- #[must_use]
570
- pub(crate) fn type_error_not_mapping(type_: Type) -> RunError {
571
- SimpleException::new_msg(Self::TypeError, format!("'{type_}' object is not a mapping")).into()
572
- }
573
-
574
- /// Creates a TypeError for **kwargs with non-string keys.
575
- ///
576
- /// Matches CPython's format: `{name}() keywords must be strings`
577
- #[must_use]
578
- pub(crate) fn type_error_kwargs_nonstring_key() -> RunError {
579
- SimpleException::new_msg(Self::TypeError, "keywords must be strings").into()
580
- }
581
-
582
- /// Creates a simple TypeError with a custom message.
583
- #[must_use]
584
- pub(crate) fn type_error(msg: impl fmt::Display) -> RunError {
585
- SimpleException::new_msg(Self::TypeError, msg).into()
586
- }
587
-
588
- /// Creates a TypeError for bytes() constructor with invalid type.
589
- ///
590
- /// Matches CPython's format: `TypeError: cannot convert '{type}' object to bytes`
591
- #[must_use]
592
- pub(crate) fn type_error_bytes_init(type_: Type) -> RunError {
593
- SimpleException::new_msg(Self::TypeError, format!("cannot convert '{type_}' object to bytes")).into()
594
- }
595
-
596
- /// Creates a TypeError for calling a non-callable type.
597
- ///
598
- /// Matches CPython's format: `TypeError: cannot create '{type}' instances`
599
- #[must_use]
600
- pub(crate) fn type_error_not_callable(type_: Type) -> RunError {
601
- SimpleException::new_msg(Self::TypeError, format!("cannot create '{type_}' instances")).into()
602
- }
603
-
604
- /// Creates a TypeError for calling a non-callable object.
605
- ///
606
- /// Matches CPython's format: `TypeError: '{type}' object is not callable`
607
- #[must_use]
608
- pub(crate) fn type_error_not_callable_object(type_: Type) -> RunError {
609
- SimpleException::new_msg(Self::TypeError, format!("'{type_}' object is not callable")).into()
610
- }
611
-
612
- /// Creates a TypeError for non-iterable type in list/tuple/etc constructors.
613
- ///
614
- /// Matches CPython's format: `TypeError: '{type}' object is not iterable`
615
- #[must_use]
616
- pub(crate) fn type_error_not_iterable(type_: Type) -> RunError {
617
- SimpleException::new_msg(Self::TypeError, format!("'{type_}' object is not iterable")).into()
618
- }
619
-
620
- /// Creates a TypeError for non-iterable type in PEP 448 `*value` literal unpack.
621
- ///
622
- /// Used when `[*expr]`, `(*expr,)` literal unpack encounters a non-iterable — distinct
623
- /// from [`type_error_not_iterable`] because CPython uses a different message for this context.
624
- ///
625
- /// Matches CPython's format: `TypeError: Value after * must be an iterable, not {type}`
626
- #[must_use]
627
- pub(crate) fn type_error_value_after_star(type_: Type) -> RunError {
628
- SimpleException::new_msg(
629
- Self::TypeError,
630
- format!("Value after * must be an iterable, not {type_}"),
631
- )
632
- .into()
633
- }
634
-
635
- /// Creates a TypeError for int() constructor with invalid type.
636
- ///
637
- /// Matches CPython's format: `TypeError: int() argument must be a string, a bytes-like object or a real number, not '{type}'`
638
- #[must_use]
639
- pub(crate) fn type_error_int_conversion(type_: Type) -> RunError {
640
- SimpleException::new_msg(
641
- Self::TypeError,
642
- format!("int() argument must be a string, a bytes-like object or a real number, not '{type_}'"),
643
- )
644
- .into()
645
- }
646
-
647
- /// Creates a TypeError for float() constructor with invalid type.
648
- ///
649
- /// Matches CPython's format: `TypeError: float() argument must be a string or a real number, not '{type}'`
650
- #[must_use]
651
- pub(crate) fn type_error_float_conversion(type_: Type) -> RunError {
652
- SimpleException::new_msg(
653
- Self::TypeError,
654
- format!("float() argument must be a string or a real number, not '{type_}'"),
655
- )
656
- .into()
657
- }
658
-
659
- /// Creates a ValueError for negative count in bytes().
660
- ///
661
- /// Matches CPython's format: `ValueError: negative count`
662
- #[must_use]
663
- pub(crate) fn value_error_negative_bytes_count() -> RunError {
664
- SimpleException::new_msg(Self::ValueError, "negative count").into()
665
- }
666
-
667
- /// Creates a TypeError for isinstance() arg 2.
668
- ///
669
- /// Matches CPython's format: `TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union`
670
- #[must_use]
671
- pub(crate) fn isinstance_arg2_error() -> RunError {
672
- SimpleException::new_msg(
673
- Self::TypeError,
674
- "isinstance() arg 2 must be a type, a tuple of types, or a union",
675
- )
676
- .into()
677
- }
678
-
679
- /// Creates a TypeError for invalid exception type in except clause.
680
- ///
681
- /// Matches CPython's format: `TypeError: catching classes that do not inherit from BaseException is not allowed`
682
- #[must_use]
683
- pub(crate) fn except_invalid_type_error() -> RunError {
684
- SimpleException::new_msg(
685
- Self::TypeError,
686
- "catching classes that do not inherit from BaseException is not allowed",
687
- )
688
- .into()
689
- }
690
-
691
- /// Creates a ValueError for range() step argument being zero.
692
- ///
693
- /// Matches CPython's format: `ValueError: range() arg 3 must not be zero`
694
- #[must_use]
695
- pub(crate) fn value_error_range_step_zero() -> RunError {
696
- SimpleException::new_msg(Self::ValueError, "range() arg 3 must not be zero").into()
697
- }
698
-
699
- /// Creates a ValueError for slice step being zero.
700
- ///
701
- /// Matches CPython's format: `ValueError: slice step cannot be zero`
702
- #[must_use]
703
- pub(crate) fn value_error_slice_step_zero() -> RunError {
704
- SimpleException::new_msg(Self::ValueError, "slice step cannot be zero").into()
705
- }
706
-
707
- /// Creates a TypeError for slice indices that are not integers or None.
708
- ///
709
- /// Matches CPython's format: `TypeError: slice indices must be integers or None or have an __index__ method`
710
- #[must_use]
711
- pub(crate) fn type_error_slice_indices() -> RunError {
712
- SimpleException::new_msg(
713
- Self::TypeError,
714
- "slice indices must be integers or None or have an __index__ method",
715
- )
716
- .into()
717
- }
718
-
719
- /// Creates a RuntimeError for dict mutation during iteration.
720
- ///
721
- /// Matches CPython's format: `RuntimeError: dictionary changed size during iteration`
722
- #[must_use]
723
- pub(crate) fn runtime_error_dict_changed_size() -> RunError {
724
- SimpleException::new_msg(Self::RuntimeError, "dictionary changed size during iteration").into()
725
- }
726
-
727
- /// Creates a RuntimeError for set mutation during iteration.
728
- ///
729
- /// Matches CPython's format: `RuntimeError: Set changed size during iteration`
730
- #[must_use]
731
- pub(crate) fn runtime_error_set_changed_size() -> RunError {
732
- SimpleException::new_msg(Self::RuntimeError, "Set changed size during iteration").into()
733
- }
734
-
735
- /// Creates a TypeError for functions that don't accept keyword arguments.
736
- ///
737
- /// Matches CPython's format: `TypeError: {name}() takes no keyword arguments`
738
- #[must_use]
739
- pub(crate) fn type_error_no_kwargs(name: &str) -> RunError {
740
- SimpleException::new_msg(Self::TypeError, format!("{name}() takes no keyword arguments")).into()
741
- }
742
-
743
- /// Creates an IndexError for list index out of range (getitem).
744
- ///
745
- /// Matches CPython's format: `IndexError('list index out of range')`
746
- #[must_use]
747
- pub(crate) fn list_index_error() -> RunError {
748
- SimpleException::new_msg(Self::IndexError, "list index out of range").into()
749
- }
750
-
751
- /// Creates an IndexError for list assignment index out of range (setitem).
752
- ///
753
- /// Matches CPython's format: `IndexError('list assignment index out of range')`
754
- #[must_use]
755
- pub(crate) fn list_assignment_index_error() -> RunError {
756
- SimpleException::new_msg(Self::IndexError, "list assignment index out of range").into()
757
- }
758
-
759
- /// Creates an IndexError for tuple index out of range.
760
- ///
761
- /// Matches CPython's format: `IndexError('tuple index out of range')`
762
- #[must_use]
763
- pub(crate) fn tuple_index_error() -> RunError {
764
- SimpleException::new_msg(Self::IndexError, "tuple index out of range").into()
765
- }
766
-
767
- /// Creates an IndexError for string index out of range.
768
- ///
769
- /// Matches CPython's format: `IndexError('string index out of range')`
770
- #[must_use]
771
- pub(crate) fn str_index_error() -> RunError {
772
- SimpleException::new_msg(Self::IndexError, "string index out of range").into()
773
- }
774
-
775
- /// Creates an IndexError for bytes index out of range.
776
- ///
777
- /// Matches CPython's format: `IndexError('index out of range')`
778
- #[must_use]
779
- pub(crate) fn bytes_index_error() -> RunError {
780
- SimpleException::new_msg(Self::IndexError, "index out of range").into()
781
- }
782
-
783
- /// Creates an IndexError for range index out of range.
784
- ///
785
- /// Matches CPython's format: `IndexError('range object index out of range')`
786
- #[must_use]
787
- pub(crate) fn range_index_error() -> RunError {
788
- SimpleException::new_msg(Self::IndexError, "range object index out of range").into()
789
- }
790
-
791
- /// Creates an IndexError for `re.Match` group index out of range.
792
- ///
793
- /// Matches CPython's format: `IndexError('no such group')`
794
- #[must_use]
795
- pub(crate) fn re_match_group_index_error() -> RunError {
796
- SimpleException::new_msg(Self::IndexError, "no such group").into()
797
- }
798
-
799
- /// Creates a TypeError for non-integer sequence indices (getitem).
800
- ///
801
- /// Matches CPython's format: `TypeError('{type}' indices must be integers, not '{index_type}')`
802
- #[must_use]
803
- pub(crate) fn type_error_indices(type_str: Type, index_type: Type) -> RunError {
804
- SimpleException::new_msg(
805
- Self::TypeError,
806
- format!("{type_str} indices must be integers, not '{index_type}'"),
807
- )
808
- .into()
809
- }
810
-
811
- /// Creates a TypeError for non-integer list indices (setitem/assignment).
812
- ///
813
- /// Matches CPython's format: `TypeError('list indices must be integers or slices, not {index_type}')`
814
- #[must_use]
815
- pub(crate) fn type_error_list_assignment_indices(index_type: Type) -> RunError {
816
- SimpleException::new_msg(
817
- Self::TypeError,
818
- format!("list indices must be integers or slices, not {index_type}"),
819
- )
820
- .into()
821
- }
822
-
823
- /// Creates a NameError for accessing a free variable (nonlocal/closure) before it's assigned.
824
- ///
825
- /// Matches CPython's format: `NameError: cannot access free variable 'x' where it is not
826
- /// associated with a value in enclosing scope`
827
- #[must_use]
828
- pub(crate) fn name_error_free_variable(name: &str) -> SimpleException {
829
- SimpleException::new_msg(
830
- Self::NameError,
831
- format!("cannot access free variable '{name}' where it is not associated with a value in enclosing scope"),
832
- )
833
- }
834
-
835
- /// Creates a NameError for accessing an undefined variable.
836
- ///
837
- /// Matches CPython's format: `NameError: name 'x' is not defined`
838
- #[must_use]
839
- pub(crate) fn name_error(name: &str) -> SimpleException {
840
- let mut msg = format!("name '{name}' is not defined");
841
- // add the same suffix as cpython, but only for the modules supported by Monty
842
- if matches!(name, "asyncio" | "sys" | "typing" | "types" | "re") {
843
- write!(&mut msg, ". Did you forget to import '{name}'?").unwrap();
844
- }
845
- SimpleException::new_msg(Self::NameError, msg)
846
- }
847
-
848
- /// Creates an UnboundLocalError for accessing a local variable before assignment.
849
- ///
850
- /// Matches CPython's format: `UnboundLocalError: cannot access local variable 'x' where it is not associated with a value`
851
- #[must_use]
852
- pub(crate) fn unbound_local_error(name: &str) -> SimpleException {
853
- SimpleException::new_msg(
854
- Self::UnboundLocalError,
855
- format!("cannot access local variable '{name}' where it is not associated with a value"),
856
- )
857
- }
858
-
859
- /// Creates a ModuleNotFoundError for when a module cannot be found.
860
- ///
861
- /// Matches CPython's format: `ModuleNotFoundError: No module named 'name'`
862
- /// Sets `hide_caret: true` because CPython doesn't show carets for module not found errors.
863
- #[must_use]
864
- pub(crate) fn module_not_found_error(module_name: &str) -> RunError {
865
- let exc = SimpleException::new_msg(Self::ModuleNotFoundError, format!("No module named '{module_name}'"));
866
- RunError::Exc(ExceptionRaise {
867
- exc,
868
- frame: None,
869
- hide_caret: true, // CPython doesn't show carets for module not found errors
870
- })
871
- }
872
-
873
- /// Creates a NotImplementedError for an unimplemented Python feature.
874
- ///
875
- /// Used during parsing when encountering Python syntax that Monty doesn't yet support.
876
- /// The message format is: "The monty syntax parser does not yet support {feature}"
877
- #[must_use]
878
- pub(crate) fn not_implemented(msg: impl fmt::Display) -> SimpleException {
879
- SimpleException::new_msg(Self::NotImplementedError, msg)
880
- }
881
-
882
- /// Creates a ZeroDivisionError for division by zero.
883
- ///
884
- /// Matches CPython 3.14's format: `ZeroDivisionError('division by zero')`
885
- #[must_use]
886
- pub(crate) fn zero_division() -> SimpleException {
887
- SimpleException::new_msg(Self::ZeroDivisionError, "division by zero")
888
- }
889
-
890
- /// Creates an OverflowError for string/sequence repetition with count too large.
891
- ///
892
- /// Matches CPython's format: `OverflowError('cannot fit 'int' into an index-sized integer')`
893
- #[must_use]
894
- pub(crate) fn overflow_repeat_count() -> SimpleException {
895
- SimpleException::new_msg(Self::OverflowError, "cannot fit 'int' into an index-sized integer")
896
- }
897
-
898
- /// Creates an IndexError for when an integer index is too large to fit in i64.
899
- ///
900
- /// Matches CPython's format: `IndexError: cannot fit 'int' into an index-sized integer`
901
- #[must_use]
902
- pub(crate) fn index_error_int_too_large() -> RunError {
903
- SimpleException::new_msg(Self::IndexError, "cannot fit 'int' into an index-sized integer").into()
904
- }
905
-
906
- /// Creates an ImportError for when a name cannot be imported from a module.
907
- ///
908
- /// Matches CPython's format for built-in modules:
909
- /// `ImportError: cannot import name 'name' from 'module' (unknown location)`
910
- ///
911
- /// Sets `hide_caret: true` because CPython doesn't show carets for import errors.
912
- #[must_use]
913
- pub(crate) fn cannot_import_name(name: &str, module_name: &str) -> RunError {
914
- let exc = SimpleException::new_msg(
915
- Self::ImportError,
916
- format!("cannot import name '{name}' from '{module_name}' (unknown location)"),
917
- );
918
- RunError::Exc(ExceptionRaise {
919
- exc,
920
- frame: None,
921
- hide_caret: true,
922
- })
923
- }
924
-
925
- /// Creates a ValueError for negative shift count in bitwise shift operations.
926
- ///
927
- /// Matches CPython's format: `ValueError: negative shift count`
928
- #[must_use]
929
- pub(crate) fn value_error_negative_shift_count() -> RunError {
930
- SimpleException::new_msg(Self::ValueError, "negative shift count").into()
931
- }
932
-
933
- /// Creates an OverflowError for shift count exceeding integer size.
934
- ///
935
- /// Matches CPython's format: `OverflowError: Python int too large to convert to C ssize_t`
936
- /// Note: CPython uses this message because it tries to convert to ssize_t for the shift amount.
937
- #[must_use]
938
- pub(crate) fn overflow_shift_count() -> RunError {
939
- SimpleException::new_msg(Self::OverflowError, "Python int too large to convert to C ssize_t").into()
940
- }
941
-
942
- /// Creates a TypeError for unsupported binary operations.
943
- ///
944
- /// For `+` or `+=` with str/list on the left side, uses CPython's special format:
945
- /// `can only concatenate {type} (not "{other}") to {type}`
946
- ///
947
- /// For other cases, uses the generic format:
948
- /// `unsupported operand type(s) for {op}: '{left}' and '{right}'`
949
- #[must_use]
950
- pub(crate) fn binary_type_error(op: &str, lhs_type: Type, rhs_type: Type) -> RunError {
951
- let message = if (op == "+" || op == "+=") && (lhs_type == Type::Str || lhs_type == Type::List) {
952
- format!("can only concatenate {lhs_type} (not \"{rhs_type}\") to {lhs_type}")
953
- } else {
954
- format!("unsupported operand type(s) for {op}: '{lhs_type}' and '{rhs_type}'")
955
- };
956
- SimpleException::new_msg(Self::TypeError, message).into()
957
- }
958
-
959
- /// Creates a TypeError for unsupported unary operations.
960
- ///
961
- /// Uses CPython's format: `bad operand type for unary {op}: '{type}'`
962
- #[must_use]
963
- pub(crate) fn unary_type_error(op: &str, value_type: Type) -> RunError {
964
- SimpleException::new_msg(
965
- Self::TypeError,
966
- format!("bad operand type for unary {op}: '{value_type}'"),
967
- )
968
- .into()
969
- }
970
-
971
- /// Creates a TypeError for functions that require an integer argument.
972
- ///
973
- /// Matches CPython's format: `TypeError: '{type}' object cannot be interpreted as an integer`
974
- #[must_use]
975
- pub(crate) fn type_error_not_integer(type_: Type) -> RunError {
976
- SimpleException::new_msg(
977
- Self::TypeError,
978
- format!("'{type_}' object cannot be interpreted as an integer"),
979
- )
980
- .into()
981
- }
982
-
983
- /// Creates a ZeroDivisionError for zero raised to a negative power.
984
- ///
985
- /// Matches CPython's format: `ZeroDivisionError: zero to a negative power`
986
- /// Note: CPython uses the same message for both int and float zero ** negative.
987
- #[must_use]
988
- pub(crate) fn zero_negative_power() -> RunError {
989
- SimpleException::new_msg(Self::ZeroDivisionError, "zero to a negative power").into()
990
- }
991
-
992
- /// Creates an OverflowError for exponents that are too large.
993
- ///
994
- /// Matches CPython's format: `OverflowError: exponent too large`
995
- #[must_use]
996
- pub(crate) fn overflow_exponent_too_large() -> RunError {
997
- SimpleException::new_msg(Self::OverflowError, "exponent too large").into()
998
- }
999
-
1000
- /// Creates a ZeroDivisionError for divmod by zero (both integer and float).
1001
- ///
1002
- /// Matches CPython's format: `ZeroDivisionError: division by zero`
1003
- /// Note: CPython uses the same message for both integer and float divmod.
1004
- #[must_use]
1005
- pub(crate) fn divmod_by_zero() -> RunError {
1006
- SimpleException::new_msg(Self::ZeroDivisionError, "division by zero").into()
1007
- }
1008
-
1009
- /// Creates a TypeError for str.join() when an item is not a string.
1010
- ///
1011
- /// Matches CPython's format: `TypeError: sequence item {index}: expected str instance, {type} found`
1012
- #[must_use]
1013
- pub(crate) fn type_error_join_item(index: usize, item_type: Type) -> RunError {
1014
- SimpleException::new_msg(
1015
- Self::TypeError,
1016
- format!("sequence item {index}: expected str instance, {item_type} found"),
1017
- )
1018
- .into()
1019
- }
1020
-
1021
- /// Creates a TypeError for str.join() when the argument is not iterable.
1022
- ///
1023
- /// Matches CPython's format: `TypeError: can only join an iterable`
1024
- #[must_use]
1025
- pub(crate) fn type_error_join_not_iterable() -> RunError {
1026
- SimpleException::new_msg(Self::TypeError, "can only join an iterable").into()
1027
- }
1028
-
1029
- /// Creates a ValueError for str.index()/str.rindex() when substring is not found.
1030
- ///
1031
- /// Matches CPython's format: `ValueError: substring not found`
1032
- #[must_use]
1033
- pub(crate) fn value_error_substring_not_found() -> RunError {
1034
- SimpleException::new_msg(Self::ValueError, "substring not found").into()
1035
- }
1036
-
1037
- /// Creates a ValueError for str.partition()/str.rpartition() with empty separator.
1038
- ///
1039
- /// Matches CPython's format: `ValueError: empty separator`
1040
- #[must_use]
1041
- pub(crate) fn value_error_empty_separator() -> RunError {
1042
- SimpleException::new_msg(Self::ValueError, "empty separator").into()
1043
- }
1044
-
1045
- /// Creates a TypeError for fillchar argument that is not a single character.
1046
- ///
1047
- /// Matches CPython's format: `TypeError: The fill character must be exactly one character long`
1048
- #[must_use]
1049
- pub(crate) fn type_error_fillchar_must_be_single_char() -> RunError {
1050
- SimpleException::new_msg(Self::TypeError, "The fill character must be exactly one character long").into()
1051
- }
1052
-
1053
- /// Creates a StopIteration exception for when an iterator is exhausted.
1054
- ///
1055
- /// Matches CPython's format: `StopIteration`
1056
- #[must_use]
1057
- pub(crate) fn stop_iteration() -> RunError {
1058
- SimpleException::new_none(Self::StopIteration).into()
1059
- }
1060
-
1061
- /// Creates a ValueError for list.index() when item is not found.
1062
- ///
1063
- /// Matches CPython's format: `ValueError: list.index(x): x not in list`
1064
- #[must_use]
1065
- pub(crate) fn value_error_not_in_list() -> RunError {
1066
- SimpleException::new_msg(Self::ValueError, "list.index(x): x not in list").into()
1067
- }
1068
-
1069
- /// Creates a ValueError for tuple.index() when item is not found.
1070
- ///
1071
- /// Matches CPython's format: `ValueError: tuple.index(x): x not in tuple`
1072
- #[must_use]
1073
- pub(crate) fn value_error_not_in_tuple() -> RunError {
1074
- SimpleException::new_msg(Self::ValueError, "tuple.index(x): x not in tuple").into()
1075
- }
1076
-
1077
- /// Creates a ValueError for list.remove() when item is not found.
1078
- ///
1079
- /// Matches CPython's format: `ValueError: list.remove(x): x not in list`
1080
- #[must_use]
1081
- pub(crate) fn value_error_remove_not_in_list() -> RunError {
1082
- SimpleException::new_msg(Self::ValueError, "list.remove(x): x not in list").into()
1083
- }
1084
-
1085
- /// Creates an IndexError for popping from an empty list.
1086
- ///
1087
- /// Matches CPython's format: `IndexError: pop from empty list`
1088
- #[must_use]
1089
- pub(crate) fn index_error_pop_empty_list() -> RunError {
1090
- SimpleException::new_msg(Self::IndexError, "pop from empty list").into()
1091
- }
1092
-
1093
- /// Creates an IndexError for list.pop(index) with invalid index.
1094
- ///
1095
- /// Matches CPython's format: `IndexError: pop index out of range`
1096
- #[must_use]
1097
- pub(crate) fn index_error_pop_out_of_range() -> RunError {
1098
- SimpleException::new_msg(Self::IndexError, "pop index out of range").into()
1099
- }
1100
-
1101
- /// Creates a KeyError for popping from an empty dict.
1102
- ///
1103
- /// Matches CPython's format: `KeyError: 'popitem(): dictionary is empty'`
1104
- #[must_use]
1105
- pub(crate) fn key_error_popitem_empty_dict() -> RunError {
1106
- SimpleException::new_msg(Self::KeyError, "'popitem(): dictionary is empty'").into()
1107
- }
1108
-
1109
- /// Creates a LookupError for unknown encoding.
1110
- ///
1111
- /// Matches CPython's format: `LookupError: unknown encoding: {encoding}`
1112
- #[must_use]
1113
- pub(crate) fn lookup_error_unknown_encoding(encoding: &str) -> RunError {
1114
- SimpleException::new_msg(Self::LookupError, format!("unknown encoding: {encoding}")).into()
1115
- }
1116
-
1117
- /// Creates a UnicodeDecodeError for invalid UTF-8 bytes in decode().
1118
- ///
1119
- /// Matches CPython's format: `UnicodeDecodeError: 'utf-8' codec can't decode bytes...`
1120
- #[must_use]
1121
- pub(crate) fn unicode_decode_error_invalid_utf8() -> RunError {
1122
- SimpleException::new_msg(
1123
- Self::UnicodeDecodeError,
1124
- "'utf-8' codec can't decode bytes: invalid utf-8 sequence",
1125
- )
1126
- .into()
1127
- }
1128
-
1129
- /// Creates a ValueError for subsequence not found in bytes/str.
1130
- ///
1131
- /// Matches CPython's format: `ValueError: subsection not found`
1132
- #[must_use]
1133
- pub(crate) fn value_error_subsequence_not_found() -> RunError {
1134
- SimpleException::new_msg(Self::ValueError, "subsection not found").into()
1135
- }
1136
-
1137
- /// Creates a LookupError for unknown error handler.
1138
- ///
1139
- /// Matches CPython's format: `LookupError: unknown error handler name '{name}'`
1140
- #[must_use]
1141
- pub(crate) fn lookup_error_unknown_error_handler(name: &str) -> RunError {
1142
- SimpleException::new_msg(Self::LookupError, format!("unknown error handler name '{name}'")).into()
1143
- }
1144
-
1145
- /// Creates a `re.PatternError` for an invalid regex pattern or unsupported regex feature.
1146
- ///
1147
- /// Matches CPython's exception type: `re.PatternError: {message}`
1148
- #[must_use]
1149
- pub(crate) fn re_pattern_error(msg: impl fmt::Display) -> RunError {
1150
- SimpleException::new_msg(Self::RePatternError, msg).into()
1151
- }
1152
- }
1153
-
1154
- /// Simple lightweight representation of an exception.
1155
- ///
1156
- /// This is used for performance reasons for common exception patterns.
1157
- /// Exception messages use `String` for owned storage.
1158
- #[derive(Debug, Clone, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
1159
- pub(crate) struct SimpleException {
1160
- exc_type: ExcType,
1161
- arg: Option<String>,
1162
- }
1163
-
1164
- impl fmt::Display for SimpleException {
1165
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1166
- self.py_repr_fmt(f)
1167
- }
1168
- }
1169
- impl From<MontyException> for SimpleException {
1170
- fn from(exc: MontyException) -> Self {
1171
- Self {
1172
- exc_type: exc.exc_type(),
1173
- arg: exc.into_message(),
1174
- }
1175
- }
1176
- }
1177
-
1178
- impl SimpleException {
1179
- /// Creates a new exception with the given type and optional argument message.
1180
- #[must_use]
1181
- pub fn new(exc_type: ExcType, arg: Option<String>) -> Self {
1182
- Self { exc_type, arg }
1183
- }
1184
-
1185
- /// Creates a new exception with the given type and argument message.
1186
- #[must_use]
1187
- pub fn new_msg(exc_type: ExcType, arg: impl fmt::Display) -> Self {
1188
- Self {
1189
- exc_type,
1190
- arg: Some(arg.to_string()),
1191
- }
1192
- }
1193
-
1194
- /// Creates a new exception with the given type and no argument message.
1195
- #[must_use]
1196
- pub fn new_none(exc_type: ExcType) -> Self {
1197
- Self { exc_type, arg: None }
1198
- }
1199
-
1200
- #[must_use]
1201
- pub fn exc_type(&self) -> ExcType {
1202
- self.exc_type
1203
- }
1204
-
1205
- #[must_use]
1206
- pub fn arg(&self) -> Option<&String> {
1207
- self.arg.as_ref()
1208
- }
1209
-
1210
- /// str() for an exception
1211
- #[must_use]
1212
- pub fn py_str(&self) -> String {
1213
- match (self.exc_type, &self.arg) {
1214
- // KeyError expecificaly uses repr of the key for str(exc)
1215
- (ExcType::KeyError, Some(exc)) => StringRepr(exc).to_string(),
1216
- (_, Some(arg)) => arg.to_owned(),
1217
- (_, None) => String::new(),
1218
- }
1219
- }
1220
-
1221
- pub(crate) fn py_type(&self) -> Type {
1222
- Type::Exception(self.exc_type)
1223
- }
1224
-
1225
- /// Returns the exception formatted as Python would repr it.
1226
- pub fn py_repr_fmt(&self, f: &mut impl Write) -> std::fmt::Result {
1227
- let type_str: &'static str = self.exc_type.into();
1228
- write!(f, "{type_str}(")?;
1229
-
1230
- if let Some(arg) = &self.arg {
1231
- string_repr_fmt(arg, f)?;
1232
- }
1233
-
1234
- f.write_char(')')
1235
- }
1236
-
1237
- pub(crate) fn with_frame(self, frame: RawStackFrame) -> ExceptionRaise {
1238
- ExceptionRaise {
1239
- exc: self,
1240
- frame: Some(frame),
1241
- hide_caret: false,
1242
- }
1243
- }
1244
-
1245
- pub(crate) fn with_position(self, position: CodeRange) -> ExceptionRaise {
1246
- ExceptionRaise {
1247
- exc: self,
1248
- frame: Some(RawStackFrame::from_position(position)),
1249
- hide_caret: false,
1250
- }
1251
- }
1252
-
1253
- /// Gets an attribute from this exception.
1254
- ///
1255
- /// Handles the `.args` attribute by allocating a tuple containing the message.
1256
- /// Returns `Err(AttributeError)` for all other attributes.
1257
- pub fn py_getattr(
1258
- &self,
1259
- attr: &EitherStr,
1260
- heap: &mut Heap<impl ResourceTracker>,
1261
- interns: &Interns,
1262
- ) -> RunResult<Option<CallResult>> {
1263
- // Fast path: interned strings can be matched by ID
1264
- let is_args = attr
1265
- .static_string()
1266
- .map_or_else(|| attr.as_str(interns) == "args", |ss| ss == StaticStrings::Args);
1267
-
1268
- if is_args {
1269
- // Construct tuple with 0 or 1 elements based on whether arg exists
1270
- let elements = if let Some(arg_str) = &self.arg {
1271
- let str_id = heap.allocate(HeapData::Str(Str::from(arg_str.clone())))?;
1272
- smallvec![Value::Ref(str_id)]
1273
- } else {
1274
- smallvec![]
1275
- };
1276
- Ok(Some(CallResult::Value(allocate_tuple(elements, heap)?)))
1277
- } else {
1278
- Ok(None)
1279
- }
1280
- }
1281
- }
1282
-
1283
- /// A raised exception with optional stack frame for traceback.
1284
- #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
1285
- pub struct ExceptionRaise {
1286
- pub exc: SimpleException,
1287
- /// The stack frame where the exception was raised (first in vec is closest "bottom" frame).
1288
- pub frame: Option<RawStackFrame>,
1289
- /// Whether to hide the caret marker when creating the stack frame.
1290
- ///
1291
- /// CPython doesn't show carets for attribute GET errors, but does show them
1292
- /// for attribute SET errors. This flag allows error creators to specify
1293
- /// whether the caret should be hidden.
1294
- #[serde(default)]
1295
- pub hide_caret: bool,
1296
- }
1297
-
1298
- impl From<SimpleException> for ExceptionRaise {
1299
- fn from(exc: SimpleException) -> Self {
1300
- Self {
1301
- exc,
1302
- frame: None,
1303
- hide_caret: false,
1304
- }
1305
- }
1306
- }
1307
-
1308
- impl From<MontyException> for ExceptionRaise {
1309
- fn from(exc: MontyException) -> Self {
1310
- Self {
1311
- exc: exc.into(),
1312
- frame: None,
1313
- hide_caret: false,
1314
- }
1315
- }
1316
- }
1317
-
1318
- impl ExceptionRaise {
1319
- /// Adds a caller's frame as the outermost frame in the traceback chain.
1320
- ///
1321
- /// This is used when an exception propagates up through call frames.
1322
- /// The new frame becomes the ultimate parent (displayed first in traceback,
1323
- /// since tracebacks show "most recent call last").
1324
- ///
1325
- /// Special case: If the innermost frame has no name yet (created with `with_position`),
1326
- /// this sets its name instead of creating a new parent. This happens when the error
1327
- /// is raised from a namespace lookup - the initial frame has the position but not
1328
- /// the function name, which gets filled in as the error propagates.
1329
- pub(crate) fn add_caller_frame(&mut self, position: CodeRange, name: StringId) {
1330
- self.add_caller_frame_inner(position, name, false);
1331
- }
1332
-
1333
- fn add_caller_frame_inner(&mut self, position: CodeRange, name: StringId, hide_caret: bool) {
1334
- if let Some(ref mut frame) = self.frame {
1335
- // If innermost frame has no name, set it instead of adding a parent
1336
- // This handles errors from namespace lookups which create nameless frames
1337
- if frame.frame_name.is_none() {
1338
- frame.frame_name = Some(name);
1339
- frame.hide_caret = hide_caret;
1340
- return;
1341
- }
1342
- // Find the outermost frame (the one with no parent) and add the new frame as its parent
1343
- let mut current = frame;
1344
- while current.parent.is_some() {
1345
- current = current.parent.as_mut().unwrap();
1346
- }
1347
- let mut new_frame = RawStackFrame::new(position, name, None);
1348
- new_frame.hide_caret = hide_caret;
1349
- current.parent = Some(Box::new(new_frame));
1350
- } else {
1351
- // No frame yet - create one
1352
- let mut new_frame = RawStackFrame::new(position, name, None);
1353
- new_frame.hide_caret = hide_caret;
1354
- self.frame = Some(new_frame);
1355
- }
1356
- }
1357
-
1358
- /// Converts this exception to a `MontyException` for the public API.
1359
- ///
1360
- /// Uses `Interns` to resolve `StringId` references to actual strings.
1361
- /// Extracts preview lines from the source code for traceback display.
1362
- #[must_use]
1363
- pub fn into_python_exception(self, interns: &Interns, source: &str) -> MontyException {
1364
- let traceback = self
1365
- .frame
1366
- .map(|frame| {
1367
- let mut frames = Vec::new();
1368
- let mut current = Some(&frame);
1369
- while let Some(f) = current {
1370
- frames.push(StackFrame::from_raw(f, interns, source));
1371
- current = f.parent.as_deref();
1372
- }
1373
- // Reverse so outermost frame is first (Python's "most recent call last" ordering)
1374
- frames.reverse();
1375
- frames
1376
- })
1377
- .unwrap_or_default();
1378
-
1379
- MontyException::new_full(self.exc.exc_type(), self.exc.arg().cloned(), traceback)
1380
- }
1381
- }
1382
-
1383
- /// A stack frame for traceback information.
1384
- ///
1385
- /// Stores position information and optional function name as StringId.
1386
- /// The actual name string must be looked up externally when formatting the traceback.
1387
- #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
1388
- pub struct RawStackFrame {
1389
- pub position: CodeRange,
1390
- /// The name of the frame (function name StringId, or None for module-level code).
1391
- pub frame_name: Option<StringId>,
1392
- pub parent: Option<Box<Self>>,
1393
- /// Whether to hide the caret marker in the traceback for this frame.
1394
- ///
1395
- /// Set to `true` for:
1396
- /// - `raise` statements (CPython doesn't show carets for raise)
1397
- /// - `AttributeError` on attribute access (CPython doesn't show carets for these)
1398
- pub hide_caret: bool,
1399
- }
1400
-
1401
- impl RawStackFrame {
1402
- pub(crate) fn new(position: CodeRange, frame_name: StringId, parent: Option<&Self>) -> Self {
1403
- Self {
1404
- position,
1405
- frame_name: Some(frame_name),
1406
- parent: parent.map(|p| Box::new(p.clone())),
1407
- hide_caret: false,
1408
- }
1409
- }
1410
-
1411
- fn from_position(position: CodeRange) -> Self {
1412
- Self {
1413
- position,
1414
- frame_name: None,
1415
- parent: None,
1416
- hide_caret: false,
1417
- }
1418
- }
1419
-
1420
- /// Creates a new frame for a raise statement (no caret will be shown).
1421
- pub(crate) fn from_raise(position: CodeRange, frame_name: StringId) -> Self {
1422
- Self {
1423
- position,
1424
- frame_name: Some(frame_name),
1425
- parent: None,
1426
- hide_caret: true,
1427
- }
1428
- }
1429
- }
1430
-
1431
- /// Runtime error types that can occur during execution.
1432
- ///
1433
- /// Three variants:
1434
- /// - `Internal`: Bug in interpreter implementation (static message)
1435
- /// - `Exc`: Python exception that can be caught by try/except (when implemented)
1436
- /// - `UncatchableExc`: Python exception from resource limits that CANNOT be caught
1437
- #[derive(Debug, serde::Serialize, serde::Deserialize)]
1438
- pub(crate) enum RunError {
1439
- /// Internal interpreter error - indicates a bug in Monty, not user code.
1440
- Internal(Cow<'static, str>),
1441
- /// Catchable Python exception (e.g., ValueError, TypeError).
1442
- Exc(ExceptionRaise),
1443
- /// Uncatchable Python exception from resource limits (MemoryError, TimeoutError).
1444
- ///
1445
- /// These exceptions display with proper tracebacks like normal Python exceptions,
1446
- /// but cannot be caught by try/except blocks. This prevents untrusted code from
1447
- /// suppressing resource limit violations.
1448
- UncatchableExc(ExceptionRaise),
1449
- }
1450
-
1451
- impl From<ExceptionRaise> for RunError {
1452
- fn from(exc: ExceptionRaise) -> Self {
1453
- Self::Exc(exc)
1454
- }
1455
- }
1456
-
1457
- impl From<SimpleException> for RunError {
1458
- fn from(exc: SimpleException) -> Self {
1459
- Self::Exc(exc.into())
1460
- }
1461
- }
1462
-
1463
- impl From<MontyException> for RunError {
1464
- fn from(exc: MontyException) -> Self {
1465
- Self::Exc(exc.into())
1466
- }
1467
- }
1468
-
1469
- impl From<FormatError> for RunError {
1470
- fn from(err: FormatError) -> Self {
1471
- let exc_type = match &err {
1472
- FormatError::Overflow(_) => ExcType::OverflowError,
1473
- FormatError::InvalidAlignment(_) | FormatError::ValueError(_) => ExcType::ValueError,
1474
- };
1475
- Self::Exc(SimpleException::new_msg(exc_type, err).into())
1476
- }
1477
- }
1478
-
1479
- impl RunError {
1480
- /// Converts this runtime error to a `MontyException` for the public API.
1481
- ///
1482
- /// Internal errors are converted to `RuntimeError` exceptions with no traceback.
1483
- #[must_use]
1484
- pub fn into_python_exception(self, interns: &Interns, source: &str) -> MontyException {
1485
- match self {
1486
- Self::Exc(exc) | Self::UncatchableExc(exc) => exc.into_python_exception(interns, source),
1487
- Self::Internal(err) => MontyException::runtime_error(format!("Internal error in monty: {err}")),
1488
- }
1489
- }
1490
-
1491
- pub fn internal(msg: impl Into<Cow<'static, str>>) -> Self {
1492
- Self::Internal(msg.into())
1493
- }
1494
- }
1495
-
1496
- /// Formats a list of parameter names for error messages.
1497
- ///
1498
- /// Examples:
1499
- /// - `["a"]` -> `'a'`
1500
- /// - `["a", "b"]` -> `'a' and 'b'`
1501
- /// - `["a", "b", "c"]` -> `'a', 'b' and 'c'`
1502
- fn format_param_names(names: &[&str]) -> String {
1503
- match names.len() {
1504
- 0 => String::new(),
1505
- 1 => format!("'{}'", names[0]),
1506
- 2 => format!("'{}' and '{}'", names[0], names[1]),
1507
- _ => {
1508
- let last = names.last().unwrap();
1509
- let rest: Vec<_> = names[..names.len() - 1].iter().map(|n| format!("'{n}'")).collect();
1510
- format!("{} and '{last}'", rest.join(", "))
1511
- }
1512
- }
1513
- }