superacli 1.1.6 → 1.1.8

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