superacli 1.1.6 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1268) hide show
  1. package/CONTRIBUTING.md +270 -0
  2. package/README.md +141 -54
  3. package/__tests__/adapter-schema.test.js +251 -86
  4. package/__tests__/azd-plugin.test.js +109 -0
  5. package/__tests__/config.test.js +4 -3
  6. package/__tests__/discover.test.js +59 -0
  7. package/__tests__/goose-plugin.test.js +149 -0
  8. package/__tests__/help-json.test.js +2 -0
  9. package/__tests__/openhands-plugin.test.js +106 -0
  10. package/__tests__/plugin-cocoindex-code-uninstall.test.js +19 -0
  11. package/__tests__/plugin-cocoindex-code.test.js +37 -0
  12. package/__tests__/plugin-install-guidance.test.js +81 -0
  13. package/__tests__/plugins-registry.test.js +44 -0
  14. package/__tests__/plugins-store.test.js +40 -5
  15. package/__tests__/process-adapter.test.js +50 -1
  16. package/__tests__/resend-plugin.test.js +109 -82
  17. package/__tests__/server-app.test.js +1 -0
  18. package/__tests__/server-routes-commands.test.js +20 -2
  19. package/__tests__/server-routes-plugins.test.js +130 -0
  20. package/__tests__/skills.test.js +26 -0
  21. package/__tests__/squirrelscan-plugin.test.js +129 -0
  22. package/__tests__/uipath-plugin.test.js +104 -0
  23. package/__tests__/uipathcli-plugin.test.js +95 -0
  24. package/cli/adapters/mcp.js +2 -0
  25. package/cli/adapters/process.js +50 -7
  26. package/cli/config.js +240 -3
  27. package/cli/discover.js +157 -0
  28. package/cli/help-json.js +16 -1
  29. package/cli/plugin-install-guidance.js +92 -37
  30. package/cli/plugins-manager.js +4 -3
  31. package/cli/plugins-registry.js +74 -8
  32. package/cli/plugins-store.js +78 -17
  33. package/cli/skills-mcp.js +1 -1
  34. package/cli/skills.js +39 -2
  35. package/cli/supercli.js +255 -63
  36. package/docs/feature-gaps.md +8 -8
  37. package/docs/features/azd-uipath-plugins.md +43 -0
  38. package/docs/features/server-plugins.md +62 -0
  39. package/docs/features/skills.md +9 -5
  40. package/docs/index.html +183 -123
  41. package/docs/{supported-harnesses.md → plugins-available.md} +4 -3
  42. package/docs/{plugin-harness-guide.md → plugins-how-to.md} +1 -1
  43. package/docs/plugins.md +26 -20
  44. package/docs/server-plugins-usage-guide.md +182 -0
  45. package/docs/skills-catalog.md +12 -10
  46. package/index.html +384 -0
  47. package/package.json +2 -2
  48. package/plugins/agent-browser/README.md +69 -0
  49. package/plugins/agent-browser/plugin.json +111 -0
  50. package/plugins/agent-browser/skills/quickstart/SKILL.md +66 -0
  51. package/plugins/aider/README.md +53 -0
  52. package/plugins/aider/plugin.json +105 -0
  53. package/plugins/aider/scripts/aider-wrapper.js +243 -0
  54. package/plugins/aider/scripts/setup-aider.js +37 -0
  55. package/plugins/aider/skills/dry-run-review.md +24 -0
  56. package/plugins/aider/skills/model-and-provider.md +24 -0
  57. package/plugins/aider/skills/one-shot-edits.md +30 -0
  58. package/plugins/aider/skills/quickstart/SKILL.md +51 -0
  59. package/plugins/azd/README.md +28 -0
  60. package/plugins/azd/plugin.json +87 -0
  61. package/plugins/azd/skills/quickstart/SKILL.md +41 -0
  62. package/plugins/blogwatcher/README.md +3 -3
  63. package/plugins/boxlite/Dockerfile +9 -0
  64. package/plugins/boxlite/README.md +62 -0
  65. package/plugins/boxlite/plugin.json +201 -0
  66. package/plugins/boxlite/scripts/run-boxlite.js +106 -0
  67. package/plugins/boxlite/skills/quickstart/SKILL.md +40 -0
  68. package/plugins/cass/plugin.json +150 -0
  69. package/plugins/cass/scripts/setup-cass.js +47 -0
  70. package/plugins/cass/skills/quickstart/SKILL.md +46 -0
  71. package/plugins/clever/README.md +46 -0
  72. package/plugins/clever/plugin.json +119 -0
  73. package/plugins/clever/scripts/setup-clever.js +28 -0
  74. package/plugins/clever/skills/auth-and-profile.md +29 -0
  75. package/plugins/clever/skills/passthrough-safety.md +21 -0
  76. package/plugins/clever/skills/quickstart/SKILL.md +45 -0
  77. package/plugins/clever/skills/resource-inventory.md +24 -0
  78. package/plugins/clix/README.md +4 -4
  79. package/plugins/cocoindex-code/README.md +64 -0
  80. package/plugins/cocoindex-code/plugin.json +81 -0
  81. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-310.pyc +0 -0
  82. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-311.pyc +0 -0
  83. package/plugins/cocoindex-code/scripts/post-install.js +61 -0
  84. package/plugins/cocoindex-code/scripts/post-uninstall.js +25 -0
  85. package/plugins/cocoindex-code/scripts/query.py +88 -0
  86. package/plugins/cocoindex-code/scripts/run-query.js +50 -0
  87. package/plugins/cocoindex-code/skills/quickstart/SKILL.md +73 -0
  88. package/plugins/copilot/README.md +24 -0
  89. package/plugins/copilot/plugin.json +80 -0
  90. package/plugins/copilot/skills/quickstart/SKILL.md +44 -0
  91. package/plugins/gemini/README.md +24 -0
  92. package/plugins/gemini/plugin.json +98 -0
  93. package/plugins/gemini/skills/quickstart/SKILL.md +44 -0
  94. package/plugins/gifcap/plugin.json +119 -0
  95. package/plugins/gifcap/scripts/setup-gifcap.js +44 -0
  96. package/plugins/gifcap/skills/quickstart/SKILL.md +34 -0
  97. package/plugins/gifcap/test-record-quiet.gif +0 -0
  98. package/plugins/gifcap/test-record.gif +0 -0
  99. package/plugins/goose/README.md +36 -0
  100. package/plugins/goose/plugin.json +183 -0
  101. package/plugins/goose/skills/quickstart/SKILL.md +44 -0
  102. package/plugins/json-server/README.md +58 -0
  103. package/plugins/json-server/plugin.json +113 -0
  104. package/plugins/json-server/skills/quickstart/SKILL.md +57 -0
  105. package/plugins/lightpanda/README.md +145 -0
  106. package/plugins/lightpanda/package-lock.json +1375 -0
  107. package/plugins/lightpanda/package.json +12 -0
  108. package/plugins/lightpanda/plugin.json +116 -0
  109. package/plugins/lightpanda/scripts/lightpanda-contacts.js +494 -0
  110. package/plugins/lightpanda/scripts/lightpanda-generic-extract.js +403 -0
  111. package/plugins/lightpanda/scripts/lightpanda-wrapper.js +480 -0
  112. package/plugins/lightpanda/scripts/setup-lightpanda.js +39 -0
  113. package/plugins/lightpanda/skills/contact-discovery.md +51 -0
  114. package/plugins/lightpanda/skills/generic-extraction.md +66 -0
  115. package/plugins/lightpanda/skills/quickstart/SKILL.md +103 -0
  116. package/plugins/lightpanda/skills/resilient-navigation.md +42 -0
  117. package/plugins/monty/README.md +2 -2
  118. package/plugins/nullclaw/README.md +3 -3
  119. package/plugins/offline-ai/README.md +23 -0
  120. package/plugins/offline-ai/plugin.json +82 -0
  121. package/plugins/offline-ai/skills/quickstart/SKILL.md +43 -0
  122. package/plugins/openhands/README.md +25 -0
  123. package/plugins/openhands/plugin.json +116 -0
  124. package/plugins/openhands/skills/quickstart/SKILL.md +26 -0
  125. package/plugins/plandex/README.md +25 -0
  126. package/plugins/plandex/plugin.json +130 -0
  127. package/plugins/plandex/skills/quickstart/SKILL.md +50 -0
  128. package/plugins/plugins.json +199 -0
  129. package/plugins/squirrelscan/Dockerfile +5 -0
  130. package/plugins/squirrelscan/README.md +47 -0
  131. package/plugins/squirrelscan/plugin.json +493 -0
  132. package/plugins/squirrelscan/scripts/post-install.js +33 -0
  133. package/plugins/squirrelscan/scripts/post-uninstall.js +25 -0
  134. package/plugins/squirrelscan/scripts/run-squirrel.js +73 -0
  135. package/plugins/squirrelscan/skills/audit-workflow/SKILL.md +33 -0
  136. package/plugins/squirrelscan/skills/publish-report/SKILL.md +33 -0
  137. package/plugins/squirrelscan/skills/quickstart/SKILL.md +41 -0
  138. package/plugins/uipath/README.md +27 -0
  139. package/plugins/uipath/plugin.json +86 -0
  140. package/plugins/uipath/skills/quickstart/SKILL.md +47 -0
  141. package/plugins/uipathcli/README.md +28 -0
  142. package/plugins/uipathcli/plugin.json +120 -0
  143. package/plugins/uipathcli/scripts/run-uipath-cli.js +49 -0
  144. package/plugins/uipathcli/skills/quickstart/SKILL.md +22 -0
  145. package/plugins/xurl/README.md +4 -4
  146. package/server/app.js +5 -2
  147. package/server/public/app.js +3 -0
  148. package/server/routes/commands.js +95 -12
  149. package/server/routes/plugins.js +262 -0
  150. package/server/services/pluginsService.js +303 -0
  151. package/server/views/command-edit.ejs +196 -14
  152. package/server/views/partials/head.ejs +1 -0
  153. package/server/views/plugins.ejs +264 -0
  154. package/tests/test-plugins-registry.js +30 -0
  155. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +0 -20
  156. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +0 -1
  157. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +0 -21
  158. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +0 -1
  159. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +0 -22
  160. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +0 -1
  161. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +0 -23
  162. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +0 -1
  163. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +0 -24
  164. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +0 -1
  165. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +0 -24
  166. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +0 -1
  167. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +0 -24
  168. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +0 -1
  169. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +0 -24
  170. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +0 -1
  171. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +0 -24
  172. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +0 -1
  173. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +0 -24
  174. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +0 -1
  175. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +0 -24
  176. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +0 -1
  177. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +0 -24
  178. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +0 -1
  179. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +0 -24
  180. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +0 -1
  181. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +0 -25
  182. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +0 -1
  183. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +0 -25
  184. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +0 -1
  185. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +0 -25
  186. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +0 -1
  187. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +0 -26
  188. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +0 -1
  189. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +0 -27
  190. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +0 -1
  191. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +0 -28
  192. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +0 -1
  193. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +0 -29
  194. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +0 -1
  195. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +0 -30
  196. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +0 -1
  197. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +0 -31
  198. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +0 -1
  199. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +0 -32
  200. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +0 -1
  201. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +0 -32
  202. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +0 -1
  203. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +0 -32
  204. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +0 -1
  205. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +0 -32
  206. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +0 -1
  207. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +0 -32
  208. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +0 -1
  209. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +0 -32
  210. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +0 -1
  211. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +0 -32
  212. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +0 -1
  213. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +0 -32
  214. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +0 -1
  215. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +0 -32
  216. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +0 -1
  217. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +0 -32
  218. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +0 -1
  219. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +0 -32
  220. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +0 -1
  221. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +0 -32
  222. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +0 -1
  223. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +0 -32
  224. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +0 -1
  225. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +0 -32
  226. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +0 -1
  227. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +0 -33
  228. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +0 -1
  229. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +0 -33
  230. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +0 -1
  231. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +0 -34
  232. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +0 -1
  233. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +0 -34
  234. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +0 -1
  235. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +0 -35
  236. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +0 -1
  237. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +0 -36
  238. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +0 -1
  239. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +0 -37
  240. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +0 -1
  241. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +0 -38
  242. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +0 -1
  243. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +0 -39
  244. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +0 -1
  245. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +0 -40
  246. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +0 -1
  247. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +0 -41
  248. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +0 -1
  249. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +0 -42
  250. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +0 -1
  251. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +0 -43
  252. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +0 -1
  253. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +0 -44
  254. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +0 -1
  255. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +0 -45
  256. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +0 -1
  257. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +0 -46
  258. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +0 -1
  259. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +0 -47
  260. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +0 -1
  261. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +0 -48
  262. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +0 -1
  263. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +0 -49
  264. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +0 -1
  265. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +0 -50
  266. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +0 -1
  267. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +0 -51
  268. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +0 -1
  269. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +0 -52
  270. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +0 -1
  271. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +0 -53
  272. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +0 -1
  273. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +0 -54
  274. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +0 -1
  275. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +0 -55
  276. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +0 -1
  277. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +0 -56
  278. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +0 -1
  279. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +0 -57
  280. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +0 -1
  281. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +0 -57
  282. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +0 -1
  283. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +0 -57
  284. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +0 -1
  285. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +0 -57
  286. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +0 -1
  287. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +0 -57
  288. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +0 -1
  289. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +0 -57
  290. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +0 -1
  291. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +0 -57
  292. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +0 -1
  293. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +0 -57
  294. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +0 -1
  295. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +0 -57
  296. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +0 -1
  297. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +0 -57
  298. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +0 -1
  299. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +0 -57
  300. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +0 -1
  301. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +0 -57
  302. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +0 -1
  303. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +0 -57
  304. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +0 -1
  305. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +0 -57
  306. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +0 -1
  307. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +0 -57
  308. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +0 -1
  309. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +0 -57
  310. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +0 -1
  311. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +0 -57
  312. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +0 -1
  313. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +0 -57
  314. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +0 -1
  315. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +0 -57
  316. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +0 -1
  317. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +0 -57
  318. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +0 -1
  319. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +0 -57
  320. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +0 -1
  321. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +0 -57
  322. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +0 -1
  323. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +0 -57
  324. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +0 -1
  325. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +0 -57
  326. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +0 -1
  327. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +0 -57
  328. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +0 -1
  329. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +0 -57
  330. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +0 -1
  331. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +0 -57
  332. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +0 -1
  333. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +0 -57
  334. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +0 -1
  335. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +0 -57
  336. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +0 -1
  337. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +0 -57
  338. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +0 -1
  339. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +0 -58
  340. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +0 -1
  341. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +0 -59
  342. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +0 -1
  343. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +0 -60
  344. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +0 -1
  345. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +0 -60
  346. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +0 -1
  347. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +0 -60
  348. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +0 -1
  349. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +0 -60
  350. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +0 -1
  351. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +0 -60
  352. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +0 -1
  353. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +0 -60
  354. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +0 -1
  355. package/.beads/config.yaml +0 -4
  356. package/.beads/issues.jsonl +0 -60
  357. package/.beads/metadata.json +0 -4
  358. package/docs/docs.html +0 -224
  359. package/docs/mcp-cheatsheet.md +0 -324
  360. package/docs/visual-overview.md +0 -21
  361. package/ref-monty/.cargo/config.toml +0 -3
  362. package/ref-monty/.claude/settings.json +0 -60
  363. package/ref-monty/.claude/skills/fastmod/SKILL.md +0 -22
  364. package/ref-monty/.claude/skills/python-playground/SKILL.md +0 -47
  365. package/ref-monty/.codecov.yml +0 -12
  366. package/ref-monty/.github/actions/build-pgo-wheel/action.yml +0 -72
  367. package/ref-monty/.github/workflows/ci.yml +0 -776
  368. package/ref-monty/.github/workflows/codspeed.yml +0 -45
  369. package/ref-monty/.github/workflows/init-npm-packages.yml +0 -82
  370. package/ref-monty/.pre-commit-config.yaml +0 -47
  371. package/ref-monty/.python-version +0 -1
  372. package/ref-monty/.rustfmt.toml +0 -4
  373. package/ref-monty/.zed/settings.json +0 -11
  374. package/ref-monty/CLAUDE.md +0 -535
  375. package/ref-monty/Cargo.lock +0 -3798
  376. package/ref-monty/Cargo.toml +0 -87
  377. package/ref-monty/LICENSE +0 -21
  378. package/ref-monty/Makefile +0 -216
  379. package/ref-monty/README.md +0 -430
  380. package/ref-monty/RELEASING.md +0 -47
  381. package/ref-monty/crates/fuzz/Cargo.toml +0 -30
  382. package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +0 -37
  383. package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +0 -552
  384. package/ref-monty/crates/monty/Cargo.toml +0 -68
  385. package/ref-monty/crates/monty/benches/main.rs +0 -247
  386. package/ref-monty/crates/monty/build.rs +0 -10
  387. package/ref-monty/crates/monty/src/args.rs +0 -733
  388. package/ref-monty/crates/monty/src/asyncio.rs +0 -179
  389. package/ref-monty/crates/monty/src/builtins/abs.rs +0 -55
  390. package/ref-monty/crates/monty/src/builtins/all.rs +0 -30
  391. package/ref-monty/crates/monty/src/builtins/any.rs +0 -30
  392. package/ref-monty/crates/monty/src/builtins/bin.rs +0 -59
  393. package/ref-monty/crates/monty/src/builtins/chr.rs +0 -46
  394. package/ref-monty/crates/monty/src/builtins/divmod.rs +0 -164
  395. package/ref-monty/crates/monty/src/builtins/enumerate.rs +0 -52
  396. package/ref-monty/crates/monty/src/builtins/filter.rs +0 -67
  397. package/ref-monty/crates/monty/src/builtins/getattr.rs +0 -65
  398. package/ref-monty/crates/monty/src/builtins/hash.rs +0 -28
  399. package/ref-monty/crates/monty/src/builtins/hex.rs +0 -58
  400. package/ref-monty/crates/monty/src/builtins/id.rs +0 -24
  401. package/ref-monty/crates/monty/src/builtins/isinstance.rs +0 -68
  402. package/ref-monty/crates/monty/src/builtins/len.rs +0 -25
  403. package/ref-monty/crates/monty/src/builtins/map.rs +0 -98
  404. package/ref-monty/crates/monty/src/builtins/min_max.rs +0 -113
  405. package/ref-monty/crates/monty/src/builtins/mod.rs +0 -246
  406. package/ref-monty/crates/monty/src/builtins/next.rs +0 -21
  407. package/ref-monty/crates/monty/src/builtins/oct.rs +0 -59
  408. package/ref-monty/crates/monty/src/builtins/ord.rs +0 -67
  409. package/ref-monty/crates/monty/src/builtins/pow.rs +0 -365
  410. package/ref-monty/crates/monty/src/builtins/print.rs +0 -141
  411. package/ref-monty/crates/monty/src/builtins/repr.rs +0 -16
  412. package/ref-monty/crates/monty/src/builtins/reversed.rs +0 -28
  413. package/ref-monty/crates/monty/src/builtins/round.rs +0 -174
  414. package/ref-monty/crates/monty/src/builtins/sorted.rs +0 -151
  415. package/ref-monty/crates/monty/src/builtins/sum.rs +0 -66
  416. package/ref-monty/crates/monty/src/builtins/type_.rs +0 -16
  417. package/ref-monty/crates/monty/src/builtins/zip.rs +0 -77
  418. package/ref-monty/crates/monty/src/bytecode/builder.rs +0 -699
  419. package/ref-monty/crates/monty/src/bytecode/code.rs +0 -310
  420. package/ref-monty/crates/monty/src/bytecode/compiler.rs +0 -3206
  421. package/ref-monty/crates/monty/src/bytecode/mod.rs +0 -24
  422. package/ref-monty/crates/monty/src/bytecode/op.rs +0 -617
  423. package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +0 -1058
  424. package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +0 -63
  425. package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +0 -487
  426. package/ref-monty/crates/monty/src/bytecode/vm/call.rs +0 -767
  427. package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +0 -741
  428. package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +0 -147
  429. package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +0 -297
  430. package/ref-monty/crates/monty/src/bytecode/vm/format.rs +0 -132
  431. package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +0 -1958
  432. package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +0 -620
  433. package/ref-monty/crates/monty/src/exception_private.rs +0 -1513
  434. package/ref-monty/crates/monty/src/exception_public.rs +0 -346
  435. package/ref-monty/crates/monty/src/expressions.rs +0 -694
  436. package/ref-monty/crates/monty/src/fstring.rs +0 -854
  437. package/ref-monty/crates/monty/src/function.rs +0 -119
  438. package/ref-monty/crates/monty/src/heap.rs +0 -1073
  439. package/ref-monty/crates/monty/src/heap_data.rs +0 -985
  440. package/ref-monty/crates/monty/src/heap_traits.rs +0 -312
  441. package/ref-monty/crates/monty/src/intern.rs +0 -837
  442. package/ref-monty/crates/monty/src/io.rs +0 -106
  443. package/ref-monty/crates/monty/src/lib.rs +0 -52
  444. package/ref-monty/crates/monty/src/modules/asyncio.rs +0 -144
  445. package/ref-monty/crates/monty/src/modules/math.rs +0 -1453
  446. package/ref-monty/crates/monty/src/modules/mod.rs +0 -120
  447. package/ref-monty/crates/monty/src/modules/os.rs +0 -116
  448. package/ref-monty/crates/monty/src/modules/pathlib.rs +0 -33
  449. package/ref-monty/crates/monty/src/modules/re.rs +0 -606
  450. package/ref-monty/crates/monty/src/modules/sys.rs +0 -60
  451. package/ref-monty/crates/monty/src/modules/typing.rs +0 -70
  452. package/ref-monty/crates/monty/src/namespace.rs +0 -21
  453. package/ref-monty/crates/monty/src/object.rs +0 -1040
  454. package/ref-monty/crates/monty/src/os.rs +0 -215
  455. package/ref-monty/crates/monty/src/parse.rs +0 -1730
  456. package/ref-monty/crates/monty/src/prepare.rs +0 -3015
  457. package/ref-monty/crates/monty/src/repl.rs +0 -1109
  458. package/ref-monty/crates/monty/src/resource.rs +0 -559
  459. package/ref-monty/crates/monty/src/run.rs +0 -457
  460. package/ref-monty/crates/monty/src/run_progress.rs +0 -821
  461. package/ref-monty/crates/monty/src/signature.rs +0 -651
  462. package/ref-monty/crates/monty/src/sorting.rs +0 -100
  463. package/ref-monty/crates/monty/src/types/bytes.rs +0 -2356
  464. package/ref-monty/crates/monty/src/types/dataclass.rs +0 -345
  465. package/ref-monty/crates/monty/src/types/dict.rs +0 -879
  466. package/ref-monty/crates/monty/src/types/dict_view.rs +0 -619
  467. package/ref-monty/crates/monty/src/types/iter.rs +0 -799
  468. package/ref-monty/crates/monty/src/types/list.rs +0 -929
  469. package/ref-monty/crates/monty/src/types/long_int.rs +0 -211
  470. package/ref-monty/crates/monty/src/types/mod.rs +0 -48
  471. package/ref-monty/crates/monty/src/types/module.rs +0 -146
  472. package/ref-monty/crates/monty/src/types/namedtuple.rs +0 -261
  473. package/ref-monty/crates/monty/src/types/path.rs +0 -596
  474. package/ref-monty/crates/monty/src/types/property.rs +0 -35
  475. package/ref-monty/crates/monty/src/types/py_trait.rs +0 -322
  476. package/ref-monty/crates/monty/src/types/range.rs +0 -285
  477. package/ref-monty/crates/monty/src/types/re_match.rs +0 -522
  478. package/ref-monty/crates/monty/src/types/re_pattern.rs +0 -726
  479. package/ref-monty/crates/monty/src/types/set.rs +0 -1373
  480. package/ref-monty/crates/monty/src/types/slice.rs +0 -257
  481. package/ref-monty/crates/monty/src/types/str.rs +0 -2051
  482. package/ref-monty/crates/monty/src/types/tuple.rs +0 -376
  483. package/ref-monty/crates/monty/src/types/type.rs +0 -407
  484. package/ref-monty/crates/monty/src/value.rs +0 -2558
  485. package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +0 -3
  486. package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +0 -3
  487. package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +0 -3
  488. package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +0 -3
  489. package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +0 -3
  490. package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +0 -3
  491. package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +0 -3
  492. package/ref-monty/crates/monty/test_cases/args__id_too_many.py +0 -2
  493. package/ref-monty/crates/monty/test_cases/args__len_no_args.py +0 -2
  494. package/ref-monty/crates/monty/test_cases/args__len_too_many.py +0 -2
  495. package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +0 -9
  496. package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +0 -9
  497. package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +0 -3
  498. package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +0 -3
  499. package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +0 -3
  500. package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +0 -3
  501. package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +0 -2
  502. package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +0 -2
  503. package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +0 -2
  504. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +0 -2
  505. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +0 -2
  506. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +0 -2
  507. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +0 -9
  508. package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +0 -2
  509. package/ref-monty/crates/monty/test_cases/assert__fail.py +0 -2
  510. package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +0 -2
  511. package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +0 -3
  512. package/ref-monty/crates/monty/test_cases/assert__ops.py +0 -11
  513. package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +0 -47
  514. package/ref-monty/crates/monty/test_cases/async__basic.py +0 -10
  515. package/ref-monty/crates/monty/test_cases/async__closure.py +0 -14
  516. package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +0 -16
  517. package/ref-monty/crates/monty/test_cases/async__exception.py +0 -10
  518. package/ref-monty/crates/monty/test_cases/async__ext_call.py +0 -73
  519. package/ref-monty/crates/monty/test_cases/async__gather_all.py +0 -85
  520. package/ref-monty/crates/monty/test_cases/async__nested_await.py +0 -15
  521. package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +0 -37
  522. package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +0 -10
  523. package/ref-monty/crates/monty/test_cases/async__not_imported.py +0 -14
  524. package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +0 -27
  525. package/ref-monty/crates/monty/test_cases/async__return_types.py +0 -31
  526. package/ref-monty/crates/monty/test_cases/async__sequential.py +0 -16
  527. package/ref-monty/crates/monty/test_cases/async__traceback.py +0 -19
  528. package/ref-monty/crates/monty/test_cases/async__with_args.py +0 -14
  529. package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +0 -9
  530. package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +0 -9
  531. package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +0 -12
  532. package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +0 -10
  533. package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +0 -10
  534. package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +0 -68
  535. package/ref-monty/crates/monty/test_cases/bool__ops.py +0 -20
  536. package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +0 -2
  537. package/ref-monty/crates/monty/test_cases/builtin__filter.py +0 -62
  538. package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +0 -11
  539. package/ref-monty/crates/monty/test_cases/builtin__getattr.py +0 -84
  540. package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +0 -42
  541. package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +0 -66
  542. package/ref-monty/crates/monty/test_cases/builtin__map.py +0 -74
  543. package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +0 -11
  544. package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +0 -154
  545. package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +0 -148
  546. package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +0 -10
  547. package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +0 -9
  548. package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +0 -12
  549. package/ref-monty/crates/monty/test_cases/builtin__repr.py +0 -3
  550. package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +0 -73
  551. package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +0 -18
  552. package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +0 -10
  553. package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +0 -10
  554. package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +0 -10
  555. package/ref-monty/crates/monty/test_cases/bytes__methods.py +0 -394
  556. package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +0 -9
  557. package/ref-monty/crates/monty/test_cases/bytes__ops.py +0 -90
  558. package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +0 -10
  559. package/ref-monty/crates/monty/test_cases/call_object.py +0 -3
  560. package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +0 -79
  561. package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +0 -81
  562. package/ref-monty/crates/monty/test_cases/closure__pep448.py +0 -203
  563. package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +0 -13
  564. package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +0 -120
  565. package/ref-monty/crates/monty/test_cases/comprehension__all.py +0 -208
  566. package/ref-monty/crates/monty/test_cases/comprehension__scope.py +0 -7
  567. package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +0 -14
  568. package/ref-monty/crates/monty/test_cases/dataclass__basic.py +0 -238
  569. package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +0 -12
  570. package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +0 -12
  571. package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +0 -11
  572. package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +0 -3
  573. package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +0 -2
  574. package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +0 -3
  575. package/ref-monty/crates/monty/test_cases/dict__methods.py +0 -151
  576. package/ref-monty/crates/monty/test_cases/dict__ops.py +0 -133
  577. package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +0 -4
  578. package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +0 -9
  579. package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +0 -3
  580. package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +0 -2
  581. package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +0 -2
  582. package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +0 -2
  583. package/ref-monty/crates/monty/test_cases/dict__views.py +0 -165
  584. package/ref-monty/crates/monty/test_cases/edge__all.py +0 -26
  585. package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +0 -2
  586. package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +0 -2
  587. package/ref-monty/crates/monty/test_cases/exc__args.py +0 -16
  588. package/ref-monty/crates/monty/test_cases/exc__str.py +0 -15
  589. package/ref-monty/crates/monty/test_cases/execute_ok__all.py +0 -54
  590. package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +0 -2
  591. package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +0 -2
  592. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +0 -2
  593. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +0 -2
  594. package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +0 -2
  595. package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +0 -4
  596. package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +0 -2
  597. package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +0 -2
  598. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +0 -4
  599. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +0 -3
  600. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +0 -4
  601. package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +0 -22
  602. package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +0 -17
  603. package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +0 -7
  604. package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +0 -34
  605. package/ref-monty/crates/monty/test_cases/ext_call__basic.py +0 -99
  606. package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +0 -37
  607. package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +0 -17
  608. package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +0 -16
  609. package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +0 -26
  610. package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +0 -18
  611. package/ref-monty/crates/monty/test_cases/ext_call__elif.py +0 -171
  612. package/ref-monty/crates/monty/test_cases/ext_call__exc.py +0 -4
  613. package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +0 -39
  614. package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +0 -17
  615. package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +0 -31
  616. package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +0 -171
  617. package/ref-monty/crates/monty/test_cases/ext_call__for.py +0 -114
  618. package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +0 -12
  619. package/ref-monty/crates/monty/test_cases/ext_call__if.py +0 -135
  620. package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +0 -37
  621. package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +0 -14
  622. package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +0 -40
  623. package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +0 -7
  624. package/ref-monty/crates/monty/test_cases/ext_call__literals.py +0 -17
  625. package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +0 -32
  626. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +0 -69
  627. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +0 -4
  628. package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +0 -14
  629. package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +0 -19
  630. package/ref-monty/crates/monty/test_cases/ext_call__return.py +0 -28
  631. package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +0 -25
  632. package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +0 -7
  633. package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +0 -28
  634. package/ref-monty/crates/monty/test_cases/ext_call__try.py +0 -280
  635. package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +0 -10
  636. package/ref-monty/crates/monty/test_cases/ext_call__unary.py +0 -13
  637. package/ref-monty/crates/monty/test_cases/frozenset__ops.py +0 -178
  638. package/ref-monty/crates/monty/test_cases/fstring__all.py +0 -236
  639. package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +0 -3
  640. package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +0 -3
  641. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +0 -3
  642. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +0 -3
  643. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +0 -4
  644. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +0 -4
  645. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +0 -4
  646. package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +0 -3
  647. package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +0 -6
  648. package/ref-monty/crates/monty/test_cases/function__call_unpack.py +0 -42
  649. package/ref-monty/crates/monty/test_cases/function__defaults.py +0 -117
  650. package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +0 -7
  651. package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +0 -7
  652. package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +0 -9
  653. package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +0 -7
  654. package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +0 -7
  655. package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +0 -9
  656. package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +0 -7
  657. package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +0 -7
  658. package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +0 -7
  659. package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +0 -7
  660. package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +0 -7
  661. package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +0 -7
  662. package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +0 -7
  663. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +0 -7
  664. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +0 -9
  665. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +0 -13
  666. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +0 -7
  667. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +0 -6
  668. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +0 -8
  669. package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +0 -6
  670. package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +0 -6
  671. package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +0 -6
  672. package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +0 -173
  673. package/ref-monty/crates/monty/test_cases/function__ops.py +0 -294
  674. package/ref-monty/crates/monty/test_cases/function__return_none.py +0 -42
  675. package/ref-monty/crates/monty/test_cases/function__signatures.py +0 -47
  676. package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +0 -6
  677. package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +0 -6
  678. package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +0 -6
  679. package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +0 -6
  680. package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +0 -6
  681. package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +0 -6
  682. package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +0 -7
  683. package/ref-monty/crates/monty/test_cases/global__ops.py +0 -163
  684. package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +0 -2
  685. package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +0 -2
  686. package/ref-monty/crates/monty/test_cases/hash__ops.py +0 -153
  687. package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +0 -3
  688. package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +0 -5
  689. package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +0 -3
  690. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +0 -10
  691. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +0 -6
  692. package/ref-monty/crates/monty/test_cases/id__ops.py +0 -97
  693. package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +0 -3
  694. package/ref-monty/crates/monty/test_cases/if__elif_else.py +0 -207
  695. package/ref-monty/crates/monty/test_cases/if__raise_elif.py +0 -11
  696. package/ref-monty/crates/monty/test_cases/if__raise_else.py +0 -13
  697. package/ref-monty/crates/monty/test_cases/if__raise_if.py +0 -9
  698. package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +0 -18
  699. package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +0 -16
  700. package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +0 -55
  701. package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +0 -9
  702. package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +0 -9
  703. package/ref-monty/crates/monty/test_cases/import__local_scope.py +0 -68
  704. package/ref-monty/crates/monty/test_cases/import__os.py +0 -25
  705. package/ref-monty/crates/monty/test_cases/import__relative_error.py +0 -9
  706. package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +0 -9
  707. package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +0 -14
  708. package/ref-monty/crates/monty/test_cases/import__star_error.py +0 -11
  709. package/ref-monty/crates/monty/test_cases/import__sys.py +0 -47
  710. package/ref-monty/crates/monty/test_cases/import__sys_monty.py +0 -28
  711. package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +0 -37
  712. package/ref-monty/crates/monty/test_cases/import__typing.py +0 -25
  713. package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +0 -4
  714. package/ref-monty/crates/monty/test_cases/int__bigint.py +0 -467
  715. package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +0 -260
  716. package/ref-monty/crates/monty/test_cases/int__ops.py +0 -219
  717. package/ref-monty/crates/monty/test_cases/int__overflow_division.py +0 -84
  718. package/ref-monty/crates/monty/test_cases/is_variant__all.py +0 -36
  719. package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +0 -2
  720. package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +0 -2
  721. package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +0 -4
  722. package/ref-monty/crates/monty/test_cases/iter__for.py +0 -243
  723. package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +0 -66
  724. package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +0 -20
  725. package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +0 -7
  726. package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +0 -3
  727. package/ref-monty/crates/monty/test_cases/lambda__all.py +0 -145
  728. package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +0 -7
  729. package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +0 -3
  730. package/ref-monty/crates/monty/test_cases/list__index_not_found.py +0 -9
  731. package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +0 -10
  732. package/ref-monty/crates/monty/test_cases/list__ops.py +0 -473
  733. package/ref-monty/crates/monty/test_cases/list__pop_empty.py +0 -9
  734. package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +0 -9
  735. package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +0 -9
  736. package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +0 -9
  737. package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +0 -13
  738. package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +0 -13
  739. package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +0 -10
  740. package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +0 -10
  741. package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +0 -2
  742. package/ref-monty/crates/monty/test_cases/longint__index_error.py +0 -3
  743. package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +0 -3
  744. package/ref-monty/crates/monty/test_cases/loop__break_continue.py +0 -113
  745. package/ref-monty/crates/monty/test_cases/loop__break_finally.py +0 -69
  746. package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +0 -13
  747. package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +0 -11
  748. package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +0 -55
  749. package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +0 -9
  750. package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +0 -81
  751. package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +0 -13
  752. package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +0 -11
  753. package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +0 -60
  754. package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +0 -9
  755. package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +0 -11
  756. package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +0 -11
  757. package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +0 -11
  758. package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +0 -11
  759. package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +0 -11
  760. package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +0 -11
  761. package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +0 -11
  762. package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +0 -11
  763. package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +0 -11
  764. package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +0 -11
  765. package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +0 -11
  766. package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +0 -11
  767. package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +0 -11
  768. package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +0 -11
  769. package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +0 -11
  770. package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +0 -11
  771. package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +0 -11
  772. package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +0 -11
  773. package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +0 -11
  774. package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +0 -11
  775. package/ref-monty/crates/monty/test_cases/math__module.py +0 -1432
  776. package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +0 -11
  777. package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +0 -11
  778. package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +0 -11
  779. package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +0 -11
  780. package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +0 -11
  781. package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +0 -259
  782. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +0 -19
  783. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +0 -12
  784. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +0 -9
  785. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +0 -9
  786. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +0 -16
  787. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +0 -9
  788. package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +0 -10
  789. package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +0 -11
  790. package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +0 -34
  791. package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +0 -3
  792. package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +0 -353
  793. package/ref-monty/crates/monty/test_cases/os__environ.py +0 -40
  794. package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +0 -5
  795. package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +0 -5
  796. package/ref-monty/crates/monty/test_cases/parse_error__complex.py +0 -3
  797. package/ref-monty/crates/monty/test_cases/pathlib__import.py +0 -11
  798. package/ref-monty/crates/monty/test_cases/pathlib__os.py +0 -136
  799. package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +0 -12
  800. package/ref-monty/crates/monty/test_cases/pathlib__pure.py +0 -81
  801. package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +0 -5
  802. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +0 -6
  803. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +0 -5
  804. package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +0 -6
  805. package/ref-monty/crates/monty/test_cases/range__error_no_args.py +0 -2
  806. package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +0 -2
  807. package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +0 -2
  808. package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +0 -10
  809. package/ref-monty/crates/monty/test_cases/range__ops.py +0 -236
  810. package/ref-monty/crates/monty/test_cases/re__basic.py +0 -756
  811. package/ref-monty/crates/monty/test_cases/re__grouping.py +0 -241
  812. package/ref-monty/crates/monty/test_cases/re__match.py +0 -148
  813. package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +0 -26
  814. package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +0 -23
  815. package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +0 -46
  816. package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +0 -12
  817. package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +0 -13
  818. package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +0 -18
  819. package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +0 -12
  820. package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +0 -5
  821. package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +0 -5
  822. package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +0 -14
  823. package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +0 -6
  824. package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +0 -16
  825. package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +0 -18
  826. package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +0 -25
  827. package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +0 -4
  828. package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +0 -27
  829. package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +0 -6
  830. package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +0 -5
  831. package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +0 -5
  832. package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +0 -5
  833. package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +0 -5
  834. package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +0 -4
  835. package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +0 -37
  836. package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +0 -34
  837. package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +0 -31
  838. package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +0 -4
  839. package/ref-monty/crates/monty/test_cases/refcount__single_list.py +0 -3
  840. package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +0 -24
  841. package/ref-monty/crates/monty/test_cases/set__ops.py +0 -191
  842. package/ref-monty/crates/monty/test_cases/set__review_bugs.py +0 -35
  843. package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +0 -2
  844. package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +0 -2
  845. package/ref-monty/crates/monty/test_cases/slice__kwargs.py +0 -9
  846. package/ref-monty/crates/monty/test_cases/slice__no_args.py +0 -9
  847. package/ref-monty/crates/monty/test_cases/slice__ops.py +0 -149
  848. package/ref-monty/crates/monty/test_cases/slice__step_zero.py +0 -9
  849. package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +0 -9
  850. package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +0 -9
  851. package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +0 -9
  852. package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +0 -9
  853. package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +0 -9
  854. package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +0 -10
  855. package/ref-monty/crates/monty/test_cases/str__index_not_found.py +0 -9
  856. package/ref-monty/crates/monty/test_cases/str__join_no_args.py +0 -9
  857. package/ref-monty/crates/monty/test_cases/str__join_non_string.py +0 -9
  858. package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +0 -9
  859. package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +0 -9
  860. package/ref-monty/crates/monty/test_cases/str__methods.py +0 -327
  861. package/ref-monty/crates/monty/test_cases/str__ops.py +0 -162
  862. package/ref-monty/crates/monty/test_cases/str__partition_empty.py +0 -9
  863. package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +0 -9
  864. package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +0 -9
  865. package/ref-monty/crates/monty/test_cases/sys__types.py +0 -7
  866. package/ref-monty/crates/monty/test_cases/traceback__division_error.py +0 -30
  867. package/ref-monty/crates/monty/test_cases/traceback__index_error.py +0 -17
  868. package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +0 -10
  869. package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +0 -29
  870. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +0 -10
  871. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +0 -24
  872. package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +0 -9
  873. package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +0 -23
  874. package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +0 -11
  875. package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +0 -16
  876. package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +0 -16
  877. package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +0 -16
  878. package/ref-monty/crates/monty/test_cases/try_except__all.py +0 -472
  879. package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +0 -2
  880. package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +0 -5
  881. package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +0 -3
  882. package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +0 -9
  883. package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +0 -10
  884. package/ref-monty/crates/monty/test_cases/tuple__methods.py +0 -19
  885. package/ref-monty/crates/monty/test_cases/tuple__ops.py +0 -133
  886. package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +0 -2
  887. package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +0 -9
  888. package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +0 -2
  889. package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +0 -9
  890. package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +0 -11
  891. package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +0 -2
  892. package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +0 -9
  893. package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +0 -9
  894. package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +0 -9
  895. package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +0 -2
  896. package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +0 -2
  897. package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +0 -9
  898. package/ref-monty/crates/monty/test_cases/type__ops.py +0 -200
  899. package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +0 -3
  900. package/ref-monty/crates/monty/test_cases/type__shadow_int.py +0 -9
  901. package/ref-monty/crates/monty/test_cases/type__shadow_len.py +0 -3
  902. package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +0 -2
  903. package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +0 -2
  904. package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +0 -2
  905. package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +0 -2
  906. package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +0 -3
  907. package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +0 -2
  908. package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +0 -2
  909. package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +0 -2
  910. package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +0 -2
  911. package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +0 -2
  912. package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +0 -6
  913. package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +0 -2
  914. package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +0 -3
  915. package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +0 -3
  916. package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +0 -4
  917. package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +0 -3
  918. package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +0 -4
  919. package/ref-monty/crates/monty/test_cases/typing__types.py +0 -24
  920. package/ref-monty/crates/monty/test_cases/unpack__nested.py +0 -48
  921. package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +0 -9
  922. package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +0 -9
  923. package/ref-monty/crates/monty/test_cases/unpack__ops.py +0 -153
  924. package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +0 -9
  925. package/ref-monty/crates/monty/test_cases/unpack__too_many.py +0 -9
  926. package/ref-monty/crates/monty/test_cases/version__cpython.py +0 -4
  927. package/ref-monty/crates/monty/test_cases/walrus__all.py +0 -178
  928. package/ref-monty/crates/monty/test_cases/while__all.py +0 -206
  929. package/ref-monty/crates/monty/tests/asyncio.rs +0 -764
  930. package/ref-monty/crates/monty/tests/binary_serde.rs +0 -185
  931. package/ref-monty/crates/monty/tests/bytecode_limits.rs +0 -248
  932. package/ref-monty/crates/monty/tests/datatest_runner.rs +0 -2029
  933. package/ref-monty/crates/monty/tests/inputs.rs +0 -420
  934. package/ref-monty/crates/monty/tests/json_serde.rs +0 -250
  935. package/ref-monty/crates/monty/tests/main.rs +0 -71
  936. package/ref-monty/crates/monty/tests/math_module.rs +0 -114
  937. package/ref-monty/crates/monty/tests/name_lookup.rs +0 -482
  938. package/ref-monty/crates/monty/tests/os_tests.rs +0 -459
  939. package/ref-monty/crates/monty/tests/parse_errors.rs +0 -441
  940. package/ref-monty/crates/monty/tests/print_writer.rs +0 -238
  941. package/ref-monty/crates/monty/tests/py_object.rs +0 -121
  942. package/ref-monty/crates/monty/tests/regex.rs +0 -90
  943. package/ref-monty/crates/monty/tests/repl.rs +0 -344
  944. package/ref-monty/crates/monty/tests/resource_limits.rs +0 -1826
  945. package/ref-monty/crates/monty/tests/try_from.rs +0 -167
  946. package/ref-monty/crates/monty-cli/Cargo.toml +0 -25
  947. package/ref-monty/crates/monty-cli/src/main.rs +0 -541
  948. package/ref-monty/crates/monty-js/.cargo/config.toml +0 -2
  949. package/ref-monty/crates/monty-js/.prettierignore +0 -8
  950. package/ref-monty/crates/monty-js/Cargo.toml +0 -32
  951. package/ref-monty/crates/monty-js/README.md +0 -207
  952. package/ref-monty/crates/monty-js/__test__/async.spec.ts +0 -350
  953. package/ref-monty/crates/monty-js/__test__/basic.spec.ts +0 -114
  954. package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +0 -427
  955. package/ref-monty/crates/monty-js/__test__/external.spec.ts +0 -354
  956. package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +0 -143
  957. package/ref-monty/crates/monty-js/__test__/limits.spec.ts +0 -162
  958. package/ref-monty/crates/monty-js/__test__/package.json +0 -3
  959. package/ref-monty/crates/monty-js/__test__/print.spec.ts +0 -229
  960. package/ref-monty/crates/monty-js/__test__/repl.spec.ts +0 -34
  961. package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +0 -205
  962. package/ref-monty/crates/monty-js/__test__/start.spec.ts +0 -443
  963. package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +0 -147
  964. package/ref-monty/crates/monty-js/__test__/types.spec.ts +0 -319
  965. package/ref-monty/crates/monty-js/build.rs +0 -61
  966. package/ref-monty/crates/monty-js/index-header.d.ts +0 -3
  967. package/ref-monty/crates/monty-js/package-lock.json +0 -4694
  968. package/ref-monty/crates/monty-js/package.json +0 -100
  969. package/ref-monty/crates/monty-js/scripts/smoke-test.sh +0 -69
  970. package/ref-monty/crates/monty-js/smoke-test/package.json +0 -17
  971. package/ref-monty/crates/monty-js/smoke-test/test.ts +0 -171
  972. package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +0 -11
  973. package/ref-monty/crates/monty-js/src/convert.rs +0 -648
  974. package/ref-monty/crates/monty-js/src/exceptions.rs +0 -293
  975. package/ref-monty/crates/monty-js/src/lib.rs +0 -41
  976. package/ref-monty/crates/monty-js/src/limits.rs +0 -53
  977. package/ref-monty/crates/monty-js/src/monty_cls.rs +0 -1407
  978. package/ref-monty/crates/monty-js/tsconfig.json +0 -17
  979. package/ref-monty/crates/monty-js/wrapper.ts +0 -701
  980. package/ref-monty/crates/monty-python/Cargo.toml +0 -38
  981. package/ref-monty/crates/monty-python/README.md +0 -134
  982. package/ref-monty/crates/monty-python/build.rs +0 -4
  983. package/ref-monty/crates/monty-python/example.py +0 -40
  984. package/ref-monty/crates/monty-python/exercise.py +0 -46
  985. package/ref-monty/crates/monty-python/pyproject.toml +0 -57
  986. package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +0 -281
  987. package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +0 -677
  988. package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +0 -933
  989. package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
  990. package/ref-monty/crates/monty-python/src/convert.rs +0 -273
  991. package/ref-monty/crates/monty-python/src/dataclass.rs +0 -461
  992. package/ref-monty/crates/monty-python/src/exceptions.rs +0 -557
  993. package/ref-monty/crates/monty-python/src/external.rs +0 -165
  994. package/ref-monty/crates/monty-python/src/lib.rs +0 -77
  995. package/ref-monty/crates/monty-python/src/limits.rs +0 -142
  996. package/ref-monty/crates/monty-python/src/monty_cls.rs +0 -1650
  997. package/ref-monty/crates/monty-python/src/repl.rs +0 -470
  998. package/ref-monty/crates/monty-python/src/serialization.rs +0 -761
  999. package/ref-monty/crates/monty-python/tests/test_async.py +0 -1201
  1000. package/ref-monty/crates/monty-python/tests/test_basic.py +0 -66
  1001. package/ref-monty/crates/monty-python/tests/test_dataclasses.py +0 -971
  1002. package/ref-monty/crates/monty-python/tests/test_exceptions.py +0 -361
  1003. package/ref-monty/crates/monty-python/tests/test_external.py +0 -367
  1004. package/ref-monty/crates/monty-python/tests/test_inputs.py +0 -126
  1005. package/ref-monty/crates/monty-python/tests/test_limits.py +0 -257
  1006. package/ref-monty/crates/monty-python/tests/test_os_access.py +0 -1286
  1007. package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +0 -731
  1008. package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +0 -483
  1009. package/ref-monty/crates/monty-python/tests/test_os_calls.py +0 -819
  1010. package/ref-monty/crates/monty-python/tests/test_print.py +0 -208
  1011. package/ref-monty/crates/monty-python/tests/test_re.py +0 -170
  1012. package/ref-monty/crates/monty-python/tests/test_readme_examples.py +0 -20
  1013. package/ref-monty/crates/monty-python/tests/test_repl.py +0 -749
  1014. package/ref-monty/crates/monty-python/tests/test_serialize.py +0 -284
  1015. package/ref-monty/crates/monty-python/tests/test_start.py +0 -346
  1016. package/ref-monty/crates/monty-python/tests/test_threading.py +0 -163
  1017. package/ref-monty/crates/monty-python/tests/test_type_check.py +0 -344
  1018. package/ref-monty/crates/monty-python/tests/test_types.py +0 -553
  1019. package/ref-monty/crates/monty-type-checking/Cargo.toml +0 -32
  1020. package/ref-monty/crates/monty-type-checking/src/db.rs +0 -116
  1021. package/ref-monty/crates/monty-type-checking/src/lib.rs +0 -4
  1022. package/ref-monty/crates/monty-type-checking/src/type_check.rs +0 -280
  1023. package/ref-monty/crates/monty-type-checking/tests/bad_types.py +0 -109
  1024. package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +0 -21
  1025. package/ref-monty/crates/monty-type-checking/tests/good_types.py +0 -475
  1026. package/ref-monty/crates/monty-type-checking/tests/main.rs +0 -205
  1027. package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +0 -56
  1028. package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +0 -41
  1029. package/ref-monty/crates/monty-typeshed/Cargo.toml +0 -29
  1030. package/ref-monty/crates/monty-typeshed/README.md +0 -11
  1031. package/ref-monty/crates/monty-typeshed/build.rs +0 -101
  1032. package/ref-monty/crates/monty-typeshed/custom/README.md +0 -1
  1033. package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +0 -138
  1034. package/ref-monty/crates/monty-typeshed/custom/os.pyi +0 -87
  1035. package/ref-monty/crates/monty-typeshed/custom/sys.pyi +0 -33
  1036. package/ref-monty/crates/monty-typeshed/src/lib.rs +0 -56
  1037. package/ref-monty/crates/monty-typeshed/update.py +0 -321
  1038. package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +0 -1
  1039. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +0 -20
  1040. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +0 -105
  1041. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +0 -394
  1042. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +0 -138
  1043. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +0 -1434
  1044. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +0 -527
  1045. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +0 -2
  1046. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +0 -502
  1047. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +0 -376
  1048. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +0 -149
  1049. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +0 -87
  1050. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +0 -395
  1051. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +0 -8
  1052. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +0 -337
  1053. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +0 -33
  1054. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +0 -741
  1055. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +0 -1217
  1056. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +0 -716
  1057. package/ref-monty/docs/usage-guide.md +0 -117
  1058. package/ref-monty/examples/README.md +0 -3
  1059. package/ref-monty/examples/expense_analysis/README.md +0 -3
  1060. package/ref-monty/examples/expense_analysis/data.py +0 -124
  1061. package/ref-monty/examples/expense_analysis/main.py +0 -115
  1062. package/ref-monty/examples/sql_playground/README.md +0 -20
  1063. package/ref-monty/examples/sql_playground/external_functions.py +0 -129
  1064. package/ref-monty/examples/sql_playground/main.py +0 -81
  1065. package/ref-monty/examples/sql_playground/sandbox_code.py +0 -82
  1066. package/ref-monty/examples/sql_playground/type_stubs.pyi +0 -14
  1067. package/ref-monty/examples/web_scraper/README.md +0 -15
  1068. package/ref-monty/examples/web_scraper/browser.py +0 -56
  1069. package/ref-monty/examples/web_scraper/example_code.py +0 -59
  1070. package/ref-monty/examples/web_scraper/external_functions.py +0 -324
  1071. package/ref-monty/examples/web_scraper/main.py +0 -193
  1072. package/ref-monty/examples/web_scraper/sub_agent.py +0 -79
  1073. package/ref-monty/monty-npm.md +0 -235
  1074. package/ref-monty/pyproject.toml +0 -162
  1075. package/ref-monty/scripts/check_imports.py +0 -91
  1076. package/ref-monty/scripts/codecov_diff.py +0 -412
  1077. package/ref-monty/scripts/complete_tests.py +0 -146
  1078. package/ref-monty/scripts/flamegraph_to_text.py +0 -208
  1079. package/ref-monty/scripts/iter_test_methods.py +0 -540
  1080. package/ref-monty/scripts/run_traceback.py +0 -180
  1081. package/ref-monty/scripts/startup_performance.py +0 -130
  1082. package/ref-monty/uv.lock +0 -1779
  1083. package/temp_resend_cli/repo/.github/scripts/pr-title-check.js +0 -34
  1084. package/temp_resend_cli/repo/.github/workflows/ci.yml +0 -67
  1085. package/temp_resend_cli/repo/.github/workflows/post-release.yml +0 -51
  1086. package/temp_resend_cli/repo/.github/workflows/pr-title-check.yml +0 -13
  1087. package/temp_resend_cli/repo/.github/workflows/release.yml +0 -175
  1088. package/temp_resend_cli/repo/.github/workflows/test-install-unix.yml +0 -34
  1089. package/temp_resend_cli/repo/.github/workflows/test-install-windows.yml +0 -48
  1090. package/temp_resend_cli/repo/CHANGELOG.md +0 -31
  1091. package/temp_resend_cli/repo/LICENSE +0 -21
  1092. package/temp_resend_cli/repo/README.md +0 -450
  1093. package/temp_resend_cli/repo/biome.json +0 -36
  1094. package/temp_resend_cli/repo/install.ps1 +0 -141
  1095. package/temp_resend_cli/repo/install.sh +0 -301
  1096. package/temp_resend_cli/repo/package.json +0 -61
  1097. package/temp_resend_cli/repo/pnpm-lock.yaml +0 -2439
  1098. package/temp_resend_cli/repo/renovate.json +0 -4
  1099. package/temp_resend_cli/repo/src/cli.ts +0 -98
  1100. package/temp_resend_cli/repo/src/commands/api-keys/create.ts +0 -114
  1101. package/temp_resend_cli/repo/src/commands/api-keys/delete.ts +0 -47
  1102. package/temp_resend_cli/repo/src/commands/api-keys/index.ts +0 -26
  1103. package/temp_resend_cli/repo/src/commands/api-keys/list.ts +0 -35
  1104. package/temp_resend_cli/repo/src/commands/api-keys/utils.ts +0 -8
  1105. package/temp_resend_cli/repo/src/commands/auth/index.ts +0 -20
  1106. package/temp_resend_cli/repo/src/commands/auth/login.ts +0 -234
  1107. package/temp_resend_cli/repo/src/commands/auth/logout.ts +0 -105
  1108. package/temp_resend_cli/repo/src/commands/broadcasts/create.ts +0 -196
  1109. package/temp_resend_cli/repo/src/commands/broadcasts/delete.ts +0 -46
  1110. package/temp_resend_cli/repo/src/commands/broadcasts/get.ts +0 -59
  1111. package/temp_resend_cli/repo/src/commands/broadcasts/index.ts +0 -43
  1112. package/temp_resend_cli/repo/src/commands/broadcasts/list.ts +0 -60
  1113. package/temp_resend_cli/repo/src/commands/broadcasts/send.ts +0 -56
  1114. package/temp_resend_cli/repo/src/commands/broadcasts/update.ts +0 -95
  1115. package/temp_resend_cli/repo/src/commands/broadcasts/utils.ts +0 -35
  1116. package/temp_resend_cli/repo/src/commands/contact-properties/create.ts +0 -118
  1117. package/temp_resend_cli/repo/src/commands/contact-properties/delete.ts +0 -48
  1118. package/temp_resend_cli/repo/src/commands/contact-properties/get.ts +0 -46
  1119. package/temp_resend_cli/repo/src/commands/contact-properties/index.ts +0 -48
  1120. package/temp_resend_cli/repo/src/commands/contact-properties/list.ts +0 -68
  1121. package/temp_resend_cli/repo/src/commands/contact-properties/update.ts +0 -88
  1122. package/temp_resend_cli/repo/src/commands/contact-properties/utils.ts +0 -17
  1123. package/temp_resend_cli/repo/src/commands/contacts/add-segment.ts +0 -78
  1124. package/temp_resend_cli/repo/src/commands/contacts/create.ts +0 -122
  1125. package/temp_resend_cli/repo/src/commands/contacts/delete.ts +0 -49
  1126. package/temp_resend_cli/repo/src/commands/contacts/get.ts +0 -53
  1127. package/temp_resend_cli/repo/src/commands/contacts/index.ts +0 -58
  1128. package/temp_resend_cli/repo/src/commands/contacts/list.ts +0 -57
  1129. package/temp_resend_cli/repo/src/commands/contacts/remove-segment.ts +0 -48
  1130. package/temp_resend_cli/repo/src/commands/contacts/segments.ts +0 -39
  1131. package/temp_resend_cli/repo/src/commands/contacts/topics.ts +0 -45
  1132. package/temp_resend_cli/repo/src/commands/contacts/update-topics.ts +0 -90
  1133. package/temp_resend_cli/repo/src/commands/contacts/update.ts +0 -77
  1134. package/temp_resend_cli/repo/src/commands/contacts/utils.ts +0 -119
  1135. package/temp_resend_cli/repo/src/commands/doctor.ts +0 -216
  1136. package/temp_resend_cli/repo/src/commands/domains/create.ts +0 -83
  1137. package/temp_resend_cli/repo/src/commands/domains/delete.ts +0 -42
  1138. package/temp_resend_cli/repo/src/commands/domains/get.ts +0 -47
  1139. package/temp_resend_cli/repo/src/commands/domains/index.ts +0 -35
  1140. package/temp_resend_cli/repo/src/commands/domains/list.ts +0 -53
  1141. package/temp_resend_cli/repo/src/commands/domains/update.ts +0 -75
  1142. package/temp_resend_cli/repo/src/commands/domains/utils.ts +0 -44
  1143. package/temp_resend_cli/repo/src/commands/domains/verify.ts +0 -38
  1144. package/temp_resend_cli/repo/src/commands/emails/batch.ts +0 -140
  1145. package/temp_resend_cli/repo/src/commands/emails/get.ts +0 -44
  1146. package/temp_resend_cli/repo/src/commands/emails/index.ts +0 -30
  1147. package/temp_resend_cli/repo/src/commands/emails/list.ts +0 -84
  1148. package/temp_resend_cli/repo/src/commands/emails/receiving/attachment.ts +0 -55
  1149. package/temp_resend_cli/repo/src/commands/emails/receiving/attachments.ts +0 -68
  1150. package/temp_resend_cli/repo/src/commands/emails/receiving/get.ts +0 -58
  1151. package/temp_resend_cli/repo/src/commands/emails/receiving/index.ts +0 -28
  1152. package/temp_resend_cli/repo/src/commands/emails/receiving/list.ts +0 -59
  1153. package/temp_resend_cli/repo/src/commands/emails/receiving/utils.ts +0 -38
  1154. package/temp_resend_cli/repo/src/commands/emails/send.ts +0 -189
  1155. package/temp_resend_cli/repo/src/commands/open.ts +0 -27
  1156. package/temp_resend_cli/repo/src/commands/segments/create.ts +0 -50
  1157. package/temp_resend_cli/repo/src/commands/segments/delete.ts +0 -47
  1158. package/temp_resend_cli/repo/src/commands/segments/get.ts +0 -38
  1159. package/temp_resend_cli/repo/src/commands/segments/index.ts +0 -36
  1160. package/temp_resend_cli/repo/src/commands/segments/list.ts +0 -58
  1161. package/temp_resend_cli/repo/src/commands/segments/utils.ts +0 -7
  1162. package/temp_resend_cli/repo/src/commands/teams/index.ts +0 -10
  1163. package/temp_resend_cli/repo/src/commands/teams/list.ts +0 -35
  1164. package/temp_resend_cli/repo/src/commands/teams/remove.ts +0 -86
  1165. package/temp_resend_cli/repo/src/commands/teams/switch.ts +0 -76
  1166. package/temp_resend_cli/repo/src/commands/topics/create.ts +0 -73
  1167. package/temp_resend_cli/repo/src/commands/topics/delete.ts +0 -47
  1168. package/temp_resend_cli/repo/src/commands/topics/get.ts +0 -42
  1169. package/temp_resend_cli/repo/src/commands/topics/index.ts +0 -42
  1170. package/temp_resend_cli/repo/src/commands/topics/list.ts +0 -34
  1171. package/temp_resend_cli/repo/src/commands/topics/update.ts +0 -59
  1172. package/temp_resend_cli/repo/src/commands/topics/utils.ts +0 -16
  1173. package/temp_resend_cli/repo/src/commands/webhooks/create.ts +0 -128
  1174. package/temp_resend_cli/repo/src/commands/webhooks/delete.ts +0 -49
  1175. package/temp_resend_cli/repo/src/commands/webhooks/get.ts +0 -42
  1176. package/temp_resend_cli/repo/src/commands/webhooks/index.ts +0 -42
  1177. package/temp_resend_cli/repo/src/commands/webhooks/list.ts +0 -55
  1178. package/temp_resend_cli/repo/src/commands/webhooks/listen.ts +0 -379
  1179. package/temp_resend_cli/repo/src/commands/webhooks/update.ts +0 -83
  1180. package/temp_resend_cli/repo/src/commands/webhooks/utils.ts +0 -36
  1181. package/temp_resend_cli/repo/src/commands/whoami.ts +0 -71
  1182. package/temp_resend_cli/repo/src/lib/actions.ts +0 -157
  1183. package/temp_resend_cli/repo/src/lib/client.ts +0 -37
  1184. package/temp_resend_cli/repo/src/lib/config.ts +0 -217
  1185. package/temp_resend_cli/repo/src/lib/files.ts +0 -15
  1186. package/temp_resend_cli/repo/src/lib/help-text.ts +0 -38
  1187. package/temp_resend_cli/repo/src/lib/output.ts +0 -56
  1188. package/temp_resend_cli/repo/src/lib/pagination.ts +0 -36
  1189. package/temp_resend_cli/repo/src/lib/prompts.ts +0 -149
  1190. package/temp_resend_cli/repo/src/lib/spinner.ts +0 -100
  1191. package/temp_resend_cli/repo/src/lib/table.ts +0 -57
  1192. package/temp_resend_cli/repo/src/lib/tty.ts +0 -28
  1193. package/temp_resend_cli/repo/src/lib/update-check.ts +0 -169
  1194. package/temp_resend_cli/repo/src/lib/version.ts +0 -4
  1195. package/temp_resend_cli/repo/tests/commands/api-keys/create.test.ts +0 -196
  1196. package/temp_resend_cli/repo/tests/commands/api-keys/delete.test.ts +0 -157
  1197. package/temp_resend_cli/repo/tests/commands/api-keys/list.test.ts +0 -134
  1198. package/temp_resend_cli/repo/tests/commands/auth/login.test.ts +0 -153
  1199. package/temp_resend_cli/repo/tests/commands/auth/logout.test.ts +0 -153
  1200. package/temp_resend_cli/repo/tests/commands/broadcasts/create.test.ts +0 -454
  1201. package/temp_resend_cli/repo/tests/commands/broadcasts/delete.test.ts +0 -183
  1202. package/temp_resend_cli/repo/tests/commands/broadcasts/get.test.ts +0 -147
  1203. package/temp_resend_cli/repo/tests/commands/broadcasts/list.test.ts +0 -199
  1204. package/temp_resend_cli/repo/tests/commands/broadcasts/send.test.ts +0 -162
  1205. package/temp_resend_cli/repo/tests/commands/broadcasts/update.test.ts +0 -288
  1206. package/temp_resend_cli/repo/tests/commands/contact-properties/create.test.ts +0 -251
  1207. package/temp_resend_cli/repo/tests/commands/contact-properties/delete.test.ts +0 -184
  1208. package/temp_resend_cli/repo/tests/commands/contact-properties/get.test.ts +0 -145
  1209. package/temp_resend_cli/repo/tests/commands/contact-properties/list.test.ts +0 -181
  1210. package/temp_resend_cli/repo/tests/commands/contact-properties/update.test.ts +0 -217
  1211. package/temp_resend_cli/repo/tests/commands/contacts/add-segment.test.ts +0 -189
  1212. package/temp_resend_cli/repo/tests/commands/contacts/create.test.ts +0 -271
  1213. package/temp_resend_cli/repo/tests/commands/contacts/delete.test.ts +0 -193
  1214. package/temp_resend_cli/repo/tests/commands/contacts/get.test.ts +0 -149
  1215. package/temp_resend_cli/repo/tests/commands/contacts/list.test.ts +0 -176
  1216. package/temp_resend_cli/repo/tests/commands/contacts/remove-segment.test.ts +0 -167
  1217. package/temp_resend_cli/repo/tests/commands/contacts/segments.test.ts +0 -168
  1218. package/temp_resend_cli/repo/tests/commands/contacts/topics.test.ts +0 -164
  1219. package/temp_resend_cli/repo/tests/commands/contacts/update-topics.test.ts +0 -248
  1220. package/temp_resend_cli/repo/tests/commands/contacts/update.test.ts +0 -206
  1221. package/temp_resend_cli/repo/tests/commands/doctor.test.ts +0 -164
  1222. package/temp_resend_cli/repo/tests/commands/domains/create.test.ts +0 -193
  1223. package/temp_resend_cli/repo/tests/commands/domains/delete.test.ts +0 -157
  1224. package/temp_resend_cli/repo/tests/commands/domains/get.test.ts +0 -138
  1225. package/temp_resend_cli/repo/tests/commands/domains/list.test.ts +0 -165
  1226. package/temp_resend_cli/repo/tests/commands/domains/update.test.ts +0 -224
  1227. package/temp_resend_cli/repo/tests/commands/domains/verify.test.ts +0 -118
  1228. package/temp_resend_cli/repo/tests/commands/emails/batch.test.ts +0 -324
  1229. package/temp_resend_cli/repo/tests/commands/emails/get.test.ts +0 -132
  1230. package/temp_resend_cli/repo/tests/commands/emails/receiving/attachment.test.ts +0 -141
  1231. package/temp_resend_cli/repo/tests/commands/emails/receiving/attachments.test.ts +0 -169
  1232. package/temp_resend_cli/repo/tests/commands/emails/receiving/get.test.ts +0 -141
  1233. package/temp_resend_cli/repo/tests/commands/emails/receiving/list.test.ts +0 -182
  1234. package/temp_resend_cli/repo/tests/commands/emails/send.test.ts +0 -312
  1235. package/temp_resend_cli/repo/tests/commands/segments/create.test.ts +0 -164
  1236. package/temp_resend_cli/repo/tests/commands/segments/delete.test.ts +0 -183
  1237. package/temp_resend_cli/repo/tests/commands/segments/get.test.ts +0 -138
  1238. package/temp_resend_cli/repo/tests/commands/segments/list.test.ts +0 -174
  1239. package/temp_resend_cli/repo/tests/commands/teams/list.test.ts +0 -62
  1240. package/temp_resend_cli/repo/tests/commands/teams/remove.test.ts +0 -110
  1241. package/temp_resend_cli/repo/tests/commands/teams/switch.test.ts +0 -103
  1242. package/temp_resend_cli/repo/tests/commands/topics/create.test.ts +0 -192
  1243. package/temp_resend_cli/repo/tests/commands/topics/delete.test.ts +0 -157
  1244. package/temp_resend_cli/repo/tests/commands/topics/get.test.ts +0 -126
  1245. package/temp_resend_cli/repo/tests/commands/topics/list.test.ts +0 -125
  1246. package/temp_resend_cli/repo/tests/commands/topics/update.test.ts +0 -178
  1247. package/temp_resend_cli/repo/tests/commands/webhooks/create.test.ts +0 -225
  1248. package/temp_resend_cli/repo/tests/commands/webhooks/delete.test.ts +0 -157
  1249. package/temp_resend_cli/repo/tests/commands/webhooks/get.test.ts +0 -126
  1250. package/temp_resend_cli/repo/tests/commands/webhooks/list.test.ts +0 -178
  1251. package/temp_resend_cli/repo/tests/commands/webhooks/update.test.ts +0 -207
  1252. package/temp_resend_cli/repo/tests/commands/whoami.test.ts +0 -98
  1253. package/temp_resend_cli/repo/tests/e2e/smoke.test.ts +0 -93
  1254. package/temp_resend_cli/repo/tests/helpers.ts +0 -86
  1255. package/temp_resend_cli/repo/tests/lib/client.test.ts +0 -71
  1256. package/temp_resend_cli/repo/tests/lib/config.test.ts +0 -451
  1257. package/temp_resend_cli/repo/tests/lib/files.test.ts +0 -73
  1258. package/temp_resend_cli/repo/tests/lib/help-text.test.ts +0 -97
  1259. package/temp_resend_cli/repo/tests/lib/output.test.ts +0 -136
  1260. package/temp_resend_cli/repo/tests/lib/prompts.test.ts +0 -185
  1261. package/temp_resend_cli/repo/tests/lib/spinner.test.ts +0 -166
  1262. package/temp_resend_cli/repo/tests/lib/table.test.ts +0 -63
  1263. package/temp_resend_cli/repo/tests/lib/tty.test.ts +0 -89
  1264. package/temp_resend_cli/repo/tests/lib/update-check.test.ts +0 -179
  1265. package/temp_resend_cli/repo/tsconfig.json +0 -14
  1266. package/temp_resend_cli/repo/vitest.config.e2e.ts +0 -8
  1267. package/temp_resend_cli/repo/vitest.config.ts +0 -10
  1268. /package/docs/{plugin-examples.md → plugins-examples.md} +0 -0
@@ -1,1453 +0,0 @@
1
- //! Implementation of Python's `math` module.
2
- //!
3
- //! Provides mathematical functions and constants matching CPython 3.14 behavior
4
- //! and error messages. All functions are pure computations that don't require
5
- //! host involvement, so they return `Value` directly rather than `AttrCallResult`.
6
- //!
7
- //! ## Implemented functions
8
- //!
9
- //! **Rounding**: `floor`, `ceil`, `trunc`
10
- //! **Roots & powers**: `sqrt`, `isqrt`, `cbrt`, `pow`, `exp`, `exp2`, `expm1`
11
- //! **Logarithms**: `log`, `log2`, `log10`, `log1p`
12
- //! **Trigonometric**: `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `atan2`
13
- //! **Hyperbolic**: `sinh`, `cosh`, `tanh`, `asinh`, `acosh`, `atanh`
14
- //! **Angular**: `degrees`, `radians`
15
- //! **Float properties**: `fabs`, `isnan`, `isinf`, `isfinite`, `copysign`, `isclose`,
16
- //! `nextafter`, `ulp`
17
- //! **Integer math**: `factorial`, `gcd`, `lcm`, `comb`, `perm`
18
- //! **Modular**: `fmod`, `remainder`, `modf`, `frexp`, `ldexp`
19
- //! **Special**: `gamma`, `lgamma`, `erf`, `erfc`
20
- //!
21
- //! ## Constants
22
- //!
23
- //! `pi`, `e`, `tau`, `inf`, `nan`
24
-
25
- use num_bigint::BigInt;
26
- use smallvec::smallvec;
27
-
28
- use crate::{
29
- args::ArgValues,
30
- bytecode::VM,
31
- defer_drop, defer_drop_mut,
32
- exception_private::{ExcType, RunResult, SimpleException},
33
- heap::{Heap, HeapData, HeapId},
34
- intern::{Interns, StaticStrings},
35
- modules::ModuleFunctions,
36
- resource::{ResourceError, ResourceTracker},
37
- types::{LongInt, Module, PyTrait, allocate_tuple},
38
- value::Value,
39
- };
40
-
41
- // ==========================
42
- // Shared constants and error helpers
43
- // ==========================
44
-
45
- /// Returns a `ValueError` with the standard CPython "math domain error" message.
46
- fn math_domain_error() -> crate::exception_private::RunError {
47
- SimpleException::new_msg(ExcType::ValueError, "math domain error").into()
48
- }
49
-
50
- /// Returns an `OverflowError` with the standard CPython "math range error" message.
51
- fn math_range_error() -> crate::exception_private::RunError {
52
- SimpleException::new_msg(ExcType::OverflowError, "math range error").into()
53
- }
54
-
55
- /// Checks whether a computation overflowed (finite input produced infinite result).
56
- ///
57
- /// Returns `Err(OverflowError("math range error"))` if `result` is infinite
58
- /// but `input` was finite.
59
- fn check_range_error(result: f64, input: f64) -> RunResult<()> {
60
- if result.is_infinite() && input.is_finite() {
61
- Err(math_range_error())
62
- } else {
63
- Ok(())
64
- }
65
- }
66
-
67
- /// Checks that a value is in the `[-1, 1]` range, raising `ValueError` if not.
68
- ///
69
- /// NaN passes through (it will propagate through the subsequent math operation).
70
- /// Used by `math.asin` and `math.acos`.
71
- fn require_unit_range(f: f64) -> RunResult<()> {
72
- if !f.is_nan() && !(-1.0..=1.0).contains(&f) {
73
- Err(SimpleException::new_msg(
74
- ExcType::ValueError,
75
- format!("expected a number in range from -1 up to 1, got {f:?}"),
76
- )
77
- .into())
78
- } else {
79
- Ok(())
80
- }
81
- }
82
-
83
- /// Checks for non-positive integer arguments (poles of the Gamma function).
84
- ///
85
- /// These are the finite non-positive integers where Gamma diverges to ±∞.
86
- /// Does NOT reject `-inf` — callers that need to reject it (like `math.gamma`)
87
- /// must do so separately, since `lgamma(-inf)` is valid and returns `inf`.
88
- #[expect(
89
- clippy::float_cmp,
90
- reason = "exact comparison detects integer poles of gamma function"
91
- )]
92
- fn check_gamma_pole(f: f64) -> RunResult<()> {
93
- if f <= 0.0 && f == f.floor() && f.is_finite() {
94
- Err(SimpleException::new_msg(
95
- ExcType::ValueError,
96
- format!("expected a noninteger or positive integer, got {f:?}"),
97
- )
98
- .into())
99
- } else {
100
- Ok(())
101
- }
102
- }
103
-
104
- /// Math module functions — each variant corresponds to a Python-visible function.
105
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, serde::Serialize, serde::Deserialize)]
106
- #[strum(serialize_all = "lowercase")]
107
- pub(crate) enum MathFunctions {
108
- // Rounding
109
- Floor,
110
- Ceil,
111
- Trunc,
112
- // Roots & powers
113
- Sqrt,
114
- Isqrt,
115
- Cbrt,
116
- Pow,
117
- Exp,
118
- Exp2,
119
- Expm1,
120
- // Logarithms
121
- Log,
122
- Log1p,
123
- Log2,
124
- Log10,
125
- // Float properties
126
- Fabs,
127
- Isnan,
128
- Isinf,
129
- Isfinite,
130
- Copysign,
131
- Isclose,
132
- Nextafter,
133
- Ulp,
134
- // Trigonometric
135
- Sin,
136
- Cos,
137
- Tan,
138
- Asin,
139
- Acos,
140
- Atan,
141
- Atan2,
142
- // Hyperbolic
143
- Sinh,
144
- Cosh,
145
- Tanh,
146
- Asinh,
147
- Acosh,
148
- Atanh,
149
- // Angular conversion
150
- Degrees,
151
- Radians,
152
- // Integer math
153
- Factorial,
154
- Gcd,
155
- Lcm,
156
- Comb,
157
- Perm,
158
- // Modular / decomposition
159
- Fmod,
160
- Remainder,
161
- Modf,
162
- Frexp,
163
- Ldexp,
164
- // Special functions
165
- Gamma,
166
- Lgamma,
167
- Erf,
168
- Erfc,
169
- }
170
-
171
- /// Creates the `math` module and allocates it on the heap.
172
- ///
173
- /// Registers all math functions and constants (`pi`, `e`, `tau`, `inf`, `nan`)
174
- /// matching CPython's `math` module. Functions are registered as
175
- /// `ModuleFunctions::Math` variants.
176
- ///
177
- /// # Returns
178
- /// A `HeapId` pointing to the newly allocated module.
179
- ///
180
- /// # Panics
181
- /// Panics if the required strings have not been pre-interned during prepare phase.
182
- pub fn create_module(vm: &mut VM<'_, '_, impl ResourceTracker>) -> Result<HeapId, ResourceError> {
183
- let mut module = Module::new(StaticStrings::Math);
184
-
185
- // Register all math functions
186
- for (name, func) in MATH_FUNCTIONS {
187
- module.set_attr(*name, Value::ModuleFunction(ModuleFunctions::Math(*func)), vm);
188
- }
189
-
190
- // Constants
191
- module.set_attr(StaticStrings::Pi, Value::Float(std::f64::consts::PI), vm);
192
- module.set_attr(StaticStrings::MathE, Value::Float(std::f64::consts::E), vm);
193
- module.set_attr(StaticStrings::Tau, Value::Float(std::f64::consts::TAU), vm);
194
- module.set_attr(StaticStrings::MathInf, Value::Float(f64::INFINITY), vm);
195
- module.set_attr(StaticStrings::MathNan, Value::Float(f64::NAN), vm);
196
-
197
- vm.heap.allocate(HeapData::Module(module))
198
- }
199
-
200
- /// Static mapping of attribute names to math functions for module creation.
201
- const MATH_FUNCTIONS: &[(StaticStrings, MathFunctions)] = &[
202
- // Rounding
203
- (StaticStrings::Floor, MathFunctions::Floor),
204
- (StaticStrings::Ceil, MathFunctions::Ceil),
205
- (StaticStrings::Trunc, MathFunctions::Trunc),
206
- // Roots & powers
207
- (StaticStrings::Sqrt, MathFunctions::Sqrt),
208
- (StaticStrings::Isqrt, MathFunctions::Isqrt),
209
- (StaticStrings::Cbrt, MathFunctions::Cbrt),
210
- (StaticStrings::Pow, MathFunctions::Pow),
211
- (StaticStrings::Exp, MathFunctions::Exp),
212
- (StaticStrings::Exp2, MathFunctions::Exp2),
213
- (StaticStrings::Expm1, MathFunctions::Expm1),
214
- // Logarithms
215
- (StaticStrings::Log, MathFunctions::Log),
216
- (StaticStrings::Log1p, MathFunctions::Log1p),
217
- (StaticStrings::Log2, MathFunctions::Log2),
218
- (StaticStrings::Log10, MathFunctions::Log10),
219
- // Float properties
220
- (StaticStrings::Fabs, MathFunctions::Fabs),
221
- (StaticStrings::Isnan, MathFunctions::Isnan),
222
- (StaticStrings::Isinf, MathFunctions::Isinf),
223
- (StaticStrings::Isfinite, MathFunctions::Isfinite),
224
- (StaticStrings::Copysign, MathFunctions::Copysign),
225
- (StaticStrings::Isclose, MathFunctions::Isclose),
226
- (StaticStrings::Nextafter, MathFunctions::Nextafter),
227
- (StaticStrings::Ulp, MathFunctions::Ulp),
228
- // Trigonometric
229
- (StaticStrings::Sin, MathFunctions::Sin),
230
- (StaticStrings::Cos, MathFunctions::Cos),
231
- (StaticStrings::Tan, MathFunctions::Tan),
232
- (StaticStrings::Asin, MathFunctions::Asin),
233
- (StaticStrings::Acos, MathFunctions::Acos),
234
- (StaticStrings::Atan, MathFunctions::Atan),
235
- (StaticStrings::Atan2, MathFunctions::Atan2),
236
- // Hyperbolic
237
- (StaticStrings::Sinh, MathFunctions::Sinh),
238
- (StaticStrings::Cosh, MathFunctions::Cosh),
239
- (StaticStrings::Tanh, MathFunctions::Tanh),
240
- (StaticStrings::Asinh, MathFunctions::Asinh),
241
- (StaticStrings::Acosh, MathFunctions::Acosh),
242
- (StaticStrings::Atanh, MathFunctions::Atanh),
243
- // Angular conversion
244
- (StaticStrings::Degrees, MathFunctions::Degrees),
245
- (StaticStrings::Radians, MathFunctions::Radians),
246
- // Integer math
247
- (StaticStrings::Factorial, MathFunctions::Factorial),
248
- (StaticStrings::Gcd, MathFunctions::Gcd),
249
- (StaticStrings::Lcm, MathFunctions::Lcm),
250
- (StaticStrings::Comb, MathFunctions::Comb),
251
- (StaticStrings::Perm, MathFunctions::Perm),
252
- // Modular / decomposition
253
- (StaticStrings::Fmod, MathFunctions::Fmod),
254
- (StaticStrings::Remainder, MathFunctions::Remainder),
255
- (StaticStrings::Modf, MathFunctions::Modf),
256
- (StaticStrings::Frexp, MathFunctions::Frexp),
257
- (StaticStrings::Ldexp, MathFunctions::Ldexp),
258
- // Special functions
259
- (StaticStrings::Gamma, MathFunctions::Gamma),
260
- (StaticStrings::Lgamma, MathFunctions::Lgamma),
261
- (StaticStrings::Erf, MathFunctions::Erf),
262
- (StaticStrings::Erfc, MathFunctions::Erfc),
263
- ];
264
-
265
- /// Dispatches a call to a math module function.
266
- ///
267
- /// All math functions are pure computations and return `Value` directly.
268
- pub(super) fn call(
269
- vm: &mut VM<'_, '_, impl ResourceTracker>,
270
- function: MathFunctions,
271
- args: ArgValues,
272
- ) -> RunResult<Value> {
273
- match function {
274
- // Rounding
275
- MathFunctions::Floor => math_floor(vm.heap, args),
276
- MathFunctions::Ceil => math_ceil(vm.heap, args),
277
- MathFunctions::Trunc => math_trunc(vm.heap, args),
278
- // Roots & powers
279
- MathFunctions::Sqrt => math_sqrt(vm.heap, args),
280
- MathFunctions::Isqrt => math_isqrt(vm.heap, args),
281
- MathFunctions::Cbrt => math_cbrt(vm.heap, args),
282
- MathFunctions::Pow => math_pow(vm.heap, args),
283
- MathFunctions::Exp => math_exp(vm.heap, args),
284
- MathFunctions::Exp2 => math_exp2(vm.heap, args),
285
- MathFunctions::Expm1 => math_expm1(vm.heap, args),
286
- // Logarithms
287
- MathFunctions::Log => math_log(vm.heap, args),
288
- MathFunctions::Log1p => math_log1p(vm.heap, args),
289
- MathFunctions::Log2 => math_log2(vm.heap, args),
290
- MathFunctions::Log10 => math_log10(vm.heap, args),
291
- // Float properties
292
- MathFunctions::Fabs => math_fabs(vm.heap, args),
293
- MathFunctions::Isnan => math_isnan(vm.heap, args),
294
- MathFunctions::Isinf => math_isinf(vm.heap, args),
295
- MathFunctions::Isfinite => math_isfinite(vm.heap, args),
296
- MathFunctions::Copysign => math_copysign(vm.heap, args),
297
- MathFunctions::Isclose => math_isclose(vm.heap, args, vm.interns),
298
- MathFunctions::Nextafter => math_nextafter(vm.heap, args),
299
- MathFunctions::Ulp => math_ulp(vm.heap, args),
300
- // Trigonometric
301
- MathFunctions::Sin => math_sin(vm.heap, args),
302
- MathFunctions::Cos => math_cos(vm.heap, args),
303
- MathFunctions::Tan => math_tan(vm.heap, args),
304
- MathFunctions::Asin => math_asin(vm.heap, args),
305
- MathFunctions::Acos => math_acos(vm.heap, args),
306
- MathFunctions::Atan => math_atan(vm.heap, args),
307
- MathFunctions::Atan2 => math_atan2(vm.heap, args),
308
- // Hyperbolic
309
- MathFunctions::Sinh => math_sinh(vm.heap, args),
310
- MathFunctions::Cosh => math_cosh(vm.heap, args),
311
- MathFunctions::Tanh => math_tanh(vm.heap, args),
312
- MathFunctions::Asinh => math_asinh(vm.heap, args),
313
- MathFunctions::Acosh => math_acosh(vm.heap, args),
314
- MathFunctions::Atanh => math_atanh(vm.heap, args),
315
- // Angular conversion
316
- MathFunctions::Degrees => math_degrees(vm.heap, args),
317
- MathFunctions::Radians => math_radians(vm.heap, args),
318
- // Integer math
319
- MathFunctions::Factorial => math_factorial(vm.heap, args),
320
- MathFunctions::Gcd => math_gcd(vm.heap, args),
321
- MathFunctions::Lcm => math_lcm(vm.heap, args),
322
- MathFunctions::Comb => math_comb(vm.heap, args),
323
- MathFunctions::Perm => math_perm(vm.heap, args),
324
- // Modular / decomposition
325
- MathFunctions::Fmod => math_fmod(vm.heap, args),
326
- MathFunctions::Remainder => math_remainder(vm.heap, args),
327
- MathFunctions::Modf => math_modf(vm.heap, args),
328
- MathFunctions::Frexp => math_frexp(vm.heap, args),
329
- MathFunctions::Ldexp => math_ldexp(vm.heap, args),
330
- // Special functions
331
- MathFunctions::Gamma => math_gamma(vm.heap, args),
332
- MathFunctions::Lgamma => math_lgamma(vm.heap, args),
333
- MathFunctions::Erf => math_erf(vm.heap, args),
334
- MathFunctions::Erfc => math_erfc(vm.heap, args),
335
- }
336
- }
337
-
338
- // ==========================
339
- // Rounding functions
340
- // ==========================
341
-
342
- /// `math.floor(x)` — returns the largest integer less than or equal to x.
343
- ///
344
- /// Accepts int, float, or bool. Returns int.
345
- /// Raises `OverflowError` for infinity, `ValueError` for NaN.
346
- fn math_floor(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
347
- let value = args.get_one_arg("math.floor", heap)?;
348
- defer_drop!(value, heap);
349
-
350
- match value {
351
- Value::Float(f) => float_to_int_checked(f.floor(), *f, heap),
352
- Value::Int(n) => Ok(Value::Int(*n)),
353
- Value::Bool(b) => Ok(Value::Int(i64::from(*b))),
354
- _ => Err(ExcType::type_error(format!(
355
- "must be real number, not {}",
356
- value.py_type(heap)
357
- ))),
358
- }
359
- }
360
-
361
- /// `math.ceil(x)` — returns the smallest integer greater than or equal to x.
362
- ///
363
- /// Accepts int, float, or bool. Returns int.
364
- /// Raises `OverflowError` for infinity, `ValueError` for NaN.
365
- fn math_ceil(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
366
- let value = args.get_one_arg("math.ceil", heap)?;
367
- defer_drop!(value, heap);
368
-
369
- match value {
370
- Value::Float(f) => float_to_int_checked(f.ceil(), *f, heap),
371
- Value::Int(n) => Ok(Value::Int(*n)),
372
- Value::Bool(b) => Ok(Value::Int(i64::from(*b))),
373
- _ => Err(ExcType::type_error(format!(
374
- "must be real number, not {}",
375
- value.py_type(heap)
376
- ))),
377
- }
378
- }
379
-
380
- /// `math.trunc(x)` — truncates x to the nearest integer toward zero.
381
- ///
382
- /// Accepts int, float, or bool. Returns int.
383
- fn math_trunc(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
384
- let value = args.get_one_arg("math.trunc", heap)?;
385
- defer_drop!(value, heap);
386
-
387
- match value {
388
- Value::Float(f) => float_to_int_checked(f.trunc(), *f, heap),
389
- Value::Int(n) => Ok(Value::Int(*n)),
390
- Value::Bool(b) => Ok(Value::Int(i64::from(*b))),
391
- _ => Err(ExcType::type_error(format!(
392
- "type {} doesn't define __trunc__ method",
393
- value.py_type(heap)
394
- ))),
395
- }
396
- }
397
-
398
- // ==========================
399
- // Roots & powers
400
- // ==========================
401
-
402
- /// `math.sqrt(x)` — returns the square root of x.
403
- ///
404
- /// Always returns a float. Raises `ValueError` for negative inputs with a
405
- /// descriptive message matching CPython 3.14: "expected a nonnegative input, got <x>".
406
- fn math_sqrt(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
407
- let value = args.get_one_arg("math.sqrt", heap)?;
408
- defer_drop!(value, heap);
409
-
410
- let f = value_to_float(value, heap)?;
411
- if f < 0.0 {
412
- Err(SimpleException::new_msg(ExcType::ValueError, format!("expected a nonnegative input, got {f:?}")).into())
413
- } else {
414
- Ok(Value::Float(f.sqrt()))
415
- }
416
- }
417
-
418
- /// `math.isqrt(n)` — returns the integer square root of a non-negative integer.
419
- ///
420
- /// Returns the largest integer `r` such that `r * r <= n`.
421
- /// Only accepts non-negative integers (and bools).
422
- fn math_isqrt(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
423
- let value = args.get_one_arg("math.isqrt", heap)?;
424
- defer_drop!(value, heap);
425
-
426
- let n = value_to_int(value, heap)?;
427
- if n < 0 {
428
- return Err(SimpleException::new_msg(ExcType::ValueError, "isqrt() argument must be nonnegative").into());
429
- }
430
- if n == 0 {
431
- return Ok(Value::Int(0));
432
- }
433
-
434
- // Integer square root via f64 estimate + correction.
435
- // For i64 inputs, f64 sqrt is accurate to within ±1, so we need to
436
- // correct both overshoot and undershoot. The cast truncates toward zero,
437
- // so undershoot is possible for perfect squares near f64 precision limits.
438
- #[expect(
439
- clippy::cast_precision_loss,
440
- clippy::cast_possible_truncation,
441
- reason = "initial estimate doesn't need to be exact, correction refines it"
442
- )]
443
- let mut x = (n as f64).sqrt() as i64;
444
- // Correct overshoot: use `x > n / x` instead of `x * x > n` to avoid i64 overflow.
445
- while x > n / x {
446
- x -= 1;
447
- }
448
- // Correct undershoot: check if (x+1)² ≤ n using division to avoid overflow.
449
- while x < n / (x + 1) {
450
- x += 1;
451
- }
452
- Ok(Value::Int(x))
453
- }
454
-
455
- /// `math.cbrt(x)` — returns the cube root of x.
456
- ///
457
- /// Always returns a float. Unlike `sqrt`, works for negative inputs.
458
- fn math_cbrt(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
459
- let value = args.get_one_arg("math.cbrt", heap)?;
460
- defer_drop!(value, heap);
461
-
462
- let f = value_to_float(value, heap)?;
463
- Ok(Value::Float(f.cbrt()))
464
- }
465
-
466
- /// `math.pow(x, y)` — returns x raised to the power y.
467
- ///
468
- /// Always returns a float. Unlike the builtin `pow()`, does not support
469
- /// three-argument modular exponentiation. Raises `ValueError` for
470
- /// negative base with non-integer exponent.
471
- fn math_pow(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
472
- let (x_val, y_val) = args.get_two_args("math.pow", heap)?;
473
- defer_drop!(x_val, heap);
474
- defer_drop!(y_val, heap);
475
-
476
- let x = value_to_float(x_val, heap)?;
477
- let y = value_to_float(y_val, heap)?;
478
- let result = x.powf(y);
479
- // CPython raises ValueError for domain errors: 0**negative, negative**non-integer
480
- if result.is_nan() && !x.is_nan() && !y.is_nan() {
481
- return Err(math_domain_error());
482
- }
483
- if result.is_infinite() && x.is_finite() && y.is_finite() {
484
- // 0**negative is a domain error (ValueError), not overflow
485
- if x == 0.0 && y < 0.0 {
486
- return Err(math_domain_error());
487
- }
488
- return Err(math_range_error());
489
- }
490
- Ok(Value::Float(result))
491
- }
492
-
493
- /// `math.exp(x)` — returns e raised to the power x.
494
- fn math_exp(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
495
- let value = args.get_one_arg("math.exp", heap)?;
496
- defer_drop!(value, heap);
497
-
498
- let f = value_to_float(value, heap)?;
499
- let result = f.exp();
500
- check_range_error(result, f)?;
501
- Ok(Value::Float(result))
502
- }
503
-
504
- /// `math.exp2(x)` — returns 2 raised to the power x.
505
- fn math_exp2(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
506
- let value = args.get_one_arg("math.exp2", heap)?;
507
- defer_drop!(value, heap);
508
-
509
- let f = value_to_float(value, heap)?;
510
- let result = f.exp2();
511
- check_range_error(result, f)?;
512
- Ok(Value::Float(result))
513
- }
514
-
515
- /// `math.expm1(x)` — returns e**x - 1.
516
- ///
517
- /// More accurate than `exp(x) - 1` for small values of x.
518
- fn math_expm1(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
519
- let value = args.get_one_arg("math.expm1", heap)?;
520
- defer_drop!(value, heap);
521
-
522
- let f = value_to_float(value, heap)?;
523
- let result = f.exp_m1();
524
- check_range_error(result, f)?;
525
- Ok(Value::Float(result))
526
- }
527
-
528
- // ==========================
529
- // Logarithms
530
- // ==========================
531
-
532
- /// `math.log(x[, base])` — returns the logarithm of x.
533
- ///
534
- /// With one argument, returns the natural logarithm (base e).
535
- /// With two arguments, returns `log(x) / log(base)`.
536
- /// Raises `ValueError` for non-positive inputs (CPython 3.14: "expected a positive input").
537
- fn math_log(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
538
- let (x_val, base_val) = args.get_one_two_args("math.log", heap)?;
539
- defer_drop!(x_val, heap);
540
- defer_drop!(base_val, heap);
541
-
542
- let x = value_to_float(x_val, heap)?;
543
- if x <= 0.0 {
544
- return Err(SimpleException::new_msg(ExcType::ValueError, "expected a positive input").into());
545
- }
546
-
547
- match base_val {
548
- Some(base_v) => {
549
- let base = value_to_float(base_v, heap)?;
550
- // base == 1.0 causes division by zero in log(x)/log(base), matching
551
- // CPython which raises ZeroDivisionError for this case.
552
- #[expect(
553
- clippy::float_cmp,
554
- reason = "exact comparison with 1.0 is intentional — log(1.0) is exactly 0.0"
555
- )]
556
- if base == 1.0 {
557
- return Err(SimpleException::new_msg(ExcType::ZeroDivisionError, "division by zero").into());
558
- }
559
- if base <= 0.0 {
560
- return Err(SimpleException::new_msg(ExcType::ValueError, "expected a positive input").into());
561
- }
562
- Ok(Value::Float(x.ln() / base.ln()))
563
- }
564
- None => Ok(Value::Float(x.ln())),
565
- }
566
- }
567
-
568
- /// `math.log1p(x)` — returns the natural logarithm of 1 + x.
569
- ///
570
- /// More accurate than `log(1 + x)` for small values of x.
571
- /// CPython 3.14 raises ValueError with "expected argument value > -1, got <x>".
572
- fn math_log1p(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
573
- let value = args.get_one_arg("math.log1p", heap)?;
574
- defer_drop!(value, heap);
575
-
576
- let f = value_to_float(value, heap)?;
577
- if f <= -1.0 {
578
- return Err(
579
- SimpleException::new_msg(ExcType::ValueError, format!("expected argument value > -1, got {f:?}")).into(),
580
- );
581
- }
582
- Ok(Value::Float(f.ln_1p()))
583
- }
584
-
585
- /// `math.log2(x)` — returns the base-2 logarithm of x.
586
- ///
587
- /// Returns `inf` for positive infinity, `nan` for NaN.
588
- /// Raises `ValueError` for non-positive finite inputs.
589
- fn math_log2(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
590
- let value = args.get_one_arg("math.log2", heap)?;
591
- defer_drop!(value, heap);
592
-
593
- let f = value_to_float(value, heap)?;
594
- if f <= 0.0 {
595
- Err(SimpleException::new_msg(ExcType::ValueError, "expected a positive input").into())
596
- } else {
597
- Ok(Value::Float(f.log2()))
598
- }
599
- }
600
-
601
- /// `math.log10(x)` — returns the base-10 logarithm of x.
602
- ///
603
- /// Returns `inf` for positive infinity, `nan` for NaN.
604
- /// Raises `ValueError` for non-positive finite inputs.
605
- fn math_log10(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
606
- let value = args.get_one_arg("math.log10", heap)?;
607
- defer_drop!(value, heap);
608
-
609
- let f = value_to_float(value, heap)?;
610
- if f <= 0.0 {
611
- Err(SimpleException::new_msg(ExcType::ValueError, "expected a positive input").into())
612
- } else {
613
- Ok(Value::Float(f.log10()))
614
- }
615
- }
616
-
617
- // ==========================
618
- // Float properties
619
- // ==========================
620
-
621
- /// `math.fabs(x)` — returns the absolute value as a float.
622
- ///
623
- /// Unlike the builtin `abs()`, always returns a float.
624
- fn math_fabs(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
625
- let value = args.get_one_arg("math.fabs", heap)?;
626
- defer_drop!(value, heap);
627
-
628
- let f = value_to_float(value, heap)?;
629
- Ok(Value::Float(f.abs()))
630
- }
631
-
632
- /// `math.isnan(x)` — returns True if x is NaN.
633
- fn math_isnan(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
634
- let value = args.get_one_arg("math.isnan", heap)?;
635
- defer_drop!(value, heap);
636
-
637
- let f = value_to_float(value, heap)?;
638
- Ok(Value::Bool(f.is_nan()))
639
- }
640
-
641
- /// `math.isinf(x)` — returns True if x is positive or negative infinity.
642
- fn math_isinf(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
643
- let value = args.get_one_arg("math.isinf", heap)?;
644
- defer_drop!(value, heap);
645
-
646
- let f = value_to_float(value, heap)?;
647
- Ok(Value::Bool(f.is_infinite()))
648
- }
649
-
650
- /// `math.isfinite(x)` — returns True if x is neither infinity nor NaN.
651
- fn math_isfinite(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
652
- let value = args.get_one_arg("math.isfinite", heap)?;
653
- defer_drop!(value, heap);
654
-
655
- let f = value_to_float(value, heap)?;
656
- Ok(Value::Bool(f.is_finite()))
657
- }
658
-
659
- /// `math.copysign(x, y)` — returns x with the sign of y.
660
- ///
661
- /// Always returns a float.
662
- fn math_copysign(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
663
- let (x_val, y_val) = args.get_two_args("math.copysign", heap)?;
664
- defer_drop!(x_val, heap);
665
- defer_drop!(y_val, heap);
666
-
667
- let x = value_to_float(x_val, heap)?;
668
- let y = value_to_float(y_val, heap)?;
669
- Ok(Value::Float(x.copysign(y)))
670
- }
671
-
672
- /// `math.isclose(a, b, *, rel_tol=1e-9, abs_tol=0.0)` — returns True if a and b are close.
673
- ///
674
- /// Supports keyword-only `rel_tol` and `abs_tol` parameters matching CPython.
675
- /// Raises `ValueError` if either tolerance is negative.
676
- fn math_isclose(heap: &mut Heap<impl ResourceTracker>, args: ArgValues, interns: &Interns) -> RunResult<Value> {
677
- let (positional, kwargs) = args.into_parts();
678
- defer_drop_mut!(positional, heap);
679
-
680
- // Extract exactly two positional args
681
- let Some(a_val) = positional.next() else {
682
- return Err(ExcType::type_error_at_least("math.isclose", 2, 0));
683
- };
684
- defer_drop!(a_val, heap);
685
- let Some(b_val) = positional.next() else {
686
- return Err(ExcType::type_error_at_least("math.isclose", 2, 1));
687
- };
688
- defer_drop!(b_val, heap);
689
- if positional.len() > 0 {
690
- return Err(ExcType::type_error_at_most("math.isclose", 2, 2 + positional.len()));
691
- }
692
-
693
- let a = value_to_float(a_val, heap)?;
694
- let b = value_to_float(b_val, heap)?;
695
-
696
- // Parse optional keyword arguments rel_tol and abs_tol
697
- let (rel_tol, abs_tol) = extract_isclose_kwargs(kwargs, heap, interns)?;
698
-
699
- if rel_tol < 0.0 {
700
- return Err(SimpleException::new_msg(ExcType::ValueError, "tolerances must be non-negative").into());
701
- }
702
- if abs_tol < 0.0 {
703
- return Err(SimpleException::new_msg(ExcType::ValueError, "tolerances must be non-negative").into());
704
- }
705
-
706
- // Exact equality check matches CPython's isclose() behavior — two identical
707
- // values (including infinities) are always considered close.
708
- #[expect(
709
- clippy::float_cmp,
710
- reason = "exact equality check matches CPython's isclose() semantics"
711
- )]
712
- if a == b {
713
- return Ok(Value::Bool(true));
714
- }
715
- if a.is_infinite() || b.is_infinite() {
716
- return Ok(Value::Bool(false));
717
- }
718
- if a.is_nan() || b.is_nan() {
719
- return Ok(Value::Bool(false));
720
- }
721
-
722
- let diff = (a - b).abs();
723
- let result = diff <= (rel_tol * a.abs().max(b.abs())).max(abs_tol);
724
- Ok(Value::Bool(result))
725
- }
726
-
727
- /// Extracts `rel_tol` and `abs_tol` keyword arguments for `math.isclose`.
728
- ///
729
- /// Returns `(rel_tol, abs_tol)` with defaults of `(1e-9, 0.0)`.
730
- fn extract_isclose_kwargs(
731
- kwargs: crate::args::KwargsValues,
732
- heap: &mut Heap<impl ResourceTracker>,
733
- interns: &Interns,
734
- ) -> RunResult<(f64, f64)> {
735
- let mut rel_tol: f64 = 1e-9;
736
- let mut abs_tol: f64 = 0.0;
737
-
738
- if kwargs.is_empty() {
739
- return Ok((rel_tol, abs_tol));
740
- }
741
-
742
- for (key, value) in kwargs {
743
- defer_drop!(key, heap);
744
- defer_drop!(value, heap);
745
-
746
- let Some(keyword_name) = key.as_either_str(heap) else {
747
- return Err(ExcType::type_error("keywords must be strings"));
748
- };
749
-
750
- let key_str = keyword_name.as_str(interns);
751
- match key_str {
752
- "rel_tol" => {
753
- rel_tol = value_to_float(value, heap)?;
754
- }
755
- "abs_tol" => {
756
- abs_tol = value_to_float(value, heap)?;
757
- }
758
- other => {
759
- return Err(ExcType::type_error(format!(
760
- "isclose() got an unexpected keyword argument '{other}'"
761
- )));
762
- }
763
- }
764
- }
765
-
766
- Ok((rel_tol, abs_tol))
767
- }
768
-
769
- /// `math.nextafter(x, y)` — returns the next float after x towards y.
770
- fn math_nextafter(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
771
- let (x_val, y_val) = args.get_two_args("math.nextafter", heap)?;
772
- defer_drop!(x_val, heap);
773
- defer_drop!(y_val, heap);
774
-
775
- let x = value_to_float(x_val, heap)?;
776
- let y = value_to_float(y_val, heap)?;
777
-
778
- Ok(Value::Float(libm::nextafter(x, y)))
779
- }
780
-
781
- /// `math.ulp(x)` — returns the value of the least significant bit of x.
782
- ///
783
- /// For finite non-zero x, returns the smallest float `u` such that `x + u != x`.
784
- /// Special cases: `ulp(nan)` returns nan, `ulp(inf)` returns inf.
785
- fn math_ulp(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
786
- let value = args.get_one_arg("math.ulp", heap)?;
787
- defer_drop!(value, heap);
788
-
789
- let f = value_to_float(value, heap)?;
790
- if f.is_nan() {
791
- return Ok(Value::Float(f64::NAN));
792
- }
793
- if f.is_infinite() {
794
- return Ok(Value::Float(f64::INFINITY));
795
- }
796
- let f = f.abs();
797
- if f == 0.0 {
798
- // CPython returns the smallest positive subnormal: 5e-324
799
- return Ok(Value::Float(f64::from_bits(1)));
800
- }
801
- // ULP = nextafter(f, inf) - f
802
- let next = libm::nextafter(f, f64::INFINITY);
803
- Ok(Value::Float(next - f))
804
- }
805
-
806
- // ==========================
807
- // Trigonometric functions
808
- // ==========================
809
-
810
- /// `math.sin(x)` — returns the sine of x (in radians).
811
- ///
812
- /// CPython 3.14 raises ValueError for infinity: "expected a finite input, got inf".
813
- fn math_sin(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
814
- let value = args.get_one_arg("math.sin", heap)?;
815
- defer_drop!(value, heap);
816
-
817
- let f = value_to_float(value, heap)?;
818
- require_finite(f)?;
819
- Ok(Value::Float(f.sin()))
820
- }
821
-
822
- /// `math.cos(x)` — returns the cosine of x (in radians).
823
- fn math_cos(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
824
- let value = args.get_one_arg("math.cos", heap)?;
825
- defer_drop!(value, heap);
826
-
827
- let f = value_to_float(value, heap)?;
828
- require_finite(f)?;
829
- Ok(Value::Float(f.cos()))
830
- }
831
-
832
- /// `math.tan(x)` — returns the tangent of x (in radians).
833
- fn math_tan(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
834
- let value = args.get_one_arg("math.tan", heap)?;
835
- defer_drop!(value, heap);
836
-
837
- let f = value_to_float(value, heap)?;
838
- require_finite(f)?;
839
- Ok(Value::Float(f.tan()))
840
- }
841
-
842
- /// `math.asin(x)` — returns the arc sine of x (in radians).
843
- ///
844
- /// CPython 3.14: "expected a number in range from -1 up to 1, got <x>".
845
- fn math_asin(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
846
- let value = args.get_one_arg("math.asin", heap)?;
847
- defer_drop!(value, heap);
848
-
849
- let f = value_to_float(value, heap)?;
850
- require_unit_range(f)?;
851
- Ok(Value::Float(f.asin()))
852
- }
853
-
854
- /// `math.acos(x)` — returns the arc cosine of x (in radians).
855
- ///
856
- /// CPython 3.14: "expected a number in range from -1 up to 1, got <x>".
857
- fn math_acos(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
858
- let value = args.get_one_arg("math.acos", heap)?;
859
- defer_drop!(value, heap);
860
-
861
- let f = value_to_float(value, heap)?;
862
- require_unit_range(f)?;
863
- Ok(Value::Float(f.acos()))
864
- }
865
-
866
- /// `math.atan(x)` — returns the arc tangent of x (in radians).
867
- fn math_atan(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
868
- let value = args.get_one_arg("math.atan", heap)?;
869
- defer_drop!(value, heap);
870
-
871
- let f = value_to_float(value, heap)?;
872
- Ok(Value::Float(f.atan()))
873
- }
874
-
875
- /// `math.atan2(y, x)` — returns atan(y/x) in radians, using the signs of both
876
- /// to determine the correct quadrant.
877
- fn math_atan2(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
878
- let (y_val, x_val) = args.get_two_args("math.atan2", heap)?;
879
- defer_drop!(y_val, heap);
880
- defer_drop!(x_val, heap);
881
-
882
- let y = value_to_float(y_val, heap)?;
883
- let x = value_to_float(x_val, heap)?;
884
- Ok(Value::Float(y.atan2(x)))
885
- }
886
-
887
- // ==========================
888
- // Hyperbolic functions
889
- // ==========================
890
-
891
- /// `math.sinh(x)` — returns the hyperbolic sine of x.
892
- fn math_sinh(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
893
- let value = args.get_one_arg("math.sinh", heap)?;
894
- defer_drop!(value, heap);
895
-
896
- let f = value_to_float(value, heap)?;
897
- let result = f.sinh();
898
- check_range_error(result, f)?;
899
- Ok(Value::Float(result))
900
- }
901
-
902
- /// `math.cosh(x)` — returns the hyperbolic cosine of x.
903
- fn math_cosh(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
904
- let value = args.get_one_arg("math.cosh", heap)?;
905
- defer_drop!(value, heap);
906
-
907
- let f = value_to_float(value, heap)?;
908
- let result = f.cosh();
909
- check_range_error(result, f)?;
910
- Ok(Value::Float(result))
911
- }
912
-
913
- /// `math.tanh(x)` — returns the hyperbolic tangent of x.
914
- fn math_tanh(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
915
- let value = args.get_one_arg("math.tanh", heap)?;
916
- defer_drop!(value, heap);
917
-
918
- let f = value_to_float(value, heap)?;
919
- Ok(Value::Float(f.tanh()))
920
- }
921
-
922
- /// `math.asinh(x)` — returns the inverse hyperbolic sine of x.
923
- fn math_asinh(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
924
- let value = args.get_one_arg("math.asinh", heap)?;
925
- defer_drop!(value, heap);
926
-
927
- let f = value_to_float(value, heap)?;
928
- Ok(Value::Float(f.asinh()))
929
- }
930
-
931
- /// `math.acosh(x)` — returns the inverse hyperbolic cosine of x.
932
- ///
933
- /// CPython 3.14: "expected argument value not less than 1, got <x>".
934
- fn math_acosh(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
935
- let value = args.get_one_arg("math.acosh", heap)?;
936
- defer_drop!(value, heap);
937
-
938
- let f = value_to_float(value, heap)?;
939
- if f < 1.0 {
940
- return Err(SimpleException::new_msg(
941
- ExcType::ValueError,
942
- format!("expected argument value not less than 1, got {f:?}"),
943
- )
944
- .into());
945
- }
946
- Ok(Value::Float(f.acosh()))
947
- }
948
-
949
- /// `math.atanh(x)` — returns the inverse hyperbolic tangent of x.
950
- ///
951
- /// CPython 3.14: "expected a number between -1 and 1, got <x>".
952
- fn math_atanh(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
953
- let value = args.get_one_arg("math.atanh", heap)?;
954
- defer_drop!(value, heap);
955
-
956
- let f = value_to_float(value, heap)?;
957
- if f <= -1.0 || f >= 1.0 {
958
- return Err(SimpleException::new_msg(
959
- ExcType::ValueError,
960
- format!("expected a number between -1 and 1, got {f:?}"),
961
- )
962
- .into());
963
- }
964
- Ok(Value::Float(f.atanh()))
965
- }
966
-
967
- // ==========================
968
- // Angular conversion
969
- // ==========================
970
-
971
- /// `math.degrees(x)` — converts angle x from radians to degrees.
972
- fn math_degrees(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
973
- let value = args.get_one_arg("math.degrees", heap)?;
974
- defer_drop!(value, heap);
975
-
976
- let f = value_to_float(value, heap)?;
977
- Ok(Value::Float(f.to_degrees()))
978
- }
979
-
980
- /// `math.radians(x)` — converts angle x from degrees to radians.
981
- fn math_radians(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
982
- let value = args.get_one_arg("math.radians", heap)?;
983
- defer_drop!(value, heap);
984
-
985
- let f = value_to_float(value, heap)?;
986
- Ok(Value::Float(f.to_radians()))
987
- }
988
-
989
- // ==========================
990
- // Integer math
991
- // ==========================
992
-
993
- /// `math.factorial(n)` — returns n factorial.
994
- ///
995
- /// Only accepts non-negative integers (and bools). Raises `ValueError` for
996
- /// negative values, `TypeError` for non-integer types.
997
- fn math_factorial(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
998
- let value = args.get_one_arg("math.factorial", heap)?;
999
- defer_drop!(value, heap);
1000
-
1001
- let n = match value {
1002
- Value::Int(n) => *n,
1003
- Value::Bool(b) => i64::from(*b),
1004
- _ => {
1005
- return Err(ExcType::type_error(format!(
1006
- "'{}' object cannot be interpreted as an integer",
1007
- value.py_type(heap)
1008
- )));
1009
- }
1010
- };
1011
-
1012
- if n < 0 {
1013
- return Err(
1014
- SimpleException::new_msg(ExcType::ValueError, "factorial() not defined for negative values").into(),
1015
- );
1016
- }
1017
-
1018
- // Compute factorial iteratively
1019
- let mut result: i64 = 1;
1020
- for i in 2..=n {
1021
- match result.checked_mul(i) {
1022
- Some(v) => result = v,
1023
- None => {
1024
- // Overflow — for simplicity, return an error for very large factorials
1025
- // since we don't have LongInt factorial support yet
1026
- return Err(
1027
- SimpleException::new_msg(ExcType::OverflowError, "int too large to convert to factorial").into(),
1028
- );
1029
- }
1030
- }
1031
- }
1032
- Ok(Value::Int(result))
1033
- }
1034
-
1035
- /// `math.gcd(*integers)` — returns the greatest common divisor of the arguments.
1036
- ///
1037
- /// Supports 0 or more arguments, matching CPython 3.9+. `gcd()` returns 0,
1038
- /// `gcd(n)` returns `abs(n)`, and for multiple args reduces pairwise.
1039
- /// The result is always non-negative.
1040
- fn math_gcd(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1041
- let positional = args.into_pos_only("math.gcd", heap)?;
1042
- defer_drop_mut!(positional, heap);
1043
-
1044
- let mut result: u64 = 0;
1045
- for arg in positional.by_ref() {
1046
- defer_drop!(arg, heap);
1047
- let n = value_to_int(arg, heap)?;
1048
- result = gcd(result, n.unsigned_abs());
1049
- }
1050
- u64_to_value(result, heap)
1051
- }
1052
-
1053
- /// `math.lcm(*integers)` — returns the least common multiple of the arguments.
1054
- ///
1055
- /// Supports 0 or more arguments, matching CPython 3.9+. `lcm()` returns 1,
1056
- /// `lcm(n)` returns `abs(n)`, and for multiple args reduces pairwise.
1057
- /// The result is always non-negative. Returns 0 if any argument is 0.
1058
- fn math_lcm(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1059
- let positional = args.into_pos_only("math.lcm", heap)?;
1060
- defer_drop_mut!(positional, heap);
1061
-
1062
- let mut result: u64 = 1;
1063
- for arg in positional.by_ref() {
1064
- defer_drop!(arg, heap);
1065
- let n = value_to_int(arg, heap)?;
1066
- let abs_n = n.unsigned_abs();
1067
- if abs_n == 0 {
1068
- return Ok(Value::Int(0));
1069
- }
1070
- let g = gcd(result, abs_n);
1071
- // lcm(a, b) = |a| / gcd(a,b) * |b| — dividing first avoids intermediate overflow
1072
- result = (result / g)
1073
- .checked_mul(abs_n)
1074
- .ok_or_else(|| SimpleException::new_msg(ExcType::OverflowError, "integer overflow in lcm"))?;
1075
- }
1076
- u64_to_value(result, heap)
1077
- }
1078
-
1079
- /// `math.comb(n, k)` — returns the number of ways to choose k items from n.
1080
- ///
1081
- /// Both arguments must be non-negative integers.
1082
- fn math_comb(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1083
- let (n_val, k_val) = args.get_two_args("math.comb", heap)?;
1084
- defer_drop!(n_val, heap);
1085
- defer_drop!(k_val, heap);
1086
-
1087
- let n = value_to_int(n_val, heap)?;
1088
- let k = value_to_int(k_val, heap)?;
1089
-
1090
- if n < 0 {
1091
- return Err(SimpleException::new_msg(ExcType::ValueError, "n must be a non-negative integer").into());
1092
- }
1093
- if k < 0 {
1094
- return Err(SimpleException::new_msg(ExcType::ValueError, "k must be a non-negative integer").into());
1095
- }
1096
- if k > n {
1097
- return Ok(Value::Int(0));
1098
- }
1099
-
1100
- // Use the smaller of k and n-k for efficiency: C(n, k) = C(n, n-k)
1101
- let k = k.min(n - k);
1102
- let mut result: i64 = 1;
1103
- for i in 0..k {
1104
- // Use GCD reduction to keep intermediates small:
1105
- // result = result * (n - i) / (i + 1)
1106
- // By dividing both numerator and denominator by their GCD first,
1107
- // we reduce the chance of overflow in the multiplication step.
1108
- let mut numerator = n - i;
1109
- let mut denominator = i + 1;
1110
- #[expect(clippy::cast_sign_loss, reason = "both values are known non-negative at this point")]
1111
- let g = gcd(numerator as u64, denominator as u64).cast_signed();
1112
- numerator /= g;
1113
- denominator /= g;
1114
- // Also reduce against the running result
1115
- #[expect(clippy::cast_sign_loss, reason = "result and denominator are known non-negative")]
1116
- let g2 = gcd(result as u64, denominator as u64).cast_signed();
1117
- result /= g2;
1118
- denominator /= g2;
1119
- debug_assert!(denominator == 1, "denominator should be 1 after GCD reduction in comb");
1120
- match result.checked_mul(numerator) {
1121
- Some(v) => result = v,
1122
- None => {
1123
- return Err(SimpleException::new_msg(ExcType::OverflowError, "integer overflow in comb").into());
1124
- }
1125
- }
1126
- }
1127
- Ok(Value::Int(result))
1128
- }
1129
-
1130
- /// `math.perm(n, k=None)` — returns the number of k-length permutations from n items.
1131
- ///
1132
- /// Both arguments must be non-negative integers. When `k` is omitted, defaults to `n`
1133
- /// (i.e., `perm(n)` returns `n!`), matching CPython behavior.
1134
- fn math_perm(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1135
- let (n_val, k_val) = args.get_one_two_args("math.perm", heap)?;
1136
- defer_drop!(n_val, heap);
1137
-
1138
- let n = value_to_int(n_val, heap)?;
1139
- let k_explicit = k_val.is_some();
1140
- let k = match k_val {
1141
- Some(kv) => {
1142
- defer_drop!(kv, heap);
1143
- value_to_int(kv, heap)?
1144
- }
1145
- None => n,
1146
- };
1147
-
1148
- if n < 0 {
1149
- // When called as perm(n) without k, CPython uses the factorial error message
1150
- let msg = if k_explicit {
1151
- "n must be a non-negative integer"
1152
- } else {
1153
- "factorial() not defined for negative values"
1154
- };
1155
- return Err(SimpleException::new_msg(ExcType::ValueError, msg).into());
1156
- }
1157
- if k < 0 {
1158
- return Err(SimpleException::new_msg(ExcType::ValueError, "k must be a non-negative integer").into());
1159
- }
1160
- if k > n {
1161
- return Ok(Value::Int(0));
1162
- }
1163
-
1164
- let mut result: i64 = 1;
1165
- for i in 0..k {
1166
- match result.checked_mul(n - i) {
1167
- Some(v) => result = v,
1168
- None => {
1169
- return Err(SimpleException::new_msg(ExcType::OverflowError, "integer overflow in perm").into());
1170
- }
1171
- }
1172
- }
1173
- Ok(Value::Int(result))
1174
- }
1175
-
1176
- // ==========================
1177
- // Modular / decomposition
1178
- // ==========================
1179
-
1180
- /// `math.fmod(x, y)` — returns x modulo y as a float.
1181
- ///
1182
- /// Unlike `x % y`, the result has the same sign as x. Raises `ValueError`
1183
- /// when y is zero (CPython: "math domain error").
1184
- fn math_fmod(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1185
- let (x_val, y_val) = args.get_two_args("math.fmod", heap)?;
1186
- defer_drop!(x_val, heap);
1187
- defer_drop!(y_val, heap);
1188
-
1189
- let x = value_to_float(x_val, heap)?;
1190
- let y = value_to_float(y_val, heap)?;
1191
-
1192
- if y == 0.0 || x.is_infinite() {
1193
- // CPython raises for both fmod(x, 0) and fmod(inf, y)
1194
- // but NaN inputs propagate
1195
- if !x.is_nan() && !y.is_nan() {
1196
- return Err(math_domain_error());
1197
- }
1198
- }
1199
- Ok(Value::Float(x % y))
1200
- }
1201
-
1202
- /// `math.remainder(x, y)` — IEEE 754 remainder of x with respect to y.
1203
- ///
1204
- /// The result is `x - n*y` where n is the closest integer to `x/y`.
1205
- fn math_remainder(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1206
- let (x_val, y_val) = args.get_two_args("math.remainder", heap)?;
1207
- defer_drop!(x_val, heap);
1208
- defer_drop!(y_val, heap);
1209
-
1210
- let x = value_to_float(x_val, heap)?;
1211
- let y = value_to_float(y_val, heap)?;
1212
-
1213
- // NaN propagates
1214
- if x.is_nan() || y.is_nan() {
1215
- return Ok(Value::Float(f64::NAN));
1216
- }
1217
- if y == 0.0 {
1218
- return Err(math_domain_error());
1219
- }
1220
- if x.is_infinite() {
1221
- return Err(math_domain_error());
1222
- }
1223
- if y.is_infinite() {
1224
- return Ok(Value::Float(x));
1225
- }
1226
-
1227
- Ok(Value::Float(libm::remainder(x, y)))
1228
- }
1229
-
1230
- /// `math.modf(x)` — returns the fractional and integer parts of x as a tuple.
1231
- ///
1232
- /// Both values carry the sign of x. Returns `(fractional, integer)`.
1233
- fn math_modf(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1234
- let value = args.get_one_arg("math.modf", heap)?;
1235
- defer_drop!(value, heap);
1236
-
1237
- let f = value_to_float(value, heap)?;
1238
- let (fractional, integer) = libm::modf(f);
1239
- let tuple = allocate_tuple(smallvec![Value::Float(fractional), Value::Float(integer)], heap)?;
1240
- Ok(tuple)
1241
- }
1242
-
1243
- /// `math.frexp(x)` — returns (mantissa, exponent) such that `x == mantissa * 2**exponent`.
1244
- ///
1245
- /// The mantissa is always in the range [0.5, 1.0) or zero.
1246
- /// Returns a tuple `(float, int)`.
1247
- fn math_frexp(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1248
- let value = args.get_one_arg("math.frexp", heap)?;
1249
- defer_drop!(value, heap);
1250
-
1251
- let f = value_to_float(value, heap)?;
1252
- let (m, exp) = libm::frexp(f);
1253
- let tuple = allocate_tuple(smallvec![Value::Float(m), Value::Int(i64::from(exp))], heap)?;
1254
- Ok(tuple)
1255
- }
1256
-
1257
- /// `math.ldexp(x, i)` — returns `x * 2**i`, the inverse of `frexp`.
1258
- ///
1259
- /// Clamps the exponent to `i32` range before calling `libm::ldexp`, which is safe
1260
- /// because IEEE 754 double exponents only span -1074 to +1023 — any `i64` outside
1261
- /// `i32` range would trivially overflow or underflow anyway.
1262
- fn math_ldexp(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1263
- let (x_val, i_val) = args.get_two_args("math.ldexp", heap)?;
1264
- defer_drop!(x_val, heap);
1265
- defer_drop!(i_val, heap);
1266
-
1267
- let x = value_to_float(x_val, heap)?;
1268
- let i = value_to_int(i_val, heap)?;
1269
-
1270
- // Special cases: inf/nan/zero pass through regardless of exponent
1271
- if x.is_nan() || x.is_infinite() || x == 0.0 {
1272
- return Ok(Value::Float(x));
1273
- }
1274
-
1275
- // Clamp i64 to i32 range — exponents beyond ±2 billion trivially overflow/underflow
1276
- #[expect(clippy::cast_possible_truncation, reason = "clamped to i32 range first")]
1277
- let exp = i.clamp(i64::from(i32::MIN), i64::from(i32::MAX)) as i32;
1278
- let result = libm::ldexp(x, exp);
1279
-
1280
- // If the result overflowed to infinity, CPython raises OverflowError
1281
- if result.is_infinite() {
1282
- return Err(math_range_error());
1283
- }
1284
-
1285
- Ok(Value::Float(result))
1286
- }
1287
-
1288
- // ==========================
1289
- // Special functions
1290
- // ==========================
1291
-
1292
- /// `math.gamma(x)` — returns the Gamma function at x.
1293
- ///
1294
- /// CPython 3.14 raises ValueError for non-positive integers:
1295
- /// "expected a noninteger or positive integer, got <x>".
1296
- fn math_gamma(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1297
- let value = args.get_one_arg("math.gamma", heap)?;
1298
- defer_drop!(value, heap);
1299
-
1300
- let f = value_to_float(value, heap)?;
1301
- // CPython also rejects -inf for gamma (but not lgamma, where lgamma(-inf) = inf)
1302
- if f == f64::NEG_INFINITY {
1303
- return Err(SimpleException::new_msg(
1304
- ExcType::ValueError,
1305
- format!("expected a noninteger or positive integer, got {f:?}"),
1306
- )
1307
- .into());
1308
- }
1309
- check_gamma_pole(f)?;
1310
-
1311
- let result = libm::tgamma(f);
1312
- check_range_error(result, f)?;
1313
- Ok(Value::Float(result))
1314
- }
1315
-
1316
- /// `math.lgamma(x)` — returns the natural log of the absolute value of Gamma(x).
1317
- fn math_lgamma(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1318
- let value = args.get_one_arg("math.lgamma", heap)?;
1319
- defer_drop!(value, heap);
1320
-
1321
- let f = value_to_float(value, heap)?;
1322
- check_gamma_pole(f)?;
1323
-
1324
- let result = libm::lgamma(f);
1325
- check_range_error(result, f)?;
1326
- Ok(Value::Float(result))
1327
- }
1328
-
1329
- /// `math.erf(x)` — returns the error function at x.
1330
- fn math_erf(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1331
- let value = args.get_one_arg("math.erf", heap)?;
1332
- defer_drop!(value, heap);
1333
-
1334
- let f = value_to_float(value, heap)?;
1335
- Ok(Value::Float(libm::erf(f)))
1336
- }
1337
-
1338
- /// `math.erfc(x)` — returns the complementary error function at x (1 - erf(x)).
1339
- ///
1340
- /// More accurate than `1 - erf(x)` for large x.
1341
- fn math_erfc(heap: &mut Heap<impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
1342
- let value = args.get_one_arg("math.erfc", heap)?;
1343
- defer_drop!(value, heap);
1344
-
1345
- let f = value_to_float(value, heap)?;
1346
- Ok(Value::Float(libm::erfc(f)))
1347
- }
1348
-
1349
- // ==========================
1350
- // Helper functions
1351
- // ==========================
1352
-
1353
- /// Converts a rounded float to an integer `Value`, checking for infinity/NaN.
1354
- ///
1355
- /// `rounded` is the already-rounded float value (e.g., from `floor()`, `ceil()`, `trunc()`).
1356
- /// `original` is the original input float, used only to determine the error type:
1357
- /// infinity produces `OverflowError`, NaN produces `ValueError`.
1358
- ///
1359
- /// For finite values outside the i64 range, promotes to `LongInt` to match CPython's
1360
- /// behavior of returning arbitrary-precision integers from `math.floor`/`ceil`/`trunc`.
1361
- fn float_to_int_checked(rounded: f64, original: f64, heap: &mut Heap<impl ResourceTracker>) -> RunResult<Value> {
1362
- if original.is_infinite() {
1363
- Err(SimpleException::new_msg(ExcType::OverflowError, "cannot convert float infinity to integer").into())
1364
- } else if original.is_nan() {
1365
- Err(SimpleException::new_msg(ExcType::ValueError, "cannot convert float NaN to integer").into())
1366
- } else if rounded >= i64::MIN as f64 && rounded < i64::MAX as f64 {
1367
- // Note: `i64::MAX as f64` rounds up to 2^63 (9223372036854775808.0), so we use
1368
- // strict less-than to exclude that value. `i64::MIN as f64` is exact (-2^63).
1369
- #[expect(
1370
- clippy::cast_possible_truncation,
1371
- reason = "intentional: value is within i64 range after bounds check"
1372
- )]
1373
- let result = rounded as i64;
1374
- Ok(Value::Int(result))
1375
- } else {
1376
- // Value exceeds i64 range — promote to LongInt.
1377
- // Format with no decimal places and parse as BigInt. This is correct because
1378
- // `rounded` is already an integer-valued float from floor/ceil/trunc.
1379
- let s = format!("{rounded:.0}");
1380
- let bi = s
1381
- .parse::<BigInt>()
1382
- .map_err(|_| SimpleException::new_msg(ExcType::ValueError, "float too large to convert to integer"))?;
1383
- Ok(LongInt::new(bi).into_value(heap)?)
1384
- }
1385
- }
1386
-
1387
- /// Converts a `Value` to `f64`, raising `TypeError` if the value is not numeric.
1388
- ///
1389
- /// Accepts `Float`, `Int`, and `Bool` values. For other types, raises a `TypeError`
1390
- /// with a message matching CPython's format: "must be real number, not <type>".
1391
- #[expect(
1392
- clippy::cast_precision_loss,
1393
- reason = "i64-to-f64 can lose precision for large integers (beyond 2^53), but this matches CPython's conversion semantics"
1394
- )]
1395
- fn value_to_float(value: &Value, heap: &Heap<impl ResourceTracker>) -> RunResult<f64> {
1396
- match value {
1397
- Value::Float(f) => Ok(*f),
1398
- Value::Int(n) => Ok(*n as f64),
1399
- Value::Bool(b) => Ok(if *b { 1.0 } else { 0.0 }),
1400
- _ => Err(ExcType::type_error(format!(
1401
- "must be real number, not {}",
1402
- value.py_type(heap)
1403
- ))),
1404
- }
1405
- }
1406
-
1407
- /// Converts a `Value` to `i64`, raising `TypeError` if the value is not an integer.
1408
- ///
1409
- /// Accepts `Int` and `Bool` values. For other types, raises a `TypeError`
1410
- /// with a message matching CPython's format.
1411
- fn value_to_int(value: &Value, heap: &Heap<impl ResourceTracker>) -> RunResult<i64> {
1412
- match value {
1413
- Value::Int(n) => Ok(*n),
1414
- Value::Bool(b) => Ok(i64::from(*b)),
1415
- _ => Err(ExcType::type_error(format!(
1416
- "'{}' object cannot be interpreted as an integer",
1417
- value.py_type(heap)
1418
- ))),
1419
- }
1420
- }
1421
-
1422
- /// Requires that a float is finite, raising ValueError if it's inf or nan.
1423
- ///
1424
- /// CPython 3.14 uses "expected a finite input, got inf" for trig functions.
1425
- fn require_finite(f: f64) -> RunResult<()> {
1426
- if f.is_infinite() {
1427
- Err(SimpleException::new_msg(ExcType::ValueError, format!("expected a finite input, got {f:?}")).into())
1428
- } else {
1429
- Ok(())
1430
- }
1431
- }
1432
-
1433
- /// Euclidean GCD algorithm for unsigned 64-bit integers.
1434
- fn gcd(mut a: u64, mut b: u64) -> u64 {
1435
- while b != 0 {
1436
- let t = b;
1437
- b = a % b;
1438
- a = t;
1439
- }
1440
- a
1441
- }
1442
-
1443
- /// Converts a `u64` result to a `Value`, promoting to `LongInt` if it exceeds `i64::MAX`.
1444
- ///
1445
- /// This is needed for operations like `gcd(i64::MIN, 0)` where the unsigned result
1446
- /// (`2^63`) doesn't fit in a signed `i64`.
1447
- fn u64_to_value(n: u64, heap: &mut Heap<impl ResourceTracker>) -> RunResult<Value> {
1448
- if let Ok(signed) = i64::try_from(n) {
1449
- Ok(Value::Int(signed))
1450
- } else {
1451
- Ok(LongInt::new(BigInt::from(n)).into_value(heap)?)
1452
- }
1453
- }