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