superacli 1.1.6 → 1.1.8

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 (1268) hide show
  1. package/CONTRIBUTING.md +270 -0
  2. package/README.md +141 -54
  3. package/__tests__/adapter-schema.test.js +251 -86
  4. package/__tests__/azd-plugin.test.js +109 -0
  5. package/__tests__/config.test.js +4 -3
  6. package/__tests__/discover.test.js +59 -0
  7. package/__tests__/goose-plugin.test.js +149 -0
  8. package/__tests__/help-json.test.js +2 -0
  9. package/__tests__/openhands-plugin.test.js +106 -0
  10. package/__tests__/plugin-cocoindex-code-uninstall.test.js +19 -0
  11. package/__tests__/plugin-cocoindex-code.test.js +37 -0
  12. package/__tests__/plugin-install-guidance.test.js +81 -0
  13. package/__tests__/plugins-registry.test.js +44 -0
  14. package/__tests__/plugins-store.test.js +40 -5
  15. package/__tests__/process-adapter.test.js +50 -1
  16. package/__tests__/resend-plugin.test.js +109 -82
  17. package/__tests__/server-app.test.js +1 -0
  18. package/__tests__/server-routes-commands.test.js +20 -2
  19. package/__tests__/server-routes-plugins.test.js +130 -0
  20. package/__tests__/skills.test.js +26 -0
  21. package/__tests__/squirrelscan-plugin.test.js +129 -0
  22. package/__tests__/uipath-plugin.test.js +104 -0
  23. package/__tests__/uipathcli-plugin.test.js +95 -0
  24. package/cli/adapters/mcp.js +2 -0
  25. package/cli/adapters/process.js +50 -7
  26. package/cli/config.js +240 -3
  27. package/cli/discover.js +157 -0
  28. package/cli/help-json.js +16 -1
  29. package/cli/plugin-install-guidance.js +92 -37
  30. package/cli/plugins-manager.js +4 -3
  31. package/cli/plugins-registry.js +74 -8
  32. package/cli/plugins-store.js +78 -17
  33. package/cli/skills-mcp.js +1 -1
  34. package/cli/skills.js +39 -2
  35. package/cli/supercli.js +255 -63
  36. package/docs/feature-gaps.md +8 -8
  37. package/docs/features/azd-uipath-plugins.md +43 -0
  38. package/docs/features/server-plugins.md +62 -0
  39. package/docs/features/skills.md +9 -5
  40. package/docs/index.html +183 -123
  41. package/docs/{supported-harnesses.md → plugins-available.md} +4 -3
  42. package/docs/{plugin-harness-guide.md → plugins-how-to.md} +1 -1
  43. package/docs/plugins.md +26 -20
  44. package/docs/server-plugins-usage-guide.md +182 -0
  45. package/docs/skills-catalog.md +12 -10
  46. package/index.html +384 -0
  47. package/package.json +2 -2
  48. package/plugins/agent-browser/README.md +69 -0
  49. package/plugins/agent-browser/plugin.json +111 -0
  50. package/plugins/agent-browser/skills/quickstart/SKILL.md +66 -0
  51. package/plugins/aider/README.md +53 -0
  52. package/plugins/aider/plugin.json +105 -0
  53. package/plugins/aider/scripts/aider-wrapper.js +243 -0
  54. package/plugins/aider/scripts/setup-aider.js +37 -0
  55. package/plugins/aider/skills/dry-run-review.md +24 -0
  56. package/plugins/aider/skills/model-and-provider.md +24 -0
  57. package/plugins/aider/skills/one-shot-edits.md +30 -0
  58. package/plugins/aider/skills/quickstart/SKILL.md +51 -0
  59. package/plugins/azd/README.md +28 -0
  60. package/plugins/azd/plugin.json +87 -0
  61. package/plugins/azd/skills/quickstart/SKILL.md +41 -0
  62. package/plugins/blogwatcher/README.md +3 -3
  63. package/plugins/boxlite/Dockerfile +9 -0
  64. package/plugins/boxlite/README.md +62 -0
  65. package/plugins/boxlite/plugin.json +201 -0
  66. package/plugins/boxlite/scripts/run-boxlite.js +106 -0
  67. package/plugins/boxlite/skills/quickstart/SKILL.md +40 -0
  68. package/plugins/cass/plugin.json +150 -0
  69. package/plugins/cass/scripts/setup-cass.js +47 -0
  70. package/plugins/cass/skills/quickstart/SKILL.md +46 -0
  71. package/plugins/clever/README.md +46 -0
  72. package/plugins/clever/plugin.json +119 -0
  73. package/plugins/clever/scripts/setup-clever.js +28 -0
  74. package/plugins/clever/skills/auth-and-profile.md +29 -0
  75. package/plugins/clever/skills/passthrough-safety.md +21 -0
  76. package/plugins/clever/skills/quickstart/SKILL.md +45 -0
  77. package/plugins/clever/skills/resource-inventory.md +24 -0
  78. package/plugins/clix/README.md +4 -4
  79. package/plugins/cocoindex-code/README.md +64 -0
  80. package/plugins/cocoindex-code/plugin.json +81 -0
  81. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-310.pyc +0 -0
  82. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-311.pyc +0 -0
  83. package/plugins/cocoindex-code/scripts/post-install.js +61 -0
  84. package/plugins/cocoindex-code/scripts/post-uninstall.js +25 -0
  85. package/plugins/cocoindex-code/scripts/query.py +88 -0
  86. package/plugins/cocoindex-code/scripts/run-query.js +50 -0
  87. package/plugins/cocoindex-code/skills/quickstart/SKILL.md +73 -0
  88. package/plugins/copilot/README.md +24 -0
  89. package/plugins/copilot/plugin.json +80 -0
  90. package/plugins/copilot/skills/quickstart/SKILL.md +44 -0
  91. package/plugins/gemini/README.md +24 -0
  92. package/plugins/gemini/plugin.json +98 -0
  93. package/plugins/gemini/skills/quickstart/SKILL.md +44 -0
  94. package/plugins/gifcap/plugin.json +119 -0
  95. package/plugins/gifcap/scripts/setup-gifcap.js +44 -0
  96. package/plugins/gifcap/skills/quickstart/SKILL.md +34 -0
  97. package/plugins/gifcap/test-record-quiet.gif +0 -0
  98. package/plugins/gifcap/test-record.gif +0 -0
  99. package/plugins/goose/README.md +36 -0
  100. package/plugins/goose/plugin.json +183 -0
  101. package/plugins/goose/skills/quickstart/SKILL.md +44 -0
  102. package/plugins/json-server/README.md +58 -0
  103. package/plugins/json-server/plugin.json +113 -0
  104. package/plugins/json-server/skills/quickstart/SKILL.md +57 -0
  105. package/plugins/lightpanda/README.md +145 -0
  106. package/plugins/lightpanda/package-lock.json +1375 -0
  107. package/plugins/lightpanda/package.json +12 -0
  108. package/plugins/lightpanda/plugin.json +116 -0
  109. package/plugins/lightpanda/scripts/lightpanda-contacts.js +494 -0
  110. package/plugins/lightpanda/scripts/lightpanda-generic-extract.js +403 -0
  111. package/plugins/lightpanda/scripts/lightpanda-wrapper.js +480 -0
  112. package/plugins/lightpanda/scripts/setup-lightpanda.js +39 -0
  113. package/plugins/lightpanda/skills/contact-discovery.md +51 -0
  114. package/plugins/lightpanda/skills/generic-extraction.md +66 -0
  115. package/plugins/lightpanda/skills/quickstart/SKILL.md +103 -0
  116. package/plugins/lightpanda/skills/resilient-navigation.md +42 -0
  117. package/plugins/monty/README.md +2 -2
  118. package/plugins/nullclaw/README.md +3 -3
  119. package/plugins/offline-ai/README.md +23 -0
  120. package/plugins/offline-ai/plugin.json +82 -0
  121. package/plugins/offline-ai/skills/quickstart/SKILL.md +43 -0
  122. package/plugins/openhands/README.md +25 -0
  123. package/plugins/openhands/plugin.json +116 -0
  124. package/plugins/openhands/skills/quickstart/SKILL.md +26 -0
  125. package/plugins/plandex/README.md +25 -0
  126. package/plugins/plandex/plugin.json +130 -0
  127. package/plugins/plandex/skills/quickstart/SKILL.md +50 -0
  128. package/plugins/plugins.json +199 -0
  129. package/plugins/squirrelscan/Dockerfile +5 -0
  130. package/plugins/squirrelscan/README.md +47 -0
  131. package/plugins/squirrelscan/plugin.json +493 -0
  132. package/plugins/squirrelscan/scripts/post-install.js +33 -0
  133. package/plugins/squirrelscan/scripts/post-uninstall.js +25 -0
  134. package/plugins/squirrelscan/scripts/run-squirrel.js +73 -0
  135. package/plugins/squirrelscan/skills/audit-workflow/SKILL.md +33 -0
  136. package/plugins/squirrelscan/skills/publish-report/SKILL.md +33 -0
  137. package/plugins/squirrelscan/skills/quickstart/SKILL.md +41 -0
  138. package/plugins/uipath/README.md +27 -0
  139. package/plugins/uipath/plugin.json +86 -0
  140. package/plugins/uipath/skills/quickstart/SKILL.md +47 -0
  141. package/plugins/uipathcli/README.md +28 -0
  142. package/plugins/uipathcli/plugin.json +120 -0
  143. package/plugins/uipathcli/scripts/run-uipath-cli.js +49 -0
  144. package/plugins/uipathcli/skills/quickstart/SKILL.md +22 -0
  145. package/plugins/xurl/README.md +4 -4
  146. package/server/app.js +5 -2
  147. package/server/public/app.js +3 -0
  148. package/server/routes/commands.js +95 -12
  149. package/server/routes/plugins.js +262 -0
  150. package/server/services/pluginsService.js +303 -0
  151. package/server/views/command-edit.ejs +196 -14
  152. package/server/views/partials/head.ejs +1 -0
  153. package/server/views/plugins.ejs +264 -0
  154. package/tests/test-plugins-registry.js +30 -0
  155. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +0 -20
  156. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +0 -1
  157. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +0 -21
  158. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +0 -1
  159. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +0 -22
  160. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +0 -1
  161. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +0 -23
  162. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +0 -1
  163. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +0 -24
  164. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +0 -1
  165. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +0 -24
  166. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +0 -1
  167. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +0 -24
  168. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +0 -1
  169. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +0 -24
  170. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +0 -1
  171. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +0 -24
  172. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +0 -1
  173. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +0 -24
  174. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +0 -1
  175. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +0 -24
  176. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +0 -1
  177. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +0 -24
  178. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +0 -1
  179. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +0 -24
  180. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +0 -1
  181. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +0 -25
  182. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +0 -1
  183. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +0 -25
  184. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +0 -1
  185. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +0 -25
  186. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +0 -1
  187. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +0 -26
  188. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +0 -1
  189. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +0 -27
  190. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +0 -1
  191. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +0 -28
  192. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +0 -1
  193. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +0 -29
  194. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +0 -1
  195. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +0 -30
  196. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +0 -1
  197. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +0 -31
  198. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +0 -1
  199. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +0 -32
  200. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +0 -1
  201. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +0 -32
  202. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +0 -1
  203. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +0 -32
  204. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +0 -1
  205. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +0 -32
  206. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +0 -1
  207. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +0 -32
  208. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +0 -1
  209. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +0 -32
  210. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +0 -1
  211. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +0 -32
  212. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +0 -1
  213. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +0 -32
  214. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +0 -1
  215. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +0 -32
  216. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +0 -1
  217. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +0 -32
  218. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +0 -1
  219. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +0 -32
  220. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +0 -1
  221. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +0 -32
  222. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +0 -1
  223. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +0 -32
  224. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +0 -1
  225. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +0 -32
  226. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +0 -1
  227. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +0 -33
  228. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +0 -1
  229. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +0 -33
  230. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +0 -1
  231. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +0 -34
  232. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +0 -1
  233. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +0 -34
  234. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +0 -1
  235. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +0 -35
  236. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +0 -1
  237. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +0 -36
  238. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +0 -1
  239. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +0 -37
  240. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +0 -1
  241. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +0 -38
  242. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +0 -1
  243. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +0 -39
  244. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +0 -1
  245. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +0 -40
  246. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +0 -1
  247. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +0 -41
  248. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +0 -1
  249. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +0 -42
  250. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +0 -1
  251. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +0 -43
  252. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +0 -1
  253. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +0 -44
  254. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +0 -1
  255. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +0 -45
  256. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +0 -1
  257. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +0 -46
  258. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +0 -1
  259. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +0 -47
  260. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +0 -1
  261. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +0 -48
  262. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +0 -1
  263. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +0 -49
  264. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +0 -1
  265. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +0 -50
  266. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +0 -1
  267. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +0 -51
  268. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +0 -1
  269. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +0 -52
  270. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +0 -1
  271. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +0 -53
  272. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +0 -1
  273. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +0 -54
  274. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +0 -1
  275. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +0 -55
  276. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +0 -1
  277. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +0 -56
  278. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +0 -1
  279. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +0 -57
  280. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +0 -1
  281. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +0 -57
  282. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +0 -1
  283. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +0 -57
  284. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +0 -1
  285. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +0 -57
  286. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +0 -1
  287. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +0 -57
  288. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +0 -1
  289. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +0 -57
  290. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +0 -1
  291. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +0 -57
  292. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +0 -1
  293. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +0 -57
  294. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +0 -1
  295. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +0 -57
  296. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +0 -1
  297. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +0 -57
  298. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +0 -1
  299. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +0 -57
  300. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +0 -1
  301. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +0 -57
  302. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +0 -1
  303. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +0 -57
  304. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +0 -1
  305. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +0 -57
  306. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +0 -1
  307. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +0 -57
  308. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +0 -1
  309. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +0 -57
  310. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +0 -1
  311. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +0 -57
  312. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +0 -1
  313. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +0 -57
  314. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +0 -1
  315. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +0 -57
  316. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +0 -1
  317. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +0 -57
  318. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +0 -1
  319. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +0 -57
  320. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +0 -1
  321. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +0 -57
  322. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +0 -1
  323. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +0 -57
  324. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +0 -1
  325. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +0 -57
  326. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +0 -1
  327. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +0 -57
  328. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +0 -1
  329. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +0 -57
  330. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +0 -1
  331. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +0 -57
  332. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +0 -1
  333. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +0 -57
  334. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +0 -1
  335. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +0 -57
  336. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +0 -1
  337. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +0 -57
  338. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +0 -1
  339. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +0 -58
  340. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +0 -1
  341. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +0 -59
  342. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +0 -1
  343. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +0 -60
  344. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +0 -1
  345. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +0 -60
  346. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +0 -1
  347. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +0 -60
  348. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +0 -1
  349. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +0 -60
  350. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +0 -1
  351. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +0 -60
  352. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +0 -1
  353. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +0 -60
  354. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +0 -1
  355. package/.beads/config.yaml +0 -4
  356. package/.beads/issues.jsonl +0 -60
  357. package/.beads/metadata.json +0 -4
  358. package/docs/docs.html +0 -224
  359. package/docs/mcp-cheatsheet.md +0 -324
  360. package/docs/visual-overview.md +0 -21
  361. package/ref-monty/.cargo/config.toml +0 -3
  362. package/ref-monty/.claude/settings.json +0 -60
  363. package/ref-monty/.claude/skills/fastmod/SKILL.md +0 -22
  364. package/ref-monty/.claude/skills/python-playground/SKILL.md +0 -47
  365. package/ref-monty/.codecov.yml +0 -12
  366. package/ref-monty/.github/actions/build-pgo-wheel/action.yml +0 -72
  367. package/ref-monty/.github/workflows/ci.yml +0 -776
  368. package/ref-monty/.github/workflows/codspeed.yml +0 -45
  369. package/ref-monty/.github/workflows/init-npm-packages.yml +0 -82
  370. package/ref-monty/.pre-commit-config.yaml +0 -47
  371. package/ref-monty/.python-version +0 -1
  372. package/ref-monty/.rustfmt.toml +0 -4
  373. package/ref-monty/.zed/settings.json +0 -11
  374. package/ref-monty/CLAUDE.md +0 -535
  375. package/ref-monty/Cargo.lock +0 -3798
  376. package/ref-monty/Cargo.toml +0 -87
  377. package/ref-monty/LICENSE +0 -21
  378. package/ref-monty/Makefile +0 -216
  379. package/ref-monty/README.md +0 -430
  380. package/ref-monty/RELEASING.md +0 -47
  381. package/ref-monty/crates/fuzz/Cargo.toml +0 -30
  382. package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +0 -37
  383. package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +0 -552
  384. package/ref-monty/crates/monty/Cargo.toml +0 -68
  385. package/ref-monty/crates/monty/benches/main.rs +0 -247
  386. package/ref-monty/crates/monty/build.rs +0 -10
  387. package/ref-monty/crates/monty/src/args.rs +0 -733
  388. package/ref-monty/crates/monty/src/asyncio.rs +0 -179
  389. package/ref-monty/crates/monty/src/builtins/abs.rs +0 -55
  390. package/ref-monty/crates/monty/src/builtins/all.rs +0 -30
  391. package/ref-monty/crates/monty/src/builtins/any.rs +0 -30
  392. package/ref-monty/crates/monty/src/builtins/bin.rs +0 -59
  393. package/ref-monty/crates/monty/src/builtins/chr.rs +0 -46
  394. package/ref-monty/crates/monty/src/builtins/divmod.rs +0 -164
  395. package/ref-monty/crates/monty/src/builtins/enumerate.rs +0 -52
  396. package/ref-monty/crates/monty/src/builtins/filter.rs +0 -67
  397. package/ref-monty/crates/monty/src/builtins/getattr.rs +0 -65
  398. package/ref-monty/crates/monty/src/builtins/hash.rs +0 -28
  399. package/ref-monty/crates/monty/src/builtins/hex.rs +0 -58
  400. package/ref-monty/crates/monty/src/builtins/id.rs +0 -24
  401. package/ref-monty/crates/monty/src/builtins/isinstance.rs +0 -68
  402. package/ref-monty/crates/monty/src/builtins/len.rs +0 -25
  403. package/ref-monty/crates/monty/src/builtins/map.rs +0 -98
  404. package/ref-monty/crates/monty/src/builtins/min_max.rs +0 -113
  405. package/ref-monty/crates/monty/src/builtins/mod.rs +0 -246
  406. package/ref-monty/crates/monty/src/builtins/next.rs +0 -21
  407. package/ref-monty/crates/monty/src/builtins/oct.rs +0 -59
  408. package/ref-monty/crates/monty/src/builtins/ord.rs +0 -67
  409. package/ref-monty/crates/monty/src/builtins/pow.rs +0 -365
  410. package/ref-monty/crates/monty/src/builtins/print.rs +0 -141
  411. package/ref-monty/crates/monty/src/builtins/repr.rs +0 -16
  412. package/ref-monty/crates/monty/src/builtins/reversed.rs +0 -28
  413. package/ref-monty/crates/monty/src/builtins/round.rs +0 -174
  414. package/ref-monty/crates/monty/src/builtins/sorted.rs +0 -151
  415. package/ref-monty/crates/monty/src/builtins/sum.rs +0 -66
  416. package/ref-monty/crates/monty/src/builtins/type_.rs +0 -16
  417. package/ref-monty/crates/monty/src/builtins/zip.rs +0 -77
  418. package/ref-monty/crates/monty/src/bytecode/builder.rs +0 -699
  419. package/ref-monty/crates/monty/src/bytecode/code.rs +0 -310
  420. package/ref-monty/crates/monty/src/bytecode/compiler.rs +0 -3206
  421. package/ref-monty/crates/monty/src/bytecode/mod.rs +0 -24
  422. package/ref-monty/crates/monty/src/bytecode/op.rs +0 -617
  423. package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +0 -1058
  424. package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +0 -63
  425. package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +0 -487
  426. package/ref-monty/crates/monty/src/bytecode/vm/call.rs +0 -767
  427. package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +0 -741
  428. package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +0 -147
  429. package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +0 -297
  430. package/ref-monty/crates/monty/src/bytecode/vm/format.rs +0 -132
  431. package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +0 -1958
  432. package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +0 -620
  433. package/ref-monty/crates/monty/src/exception_private.rs +0 -1513
  434. package/ref-monty/crates/monty/src/exception_public.rs +0 -346
  435. package/ref-monty/crates/monty/src/expressions.rs +0 -694
  436. package/ref-monty/crates/monty/src/fstring.rs +0 -854
  437. package/ref-monty/crates/monty/src/function.rs +0 -119
  438. package/ref-monty/crates/monty/src/heap.rs +0 -1073
  439. package/ref-monty/crates/monty/src/heap_data.rs +0 -985
  440. package/ref-monty/crates/monty/src/heap_traits.rs +0 -312
  441. package/ref-monty/crates/monty/src/intern.rs +0 -837
  442. package/ref-monty/crates/monty/src/io.rs +0 -106
  443. package/ref-monty/crates/monty/src/lib.rs +0 -52
  444. package/ref-monty/crates/monty/src/modules/asyncio.rs +0 -144
  445. package/ref-monty/crates/monty/src/modules/math.rs +0 -1453
  446. package/ref-monty/crates/monty/src/modules/mod.rs +0 -120
  447. package/ref-monty/crates/monty/src/modules/os.rs +0 -116
  448. package/ref-monty/crates/monty/src/modules/pathlib.rs +0 -33
  449. package/ref-monty/crates/monty/src/modules/re.rs +0 -606
  450. package/ref-monty/crates/monty/src/modules/sys.rs +0 -60
  451. package/ref-monty/crates/monty/src/modules/typing.rs +0 -70
  452. package/ref-monty/crates/monty/src/namespace.rs +0 -21
  453. package/ref-monty/crates/monty/src/object.rs +0 -1040
  454. package/ref-monty/crates/monty/src/os.rs +0 -215
  455. package/ref-monty/crates/monty/src/parse.rs +0 -1730
  456. package/ref-monty/crates/monty/src/prepare.rs +0 -3015
  457. package/ref-monty/crates/monty/src/repl.rs +0 -1109
  458. package/ref-monty/crates/monty/src/resource.rs +0 -559
  459. package/ref-monty/crates/monty/src/run.rs +0 -457
  460. package/ref-monty/crates/monty/src/run_progress.rs +0 -821
  461. package/ref-monty/crates/monty/src/signature.rs +0 -651
  462. package/ref-monty/crates/monty/src/sorting.rs +0 -100
  463. package/ref-monty/crates/monty/src/types/bytes.rs +0 -2356
  464. package/ref-monty/crates/monty/src/types/dataclass.rs +0 -345
  465. package/ref-monty/crates/monty/src/types/dict.rs +0 -879
  466. package/ref-monty/crates/monty/src/types/dict_view.rs +0 -619
  467. package/ref-monty/crates/monty/src/types/iter.rs +0 -799
  468. package/ref-monty/crates/monty/src/types/list.rs +0 -929
  469. package/ref-monty/crates/monty/src/types/long_int.rs +0 -211
  470. package/ref-monty/crates/monty/src/types/mod.rs +0 -48
  471. package/ref-monty/crates/monty/src/types/module.rs +0 -146
  472. package/ref-monty/crates/monty/src/types/namedtuple.rs +0 -261
  473. package/ref-monty/crates/monty/src/types/path.rs +0 -596
  474. package/ref-monty/crates/monty/src/types/property.rs +0 -35
  475. package/ref-monty/crates/monty/src/types/py_trait.rs +0 -322
  476. package/ref-monty/crates/monty/src/types/range.rs +0 -285
  477. package/ref-monty/crates/monty/src/types/re_match.rs +0 -522
  478. package/ref-monty/crates/monty/src/types/re_pattern.rs +0 -726
  479. package/ref-monty/crates/monty/src/types/set.rs +0 -1373
  480. package/ref-monty/crates/monty/src/types/slice.rs +0 -257
  481. package/ref-monty/crates/monty/src/types/str.rs +0 -2051
  482. package/ref-monty/crates/monty/src/types/tuple.rs +0 -376
  483. package/ref-monty/crates/monty/src/types/type.rs +0 -407
  484. package/ref-monty/crates/monty/src/value.rs +0 -2558
  485. package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +0 -3
  486. package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +0 -3
  487. package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +0 -3
  488. package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +0 -3
  489. package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +0 -3
  490. package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +0 -3
  491. package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +0 -3
  492. package/ref-monty/crates/monty/test_cases/args__id_too_many.py +0 -2
  493. package/ref-monty/crates/monty/test_cases/args__len_no_args.py +0 -2
  494. package/ref-monty/crates/monty/test_cases/args__len_too_many.py +0 -2
  495. package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +0 -9
  496. package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +0 -9
  497. package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +0 -3
  498. package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +0 -3
  499. package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +0 -3
  500. package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +0 -3
  501. package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +0 -2
  502. package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +0 -2
  503. package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +0 -2
  504. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +0 -2
  505. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +0 -2
  506. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +0 -2
  507. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +0 -9
  508. package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +0 -2
  509. package/ref-monty/crates/monty/test_cases/assert__fail.py +0 -2
  510. package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +0 -2
  511. package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +0 -3
  512. package/ref-monty/crates/monty/test_cases/assert__ops.py +0 -11
  513. package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +0 -47
  514. package/ref-monty/crates/monty/test_cases/async__basic.py +0 -10
  515. package/ref-monty/crates/monty/test_cases/async__closure.py +0 -14
  516. package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +0 -16
  517. package/ref-monty/crates/monty/test_cases/async__exception.py +0 -10
  518. package/ref-monty/crates/monty/test_cases/async__ext_call.py +0 -73
  519. package/ref-monty/crates/monty/test_cases/async__gather_all.py +0 -85
  520. package/ref-monty/crates/monty/test_cases/async__nested_await.py +0 -15
  521. package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +0 -37
  522. package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +0 -10
  523. package/ref-monty/crates/monty/test_cases/async__not_imported.py +0 -14
  524. package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +0 -27
  525. package/ref-monty/crates/monty/test_cases/async__return_types.py +0 -31
  526. package/ref-monty/crates/monty/test_cases/async__sequential.py +0 -16
  527. package/ref-monty/crates/monty/test_cases/async__traceback.py +0 -19
  528. package/ref-monty/crates/monty/test_cases/async__with_args.py +0 -14
  529. package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +0 -9
  530. package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +0 -9
  531. package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +0 -12
  532. package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +0 -10
  533. package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +0 -10
  534. package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +0 -68
  535. package/ref-monty/crates/monty/test_cases/bool__ops.py +0 -20
  536. package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +0 -2
  537. package/ref-monty/crates/monty/test_cases/builtin__filter.py +0 -62
  538. package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +0 -11
  539. package/ref-monty/crates/monty/test_cases/builtin__getattr.py +0 -84
  540. package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +0 -42
  541. package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +0 -66
  542. package/ref-monty/crates/monty/test_cases/builtin__map.py +0 -74
  543. package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +0 -11
  544. package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +0 -154
  545. package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +0 -148
  546. package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +0 -10
  547. package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +0 -9
  548. package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +0 -12
  549. package/ref-monty/crates/monty/test_cases/builtin__repr.py +0 -3
  550. package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +0 -73
  551. package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +0 -18
  552. package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +0 -10
  553. package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +0 -10
  554. package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +0 -10
  555. package/ref-monty/crates/monty/test_cases/bytes__methods.py +0 -394
  556. package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +0 -9
  557. package/ref-monty/crates/monty/test_cases/bytes__ops.py +0 -90
  558. package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +0 -10
  559. package/ref-monty/crates/monty/test_cases/call_object.py +0 -3
  560. package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +0 -79
  561. package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +0 -81
  562. package/ref-monty/crates/monty/test_cases/closure__pep448.py +0 -203
  563. package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +0 -13
  564. package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +0 -120
  565. package/ref-monty/crates/monty/test_cases/comprehension__all.py +0 -208
  566. package/ref-monty/crates/monty/test_cases/comprehension__scope.py +0 -7
  567. package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +0 -14
  568. package/ref-monty/crates/monty/test_cases/dataclass__basic.py +0 -238
  569. package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +0 -12
  570. package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +0 -12
  571. package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +0 -11
  572. package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +0 -3
  573. package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +0 -2
  574. package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +0 -3
  575. package/ref-monty/crates/monty/test_cases/dict__methods.py +0 -151
  576. package/ref-monty/crates/monty/test_cases/dict__ops.py +0 -133
  577. package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +0 -4
  578. package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +0 -9
  579. package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +0 -3
  580. package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +0 -2
  581. package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +0 -2
  582. package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +0 -2
  583. package/ref-monty/crates/monty/test_cases/dict__views.py +0 -165
  584. package/ref-monty/crates/monty/test_cases/edge__all.py +0 -26
  585. package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +0 -2
  586. package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +0 -2
  587. package/ref-monty/crates/monty/test_cases/exc__args.py +0 -16
  588. package/ref-monty/crates/monty/test_cases/exc__str.py +0 -15
  589. package/ref-monty/crates/monty/test_cases/execute_ok__all.py +0 -54
  590. package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +0 -2
  591. package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +0 -2
  592. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +0 -2
  593. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +0 -2
  594. package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +0 -2
  595. package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +0 -4
  596. package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +0 -2
  597. package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +0 -2
  598. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +0 -4
  599. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +0 -3
  600. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +0 -4
  601. package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +0 -22
  602. package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +0 -17
  603. package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +0 -7
  604. package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +0 -34
  605. package/ref-monty/crates/monty/test_cases/ext_call__basic.py +0 -99
  606. package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +0 -37
  607. package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +0 -17
  608. package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +0 -16
  609. package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +0 -26
  610. package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +0 -18
  611. package/ref-monty/crates/monty/test_cases/ext_call__elif.py +0 -171
  612. package/ref-monty/crates/monty/test_cases/ext_call__exc.py +0 -4
  613. package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +0 -39
  614. package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +0 -17
  615. package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +0 -31
  616. package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +0 -171
  617. package/ref-monty/crates/monty/test_cases/ext_call__for.py +0 -114
  618. package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +0 -12
  619. package/ref-monty/crates/monty/test_cases/ext_call__if.py +0 -135
  620. package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +0 -37
  621. package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +0 -14
  622. package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +0 -40
  623. package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +0 -7
  624. package/ref-monty/crates/monty/test_cases/ext_call__literals.py +0 -17
  625. package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +0 -32
  626. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +0 -69
  627. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +0 -4
  628. package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +0 -14
  629. package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +0 -19
  630. package/ref-monty/crates/monty/test_cases/ext_call__return.py +0 -28
  631. package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +0 -25
  632. package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +0 -7
  633. package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +0 -28
  634. package/ref-monty/crates/monty/test_cases/ext_call__try.py +0 -280
  635. package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +0 -10
  636. package/ref-monty/crates/monty/test_cases/ext_call__unary.py +0 -13
  637. package/ref-monty/crates/monty/test_cases/frozenset__ops.py +0 -178
  638. package/ref-monty/crates/monty/test_cases/fstring__all.py +0 -236
  639. package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +0 -3
  640. package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +0 -3
  641. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +0 -3
  642. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +0 -3
  643. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +0 -4
  644. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +0 -4
  645. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +0 -4
  646. package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +0 -3
  647. package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +0 -6
  648. package/ref-monty/crates/monty/test_cases/function__call_unpack.py +0 -42
  649. package/ref-monty/crates/monty/test_cases/function__defaults.py +0 -117
  650. package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +0 -7
  651. package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +0 -7
  652. package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +0 -9
  653. package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +0 -7
  654. package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +0 -7
  655. package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +0 -9
  656. package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +0 -7
  657. package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +0 -7
  658. package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +0 -7
  659. package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +0 -7
  660. package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +0 -7
  661. package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +0 -7
  662. package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +0 -7
  663. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +0 -7
  664. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +0 -9
  665. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +0 -13
  666. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +0 -7
  667. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +0 -6
  668. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +0 -8
  669. package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +0 -6
  670. package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +0 -6
  671. package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +0 -6
  672. package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +0 -173
  673. package/ref-monty/crates/monty/test_cases/function__ops.py +0 -294
  674. package/ref-monty/crates/monty/test_cases/function__return_none.py +0 -42
  675. package/ref-monty/crates/monty/test_cases/function__signatures.py +0 -47
  676. package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +0 -6
  677. package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +0 -6
  678. package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +0 -6
  679. package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +0 -6
  680. package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +0 -6
  681. package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +0 -6
  682. package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +0 -7
  683. package/ref-monty/crates/monty/test_cases/global__ops.py +0 -163
  684. package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +0 -2
  685. package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +0 -2
  686. package/ref-monty/crates/monty/test_cases/hash__ops.py +0 -153
  687. package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +0 -3
  688. package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +0 -5
  689. package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +0 -3
  690. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +0 -10
  691. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +0 -6
  692. package/ref-monty/crates/monty/test_cases/id__ops.py +0 -97
  693. package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +0 -3
  694. package/ref-monty/crates/monty/test_cases/if__elif_else.py +0 -207
  695. package/ref-monty/crates/monty/test_cases/if__raise_elif.py +0 -11
  696. package/ref-monty/crates/monty/test_cases/if__raise_else.py +0 -13
  697. package/ref-monty/crates/monty/test_cases/if__raise_if.py +0 -9
  698. package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +0 -18
  699. package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +0 -16
  700. package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +0 -55
  701. package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +0 -9
  702. package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +0 -9
  703. package/ref-monty/crates/monty/test_cases/import__local_scope.py +0 -68
  704. package/ref-monty/crates/monty/test_cases/import__os.py +0 -25
  705. package/ref-monty/crates/monty/test_cases/import__relative_error.py +0 -9
  706. package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +0 -9
  707. package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +0 -14
  708. package/ref-monty/crates/monty/test_cases/import__star_error.py +0 -11
  709. package/ref-monty/crates/monty/test_cases/import__sys.py +0 -47
  710. package/ref-monty/crates/monty/test_cases/import__sys_monty.py +0 -28
  711. package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +0 -37
  712. package/ref-monty/crates/monty/test_cases/import__typing.py +0 -25
  713. package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +0 -4
  714. package/ref-monty/crates/monty/test_cases/int__bigint.py +0 -467
  715. package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +0 -260
  716. package/ref-monty/crates/monty/test_cases/int__ops.py +0 -219
  717. package/ref-monty/crates/monty/test_cases/int__overflow_division.py +0 -84
  718. package/ref-monty/crates/monty/test_cases/is_variant__all.py +0 -36
  719. package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +0 -2
  720. package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +0 -2
  721. package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +0 -4
  722. package/ref-monty/crates/monty/test_cases/iter__for.py +0 -243
  723. package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +0 -66
  724. package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +0 -20
  725. package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +0 -7
  726. package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +0 -3
  727. package/ref-monty/crates/monty/test_cases/lambda__all.py +0 -145
  728. package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +0 -7
  729. package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +0 -3
  730. package/ref-monty/crates/monty/test_cases/list__index_not_found.py +0 -9
  731. package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +0 -10
  732. package/ref-monty/crates/monty/test_cases/list__ops.py +0 -473
  733. package/ref-monty/crates/monty/test_cases/list__pop_empty.py +0 -9
  734. package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +0 -9
  735. package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +0 -9
  736. package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +0 -9
  737. package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +0 -13
  738. package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +0 -13
  739. package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +0 -10
  740. package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +0 -10
  741. package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +0 -2
  742. package/ref-monty/crates/monty/test_cases/longint__index_error.py +0 -3
  743. package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +0 -3
  744. package/ref-monty/crates/monty/test_cases/loop__break_continue.py +0 -113
  745. package/ref-monty/crates/monty/test_cases/loop__break_finally.py +0 -69
  746. package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +0 -13
  747. package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +0 -11
  748. package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +0 -55
  749. package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +0 -9
  750. package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +0 -81
  751. package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +0 -13
  752. package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +0 -11
  753. package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +0 -60
  754. package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +0 -9
  755. package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +0 -11
  756. package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +0 -11
  757. package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +0 -11
  758. package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +0 -11
  759. package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +0 -11
  760. package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +0 -11
  761. package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +0 -11
  762. package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +0 -11
  763. package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +0 -11
  764. package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +0 -11
  765. package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +0 -11
  766. package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +0 -11
  767. package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +0 -11
  768. package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +0 -11
  769. package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +0 -11
  770. package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +0 -11
  771. package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +0 -11
  772. package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +0 -11
  773. package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +0 -11
  774. package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +0 -11
  775. package/ref-monty/crates/monty/test_cases/math__module.py +0 -1432
  776. package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +0 -11
  777. package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +0 -11
  778. package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +0 -11
  779. package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +0 -11
  780. package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +0 -11
  781. package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +0 -259
  782. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +0 -19
  783. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +0 -12
  784. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +0 -9
  785. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +0 -9
  786. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +0 -16
  787. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +0 -9
  788. package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +0 -10
  789. package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +0 -11
  790. package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +0 -34
  791. package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +0 -3
  792. package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +0 -353
  793. package/ref-monty/crates/monty/test_cases/os__environ.py +0 -40
  794. package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +0 -5
  795. package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +0 -5
  796. package/ref-monty/crates/monty/test_cases/parse_error__complex.py +0 -3
  797. package/ref-monty/crates/monty/test_cases/pathlib__import.py +0 -11
  798. package/ref-monty/crates/monty/test_cases/pathlib__os.py +0 -136
  799. package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +0 -12
  800. package/ref-monty/crates/monty/test_cases/pathlib__pure.py +0 -81
  801. package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +0 -5
  802. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +0 -6
  803. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +0 -5
  804. package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +0 -6
  805. package/ref-monty/crates/monty/test_cases/range__error_no_args.py +0 -2
  806. package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +0 -2
  807. package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +0 -2
  808. package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +0 -10
  809. package/ref-monty/crates/monty/test_cases/range__ops.py +0 -236
  810. package/ref-monty/crates/monty/test_cases/re__basic.py +0 -756
  811. package/ref-monty/crates/monty/test_cases/re__grouping.py +0 -241
  812. package/ref-monty/crates/monty/test_cases/re__match.py +0 -148
  813. package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +0 -26
  814. package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +0 -23
  815. package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +0 -46
  816. package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +0 -12
  817. package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +0 -13
  818. package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +0 -18
  819. package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +0 -12
  820. package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +0 -5
  821. package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +0 -5
  822. package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +0 -14
  823. package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +0 -6
  824. package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +0 -16
  825. package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +0 -18
  826. package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +0 -25
  827. package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +0 -4
  828. package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +0 -27
  829. package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +0 -6
  830. package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +0 -5
  831. package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +0 -5
  832. package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +0 -5
  833. package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +0 -5
  834. package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +0 -4
  835. package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +0 -37
  836. package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +0 -34
  837. package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +0 -31
  838. package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +0 -4
  839. package/ref-monty/crates/monty/test_cases/refcount__single_list.py +0 -3
  840. package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +0 -24
  841. package/ref-monty/crates/monty/test_cases/set__ops.py +0 -191
  842. package/ref-monty/crates/monty/test_cases/set__review_bugs.py +0 -35
  843. package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +0 -2
  844. package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +0 -2
  845. package/ref-monty/crates/monty/test_cases/slice__kwargs.py +0 -9
  846. package/ref-monty/crates/monty/test_cases/slice__no_args.py +0 -9
  847. package/ref-monty/crates/monty/test_cases/slice__ops.py +0 -149
  848. package/ref-monty/crates/monty/test_cases/slice__step_zero.py +0 -9
  849. package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +0 -9
  850. package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +0 -9
  851. package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +0 -9
  852. package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +0 -9
  853. package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +0 -9
  854. package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +0 -10
  855. package/ref-monty/crates/monty/test_cases/str__index_not_found.py +0 -9
  856. package/ref-monty/crates/monty/test_cases/str__join_no_args.py +0 -9
  857. package/ref-monty/crates/monty/test_cases/str__join_non_string.py +0 -9
  858. package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +0 -9
  859. package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +0 -9
  860. package/ref-monty/crates/monty/test_cases/str__methods.py +0 -327
  861. package/ref-monty/crates/monty/test_cases/str__ops.py +0 -162
  862. package/ref-monty/crates/monty/test_cases/str__partition_empty.py +0 -9
  863. package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +0 -9
  864. package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +0 -9
  865. package/ref-monty/crates/monty/test_cases/sys__types.py +0 -7
  866. package/ref-monty/crates/monty/test_cases/traceback__division_error.py +0 -30
  867. package/ref-monty/crates/monty/test_cases/traceback__index_error.py +0 -17
  868. package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +0 -10
  869. package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +0 -29
  870. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +0 -10
  871. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +0 -24
  872. package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +0 -9
  873. package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +0 -23
  874. package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +0 -11
  875. package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +0 -16
  876. package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +0 -16
  877. package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +0 -16
  878. package/ref-monty/crates/monty/test_cases/try_except__all.py +0 -472
  879. package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +0 -2
  880. package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +0 -5
  881. package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +0 -3
  882. package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +0 -9
  883. package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +0 -10
  884. package/ref-monty/crates/monty/test_cases/tuple__methods.py +0 -19
  885. package/ref-monty/crates/monty/test_cases/tuple__ops.py +0 -133
  886. package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +0 -2
  887. package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +0 -9
  888. package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +0 -2
  889. package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +0 -9
  890. package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +0 -11
  891. package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +0 -2
  892. package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +0 -9
  893. package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +0 -9
  894. package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +0 -9
  895. package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +0 -2
  896. package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +0 -2
  897. package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +0 -9
  898. package/ref-monty/crates/monty/test_cases/type__ops.py +0 -200
  899. package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +0 -3
  900. package/ref-monty/crates/monty/test_cases/type__shadow_int.py +0 -9
  901. package/ref-monty/crates/monty/test_cases/type__shadow_len.py +0 -3
  902. package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +0 -2
  903. package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +0 -2
  904. package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +0 -2
  905. package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +0 -2
  906. package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +0 -3
  907. package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +0 -2
  908. package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +0 -2
  909. package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +0 -2
  910. package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +0 -2
  911. package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +0 -2
  912. package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +0 -6
  913. package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +0 -2
  914. package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +0 -3
  915. package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +0 -3
  916. package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +0 -4
  917. package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +0 -3
  918. package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +0 -4
  919. package/ref-monty/crates/monty/test_cases/typing__types.py +0 -24
  920. package/ref-monty/crates/monty/test_cases/unpack__nested.py +0 -48
  921. package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +0 -9
  922. package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +0 -9
  923. package/ref-monty/crates/monty/test_cases/unpack__ops.py +0 -153
  924. package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +0 -9
  925. package/ref-monty/crates/monty/test_cases/unpack__too_many.py +0 -9
  926. package/ref-monty/crates/monty/test_cases/version__cpython.py +0 -4
  927. package/ref-monty/crates/monty/test_cases/walrus__all.py +0 -178
  928. package/ref-monty/crates/monty/test_cases/while__all.py +0 -206
  929. package/ref-monty/crates/monty/tests/asyncio.rs +0 -764
  930. package/ref-monty/crates/monty/tests/binary_serde.rs +0 -185
  931. package/ref-monty/crates/monty/tests/bytecode_limits.rs +0 -248
  932. package/ref-monty/crates/monty/tests/datatest_runner.rs +0 -2029
  933. package/ref-monty/crates/monty/tests/inputs.rs +0 -420
  934. package/ref-monty/crates/monty/tests/json_serde.rs +0 -250
  935. package/ref-monty/crates/monty/tests/main.rs +0 -71
  936. package/ref-monty/crates/monty/tests/math_module.rs +0 -114
  937. package/ref-monty/crates/monty/tests/name_lookup.rs +0 -482
  938. package/ref-monty/crates/monty/tests/os_tests.rs +0 -459
  939. package/ref-monty/crates/monty/tests/parse_errors.rs +0 -441
  940. package/ref-monty/crates/monty/tests/print_writer.rs +0 -238
  941. package/ref-monty/crates/monty/tests/py_object.rs +0 -121
  942. package/ref-monty/crates/monty/tests/regex.rs +0 -90
  943. package/ref-monty/crates/monty/tests/repl.rs +0 -344
  944. package/ref-monty/crates/monty/tests/resource_limits.rs +0 -1826
  945. package/ref-monty/crates/monty/tests/try_from.rs +0 -167
  946. package/ref-monty/crates/monty-cli/Cargo.toml +0 -25
  947. package/ref-monty/crates/monty-cli/src/main.rs +0 -541
  948. package/ref-monty/crates/monty-js/.cargo/config.toml +0 -2
  949. package/ref-monty/crates/monty-js/.prettierignore +0 -8
  950. package/ref-monty/crates/monty-js/Cargo.toml +0 -32
  951. package/ref-monty/crates/monty-js/README.md +0 -207
  952. package/ref-monty/crates/monty-js/__test__/async.spec.ts +0 -350
  953. package/ref-monty/crates/monty-js/__test__/basic.spec.ts +0 -114
  954. package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +0 -427
  955. package/ref-monty/crates/monty-js/__test__/external.spec.ts +0 -354
  956. package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +0 -143
  957. package/ref-monty/crates/monty-js/__test__/limits.spec.ts +0 -162
  958. package/ref-monty/crates/monty-js/__test__/package.json +0 -3
  959. package/ref-monty/crates/monty-js/__test__/print.spec.ts +0 -229
  960. package/ref-monty/crates/monty-js/__test__/repl.spec.ts +0 -34
  961. package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +0 -205
  962. package/ref-monty/crates/monty-js/__test__/start.spec.ts +0 -443
  963. package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +0 -147
  964. package/ref-monty/crates/monty-js/__test__/types.spec.ts +0 -319
  965. package/ref-monty/crates/monty-js/build.rs +0 -61
  966. package/ref-monty/crates/monty-js/index-header.d.ts +0 -3
  967. package/ref-monty/crates/monty-js/package-lock.json +0 -4694
  968. package/ref-monty/crates/monty-js/package.json +0 -100
  969. package/ref-monty/crates/monty-js/scripts/smoke-test.sh +0 -69
  970. package/ref-monty/crates/monty-js/smoke-test/package.json +0 -17
  971. package/ref-monty/crates/monty-js/smoke-test/test.ts +0 -171
  972. package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +0 -11
  973. package/ref-monty/crates/monty-js/src/convert.rs +0 -648
  974. package/ref-monty/crates/monty-js/src/exceptions.rs +0 -293
  975. package/ref-monty/crates/monty-js/src/lib.rs +0 -41
  976. package/ref-monty/crates/monty-js/src/limits.rs +0 -53
  977. package/ref-monty/crates/monty-js/src/monty_cls.rs +0 -1407
  978. package/ref-monty/crates/monty-js/tsconfig.json +0 -17
  979. package/ref-monty/crates/monty-js/wrapper.ts +0 -701
  980. package/ref-monty/crates/monty-python/Cargo.toml +0 -38
  981. package/ref-monty/crates/monty-python/README.md +0 -134
  982. package/ref-monty/crates/monty-python/build.rs +0 -4
  983. package/ref-monty/crates/monty-python/example.py +0 -40
  984. package/ref-monty/crates/monty-python/exercise.py +0 -46
  985. package/ref-monty/crates/monty-python/pyproject.toml +0 -57
  986. package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +0 -281
  987. package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +0 -677
  988. package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +0 -933
  989. package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
  990. package/ref-monty/crates/monty-python/src/convert.rs +0 -273
  991. package/ref-monty/crates/monty-python/src/dataclass.rs +0 -461
  992. package/ref-monty/crates/monty-python/src/exceptions.rs +0 -557
  993. package/ref-monty/crates/monty-python/src/external.rs +0 -165
  994. package/ref-monty/crates/monty-python/src/lib.rs +0 -77
  995. package/ref-monty/crates/monty-python/src/limits.rs +0 -142
  996. package/ref-monty/crates/monty-python/src/monty_cls.rs +0 -1650
  997. package/ref-monty/crates/monty-python/src/repl.rs +0 -470
  998. package/ref-monty/crates/monty-python/src/serialization.rs +0 -761
  999. package/ref-monty/crates/monty-python/tests/test_async.py +0 -1201
  1000. package/ref-monty/crates/monty-python/tests/test_basic.py +0 -66
  1001. package/ref-monty/crates/monty-python/tests/test_dataclasses.py +0 -971
  1002. package/ref-monty/crates/monty-python/tests/test_exceptions.py +0 -361
  1003. package/ref-monty/crates/monty-python/tests/test_external.py +0 -367
  1004. package/ref-monty/crates/monty-python/tests/test_inputs.py +0 -126
  1005. package/ref-monty/crates/monty-python/tests/test_limits.py +0 -257
  1006. package/ref-monty/crates/monty-python/tests/test_os_access.py +0 -1286
  1007. package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +0 -731
  1008. package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +0 -483
  1009. package/ref-monty/crates/monty-python/tests/test_os_calls.py +0 -819
  1010. package/ref-monty/crates/monty-python/tests/test_print.py +0 -208
  1011. package/ref-monty/crates/monty-python/tests/test_re.py +0 -170
  1012. package/ref-monty/crates/monty-python/tests/test_readme_examples.py +0 -20
  1013. package/ref-monty/crates/monty-python/tests/test_repl.py +0 -749
  1014. package/ref-monty/crates/monty-python/tests/test_serialize.py +0 -284
  1015. package/ref-monty/crates/monty-python/tests/test_start.py +0 -346
  1016. package/ref-monty/crates/monty-python/tests/test_threading.py +0 -163
  1017. package/ref-monty/crates/monty-python/tests/test_type_check.py +0 -344
  1018. package/ref-monty/crates/monty-python/tests/test_types.py +0 -553
  1019. package/ref-monty/crates/monty-type-checking/Cargo.toml +0 -32
  1020. package/ref-monty/crates/monty-type-checking/src/db.rs +0 -116
  1021. package/ref-monty/crates/monty-type-checking/src/lib.rs +0 -4
  1022. package/ref-monty/crates/monty-type-checking/src/type_check.rs +0 -280
  1023. package/ref-monty/crates/monty-type-checking/tests/bad_types.py +0 -109
  1024. package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +0 -21
  1025. package/ref-monty/crates/monty-type-checking/tests/good_types.py +0 -475
  1026. package/ref-monty/crates/monty-type-checking/tests/main.rs +0 -205
  1027. package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +0 -56
  1028. package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +0 -41
  1029. package/ref-monty/crates/monty-typeshed/Cargo.toml +0 -29
  1030. package/ref-monty/crates/monty-typeshed/README.md +0 -11
  1031. package/ref-monty/crates/monty-typeshed/build.rs +0 -101
  1032. package/ref-monty/crates/monty-typeshed/custom/README.md +0 -1
  1033. package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +0 -138
  1034. package/ref-monty/crates/monty-typeshed/custom/os.pyi +0 -87
  1035. package/ref-monty/crates/monty-typeshed/custom/sys.pyi +0 -33
  1036. package/ref-monty/crates/monty-typeshed/src/lib.rs +0 -56
  1037. package/ref-monty/crates/monty-typeshed/update.py +0 -321
  1038. package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +0 -1
  1039. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +0 -20
  1040. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +0 -105
  1041. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +0 -394
  1042. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +0 -138
  1043. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +0 -1434
  1044. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +0 -527
  1045. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +0 -2
  1046. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +0 -502
  1047. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +0 -376
  1048. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +0 -149
  1049. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +0 -87
  1050. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +0 -395
  1051. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +0 -8
  1052. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +0 -337
  1053. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +0 -33
  1054. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +0 -741
  1055. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +0 -1217
  1056. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +0 -716
  1057. package/ref-monty/docs/usage-guide.md +0 -117
  1058. package/ref-monty/examples/README.md +0 -3
  1059. package/ref-monty/examples/expense_analysis/README.md +0 -3
  1060. package/ref-monty/examples/expense_analysis/data.py +0 -124
  1061. package/ref-monty/examples/expense_analysis/main.py +0 -115
  1062. package/ref-monty/examples/sql_playground/README.md +0 -20
  1063. package/ref-monty/examples/sql_playground/external_functions.py +0 -129
  1064. package/ref-monty/examples/sql_playground/main.py +0 -81
  1065. package/ref-monty/examples/sql_playground/sandbox_code.py +0 -82
  1066. package/ref-monty/examples/sql_playground/type_stubs.pyi +0 -14
  1067. package/ref-monty/examples/web_scraper/README.md +0 -15
  1068. package/ref-monty/examples/web_scraper/browser.py +0 -56
  1069. package/ref-monty/examples/web_scraper/example_code.py +0 -59
  1070. package/ref-monty/examples/web_scraper/external_functions.py +0 -324
  1071. package/ref-monty/examples/web_scraper/main.py +0 -193
  1072. package/ref-monty/examples/web_scraper/sub_agent.py +0 -79
  1073. package/ref-monty/monty-npm.md +0 -235
  1074. package/ref-monty/pyproject.toml +0 -162
  1075. package/ref-monty/scripts/check_imports.py +0 -91
  1076. package/ref-monty/scripts/codecov_diff.py +0 -412
  1077. package/ref-monty/scripts/complete_tests.py +0 -146
  1078. package/ref-monty/scripts/flamegraph_to_text.py +0 -208
  1079. package/ref-monty/scripts/iter_test_methods.py +0 -540
  1080. package/ref-monty/scripts/run_traceback.py +0 -180
  1081. package/ref-monty/scripts/startup_performance.py +0 -130
  1082. package/ref-monty/uv.lock +0 -1779
  1083. package/temp_resend_cli/repo/.github/scripts/pr-title-check.js +0 -34
  1084. package/temp_resend_cli/repo/.github/workflows/ci.yml +0 -67
  1085. package/temp_resend_cli/repo/.github/workflows/post-release.yml +0 -51
  1086. package/temp_resend_cli/repo/.github/workflows/pr-title-check.yml +0 -13
  1087. package/temp_resend_cli/repo/.github/workflows/release.yml +0 -175
  1088. package/temp_resend_cli/repo/.github/workflows/test-install-unix.yml +0 -34
  1089. package/temp_resend_cli/repo/.github/workflows/test-install-windows.yml +0 -48
  1090. package/temp_resend_cli/repo/CHANGELOG.md +0 -31
  1091. package/temp_resend_cli/repo/LICENSE +0 -21
  1092. package/temp_resend_cli/repo/README.md +0 -450
  1093. package/temp_resend_cli/repo/biome.json +0 -36
  1094. package/temp_resend_cli/repo/install.ps1 +0 -141
  1095. package/temp_resend_cli/repo/install.sh +0 -301
  1096. package/temp_resend_cli/repo/package.json +0 -61
  1097. package/temp_resend_cli/repo/pnpm-lock.yaml +0 -2439
  1098. package/temp_resend_cli/repo/renovate.json +0 -4
  1099. package/temp_resend_cli/repo/src/cli.ts +0 -98
  1100. package/temp_resend_cli/repo/src/commands/api-keys/create.ts +0 -114
  1101. package/temp_resend_cli/repo/src/commands/api-keys/delete.ts +0 -47
  1102. package/temp_resend_cli/repo/src/commands/api-keys/index.ts +0 -26
  1103. package/temp_resend_cli/repo/src/commands/api-keys/list.ts +0 -35
  1104. package/temp_resend_cli/repo/src/commands/api-keys/utils.ts +0 -8
  1105. package/temp_resend_cli/repo/src/commands/auth/index.ts +0 -20
  1106. package/temp_resend_cli/repo/src/commands/auth/login.ts +0 -234
  1107. package/temp_resend_cli/repo/src/commands/auth/logout.ts +0 -105
  1108. package/temp_resend_cli/repo/src/commands/broadcasts/create.ts +0 -196
  1109. package/temp_resend_cli/repo/src/commands/broadcasts/delete.ts +0 -46
  1110. package/temp_resend_cli/repo/src/commands/broadcasts/get.ts +0 -59
  1111. package/temp_resend_cli/repo/src/commands/broadcasts/index.ts +0 -43
  1112. package/temp_resend_cli/repo/src/commands/broadcasts/list.ts +0 -60
  1113. package/temp_resend_cli/repo/src/commands/broadcasts/send.ts +0 -56
  1114. package/temp_resend_cli/repo/src/commands/broadcasts/update.ts +0 -95
  1115. package/temp_resend_cli/repo/src/commands/broadcasts/utils.ts +0 -35
  1116. package/temp_resend_cli/repo/src/commands/contact-properties/create.ts +0 -118
  1117. package/temp_resend_cli/repo/src/commands/contact-properties/delete.ts +0 -48
  1118. package/temp_resend_cli/repo/src/commands/contact-properties/get.ts +0 -46
  1119. package/temp_resend_cli/repo/src/commands/contact-properties/index.ts +0 -48
  1120. package/temp_resend_cli/repo/src/commands/contact-properties/list.ts +0 -68
  1121. package/temp_resend_cli/repo/src/commands/contact-properties/update.ts +0 -88
  1122. package/temp_resend_cli/repo/src/commands/contact-properties/utils.ts +0 -17
  1123. package/temp_resend_cli/repo/src/commands/contacts/add-segment.ts +0 -78
  1124. package/temp_resend_cli/repo/src/commands/contacts/create.ts +0 -122
  1125. package/temp_resend_cli/repo/src/commands/contacts/delete.ts +0 -49
  1126. package/temp_resend_cli/repo/src/commands/contacts/get.ts +0 -53
  1127. package/temp_resend_cli/repo/src/commands/contacts/index.ts +0 -58
  1128. package/temp_resend_cli/repo/src/commands/contacts/list.ts +0 -57
  1129. package/temp_resend_cli/repo/src/commands/contacts/remove-segment.ts +0 -48
  1130. package/temp_resend_cli/repo/src/commands/contacts/segments.ts +0 -39
  1131. package/temp_resend_cli/repo/src/commands/contacts/topics.ts +0 -45
  1132. package/temp_resend_cli/repo/src/commands/contacts/update-topics.ts +0 -90
  1133. package/temp_resend_cli/repo/src/commands/contacts/update.ts +0 -77
  1134. package/temp_resend_cli/repo/src/commands/contacts/utils.ts +0 -119
  1135. package/temp_resend_cli/repo/src/commands/doctor.ts +0 -216
  1136. package/temp_resend_cli/repo/src/commands/domains/create.ts +0 -83
  1137. package/temp_resend_cli/repo/src/commands/domains/delete.ts +0 -42
  1138. package/temp_resend_cli/repo/src/commands/domains/get.ts +0 -47
  1139. package/temp_resend_cli/repo/src/commands/domains/index.ts +0 -35
  1140. package/temp_resend_cli/repo/src/commands/domains/list.ts +0 -53
  1141. package/temp_resend_cli/repo/src/commands/domains/update.ts +0 -75
  1142. package/temp_resend_cli/repo/src/commands/domains/utils.ts +0 -44
  1143. package/temp_resend_cli/repo/src/commands/domains/verify.ts +0 -38
  1144. package/temp_resend_cli/repo/src/commands/emails/batch.ts +0 -140
  1145. package/temp_resend_cli/repo/src/commands/emails/get.ts +0 -44
  1146. package/temp_resend_cli/repo/src/commands/emails/index.ts +0 -30
  1147. package/temp_resend_cli/repo/src/commands/emails/list.ts +0 -84
  1148. package/temp_resend_cli/repo/src/commands/emails/receiving/attachment.ts +0 -55
  1149. package/temp_resend_cli/repo/src/commands/emails/receiving/attachments.ts +0 -68
  1150. package/temp_resend_cli/repo/src/commands/emails/receiving/get.ts +0 -58
  1151. package/temp_resend_cli/repo/src/commands/emails/receiving/index.ts +0 -28
  1152. package/temp_resend_cli/repo/src/commands/emails/receiving/list.ts +0 -59
  1153. package/temp_resend_cli/repo/src/commands/emails/receiving/utils.ts +0 -38
  1154. package/temp_resend_cli/repo/src/commands/emails/send.ts +0 -189
  1155. package/temp_resend_cli/repo/src/commands/open.ts +0 -27
  1156. package/temp_resend_cli/repo/src/commands/segments/create.ts +0 -50
  1157. package/temp_resend_cli/repo/src/commands/segments/delete.ts +0 -47
  1158. package/temp_resend_cli/repo/src/commands/segments/get.ts +0 -38
  1159. package/temp_resend_cli/repo/src/commands/segments/index.ts +0 -36
  1160. package/temp_resend_cli/repo/src/commands/segments/list.ts +0 -58
  1161. package/temp_resend_cli/repo/src/commands/segments/utils.ts +0 -7
  1162. package/temp_resend_cli/repo/src/commands/teams/index.ts +0 -10
  1163. package/temp_resend_cli/repo/src/commands/teams/list.ts +0 -35
  1164. package/temp_resend_cli/repo/src/commands/teams/remove.ts +0 -86
  1165. package/temp_resend_cli/repo/src/commands/teams/switch.ts +0 -76
  1166. package/temp_resend_cli/repo/src/commands/topics/create.ts +0 -73
  1167. package/temp_resend_cli/repo/src/commands/topics/delete.ts +0 -47
  1168. package/temp_resend_cli/repo/src/commands/topics/get.ts +0 -42
  1169. package/temp_resend_cli/repo/src/commands/topics/index.ts +0 -42
  1170. package/temp_resend_cli/repo/src/commands/topics/list.ts +0 -34
  1171. package/temp_resend_cli/repo/src/commands/topics/update.ts +0 -59
  1172. package/temp_resend_cli/repo/src/commands/topics/utils.ts +0 -16
  1173. package/temp_resend_cli/repo/src/commands/webhooks/create.ts +0 -128
  1174. package/temp_resend_cli/repo/src/commands/webhooks/delete.ts +0 -49
  1175. package/temp_resend_cli/repo/src/commands/webhooks/get.ts +0 -42
  1176. package/temp_resend_cli/repo/src/commands/webhooks/index.ts +0 -42
  1177. package/temp_resend_cli/repo/src/commands/webhooks/list.ts +0 -55
  1178. package/temp_resend_cli/repo/src/commands/webhooks/listen.ts +0 -379
  1179. package/temp_resend_cli/repo/src/commands/webhooks/update.ts +0 -83
  1180. package/temp_resend_cli/repo/src/commands/webhooks/utils.ts +0 -36
  1181. package/temp_resend_cli/repo/src/commands/whoami.ts +0 -71
  1182. package/temp_resend_cli/repo/src/lib/actions.ts +0 -157
  1183. package/temp_resend_cli/repo/src/lib/client.ts +0 -37
  1184. package/temp_resend_cli/repo/src/lib/config.ts +0 -217
  1185. package/temp_resend_cli/repo/src/lib/files.ts +0 -15
  1186. package/temp_resend_cli/repo/src/lib/help-text.ts +0 -38
  1187. package/temp_resend_cli/repo/src/lib/output.ts +0 -56
  1188. package/temp_resend_cli/repo/src/lib/pagination.ts +0 -36
  1189. package/temp_resend_cli/repo/src/lib/prompts.ts +0 -149
  1190. package/temp_resend_cli/repo/src/lib/spinner.ts +0 -100
  1191. package/temp_resend_cli/repo/src/lib/table.ts +0 -57
  1192. package/temp_resend_cli/repo/src/lib/tty.ts +0 -28
  1193. package/temp_resend_cli/repo/src/lib/update-check.ts +0 -169
  1194. package/temp_resend_cli/repo/src/lib/version.ts +0 -4
  1195. package/temp_resend_cli/repo/tests/commands/api-keys/create.test.ts +0 -196
  1196. package/temp_resend_cli/repo/tests/commands/api-keys/delete.test.ts +0 -157
  1197. package/temp_resend_cli/repo/tests/commands/api-keys/list.test.ts +0 -134
  1198. package/temp_resend_cli/repo/tests/commands/auth/login.test.ts +0 -153
  1199. package/temp_resend_cli/repo/tests/commands/auth/logout.test.ts +0 -153
  1200. package/temp_resend_cli/repo/tests/commands/broadcasts/create.test.ts +0 -454
  1201. package/temp_resend_cli/repo/tests/commands/broadcasts/delete.test.ts +0 -183
  1202. package/temp_resend_cli/repo/tests/commands/broadcasts/get.test.ts +0 -147
  1203. package/temp_resend_cli/repo/tests/commands/broadcasts/list.test.ts +0 -199
  1204. package/temp_resend_cli/repo/tests/commands/broadcasts/send.test.ts +0 -162
  1205. package/temp_resend_cli/repo/tests/commands/broadcasts/update.test.ts +0 -288
  1206. package/temp_resend_cli/repo/tests/commands/contact-properties/create.test.ts +0 -251
  1207. package/temp_resend_cli/repo/tests/commands/contact-properties/delete.test.ts +0 -184
  1208. package/temp_resend_cli/repo/tests/commands/contact-properties/get.test.ts +0 -145
  1209. package/temp_resend_cli/repo/tests/commands/contact-properties/list.test.ts +0 -181
  1210. package/temp_resend_cli/repo/tests/commands/contact-properties/update.test.ts +0 -217
  1211. package/temp_resend_cli/repo/tests/commands/contacts/add-segment.test.ts +0 -189
  1212. package/temp_resend_cli/repo/tests/commands/contacts/create.test.ts +0 -271
  1213. package/temp_resend_cli/repo/tests/commands/contacts/delete.test.ts +0 -193
  1214. package/temp_resend_cli/repo/tests/commands/contacts/get.test.ts +0 -149
  1215. package/temp_resend_cli/repo/tests/commands/contacts/list.test.ts +0 -176
  1216. package/temp_resend_cli/repo/tests/commands/contacts/remove-segment.test.ts +0 -167
  1217. package/temp_resend_cli/repo/tests/commands/contacts/segments.test.ts +0 -168
  1218. package/temp_resend_cli/repo/tests/commands/contacts/topics.test.ts +0 -164
  1219. package/temp_resend_cli/repo/tests/commands/contacts/update-topics.test.ts +0 -248
  1220. package/temp_resend_cli/repo/tests/commands/contacts/update.test.ts +0 -206
  1221. package/temp_resend_cli/repo/tests/commands/doctor.test.ts +0 -164
  1222. package/temp_resend_cli/repo/tests/commands/domains/create.test.ts +0 -193
  1223. package/temp_resend_cli/repo/tests/commands/domains/delete.test.ts +0 -157
  1224. package/temp_resend_cli/repo/tests/commands/domains/get.test.ts +0 -138
  1225. package/temp_resend_cli/repo/tests/commands/domains/list.test.ts +0 -165
  1226. package/temp_resend_cli/repo/tests/commands/domains/update.test.ts +0 -224
  1227. package/temp_resend_cli/repo/tests/commands/domains/verify.test.ts +0 -118
  1228. package/temp_resend_cli/repo/tests/commands/emails/batch.test.ts +0 -324
  1229. package/temp_resend_cli/repo/tests/commands/emails/get.test.ts +0 -132
  1230. package/temp_resend_cli/repo/tests/commands/emails/receiving/attachment.test.ts +0 -141
  1231. package/temp_resend_cli/repo/tests/commands/emails/receiving/attachments.test.ts +0 -169
  1232. package/temp_resend_cli/repo/tests/commands/emails/receiving/get.test.ts +0 -141
  1233. package/temp_resend_cli/repo/tests/commands/emails/receiving/list.test.ts +0 -182
  1234. package/temp_resend_cli/repo/tests/commands/emails/send.test.ts +0 -312
  1235. package/temp_resend_cli/repo/tests/commands/segments/create.test.ts +0 -164
  1236. package/temp_resend_cli/repo/tests/commands/segments/delete.test.ts +0 -183
  1237. package/temp_resend_cli/repo/tests/commands/segments/get.test.ts +0 -138
  1238. package/temp_resend_cli/repo/tests/commands/segments/list.test.ts +0 -174
  1239. package/temp_resend_cli/repo/tests/commands/teams/list.test.ts +0 -62
  1240. package/temp_resend_cli/repo/tests/commands/teams/remove.test.ts +0 -110
  1241. package/temp_resend_cli/repo/tests/commands/teams/switch.test.ts +0 -103
  1242. package/temp_resend_cli/repo/tests/commands/topics/create.test.ts +0 -192
  1243. package/temp_resend_cli/repo/tests/commands/topics/delete.test.ts +0 -157
  1244. package/temp_resend_cli/repo/tests/commands/topics/get.test.ts +0 -126
  1245. package/temp_resend_cli/repo/tests/commands/topics/list.test.ts +0 -125
  1246. package/temp_resend_cli/repo/tests/commands/topics/update.test.ts +0 -178
  1247. package/temp_resend_cli/repo/tests/commands/webhooks/create.test.ts +0 -225
  1248. package/temp_resend_cli/repo/tests/commands/webhooks/delete.test.ts +0 -157
  1249. package/temp_resend_cli/repo/tests/commands/webhooks/get.test.ts +0 -126
  1250. package/temp_resend_cli/repo/tests/commands/webhooks/list.test.ts +0 -178
  1251. package/temp_resend_cli/repo/tests/commands/webhooks/update.test.ts +0 -207
  1252. package/temp_resend_cli/repo/tests/commands/whoami.test.ts +0 -98
  1253. package/temp_resend_cli/repo/tests/e2e/smoke.test.ts +0 -93
  1254. package/temp_resend_cli/repo/tests/helpers.ts +0 -86
  1255. package/temp_resend_cli/repo/tests/lib/client.test.ts +0 -71
  1256. package/temp_resend_cli/repo/tests/lib/config.test.ts +0 -451
  1257. package/temp_resend_cli/repo/tests/lib/files.test.ts +0 -73
  1258. package/temp_resend_cli/repo/tests/lib/help-text.test.ts +0 -97
  1259. package/temp_resend_cli/repo/tests/lib/output.test.ts +0 -136
  1260. package/temp_resend_cli/repo/tests/lib/prompts.test.ts +0 -185
  1261. package/temp_resend_cli/repo/tests/lib/spinner.test.ts +0 -166
  1262. package/temp_resend_cli/repo/tests/lib/table.test.ts +0 -63
  1263. package/temp_resend_cli/repo/tests/lib/tty.test.ts +0 -89
  1264. package/temp_resend_cli/repo/tests/lib/update-check.test.ts +0 -179
  1265. package/temp_resend_cli/repo/tsconfig.json +0 -14
  1266. package/temp_resend_cli/repo/vitest.config.e2e.ts +0 -8
  1267. package/temp_resend_cli/repo/vitest.config.ts +0 -10
  1268. /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
- }