superacli 1.1.6 → 1.1.7

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