superacli 1.1.6 → 1.1.7

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