superacli 1.1.4 → 1.1.6

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 (961) hide show
  1. package/__tests__/adapter-schema.test.js +2 -0
  2. package/__tests__/config.test.js +62 -1
  3. package/__tests__/help-json.test.js +2 -0
  4. package/__tests__/mcp-adapter.test.js +14 -4
  5. package/__tests__/mcp-local.test.js +159 -0
  6. package/__tests__/mcp-stdio-jsonrpc.test.js +105 -0
  7. package/__tests__/monty-plugin.test.js +121 -0
  8. package/__tests__/plugin-browser-use-uninstall.test.js +23 -0
  9. package/__tests__/plugin-browser-use.test.js +77 -0
  10. package/__tests__/plugins-command.test.js +92 -1
  11. package/__tests__/plugins-learn.test.js +62 -0
  12. package/__tests__/plugins-registry.test.js +3 -1
  13. package/__tests__/resend-plugin.test.js +122 -0
  14. package/__tests__/skills.test.js +4 -0
  15. package/cli/adapter-schema.js +3 -2
  16. package/cli/adapters/mcp.js +22 -3
  17. package/cli/adapters/process.js +34 -7
  18. package/cli/config.js +27 -1
  19. package/cli/help-json.js +2 -2
  20. package/cli/mcp-diagnostics.js +152 -0
  21. package/cli/mcp-discovery.js +221 -0
  22. package/cli/mcp-local.js +267 -25
  23. package/cli/mcp-stdio-jsonrpc.js +246 -0
  24. package/cli/plugin-install-guidance.js +25 -0
  25. package/cli/plugins-command.js +86 -3
  26. package/cli/plugins-learn.js +177 -0
  27. package/cli/plugins-manager.js +3 -0
  28. package/cli/plugins-registry.js +2 -1
  29. package/cli/skills-mcp.js +102 -0
  30. package/cli/skills.js +6 -40
  31. package/cli/supercli.js +7 -2
  32. package/docs/initial/mcp-local-mode.md +35 -0
  33. package/docs/mcp-cheatsheet.md +324 -0
  34. package/docs/plugins.md +7 -0
  35. package/package.json +1 -1
  36. package/plugins/browser-use/plugin.json +23 -0
  37. package/plugins/browser-use/scripts/post-install.js +146 -0
  38. package/plugins/browser-use/scripts/post-uninstall.js +28 -0
  39. package/plugins/browser-use/skills/quickstart/SKILL.md +47 -0
  40. package/plugins/monty/README.md +49 -0
  41. package/plugins/monty/plugin.json +69 -0
  42. package/plugins/monty/scripts/post-install.js +73 -0
  43. package/plugins/monty/scripts/post-uninstall.js +23 -0
  44. package/plugins/monty/scripts/run-python.js +140 -0
  45. package/plugins/monty/scripts/setup-monty.js +27 -0
  46. package/plugins/plugins.json +29 -0
  47. package/plugins/resend/plugin.json +371 -0
  48. package/plugins/resend/scripts/post-install.js +59 -0
  49. package/plugins/resend/scripts/post-uninstall.js +23 -0
  50. package/plugins/resend/scripts/setup-resend.js +27 -0
  51. package/plugins/resend/skills/quickstart/SKILL.md +80 -0
  52. package/ref-monty/.cargo/config.toml +3 -0
  53. package/ref-monty/.claude/settings.json +60 -0
  54. package/ref-monty/.claude/skills/fastmod/SKILL.md +22 -0
  55. package/ref-monty/.claude/skills/python-playground/SKILL.md +47 -0
  56. package/ref-monty/.codecov.yml +12 -0
  57. package/ref-monty/.github/actions/build-pgo-wheel/action.yml +72 -0
  58. package/ref-monty/.github/workflows/ci.yml +776 -0
  59. package/ref-monty/.github/workflows/codspeed.yml +45 -0
  60. package/ref-monty/.github/workflows/init-npm-packages.yml +82 -0
  61. package/ref-monty/.pre-commit-config.yaml +47 -0
  62. package/ref-monty/.python-version +1 -0
  63. package/ref-monty/.rustfmt.toml +4 -0
  64. package/ref-monty/.zed/settings.json +11 -0
  65. package/ref-monty/CLAUDE.md +535 -0
  66. package/ref-monty/Cargo.lock +3798 -0
  67. package/ref-monty/Cargo.toml +87 -0
  68. package/ref-monty/LICENSE +21 -0
  69. package/ref-monty/Makefile +216 -0
  70. package/ref-monty/README.md +430 -0
  71. package/ref-monty/RELEASING.md +47 -0
  72. package/ref-monty/crates/fuzz/Cargo.toml +30 -0
  73. package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +37 -0
  74. package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +552 -0
  75. package/ref-monty/crates/monty/Cargo.toml +68 -0
  76. package/ref-monty/crates/monty/benches/main.rs +247 -0
  77. package/ref-monty/crates/monty/build.rs +10 -0
  78. package/ref-monty/crates/monty/src/args.rs +733 -0
  79. package/ref-monty/crates/monty/src/asyncio.rs +179 -0
  80. package/ref-monty/crates/monty/src/builtins/abs.rs +55 -0
  81. package/ref-monty/crates/monty/src/builtins/all.rs +30 -0
  82. package/ref-monty/crates/monty/src/builtins/any.rs +30 -0
  83. package/ref-monty/crates/monty/src/builtins/bin.rs +59 -0
  84. package/ref-monty/crates/monty/src/builtins/chr.rs +46 -0
  85. package/ref-monty/crates/monty/src/builtins/divmod.rs +164 -0
  86. package/ref-monty/crates/monty/src/builtins/enumerate.rs +52 -0
  87. package/ref-monty/crates/monty/src/builtins/filter.rs +67 -0
  88. package/ref-monty/crates/monty/src/builtins/getattr.rs +65 -0
  89. package/ref-monty/crates/monty/src/builtins/hash.rs +28 -0
  90. package/ref-monty/crates/monty/src/builtins/hex.rs +58 -0
  91. package/ref-monty/crates/monty/src/builtins/id.rs +24 -0
  92. package/ref-monty/crates/monty/src/builtins/isinstance.rs +68 -0
  93. package/ref-monty/crates/monty/src/builtins/len.rs +25 -0
  94. package/ref-monty/crates/monty/src/builtins/map.rs +98 -0
  95. package/ref-monty/crates/monty/src/builtins/min_max.rs +113 -0
  96. package/ref-monty/crates/monty/src/builtins/mod.rs +246 -0
  97. package/ref-monty/crates/monty/src/builtins/next.rs +21 -0
  98. package/ref-monty/crates/monty/src/builtins/oct.rs +59 -0
  99. package/ref-monty/crates/monty/src/builtins/ord.rs +67 -0
  100. package/ref-monty/crates/monty/src/builtins/pow.rs +365 -0
  101. package/ref-monty/crates/monty/src/builtins/print.rs +141 -0
  102. package/ref-monty/crates/monty/src/builtins/repr.rs +16 -0
  103. package/ref-monty/crates/monty/src/builtins/reversed.rs +28 -0
  104. package/ref-monty/crates/monty/src/builtins/round.rs +174 -0
  105. package/ref-monty/crates/monty/src/builtins/sorted.rs +151 -0
  106. package/ref-monty/crates/monty/src/builtins/sum.rs +66 -0
  107. package/ref-monty/crates/monty/src/builtins/type_.rs +16 -0
  108. package/ref-monty/crates/monty/src/builtins/zip.rs +77 -0
  109. package/ref-monty/crates/monty/src/bytecode/builder.rs +699 -0
  110. package/ref-monty/crates/monty/src/bytecode/code.rs +310 -0
  111. package/ref-monty/crates/monty/src/bytecode/compiler.rs +3206 -0
  112. package/ref-monty/crates/monty/src/bytecode/mod.rs +24 -0
  113. package/ref-monty/crates/monty/src/bytecode/op.rs +617 -0
  114. package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +1058 -0
  115. package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +63 -0
  116. package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +487 -0
  117. package/ref-monty/crates/monty/src/bytecode/vm/call.rs +767 -0
  118. package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +741 -0
  119. package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +147 -0
  120. package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +297 -0
  121. package/ref-monty/crates/monty/src/bytecode/vm/format.rs +132 -0
  122. package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +1958 -0
  123. package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +620 -0
  124. package/ref-monty/crates/monty/src/exception_private.rs +1513 -0
  125. package/ref-monty/crates/monty/src/exception_public.rs +346 -0
  126. package/ref-monty/crates/monty/src/expressions.rs +694 -0
  127. package/ref-monty/crates/monty/src/fstring.rs +854 -0
  128. package/ref-monty/crates/monty/src/function.rs +119 -0
  129. package/ref-monty/crates/monty/src/heap.rs +1073 -0
  130. package/ref-monty/crates/monty/src/heap_data.rs +985 -0
  131. package/ref-monty/crates/monty/src/heap_traits.rs +312 -0
  132. package/ref-monty/crates/monty/src/intern.rs +837 -0
  133. package/ref-monty/crates/monty/src/io.rs +106 -0
  134. package/ref-monty/crates/monty/src/lib.rs +52 -0
  135. package/ref-monty/crates/monty/src/modules/asyncio.rs +144 -0
  136. package/ref-monty/crates/monty/src/modules/math.rs +1453 -0
  137. package/ref-monty/crates/monty/src/modules/mod.rs +120 -0
  138. package/ref-monty/crates/monty/src/modules/os.rs +116 -0
  139. package/ref-monty/crates/monty/src/modules/pathlib.rs +33 -0
  140. package/ref-monty/crates/monty/src/modules/re.rs +606 -0
  141. package/ref-monty/crates/monty/src/modules/sys.rs +60 -0
  142. package/ref-monty/crates/monty/src/modules/typing.rs +70 -0
  143. package/ref-monty/crates/monty/src/namespace.rs +21 -0
  144. package/ref-monty/crates/monty/src/object.rs +1040 -0
  145. package/ref-monty/crates/monty/src/os.rs +215 -0
  146. package/ref-monty/crates/monty/src/parse.rs +1730 -0
  147. package/ref-monty/crates/monty/src/prepare.rs +3015 -0
  148. package/ref-monty/crates/monty/src/repl.rs +1109 -0
  149. package/ref-monty/crates/monty/src/resource.rs +559 -0
  150. package/ref-monty/crates/monty/src/run.rs +457 -0
  151. package/ref-monty/crates/monty/src/run_progress.rs +821 -0
  152. package/ref-monty/crates/monty/src/signature.rs +651 -0
  153. package/ref-monty/crates/monty/src/sorting.rs +100 -0
  154. package/ref-monty/crates/monty/src/types/bytes.rs +2356 -0
  155. package/ref-monty/crates/monty/src/types/dataclass.rs +345 -0
  156. package/ref-monty/crates/monty/src/types/dict.rs +879 -0
  157. package/ref-monty/crates/monty/src/types/dict_view.rs +619 -0
  158. package/ref-monty/crates/monty/src/types/iter.rs +799 -0
  159. package/ref-monty/crates/monty/src/types/list.rs +929 -0
  160. package/ref-monty/crates/monty/src/types/long_int.rs +211 -0
  161. package/ref-monty/crates/monty/src/types/mod.rs +48 -0
  162. package/ref-monty/crates/monty/src/types/module.rs +146 -0
  163. package/ref-monty/crates/monty/src/types/namedtuple.rs +261 -0
  164. package/ref-monty/crates/monty/src/types/path.rs +596 -0
  165. package/ref-monty/crates/monty/src/types/property.rs +35 -0
  166. package/ref-monty/crates/monty/src/types/py_trait.rs +322 -0
  167. package/ref-monty/crates/monty/src/types/range.rs +285 -0
  168. package/ref-monty/crates/monty/src/types/re_match.rs +522 -0
  169. package/ref-monty/crates/monty/src/types/re_pattern.rs +726 -0
  170. package/ref-monty/crates/monty/src/types/set.rs +1373 -0
  171. package/ref-monty/crates/monty/src/types/slice.rs +257 -0
  172. package/ref-monty/crates/monty/src/types/str.rs +2051 -0
  173. package/ref-monty/crates/monty/src/types/tuple.rs +376 -0
  174. package/ref-monty/crates/monty/src/types/type.rs +407 -0
  175. package/ref-monty/crates/monty/src/value.rs +2558 -0
  176. package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +3 -0
  177. package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +3 -0
  178. package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +3 -0
  179. package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +3 -0
  180. package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +3 -0
  181. package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +3 -0
  182. package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +3 -0
  183. package/ref-monty/crates/monty/test_cases/args__id_too_many.py +2 -0
  184. package/ref-monty/crates/monty/test_cases/args__len_no_args.py +2 -0
  185. package/ref-monty/crates/monty/test_cases/args__len_too_many.py +2 -0
  186. package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +9 -0
  187. package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +9 -0
  188. package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +3 -0
  189. package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +3 -0
  190. package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +3 -0
  191. package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +3 -0
  192. package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +2 -0
  193. package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +2 -0
  194. package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +2 -0
  195. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +2 -0
  196. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +2 -0
  197. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +2 -0
  198. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +9 -0
  199. package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +2 -0
  200. package/ref-monty/crates/monty/test_cases/assert__fail.py +2 -0
  201. package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +2 -0
  202. package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +3 -0
  203. package/ref-monty/crates/monty/test_cases/assert__ops.py +11 -0
  204. package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +47 -0
  205. package/ref-monty/crates/monty/test_cases/async__basic.py +10 -0
  206. package/ref-monty/crates/monty/test_cases/async__closure.py +14 -0
  207. package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +16 -0
  208. package/ref-monty/crates/monty/test_cases/async__exception.py +10 -0
  209. package/ref-monty/crates/monty/test_cases/async__ext_call.py +73 -0
  210. package/ref-monty/crates/monty/test_cases/async__gather_all.py +85 -0
  211. package/ref-monty/crates/monty/test_cases/async__nested_await.py +15 -0
  212. package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +37 -0
  213. package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +10 -0
  214. package/ref-monty/crates/monty/test_cases/async__not_imported.py +14 -0
  215. package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +27 -0
  216. package/ref-monty/crates/monty/test_cases/async__return_types.py +31 -0
  217. package/ref-monty/crates/monty/test_cases/async__sequential.py +16 -0
  218. package/ref-monty/crates/monty/test_cases/async__traceback.py +19 -0
  219. package/ref-monty/crates/monty/test_cases/async__with_args.py +14 -0
  220. package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +9 -0
  221. package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +9 -0
  222. package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +12 -0
  223. package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +10 -0
  224. package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +10 -0
  225. package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +68 -0
  226. package/ref-monty/crates/monty/test_cases/bool__ops.py +20 -0
  227. package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +2 -0
  228. package/ref-monty/crates/monty/test_cases/builtin__filter.py +62 -0
  229. package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +11 -0
  230. package/ref-monty/crates/monty/test_cases/builtin__getattr.py +84 -0
  231. package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +42 -0
  232. package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +66 -0
  233. package/ref-monty/crates/monty/test_cases/builtin__map.py +74 -0
  234. package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +11 -0
  235. package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +154 -0
  236. package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +148 -0
  237. package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +10 -0
  238. package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +9 -0
  239. package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +12 -0
  240. package/ref-monty/crates/monty/test_cases/builtin__repr.py +3 -0
  241. package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +73 -0
  242. package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +18 -0
  243. package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +10 -0
  244. package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +10 -0
  245. package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +10 -0
  246. package/ref-monty/crates/monty/test_cases/bytes__methods.py +394 -0
  247. package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +9 -0
  248. package/ref-monty/crates/monty/test_cases/bytes__ops.py +90 -0
  249. package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +10 -0
  250. package/ref-monty/crates/monty/test_cases/call_object.py +3 -0
  251. package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +79 -0
  252. package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +81 -0
  253. package/ref-monty/crates/monty/test_cases/closure__pep448.py +203 -0
  254. package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +13 -0
  255. package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +120 -0
  256. package/ref-monty/crates/monty/test_cases/comprehension__all.py +208 -0
  257. package/ref-monty/crates/monty/test_cases/comprehension__scope.py +7 -0
  258. package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +14 -0
  259. package/ref-monty/crates/monty/test_cases/dataclass__basic.py +238 -0
  260. package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +12 -0
  261. package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +12 -0
  262. package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +11 -0
  263. package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +3 -0
  264. package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +2 -0
  265. package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +3 -0
  266. package/ref-monty/crates/monty/test_cases/dict__methods.py +151 -0
  267. package/ref-monty/crates/monty/test_cases/dict__ops.py +133 -0
  268. package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +4 -0
  269. package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +9 -0
  270. package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +3 -0
  271. package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +2 -0
  272. package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +2 -0
  273. package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +2 -0
  274. package/ref-monty/crates/monty/test_cases/dict__views.py +165 -0
  275. package/ref-monty/crates/monty/test_cases/edge__all.py +26 -0
  276. package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +2 -0
  277. package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +2 -0
  278. package/ref-monty/crates/monty/test_cases/exc__args.py +16 -0
  279. package/ref-monty/crates/monty/test_cases/exc__str.py +15 -0
  280. package/ref-monty/crates/monty/test_cases/execute_ok__all.py +54 -0
  281. package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +2 -0
  282. package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +2 -0
  283. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +2 -0
  284. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +2 -0
  285. package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +2 -0
  286. package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +4 -0
  287. package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +2 -0
  288. package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +2 -0
  289. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +4 -0
  290. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +3 -0
  291. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +4 -0
  292. package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +22 -0
  293. package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +17 -0
  294. package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +7 -0
  295. package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +34 -0
  296. package/ref-monty/crates/monty/test_cases/ext_call__basic.py +99 -0
  297. package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +37 -0
  298. package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +17 -0
  299. package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +16 -0
  300. package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +26 -0
  301. package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +18 -0
  302. package/ref-monty/crates/monty/test_cases/ext_call__elif.py +171 -0
  303. package/ref-monty/crates/monty/test_cases/ext_call__exc.py +4 -0
  304. package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +39 -0
  305. package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +17 -0
  306. package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +31 -0
  307. package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +171 -0
  308. package/ref-monty/crates/monty/test_cases/ext_call__for.py +114 -0
  309. package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +12 -0
  310. package/ref-monty/crates/monty/test_cases/ext_call__if.py +135 -0
  311. package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +37 -0
  312. package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +14 -0
  313. package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +40 -0
  314. package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +7 -0
  315. package/ref-monty/crates/monty/test_cases/ext_call__literals.py +17 -0
  316. package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +32 -0
  317. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +69 -0
  318. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +4 -0
  319. package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +14 -0
  320. package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +19 -0
  321. package/ref-monty/crates/monty/test_cases/ext_call__return.py +28 -0
  322. package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +25 -0
  323. package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +7 -0
  324. package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +28 -0
  325. package/ref-monty/crates/monty/test_cases/ext_call__try.py +280 -0
  326. package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +10 -0
  327. package/ref-monty/crates/monty/test_cases/ext_call__unary.py +13 -0
  328. package/ref-monty/crates/monty/test_cases/frozenset__ops.py +178 -0
  329. package/ref-monty/crates/monty/test_cases/fstring__all.py +236 -0
  330. package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +3 -0
  331. package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +3 -0
  332. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +3 -0
  333. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +3 -0
  334. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +4 -0
  335. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +4 -0
  336. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +4 -0
  337. package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +3 -0
  338. package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +6 -0
  339. package/ref-monty/crates/monty/test_cases/function__call_unpack.py +42 -0
  340. package/ref-monty/crates/monty/test_cases/function__defaults.py +117 -0
  341. package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +7 -0
  342. package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +7 -0
  343. package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +9 -0
  344. package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +7 -0
  345. package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +7 -0
  346. package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +9 -0
  347. package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +7 -0
  348. package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +7 -0
  349. package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +7 -0
  350. package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +7 -0
  351. package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +7 -0
  352. package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +7 -0
  353. package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +7 -0
  354. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +7 -0
  355. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +9 -0
  356. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +13 -0
  357. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +7 -0
  358. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +6 -0
  359. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +8 -0
  360. package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +6 -0
  361. package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +6 -0
  362. package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +6 -0
  363. package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +173 -0
  364. package/ref-monty/crates/monty/test_cases/function__ops.py +294 -0
  365. package/ref-monty/crates/monty/test_cases/function__return_none.py +42 -0
  366. package/ref-monty/crates/monty/test_cases/function__signatures.py +47 -0
  367. package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +6 -0
  368. package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +6 -0
  369. package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +6 -0
  370. package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +6 -0
  371. package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +6 -0
  372. package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +6 -0
  373. package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +7 -0
  374. package/ref-monty/crates/monty/test_cases/global__ops.py +163 -0
  375. package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +2 -0
  376. package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +2 -0
  377. package/ref-monty/crates/monty/test_cases/hash__ops.py +153 -0
  378. package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +3 -0
  379. package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +5 -0
  380. package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +3 -0
  381. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +10 -0
  382. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +6 -0
  383. package/ref-monty/crates/monty/test_cases/id__ops.py +97 -0
  384. package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +3 -0
  385. package/ref-monty/crates/monty/test_cases/if__elif_else.py +207 -0
  386. package/ref-monty/crates/monty/test_cases/if__raise_elif.py +11 -0
  387. package/ref-monty/crates/monty/test_cases/if__raise_else.py +13 -0
  388. package/ref-monty/crates/monty/test_cases/if__raise_if.py +9 -0
  389. package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +18 -0
  390. package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +16 -0
  391. package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +55 -0
  392. package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +9 -0
  393. package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +9 -0
  394. package/ref-monty/crates/monty/test_cases/import__local_scope.py +68 -0
  395. package/ref-monty/crates/monty/test_cases/import__os.py +25 -0
  396. package/ref-monty/crates/monty/test_cases/import__relative_error.py +9 -0
  397. package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +9 -0
  398. package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +14 -0
  399. package/ref-monty/crates/monty/test_cases/import__star_error.py +11 -0
  400. package/ref-monty/crates/monty/test_cases/import__sys.py +47 -0
  401. package/ref-monty/crates/monty/test_cases/import__sys_monty.py +28 -0
  402. package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +37 -0
  403. package/ref-monty/crates/monty/test_cases/import__typing.py +25 -0
  404. package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +4 -0
  405. package/ref-monty/crates/monty/test_cases/int__bigint.py +467 -0
  406. package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +260 -0
  407. package/ref-monty/crates/monty/test_cases/int__ops.py +219 -0
  408. package/ref-monty/crates/monty/test_cases/int__overflow_division.py +84 -0
  409. package/ref-monty/crates/monty/test_cases/is_variant__all.py +36 -0
  410. package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +2 -0
  411. package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +2 -0
  412. package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +4 -0
  413. package/ref-monty/crates/monty/test_cases/iter__for.py +243 -0
  414. package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +66 -0
  415. package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +20 -0
  416. package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +7 -0
  417. package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +3 -0
  418. package/ref-monty/crates/monty/test_cases/lambda__all.py +145 -0
  419. package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +7 -0
  420. package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +3 -0
  421. package/ref-monty/crates/monty/test_cases/list__index_not_found.py +9 -0
  422. package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +10 -0
  423. package/ref-monty/crates/monty/test_cases/list__ops.py +473 -0
  424. package/ref-monty/crates/monty/test_cases/list__pop_empty.py +9 -0
  425. package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +9 -0
  426. package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +9 -0
  427. package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +9 -0
  428. package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +13 -0
  429. package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +13 -0
  430. package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +10 -0
  431. package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +10 -0
  432. package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +2 -0
  433. package/ref-monty/crates/monty/test_cases/longint__index_error.py +3 -0
  434. package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +3 -0
  435. package/ref-monty/crates/monty/test_cases/loop__break_continue.py +113 -0
  436. package/ref-monty/crates/monty/test_cases/loop__break_finally.py +69 -0
  437. package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +13 -0
  438. package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +11 -0
  439. package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +55 -0
  440. package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +9 -0
  441. package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +81 -0
  442. package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +13 -0
  443. package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +11 -0
  444. package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +60 -0
  445. package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +9 -0
  446. package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +11 -0
  447. package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +11 -0
  448. package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +11 -0
  449. package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +11 -0
  450. package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +11 -0
  451. package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +11 -0
  452. package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +11 -0
  453. package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +11 -0
  454. package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +11 -0
  455. package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +11 -0
  456. package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +11 -0
  457. package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +11 -0
  458. package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +11 -0
  459. package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +11 -0
  460. package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +11 -0
  461. package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +11 -0
  462. package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +11 -0
  463. package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +11 -0
  464. package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +11 -0
  465. package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +11 -0
  466. package/ref-monty/crates/monty/test_cases/math__module.py +1432 -0
  467. package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +11 -0
  468. package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +11 -0
  469. package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +11 -0
  470. package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +11 -0
  471. package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +11 -0
  472. package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +259 -0
  473. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +19 -0
  474. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +12 -0
  475. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +9 -0
  476. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +9 -0
  477. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +16 -0
  478. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +9 -0
  479. package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +10 -0
  480. package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +11 -0
  481. package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +34 -0
  482. package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +3 -0
  483. package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +353 -0
  484. package/ref-monty/crates/monty/test_cases/os__environ.py +40 -0
  485. package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +5 -0
  486. package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +5 -0
  487. package/ref-monty/crates/monty/test_cases/parse_error__complex.py +3 -0
  488. package/ref-monty/crates/monty/test_cases/pathlib__import.py +11 -0
  489. package/ref-monty/crates/monty/test_cases/pathlib__os.py +136 -0
  490. package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +12 -0
  491. package/ref-monty/crates/monty/test_cases/pathlib__pure.py +81 -0
  492. package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +5 -0
  493. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +6 -0
  494. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +5 -0
  495. package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +6 -0
  496. package/ref-monty/crates/monty/test_cases/range__error_no_args.py +2 -0
  497. package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +2 -0
  498. package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +2 -0
  499. package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +10 -0
  500. package/ref-monty/crates/monty/test_cases/range__ops.py +236 -0
  501. package/ref-monty/crates/monty/test_cases/re__basic.py +756 -0
  502. package/ref-monty/crates/monty/test_cases/re__grouping.py +241 -0
  503. package/ref-monty/crates/monty/test_cases/re__match.py +148 -0
  504. package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +26 -0
  505. package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +23 -0
  506. package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +46 -0
  507. package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +12 -0
  508. package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +13 -0
  509. package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +18 -0
  510. package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +12 -0
  511. package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +5 -0
  512. package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +5 -0
  513. package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +14 -0
  514. package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +6 -0
  515. package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +16 -0
  516. package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +18 -0
  517. package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +25 -0
  518. package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +4 -0
  519. package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +27 -0
  520. package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +6 -0
  521. package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +5 -0
  522. package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +5 -0
  523. package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +5 -0
  524. package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +5 -0
  525. package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +4 -0
  526. package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +37 -0
  527. package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +34 -0
  528. package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +31 -0
  529. package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +4 -0
  530. package/ref-monty/crates/monty/test_cases/refcount__single_list.py +3 -0
  531. package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +24 -0
  532. package/ref-monty/crates/monty/test_cases/set__ops.py +191 -0
  533. package/ref-monty/crates/monty/test_cases/set__review_bugs.py +35 -0
  534. package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +2 -0
  535. package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +2 -0
  536. package/ref-monty/crates/monty/test_cases/slice__kwargs.py +9 -0
  537. package/ref-monty/crates/monty/test_cases/slice__no_args.py +9 -0
  538. package/ref-monty/crates/monty/test_cases/slice__ops.py +149 -0
  539. package/ref-monty/crates/monty/test_cases/slice__step_zero.py +9 -0
  540. package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +9 -0
  541. package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +9 -0
  542. package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +9 -0
  543. package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +9 -0
  544. package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +9 -0
  545. package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +10 -0
  546. package/ref-monty/crates/monty/test_cases/str__index_not_found.py +9 -0
  547. package/ref-monty/crates/monty/test_cases/str__join_no_args.py +9 -0
  548. package/ref-monty/crates/monty/test_cases/str__join_non_string.py +9 -0
  549. package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +9 -0
  550. package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +9 -0
  551. package/ref-monty/crates/monty/test_cases/str__methods.py +327 -0
  552. package/ref-monty/crates/monty/test_cases/str__ops.py +162 -0
  553. package/ref-monty/crates/monty/test_cases/str__partition_empty.py +9 -0
  554. package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +9 -0
  555. package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +9 -0
  556. package/ref-monty/crates/monty/test_cases/sys__types.py +7 -0
  557. package/ref-monty/crates/monty/test_cases/traceback__division_error.py +30 -0
  558. package/ref-monty/crates/monty/test_cases/traceback__index_error.py +17 -0
  559. package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +10 -0
  560. package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +29 -0
  561. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +10 -0
  562. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +24 -0
  563. package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +9 -0
  564. package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +23 -0
  565. package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +11 -0
  566. package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +16 -0
  567. package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +16 -0
  568. package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +16 -0
  569. package/ref-monty/crates/monty/test_cases/try_except__all.py +472 -0
  570. package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +2 -0
  571. package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +5 -0
  572. package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +3 -0
  573. package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +9 -0
  574. package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +10 -0
  575. package/ref-monty/crates/monty/test_cases/tuple__methods.py +19 -0
  576. package/ref-monty/crates/monty/test_cases/tuple__ops.py +133 -0
  577. package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +2 -0
  578. package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +9 -0
  579. package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +2 -0
  580. package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +9 -0
  581. package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +11 -0
  582. package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +2 -0
  583. package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +9 -0
  584. package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +9 -0
  585. package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +9 -0
  586. package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +2 -0
  587. package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +2 -0
  588. package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +9 -0
  589. package/ref-monty/crates/monty/test_cases/type__ops.py +200 -0
  590. package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +3 -0
  591. package/ref-monty/crates/monty/test_cases/type__shadow_int.py +9 -0
  592. package/ref-monty/crates/monty/test_cases/type__shadow_len.py +3 -0
  593. package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +2 -0
  594. package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +2 -0
  595. package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +2 -0
  596. package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +2 -0
  597. package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +3 -0
  598. package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +2 -0
  599. package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +2 -0
  600. package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +2 -0
  601. package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +2 -0
  602. package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +2 -0
  603. package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +6 -0
  604. package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +2 -0
  605. package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +3 -0
  606. package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +3 -0
  607. package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +4 -0
  608. package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +3 -0
  609. package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +4 -0
  610. package/ref-monty/crates/monty/test_cases/typing__types.py +24 -0
  611. package/ref-monty/crates/monty/test_cases/unpack__nested.py +48 -0
  612. package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +9 -0
  613. package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +9 -0
  614. package/ref-monty/crates/monty/test_cases/unpack__ops.py +153 -0
  615. package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +9 -0
  616. package/ref-monty/crates/monty/test_cases/unpack__too_many.py +9 -0
  617. package/ref-monty/crates/monty/test_cases/version__cpython.py +4 -0
  618. package/ref-monty/crates/monty/test_cases/walrus__all.py +178 -0
  619. package/ref-monty/crates/monty/test_cases/while__all.py +206 -0
  620. package/ref-monty/crates/monty/tests/asyncio.rs +764 -0
  621. package/ref-monty/crates/monty/tests/binary_serde.rs +185 -0
  622. package/ref-monty/crates/monty/tests/bytecode_limits.rs +248 -0
  623. package/ref-monty/crates/monty/tests/datatest_runner.rs +2029 -0
  624. package/ref-monty/crates/monty/tests/inputs.rs +420 -0
  625. package/ref-monty/crates/monty/tests/json_serde.rs +250 -0
  626. package/ref-monty/crates/monty/tests/main.rs +71 -0
  627. package/ref-monty/crates/monty/tests/math_module.rs +114 -0
  628. package/ref-monty/crates/monty/tests/name_lookup.rs +482 -0
  629. package/ref-monty/crates/monty/tests/os_tests.rs +459 -0
  630. package/ref-monty/crates/monty/tests/parse_errors.rs +441 -0
  631. package/ref-monty/crates/monty/tests/print_writer.rs +238 -0
  632. package/ref-monty/crates/monty/tests/py_object.rs +121 -0
  633. package/ref-monty/crates/monty/tests/regex.rs +90 -0
  634. package/ref-monty/crates/monty/tests/repl.rs +344 -0
  635. package/ref-monty/crates/monty/tests/resource_limits.rs +1826 -0
  636. package/ref-monty/crates/monty/tests/try_from.rs +167 -0
  637. package/ref-monty/crates/monty-cli/Cargo.toml +25 -0
  638. package/ref-monty/crates/monty-cli/src/main.rs +541 -0
  639. package/ref-monty/crates/monty-js/.cargo/config.toml +2 -0
  640. package/ref-monty/crates/monty-js/.prettierignore +8 -0
  641. package/ref-monty/crates/monty-js/Cargo.toml +32 -0
  642. package/ref-monty/crates/monty-js/README.md +207 -0
  643. package/ref-monty/crates/monty-js/__test__/async.spec.ts +350 -0
  644. package/ref-monty/crates/monty-js/__test__/basic.spec.ts +114 -0
  645. package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +427 -0
  646. package/ref-monty/crates/monty-js/__test__/external.spec.ts +354 -0
  647. package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +143 -0
  648. package/ref-monty/crates/monty-js/__test__/limits.spec.ts +162 -0
  649. package/ref-monty/crates/monty-js/__test__/package.json +3 -0
  650. package/ref-monty/crates/monty-js/__test__/print.spec.ts +229 -0
  651. package/ref-monty/crates/monty-js/__test__/repl.spec.ts +34 -0
  652. package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +205 -0
  653. package/ref-monty/crates/monty-js/__test__/start.spec.ts +443 -0
  654. package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +147 -0
  655. package/ref-monty/crates/monty-js/__test__/types.spec.ts +319 -0
  656. package/ref-monty/crates/monty-js/build.rs +61 -0
  657. package/ref-monty/crates/monty-js/index-header.d.ts +3 -0
  658. package/ref-monty/crates/monty-js/package-lock.json +4694 -0
  659. package/ref-monty/crates/monty-js/package.json +100 -0
  660. package/ref-monty/crates/monty-js/scripts/smoke-test.sh +69 -0
  661. package/ref-monty/crates/monty-js/smoke-test/package.json +17 -0
  662. package/ref-monty/crates/monty-js/smoke-test/test.ts +171 -0
  663. package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +11 -0
  664. package/ref-monty/crates/monty-js/src/convert.rs +648 -0
  665. package/ref-monty/crates/monty-js/src/exceptions.rs +293 -0
  666. package/ref-monty/crates/monty-js/src/lib.rs +41 -0
  667. package/ref-monty/crates/monty-js/src/limits.rs +53 -0
  668. package/ref-monty/crates/monty-js/src/monty_cls.rs +1407 -0
  669. package/ref-monty/crates/monty-js/tsconfig.json +17 -0
  670. package/ref-monty/crates/monty-js/wrapper.ts +701 -0
  671. package/ref-monty/crates/monty-python/Cargo.toml +38 -0
  672. package/ref-monty/crates/monty-python/README.md +134 -0
  673. package/ref-monty/crates/monty-python/build.rs +4 -0
  674. package/ref-monty/crates/monty-python/example.py +40 -0
  675. package/ref-monty/crates/monty-python/exercise.py +46 -0
  676. package/ref-monty/crates/monty-python/pyproject.toml +57 -0
  677. package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +281 -0
  678. package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +677 -0
  679. package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +933 -0
  680. package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
  681. package/ref-monty/crates/monty-python/src/convert.rs +273 -0
  682. package/ref-monty/crates/monty-python/src/dataclass.rs +461 -0
  683. package/ref-monty/crates/monty-python/src/exceptions.rs +557 -0
  684. package/ref-monty/crates/monty-python/src/external.rs +165 -0
  685. package/ref-monty/crates/monty-python/src/lib.rs +77 -0
  686. package/ref-monty/crates/monty-python/src/limits.rs +142 -0
  687. package/ref-monty/crates/monty-python/src/monty_cls.rs +1650 -0
  688. package/ref-monty/crates/monty-python/src/repl.rs +470 -0
  689. package/ref-monty/crates/monty-python/src/serialization.rs +761 -0
  690. package/ref-monty/crates/monty-python/tests/test_async.py +1201 -0
  691. package/ref-monty/crates/monty-python/tests/test_basic.py +66 -0
  692. package/ref-monty/crates/monty-python/tests/test_dataclasses.py +971 -0
  693. package/ref-monty/crates/monty-python/tests/test_exceptions.py +361 -0
  694. package/ref-monty/crates/monty-python/tests/test_external.py +367 -0
  695. package/ref-monty/crates/monty-python/tests/test_inputs.py +126 -0
  696. package/ref-monty/crates/monty-python/tests/test_limits.py +257 -0
  697. package/ref-monty/crates/monty-python/tests/test_os_access.py +1286 -0
  698. package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +731 -0
  699. package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +483 -0
  700. package/ref-monty/crates/monty-python/tests/test_os_calls.py +819 -0
  701. package/ref-monty/crates/monty-python/tests/test_print.py +208 -0
  702. package/ref-monty/crates/monty-python/tests/test_re.py +170 -0
  703. package/ref-monty/crates/monty-python/tests/test_readme_examples.py +20 -0
  704. package/ref-monty/crates/monty-python/tests/test_repl.py +749 -0
  705. package/ref-monty/crates/monty-python/tests/test_serialize.py +284 -0
  706. package/ref-monty/crates/monty-python/tests/test_start.py +346 -0
  707. package/ref-monty/crates/monty-python/tests/test_threading.py +163 -0
  708. package/ref-monty/crates/monty-python/tests/test_type_check.py +344 -0
  709. package/ref-monty/crates/monty-python/tests/test_types.py +553 -0
  710. package/ref-monty/crates/monty-type-checking/Cargo.toml +32 -0
  711. package/ref-monty/crates/monty-type-checking/src/db.rs +116 -0
  712. package/ref-monty/crates/monty-type-checking/src/lib.rs +4 -0
  713. package/ref-monty/crates/monty-type-checking/src/type_check.rs +280 -0
  714. package/ref-monty/crates/monty-type-checking/tests/bad_types.py +109 -0
  715. package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +21 -0
  716. package/ref-monty/crates/monty-type-checking/tests/good_types.py +475 -0
  717. package/ref-monty/crates/monty-type-checking/tests/main.rs +205 -0
  718. package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +56 -0
  719. package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +41 -0
  720. package/ref-monty/crates/monty-typeshed/Cargo.toml +29 -0
  721. package/ref-monty/crates/monty-typeshed/README.md +11 -0
  722. package/ref-monty/crates/monty-typeshed/build.rs +101 -0
  723. package/ref-monty/crates/monty-typeshed/custom/README.md +1 -0
  724. package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +138 -0
  725. package/ref-monty/crates/monty-typeshed/custom/os.pyi +87 -0
  726. package/ref-monty/crates/monty-typeshed/custom/sys.pyi +33 -0
  727. package/ref-monty/crates/monty-typeshed/src/lib.rs +56 -0
  728. package/ref-monty/crates/monty-typeshed/update.py +321 -0
  729. package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +1 -0
  730. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +20 -0
  731. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +105 -0
  732. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +394 -0
  733. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +138 -0
  734. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +1434 -0
  735. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +527 -0
  736. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +2 -0
  737. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +502 -0
  738. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +376 -0
  739. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +149 -0
  740. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +87 -0
  741. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +395 -0
  742. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +8 -0
  743. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +337 -0
  744. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +33 -0
  745. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +741 -0
  746. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +1217 -0
  747. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +716 -0
  748. package/ref-monty/docs/usage-guide.md +117 -0
  749. package/ref-monty/examples/README.md +3 -0
  750. package/ref-monty/examples/expense_analysis/README.md +3 -0
  751. package/ref-monty/examples/expense_analysis/data.py +124 -0
  752. package/ref-monty/examples/expense_analysis/main.py +115 -0
  753. package/ref-monty/examples/sql_playground/README.md +20 -0
  754. package/ref-monty/examples/sql_playground/external_functions.py +129 -0
  755. package/ref-monty/examples/sql_playground/main.py +81 -0
  756. package/ref-monty/examples/sql_playground/sandbox_code.py +82 -0
  757. package/ref-monty/examples/sql_playground/type_stubs.pyi +14 -0
  758. package/ref-monty/examples/web_scraper/README.md +15 -0
  759. package/ref-monty/examples/web_scraper/browser.py +56 -0
  760. package/ref-monty/examples/web_scraper/example_code.py +59 -0
  761. package/ref-monty/examples/web_scraper/external_functions.py +324 -0
  762. package/ref-monty/examples/web_scraper/main.py +193 -0
  763. package/ref-monty/examples/web_scraper/sub_agent.py +79 -0
  764. package/ref-monty/monty-npm.md +235 -0
  765. package/ref-monty/pyproject.toml +162 -0
  766. package/ref-monty/scripts/check_imports.py +91 -0
  767. package/ref-monty/scripts/codecov_diff.py +412 -0
  768. package/ref-monty/scripts/complete_tests.py +146 -0
  769. package/ref-monty/scripts/flamegraph_to_text.py +208 -0
  770. package/ref-monty/scripts/iter_test_methods.py +540 -0
  771. package/ref-monty/scripts/run_traceback.py +180 -0
  772. package/ref-monty/scripts/startup_performance.py +130 -0
  773. package/ref-monty/uv.lock +1779 -0
  774. package/temp_resend_cli/repo/.github/scripts/pr-title-check.js +34 -0
  775. package/temp_resend_cli/repo/.github/workflows/ci.yml +67 -0
  776. package/temp_resend_cli/repo/.github/workflows/post-release.yml +51 -0
  777. package/temp_resend_cli/repo/.github/workflows/pr-title-check.yml +13 -0
  778. package/temp_resend_cli/repo/.github/workflows/release.yml +175 -0
  779. package/temp_resend_cli/repo/.github/workflows/test-install-unix.yml +34 -0
  780. package/temp_resend_cli/repo/.github/workflows/test-install-windows.yml +48 -0
  781. package/temp_resend_cli/repo/CHANGELOG.md +31 -0
  782. package/temp_resend_cli/repo/LICENSE +21 -0
  783. package/temp_resend_cli/repo/README.md +450 -0
  784. package/temp_resend_cli/repo/biome.json +36 -0
  785. package/temp_resend_cli/repo/install.ps1 +141 -0
  786. package/temp_resend_cli/repo/install.sh +301 -0
  787. package/temp_resend_cli/repo/package.json +61 -0
  788. package/temp_resend_cli/repo/pnpm-lock.yaml +2439 -0
  789. package/temp_resend_cli/repo/renovate.json +4 -0
  790. package/temp_resend_cli/repo/src/cli.ts +98 -0
  791. package/temp_resend_cli/repo/src/commands/api-keys/create.ts +114 -0
  792. package/temp_resend_cli/repo/src/commands/api-keys/delete.ts +47 -0
  793. package/temp_resend_cli/repo/src/commands/api-keys/index.ts +26 -0
  794. package/temp_resend_cli/repo/src/commands/api-keys/list.ts +35 -0
  795. package/temp_resend_cli/repo/src/commands/api-keys/utils.ts +8 -0
  796. package/temp_resend_cli/repo/src/commands/auth/index.ts +20 -0
  797. package/temp_resend_cli/repo/src/commands/auth/login.ts +234 -0
  798. package/temp_resend_cli/repo/src/commands/auth/logout.ts +105 -0
  799. package/temp_resend_cli/repo/src/commands/broadcasts/create.ts +196 -0
  800. package/temp_resend_cli/repo/src/commands/broadcasts/delete.ts +46 -0
  801. package/temp_resend_cli/repo/src/commands/broadcasts/get.ts +59 -0
  802. package/temp_resend_cli/repo/src/commands/broadcasts/index.ts +43 -0
  803. package/temp_resend_cli/repo/src/commands/broadcasts/list.ts +60 -0
  804. package/temp_resend_cli/repo/src/commands/broadcasts/send.ts +56 -0
  805. package/temp_resend_cli/repo/src/commands/broadcasts/update.ts +95 -0
  806. package/temp_resend_cli/repo/src/commands/broadcasts/utils.ts +35 -0
  807. package/temp_resend_cli/repo/src/commands/contact-properties/create.ts +118 -0
  808. package/temp_resend_cli/repo/src/commands/contact-properties/delete.ts +48 -0
  809. package/temp_resend_cli/repo/src/commands/contact-properties/get.ts +46 -0
  810. package/temp_resend_cli/repo/src/commands/contact-properties/index.ts +48 -0
  811. package/temp_resend_cli/repo/src/commands/contact-properties/list.ts +68 -0
  812. package/temp_resend_cli/repo/src/commands/contact-properties/update.ts +88 -0
  813. package/temp_resend_cli/repo/src/commands/contact-properties/utils.ts +17 -0
  814. package/temp_resend_cli/repo/src/commands/contacts/add-segment.ts +78 -0
  815. package/temp_resend_cli/repo/src/commands/contacts/create.ts +122 -0
  816. package/temp_resend_cli/repo/src/commands/contacts/delete.ts +49 -0
  817. package/temp_resend_cli/repo/src/commands/contacts/get.ts +53 -0
  818. package/temp_resend_cli/repo/src/commands/contacts/index.ts +58 -0
  819. package/temp_resend_cli/repo/src/commands/contacts/list.ts +57 -0
  820. package/temp_resend_cli/repo/src/commands/contacts/remove-segment.ts +48 -0
  821. package/temp_resend_cli/repo/src/commands/contacts/segments.ts +39 -0
  822. package/temp_resend_cli/repo/src/commands/contacts/topics.ts +45 -0
  823. package/temp_resend_cli/repo/src/commands/contacts/update-topics.ts +90 -0
  824. package/temp_resend_cli/repo/src/commands/contacts/update.ts +77 -0
  825. package/temp_resend_cli/repo/src/commands/contacts/utils.ts +119 -0
  826. package/temp_resend_cli/repo/src/commands/doctor.ts +216 -0
  827. package/temp_resend_cli/repo/src/commands/domains/create.ts +83 -0
  828. package/temp_resend_cli/repo/src/commands/domains/delete.ts +42 -0
  829. package/temp_resend_cli/repo/src/commands/domains/get.ts +47 -0
  830. package/temp_resend_cli/repo/src/commands/domains/index.ts +35 -0
  831. package/temp_resend_cli/repo/src/commands/domains/list.ts +53 -0
  832. package/temp_resend_cli/repo/src/commands/domains/update.ts +75 -0
  833. package/temp_resend_cli/repo/src/commands/domains/utils.ts +44 -0
  834. package/temp_resend_cli/repo/src/commands/domains/verify.ts +38 -0
  835. package/temp_resend_cli/repo/src/commands/emails/batch.ts +140 -0
  836. package/temp_resend_cli/repo/src/commands/emails/get.ts +44 -0
  837. package/temp_resend_cli/repo/src/commands/emails/index.ts +30 -0
  838. package/temp_resend_cli/repo/src/commands/emails/list.ts +84 -0
  839. package/temp_resend_cli/repo/src/commands/emails/receiving/attachment.ts +55 -0
  840. package/temp_resend_cli/repo/src/commands/emails/receiving/attachments.ts +68 -0
  841. package/temp_resend_cli/repo/src/commands/emails/receiving/get.ts +58 -0
  842. package/temp_resend_cli/repo/src/commands/emails/receiving/index.ts +28 -0
  843. package/temp_resend_cli/repo/src/commands/emails/receiving/list.ts +59 -0
  844. package/temp_resend_cli/repo/src/commands/emails/receiving/utils.ts +38 -0
  845. package/temp_resend_cli/repo/src/commands/emails/send.ts +189 -0
  846. package/temp_resend_cli/repo/src/commands/open.ts +27 -0
  847. package/temp_resend_cli/repo/src/commands/segments/create.ts +50 -0
  848. package/temp_resend_cli/repo/src/commands/segments/delete.ts +47 -0
  849. package/temp_resend_cli/repo/src/commands/segments/get.ts +38 -0
  850. package/temp_resend_cli/repo/src/commands/segments/index.ts +36 -0
  851. package/temp_resend_cli/repo/src/commands/segments/list.ts +58 -0
  852. package/temp_resend_cli/repo/src/commands/segments/utils.ts +7 -0
  853. package/temp_resend_cli/repo/src/commands/teams/index.ts +10 -0
  854. package/temp_resend_cli/repo/src/commands/teams/list.ts +35 -0
  855. package/temp_resend_cli/repo/src/commands/teams/remove.ts +86 -0
  856. package/temp_resend_cli/repo/src/commands/teams/switch.ts +76 -0
  857. package/temp_resend_cli/repo/src/commands/topics/create.ts +73 -0
  858. package/temp_resend_cli/repo/src/commands/topics/delete.ts +47 -0
  859. package/temp_resend_cli/repo/src/commands/topics/get.ts +42 -0
  860. package/temp_resend_cli/repo/src/commands/topics/index.ts +42 -0
  861. package/temp_resend_cli/repo/src/commands/topics/list.ts +34 -0
  862. package/temp_resend_cli/repo/src/commands/topics/update.ts +59 -0
  863. package/temp_resend_cli/repo/src/commands/topics/utils.ts +16 -0
  864. package/temp_resend_cli/repo/src/commands/webhooks/create.ts +128 -0
  865. package/temp_resend_cli/repo/src/commands/webhooks/delete.ts +49 -0
  866. package/temp_resend_cli/repo/src/commands/webhooks/get.ts +42 -0
  867. package/temp_resend_cli/repo/src/commands/webhooks/index.ts +42 -0
  868. package/temp_resend_cli/repo/src/commands/webhooks/list.ts +55 -0
  869. package/temp_resend_cli/repo/src/commands/webhooks/listen.ts +379 -0
  870. package/temp_resend_cli/repo/src/commands/webhooks/update.ts +83 -0
  871. package/temp_resend_cli/repo/src/commands/webhooks/utils.ts +36 -0
  872. package/temp_resend_cli/repo/src/commands/whoami.ts +71 -0
  873. package/temp_resend_cli/repo/src/lib/actions.ts +157 -0
  874. package/temp_resend_cli/repo/src/lib/client.ts +37 -0
  875. package/temp_resend_cli/repo/src/lib/config.ts +217 -0
  876. package/temp_resend_cli/repo/src/lib/files.ts +15 -0
  877. package/temp_resend_cli/repo/src/lib/help-text.ts +38 -0
  878. package/temp_resend_cli/repo/src/lib/output.ts +56 -0
  879. package/temp_resend_cli/repo/src/lib/pagination.ts +36 -0
  880. package/temp_resend_cli/repo/src/lib/prompts.ts +149 -0
  881. package/temp_resend_cli/repo/src/lib/spinner.ts +100 -0
  882. package/temp_resend_cli/repo/src/lib/table.ts +57 -0
  883. package/temp_resend_cli/repo/src/lib/tty.ts +28 -0
  884. package/temp_resend_cli/repo/src/lib/update-check.ts +169 -0
  885. package/temp_resend_cli/repo/src/lib/version.ts +4 -0
  886. package/temp_resend_cli/repo/tests/commands/api-keys/create.test.ts +196 -0
  887. package/temp_resend_cli/repo/tests/commands/api-keys/delete.test.ts +157 -0
  888. package/temp_resend_cli/repo/tests/commands/api-keys/list.test.ts +134 -0
  889. package/temp_resend_cli/repo/tests/commands/auth/login.test.ts +153 -0
  890. package/temp_resend_cli/repo/tests/commands/auth/logout.test.ts +153 -0
  891. package/temp_resend_cli/repo/tests/commands/broadcasts/create.test.ts +454 -0
  892. package/temp_resend_cli/repo/tests/commands/broadcasts/delete.test.ts +183 -0
  893. package/temp_resend_cli/repo/tests/commands/broadcasts/get.test.ts +147 -0
  894. package/temp_resend_cli/repo/tests/commands/broadcasts/list.test.ts +199 -0
  895. package/temp_resend_cli/repo/tests/commands/broadcasts/send.test.ts +162 -0
  896. package/temp_resend_cli/repo/tests/commands/broadcasts/update.test.ts +288 -0
  897. package/temp_resend_cli/repo/tests/commands/contact-properties/create.test.ts +251 -0
  898. package/temp_resend_cli/repo/tests/commands/contact-properties/delete.test.ts +184 -0
  899. package/temp_resend_cli/repo/tests/commands/contact-properties/get.test.ts +145 -0
  900. package/temp_resend_cli/repo/tests/commands/contact-properties/list.test.ts +181 -0
  901. package/temp_resend_cli/repo/tests/commands/contact-properties/update.test.ts +217 -0
  902. package/temp_resend_cli/repo/tests/commands/contacts/add-segment.test.ts +189 -0
  903. package/temp_resend_cli/repo/tests/commands/contacts/create.test.ts +271 -0
  904. package/temp_resend_cli/repo/tests/commands/contacts/delete.test.ts +193 -0
  905. package/temp_resend_cli/repo/tests/commands/contacts/get.test.ts +149 -0
  906. package/temp_resend_cli/repo/tests/commands/contacts/list.test.ts +176 -0
  907. package/temp_resend_cli/repo/tests/commands/contacts/remove-segment.test.ts +167 -0
  908. package/temp_resend_cli/repo/tests/commands/contacts/segments.test.ts +168 -0
  909. package/temp_resend_cli/repo/tests/commands/contacts/topics.test.ts +164 -0
  910. package/temp_resend_cli/repo/tests/commands/contacts/update-topics.test.ts +248 -0
  911. package/temp_resend_cli/repo/tests/commands/contacts/update.test.ts +206 -0
  912. package/temp_resend_cli/repo/tests/commands/doctor.test.ts +164 -0
  913. package/temp_resend_cli/repo/tests/commands/domains/create.test.ts +193 -0
  914. package/temp_resend_cli/repo/tests/commands/domains/delete.test.ts +157 -0
  915. package/temp_resend_cli/repo/tests/commands/domains/get.test.ts +138 -0
  916. package/temp_resend_cli/repo/tests/commands/domains/list.test.ts +165 -0
  917. package/temp_resend_cli/repo/tests/commands/domains/update.test.ts +224 -0
  918. package/temp_resend_cli/repo/tests/commands/domains/verify.test.ts +118 -0
  919. package/temp_resend_cli/repo/tests/commands/emails/batch.test.ts +324 -0
  920. package/temp_resend_cli/repo/tests/commands/emails/get.test.ts +132 -0
  921. package/temp_resend_cli/repo/tests/commands/emails/receiving/attachment.test.ts +141 -0
  922. package/temp_resend_cli/repo/tests/commands/emails/receiving/attachments.test.ts +169 -0
  923. package/temp_resend_cli/repo/tests/commands/emails/receiving/get.test.ts +141 -0
  924. package/temp_resend_cli/repo/tests/commands/emails/receiving/list.test.ts +182 -0
  925. package/temp_resend_cli/repo/tests/commands/emails/send.test.ts +312 -0
  926. package/temp_resend_cli/repo/tests/commands/segments/create.test.ts +164 -0
  927. package/temp_resend_cli/repo/tests/commands/segments/delete.test.ts +183 -0
  928. package/temp_resend_cli/repo/tests/commands/segments/get.test.ts +138 -0
  929. package/temp_resend_cli/repo/tests/commands/segments/list.test.ts +174 -0
  930. package/temp_resend_cli/repo/tests/commands/teams/list.test.ts +62 -0
  931. package/temp_resend_cli/repo/tests/commands/teams/remove.test.ts +110 -0
  932. package/temp_resend_cli/repo/tests/commands/teams/switch.test.ts +103 -0
  933. package/temp_resend_cli/repo/tests/commands/topics/create.test.ts +192 -0
  934. package/temp_resend_cli/repo/tests/commands/topics/delete.test.ts +157 -0
  935. package/temp_resend_cli/repo/tests/commands/topics/get.test.ts +126 -0
  936. package/temp_resend_cli/repo/tests/commands/topics/list.test.ts +125 -0
  937. package/temp_resend_cli/repo/tests/commands/topics/update.test.ts +178 -0
  938. package/temp_resend_cli/repo/tests/commands/webhooks/create.test.ts +225 -0
  939. package/temp_resend_cli/repo/tests/commands/webhooks/delete.test.ts +157 -0
  940. package/temp_resend_cli/repo/tests/commands/webhooks/get.test.ts +126 -0
  941. package/temp_resend_cli/repo/tests/commands/webhooks/list.test.ts +178 -0
  942. package/temp_resend_cli/repo/tests/commands/webhooks/update.test.ts +207 -0
  943. package/temp_resend_cli/repo/tests/commands/whoami.test.ts +98 -0
  944. package/temp_resend_cli/repo/tests/e2e/smoke.test.ts +93 -0
  945. package/temp_resend_cli/repo/tests/helpers.ts +86 -0
  946. package/temp_resend_cli/repo/tests/lib/client.test.ts +71 -0
  947. package/temp_resend_cli/repo/tests/lib/config.test.ts +451 -0
  948. package/temp_resend_cli/repo/tests/lib/files.test.ts +73 -0
  949. package/temp_resend_cli/repo/tests/lib/help-text.test.ts +97 -0
  950. package/temp_resend_cli/repo/tests/lib/output.test.ts +136 -0
  951. package/temp_resend_cli/repo/tests/lib/prompts.test.ts +185 -0
  952. package/temp_resend_cli/repo/tests/lib/spinner.test.ts +166 -0
  953. package/temp_resend_cli/repo/tests/lib/table.test.ts +63 -0
  954. package/temp_resend_cli/repo/tests/lib/tty.test.ts +89 -0
  955. package/temp_resend_cli/repo/tests/lib/update-check.test.ts +179 -0
  956. package/temp_resend_cli/repo/tsconfig.json +14 -0
  957. package/temp_resend_cli/repo/vitest.config.e2e.ts +8 -0
  958. package/temp_resend_cli/repo/vitest.config.ts +10 -0
  959. package/tests/test-mcp-browser-use-smoke.sh +28 -56
  960. package/tests/test-monty-smoke.sh +32 -0
  961. package/tests/test-resend-smoke.sh +36 -0
@@ -0,0 +1,985 @@
1
+ use std::{
2
+ borrow::Cow,
3
+ fmt::Write,
4
+ hash::{DefaultHasher, Hash, Hasher},
5
+ mem::discriminant,
6
+ };
7
+
8
+ use ahash::AHashSet;
9
+ use num_integer::Integer;
10
+
11
+ use crate::{
12
+ ExcType, ResourceError, ResourceTracker,
13
+ args::ArgValues,
14
+ asyncio::{Coroutine, GatherFuture, GatherItem},
15
+ bytecode::{CallResult, VM},
16
+ defer_drop,
17
+ exception_private::{RunResult, SimpleException},
18
+ heap::{Heap, HeapId},
19
+ intern::{FunctionId, Interns},
20
+ types::{
21
+ Bytes, Dataclass, Dict, DictItemsView, DictKeysView, DictValuesView, FrozenSet, List, LongInt, Module,
22
+ MontyIter, NamedTuple, Path, PyTrait, Range, ReMatch, RePattern, Set, Slice, Str, Tuple, Type,
23
+ },
24
+ value::{EitherStr, Value},
25
+ };
26
+
27
+ /// HeapData captures every runtime value that must live in the arena.
28
+ ///
29
+ /// Each variant wraps a type that implements `PyTrait`, providing
30
+ /// Python-compatible operations. The trait is manually implemented to dispatch
31
+ /// to the appropriate variant's implementation.
32
+ #[derive(Debug, serde::Serialize, serde::Deserialize)]
33
+ pub(crate) enum HeapData {
34
+ Str(Str),
35
+ Bytes(Bytes),
36
+ List(List),
37
+ Tuple(Tuple),
38
+ NamedTuple(NamedTuple),
39
+ Dict(Dict),
40
+ DictKeysView(DictKeysView),
41
+ DictItemsView(DictItemsView),
42
+ DictValuesView(DictValuesView),
43
+ Set(Set),
44
+ FrozenSet(FrozenSet),
45
+ Closure(Closure),
46
+ FunctionDefaults(FunctionDefaults),
47
+ /// A cell wrapping a single mutable value for closure support.
48
+ ///
49
+ /// Cells enable nonlocal variable access by providing a heap-allocated
50
+ /// container that can be shared between a function and its nested functions.
51
+ /// Both the outer function and inner function hold references to the same
52
+ /// cell, allowing modifications to propagate across scope boundaries.
53
+ Cell(CellValue),
54
+ /// A range object (e.g., `range(10)` or `range(1, 10, 2)`).
55
+ ///
56
+ /// Stored on the heap to keep `Value` enum small (16 bytes). Range objects
57
+ /// are immutable and hashable.
58
+ Range(Range),
59
+ /// A slice object (e.g., `slice(1, 10, 2)` or from `x[1:10:2]`).
60
+ ///
61
+ /// Stored on the heap to keep `Value` enum small. Slice objects represent
62
+ /// start:stop:step indices for sequence slicing operations.
63
+ Slice(Slice),
64
+ /// An exception instance (e.g., `ValueError('message')`).
65
+ ///
66
+ /// Stored on the heap to keep `Value` enum small (16 bytes). Exceptions
67
+ /// are created when exception types are called or when `raise` is executed.
68
+ Exception(SimpleException),
69
+ /// A dataclass instance with fields and method references.
70
+ ///
71
+ /// Contains a class name, a Dict of field name -> value mappings, and a set
72
+ /// of method names that trigger external function calls when invoked.
73
+ Dataclass(Dataclass),
74
+ /// An iterator for for-loop iteration and the `iter()` type constructor.
75
+ ///
76
+ /// Created by the `GetIter` opcode or `iter()` builtin, advanced by `ForIter`.
77
+ /// Stores iteration state for lists, tuples, strings, ranges, dicts, and sets.
78
+ Iter(MontyIter),
79
+ /// An arbitrary precision integer (LongInt).
80
+ ///
81
+ /// Stored on the heap to keep `Value` enum at 16 bytes. Python has one `int` type,
82
+ /// so LongInt is an implementation detail - we use `Value::Int(i64)` for performance
83
+ /// when values fit, and promote to LongInt on overflow. When LongInt results fit back
84
+ /// in i64, they are demoted back to `Value::Int` for performance.
85
+ LongInt(LongInt),
86
+ /// A Python module (e.g., `sys`, `typing`).
87
+ ///
88
+ /// Modules have a name and a dictionary of attributes. They are created by
89
+ /// import statements and can have refs to other heap values in their attributes.
90
+ Module(Module),
91
+ /// A coroutine object from an async function call.
92
+ ///
93
+ /// Contains pre-bound arguments and captured cells, ready to be awaited.
94
+ /// When awaited, a new frame is pushed using the stored namespace.
95
+ Coroutine(Coroutine),
96
+ /// A gather() result tracking multiple coroutines/tasks.
97
+ ///
98
+ /// Created by asyncio.gather() and spawns tasks when awaited.
99
+ GatherFuture(GatherFuture),
100
+ /// A filesystem path from `pathlib.Path`.
101
+ ///
102
+ /// Stored on the heap to provide Python-compatible path operations.
103
+ /// Pure methods (name, parent, etc.) are handled directly by the VM.
104
+ /// I/O methods (exists, read_text, etc.) yield external function calls.
105
+ Path(Path),
106
+ /// A compiled regex pattern from `re.compile()`.
107
+ ///
108
+ /// Contains the original pattern string, flags, and compiled regex engine.
109
+ /// Leaf type: no heap references, not GC-tracked.
110
+ RePattern(Box<RePattern>),
111
+ /// A regex match result from a successful regex operation.
112
+ ///
113
+ /// Contains the matched text, capture groups, positions, and input string.
114
+ /// Leaf type: no heap references, not GC-tracked.
115
+ ReMatch(ReMatch),
116
+ /// Reference to an external function whose name was not found in the intern table.
117
+ ///
118
+ /// Created when the host resolves a `NameLookup` to a callable whose name does not
119
+ /// match any interned string (e.g., the host returns a function with a different
120
+ /// `__name__` than the variable it was assigned to). When called, the VM yields
121
+ /// `FrameExit::ExternalCall` with an `EitherStr::Heap` containing this name.
122
+ ExtFunction(String),
123
+ }
124
+
125
+ impl HeapData {
126
+ /// Returns whether this heap data type can participate in reference cycles.
127
+ ///
128
+ /// Only container types that can hold references to other heap objects need to be
129
+ /// tracked for GC purposes. Leaf types like Str, Bytes, Range, and Exception cannot
130
+ /// form cycles and should not count toward the GC allocation threshold.
131
+ ///
132
+ /// This optimization allows programs that allocate many leaf objects (like strings)
133
+ /// to avoid triggering unnecessary GC cycles.
134
+ #[inline]
135
+ pub(crate) fn is_gc_tracked(&self) -> bool {
136
+ matches!(
137
+ self,
138
+ Self::List(_)
139
+ | Self::Tuple(_)
140
+ | Self::NamedTuple(_)
141
+ | Self::Dict(_)
142
+ | Self::DictKeysView(_)
143
+ | Self::DictItemsView(_)
144
+ | Self::DictValuesView(_)
145
+ | Self::Set(_)
146
+ | Self::FrozenSet(_)
147
+ | Self::Closure(_)
148
+ | Self::FunctionDefaults(_)
149
+ | Self::Cell(_)
150
+ | Self::Dataclass(_)
151
+ | Self::Iter(_)
152
+ | Self::Module(_)
153
+ | Self::Coroutine(_)
154
+ | Self::GatherFuture(_)
155
+ )
156
+ }
157
+
158
+ /// Returns whether this heap data currently contains any heap references (`Value::Ref`).
159
+ ///
160
+ /// Used during allocation to determine if this data could create reference cycles.
161
+ /// When true, `mark_potential_cycle()` should be called to enable GC.
162
+ ///
163
+ /// Note: This is separate from `is_gc_tracked()` - a container may be GC-tracked
164
+ /// (capable of holding refs) but not currently contain any refs.
165
+ #[inline]
166
+ pub(crate) fn has_refs(&self) -> bool {
167
+ match self {
168
+ Self::List(list) => list.contains_refs(),
169
+ Self::Tuple(tuple) => tuple.contains_refs(),
170
+ Self::NamedTuple(nt) => nt.contains_refs(),
171
+ Self::Dict(dict) => dict.has_refs(),
172
+ Self::DictKeysView(_) | Self::DictItemsView(_) | Self::DictValuesView(_) => true,
173
+ Self::Set(set) => set.has_refs(),
174
+ Self::FrozenSet(fset) => fset.has_refs(),
175
+ // Closures always have refs when they have captured cells (HeapIds)
176
+ Self::Closure(closure) => {
177
+ !closure.cells.is_empty() || closure.defaults.iter().any(|v| matches!(v, Value::Ref(_)))
178
+ }
179
+ Self::FunctionDefaults(fd) => fd.defaults.iter().any(|v| matches!(v, Value::Ref(_))),
180
+ Self::Cell(cell) => matches!(&cell.0, Value::Ref(_)),
181
+ Self::Dataclass(dc) => dc.has_refs(),
182
+ Self::Iter(iter) => iter.has_refs(),
183
+ Self::Module(m) => m.has_refs(),
184
+ // Coroutines have refs from namespace values (params, cell/free vars)
185
+ Self::Coroutine(coro) => coro.namespace.iter().any(|v| matches!(v, Value::Ref(_))),
186
+ // GatherFutures have refs from coroutine items and results
187
+ Self::GatherFuture(gather) => {
188
+ gather.items.iter().any(|item| matches!(item, GatherItem::Coroutine(_)))
189
+ || gather
190
+ .results
191
+ .iter()
192
+ .any(|r| r.as_ref().is_some_and(|v| matches!(v, Value::Ref(_))))
193
+ }
194
+ // Leaf types cannot have refs
195
+ _ => false,
196
+ }
197
+ }
198
+
199
+ /// Returns true if this heap data is a coroutine.
200
+ #[inline]
201
+ pub fn is_coroutine(&self) -> bool {
202
+ matches!(self, Self::Coroutine(_))
203
+ }
204
+
205
+ /// Re-cast this as `HeapDataMut` for mutation.
206
+ ///
207
+ /// This is an important part of the Heap invariants: we never allow `&mut HeapData`
208
+ /// outside of the heap module to prevent heap data changing type during execution.
209
+ pub(crate) fn to_mut(&mut self) -> HeapDataMut<'_> {
210
+ match self {
211
+ Self::Str(s) => HeapDataMut::Str(s),
212
+ Self::Bytes(b) => HeapDataMut::Bytes(b),
213
+ Self::List(l) => HeapDataMut::List(l),
214
+ Self::Tuple(t) => HeapDataMut::Tuple(t),
215
+ Self::NamedTuple(nt) => HeapDataMut::NamedTuple(nt),
216
+ Self::Dict(d) => HeapDataMut::Dict(d),
217
+ Self::DictKeysView(view) => HeapDataMut::DictKeysView(view),
218
+ Self::DictItemsView(view) => HeapDataMut::DictItemsView(view),
219
+ Self::DictValuesView(view) => HeapDataMut::DictValuesView(view),
220
+ Self::Set(s) => HeapDataMut::Set(s),
221
+ Self::FrozenSet(fs) => HeapDataMut::FrozenSet(fs),
222
+ Self::Closure(closure) => HeapDataMut::Closure(closure),
223
+ Self::FunctionDefaults(fd) => HeapDataMut::FunctionDefaults(fd),
224
+ Self::Cell(cell) => HeapDataMut::Cell(cell),
225
+ Self::Range(r) => HeapDataMut::Range(r),
226
+ Self::Slice(s) => HeapDataMut::Slice(s),
227
+ Self::Exception(e) => HeapDataMut::Exception(e),
228
+ Self::Dataclass(dc) => HeapDataMut::Dataclass(dc),
229
+ Self::Iter(iter) => HeapDataMut::Iter(iter),
230
+ Self::LongInt(li) => HeapDataMut::LongInt(li),
231
+ Self::Module(m) => HeapDataMut::Module(m),
232
+ Self::Coroutine(coro) => HeapDataMut::Coroutine(coro),
233
+ Self::GatherFuture(gather) => HeapDataMut::GatherFuture(gather),
234
+ Self::Path(p) => HeapDataMut::Path(p),
235
+ Self::ReMatch(m) => HeapDataMut::ReMatch(m),
236
+ Self::RePattern(p) => HeapDataMut::RePattern(p),
237
+ Self::ExtFunction(s) => HeapDataMut::ExtFunction(s),
238
+ }
239
+ }
240
+ }
241
+
242
+ /// Mutable reference to `HeapData` inner values
243
+ #[derive(Debug)]
244
+ pub(crate) enum HeapDataMut<'a> {
245
+ Str(&'a mut Str),
246
+ Bytes(&'a mut Bytes),
247
+ List(&'a mut List),
248
+ Tuple(&'a mut Tuple),
249
+ NamedTuple(&'a mut NamedTuple),
250
+ Dict(&'a mut Dict),
251
+ DictKeysView(&'a mut DictKeysView),
252
+ DictItemsView(&'a mut DictItemsView),
253
+ DictValuesView(&'a mut DictValuesView),
254
+ Set(&'a mut Set),
255
+ FrozenSet(&'a mut FrozenSet),
256
+ Closure(&'a mut Closure),
257
+ FunctionDefaults(&'a mut FunctionDefaults),
258
+ /// A cell wrapping a single mutable value for closure support.
259
+ ///
260
+ /// Cells enable nonlocal variable access by providing a heap-allocated
261
+ /// container that can be shared between a function and its nested functions.
262
+ /// Both the outer function and inner function hold references to the same
263
+ /// cell, allowing modifications to propagate across scope boundaries.
264
+ Cell(&'a mut CellValue),
265
+ /// A range object (e.g., `range(10)` or `range(1, 10, 2)`).
266
+ ///
267
+ /// Stored on the heap to keep `Value` enum small (16 bytes). Range objects
268
+ /// are immutable and hashable.
269
+ Range(&'a mut Range),
270
+ /// A slice object (e.g., `slice(1, 10, 2)` or from `x[1:10:2]`).
271
+ ///
272
+ /// Stored on the heap to keep `Value` enum small. Slice objects represent
273
+ /// start:stop:step indices for sequence slicing operations.
274
+ Slice(&'a mut Slice),
275
+ /// An exception instance (e.g., `ValueError('message')`).
276
+ ///
277
+ /// Stored on the heap to keep `Value` enum small (16 bytes). Exceptions
278
+ /// are created when exception types are called or when `raise` is executed.
279
+ Exception(&'a mut SimpleException),
280
+ /// A dataclass instance with fields and method references.
281
+ ///
282
+ /// Contains a class name, a Dict of field name -> value mappings, and a set
283
+ /// of method names that trigger external function calls when invoked.
284
+ Dataclass(&'a mut Dataclass),
285
+ /// An iterator for for-loop iteration and the `iter()` type constructor.
286
+ ///
287
+ /// Created by the `GetIter` opcode or `iter()` builtin, advanced by `ForIter`.
288
+ /// Stores iteration state for lists, tuples, strings, ranges, dicts, and sets.
289
+ Iter(&'a mut MontyIter),
290
+ /// An arbitrary precision integer (LongInt).
291
+ ///
292
+ /// Stored on the heap to keep `Value` enum at 16 bytes. Python has one `int` type,
293
+ /// so LongInt is an implementation detail - we use `Value::Int(i64)` for performance
294
+ /// when values fit, and promote to LongInt on overflow. When LongInt results fit back
295
+ /// in i64, they are demoted back to `Value::Int` for performance.
296
+ LongInt(&'a mut LongInt),
297
+ /// A Python module (e.g., `sys`, `typing`).
298
+ ///
299
+ /// Modules have a name and a dictionary of attributes. They are created by
300
+ /// import statements and can have refs to other heap values in their attributes.
301
+ Module(&'a mut Module),
302
+ /// A coroutine object from an async function call.
303
+ ///
304
+ /// Contains pre-bound arguments and captured cells, ready to be awaited.
305
+ /// When awaited, a new frame is pushed using the stored namespace.
306
+ Coroutine(&'a mut Coroutine),
307
+ /// A gather() result tracking multiple coroutines/tasks.
308
+ ///
309
+ /// Created by asyncio.gather() and spawns tasks when awaited.
310
+ GatherFuture(&'a mut GatherFuture),
311
+ /// A filesystem path from `pathlib.Path`.
312
+ ///
313
+ /// Stored on the heap to provide Python-compatible path operations.
314
+ /// Pure methods (name, parent, etc.) are handled directly by the VM.
315
+ /// I/O methods (exists, read_text, etc.) yield external function calls.
316
+ Path(&'a mut Path),
317
+ /// A regex match result from `re.match()`, `re.search()`, etc.
318
+ ///
319
+ /// Stores matched text, capture groups, and positions. All data is owned
320
+ /// (no heap references), so reference counting is trivial.
321
+ ReMatch(&'a mut ReMatch),
322
+ /// A compiled regex pattern from `re.compile()`.
323
+ ///
324
+ /// Wraps a compiled regex with the original pattern string and flags.
325
+ /// Custom serde serializes only the pattern and flags, recompiling on deserialize.
326
+ RePattern(&'a mut RePattern),
327
+ /// Reference to an external function where the name was not interned.
328
+ ///
329
+ /// Created when the host resolves a name lookup to a callable whose name
330
+ /// does not match any interned string (e.g., the host returns a function
331
+ /// with a different `__name__` than the variable it was assigned to).
332
+ ExtFunction(&'a mut String),
333
+ }
334
+
335
+ /// Thin wrapper around `Value` which is used in the `Cell` variant above.
336
+ ///
337
+ /// The inner value is the cell's mutable payload.
338
+ #[derive(Debug, serde::Serialize, serde::Deserialize)]
339
+ #[serde(transparent)]
340
+ #[repr(transparent)]
341
+ pub(crate) struct CellValue(pub(crate) Value);
342
+
343
+ impl std::ops::Deref for CellValue {
344
+ type Target = Value;
345
+
346
+ fn deref(&self) -> &Self::Target {
347
+ &self.0
348
+ }
349
+ }
350
+
351
+ /// A closure: a function that captures variables from enclosing scopes.
352
+ ///
353
+ /// Contains a reference to the function definition, a vector of captured cell HeapIds,
354
+ /// and evaluated default values (if any). When the closure is called, these cells are
355
+ /// passed to the RunFrame for variable access. When the closure is dropped, we must
356
+ /// decrement the ref count on each captured cell and each default value.
357
+ #[derive(Debug, serde::Serialize, serde::Deserialize)]
358
+ pub(crate) struct Closure {
359
+ /// The function definition being captured.
360
+ pub func_id: FunctionId,
361
+ /// Captured cells from enclosing scopes.
362
+ pub cells: Vec<HeapId>,
363
+ /// Evaluated default parameter values (if any).
364
+ pub defaults: Vec<Value>,
365
+ }
366
+
367
+ /// A function with evaluated default parameter values (non-closure).
368
+ ///
369
+ /// Contains a reference to the function definition and the evaluated default values.
370
+ /// When the function is called, defaults are cloned for missing optional parameters.
371
+ /// When dropped, we must decrement the ref count on each default value.
372
+ #[derive(Debug, serde::Serialize, serde::Deserialize)]
373
+ pub(crate) struct FunctionDefaults {
374
+ /// The function definition being captured.
375
+ pub func_id: FunctionId,
376
+ /// Evaluated default parameter values (if any).
377
+ pub defaults: Vec<Value>,
378
+ }
379
+
380
+ impl HeapDataMut<'_> {
381
+ /// Computes hash for immutable heap types that can be used as dict keys.
382
+ ///
383
+ /// Returns `Ok(Some(hash))` for immutable types (Str, Bytes, Tuple of hashables).
384
+ /// Returns `Ok(None)` for mutable types (List, Dict) which cannot be dict keys.
385
+ /// Returns `Err(ResourceError::Recursion)` if the recursion limit is exceeded
386
+ /// while hashing deeply nested containers (e.g., tuples of tuples).
387
+ ///
388
+ /// This is called lazily when the value is first used as a dict key,
389
+ /// avoiding unnecessary hash computation for values that are never used as keys.
390
+ pub fn compute_hash_if_immutable(
391
+ &self,
392
+ heap: &mut Heap<impl ResourceTracker>,
393
+ interns: &Interns,
394
+ ) -> Result<Option<u64>, ResourceError> {
395
+ match self {
396
+ // Hash just the actual string or bytes content for consistency with Value::InternString/InternBytes
397
+ // hence we don't include the discriminant
398
+ Self::Str(s) => {
399
+ let mut hasher = DefaultHasher::new();
400
+ s.as_str().hash(&mut hasher);
401
+ Ok(Some(hasher.finish()))
402
+ }
403
+ Self::Bytes(b) => {
404
+ let mut hasher = DefaultHasher::new();
405
+ b.as_slice().hash(&mut hasher);
406
+ Ok(Some(hasher.finish()))
407
+ }
408
+ Self::FrozenSet(fs) => {
409
+ // FrozenSet hash is XOR of element hashes (order-independent)
410
+ // Recursion depth is checked inside compute_hash
411
+ fs.compute_hash(heap, interns)
412
+ }
413
+ Self::Tuple(t) => {
414
+ let token = heap.incr_recursion_depth()?;
415
+ crate::defer_drop!(token, heap);
416
+ let mut hasher = DefaultHasher::new();
417
+ discriminant(self).hash(&mut hasher);
418
+ // Tuple is hashable only if all elements are hashable
419
+ for obj in t.as_slice() {
420
+ match obj.py_hash(heap, interns)? {
421
+ Some(h) => h.hash(&mut hasher),
422
+ None => return Ok(None),
423
+ }
424
+ }
425
+ Ok(Some(hasher.finish()))
426
+ }
427
+ Self::NamedTuple(nt) => {
428
+ let token = heap.incr_recursion_depth()?;
429
+ crate::defer_drop!(token, heap);
430
+ let mut hasher = DefaultHasher::new();
431
+ discriminant(self).hash(&mut hasher);
432
+ // Hash only by elements (not type_name) to match equality semantics
433
+ for obj in nt.as_vec() {
434
+ match obj.py_hash(heap, interns)? {
435
+ Some(h) => h.hash(&mut hasher),
436
+ None => return Ok(None),
437
+ }
438
+ }
439
+ Ok(Some(hasher.finish()))
440
+ }
441
+ Self::Closure(closure) => {
442
+ let mut hasher = DefaultHasher::new();
443
+ discriminant(self).hash(&mut hasher);
444
+ // TODO, this is NOT proper hashing, we should somehow hash the function properly
445
+ closure.func_id.hash(&mut hasher);
446
+ Ok(Some(hasher.finish()))
447
+ }
448
+ Self::FunctionDefaults(fd) => {
449
+ let mut hasher = DefaultHasher::new();
450
+ discriminant(self).hash(&mut hasher);
451
+ // TODO, this is NOT proper hashing, we should somehow hash the function properly
452
+ fd.func_id.hash(&mut hasher);
453
+ Ok(Some(hasher.finish()))
454
+ }
455
+ Self::Range(range) => {
456
+ let mut hasher = DefaultHasher::new();
457
+ discriminant(self).hash(&mut hasher);
458
+ range.start.hash(&mut hasher);
459
+ range.stop.hash(&mut hasher);
460
+ range.step.hash(&mut hasher);
461
+ Ok(Some(hasher.finish()))
462
+ }
463
+ // Dataclass hashability depends on the mutable flag
464
+ // Recursion depth is checked inside compute_hash
465
+ Self::Dataclass(dc) => dc.compute_hash(heap, interns),
466
+ // Slices are immutable and hashable (like in CPython)
467
+ Self::Slice(slice) => {
468
+ let mut hasher = DefaultHasher::new();
469
+ discriminant(self).hash(&mut hasher);
470
+ slice.start.hash(&mut hasher);
471
+ slice.stop.hash(&mut hasher);
472
+ slice.step.hash(&mut hasher);
473
+ Ok(Some(hasher.finish()))
474
+ }
475
+ // Path is immutable and hashable
476
+ Self::Path(path) => {
477
+ let mut hasher = DefaultHasher::new();
478
+ discriminant(self).hash(&mut hasher);
479
+ path.as_str().hash(&mut hasher);
480
+ Ok(Some(hasher.finish()))
481
+ }
482
+ // LongInt is immutable and hashable
483
+ Self::LongInt(li) => Ok(Some(li.hash())),
484
+ // ExtFunction is hashable by name
485
+ Self::ExtFunction(name) => {
486
+ let mut hasher = DefaultHasher::new();
487
+ discriminant(self).hash(&mut hasher);
488
+ name.hash(&mut hasher);
489
+ Ok(Some(hasher.finish()))
490
+ }
491
+ // other types cannot be hashed (Cell is handled specially in get_or_compute_hash)
492
+ _ => Ok(None),
493
+ }
494
+ }
495
+ }
496
+
497
+ /// Shared dispatch macro for `PyTrait` methods on `HeapData` and `HeapDataMut`.
498
+ ///
499
+ /// Both enums have identical variants (owned vs borrowed) and identical dispatch
500
+ /// logic. This macro eliminates the duplication by generating the match arms for
501
+ /// each method. The caller provides `self` and the method body for each variant.
502
+ macro_rules! impl_py_trait_dispatch {
503
+ ($self_ty:ty) => {
504
+ impl PyTrait for $self_ty {
505
+ fn py_type(&self, heap: &Heap<impl ResourceTracker>) -> Type {
506
+ match self {
507
+ Self::Str(s) => s.py_type(heap),
508
+ Self::Bytes(b) => b.py_type(heap),
509
+ Self::List(l) => l.py_type(heap),
510
+ Self::Tuple(t) => t.py_type(heap),
511
+ Self::NamedTuple(nt) => nt.py_type(heap),
512
+ Self::Dict(d) => d.py_type(heap),
513
+ Self::DictKeysView(view) => view.py_type(heap),
514
+ Self::DictItemsView(view) => view.py_type(heap),
515
+ Self::DictValuesView(view) => view.py_type(heap),
516
+ Self::Set(s) => s.py_type(heap),
517
+ Self::FrozenSet(fs) => fs.py_type(heap),
518
+ Self::Closure(_) | Self::FunctionDefaults(_) | Self::ExtFunction(_) => Type::Function,
519
+ Self::Cell(_) => Type::Cell,
520
+ Self::Range(_) => Type::Range,
521
+ Self::Slice(_) => Type::Slice,
522
+ Self::Exception(e) => e.py_type(),
523
+ Self::Dataclass(dc) => dc.py_type(heap),
524
+ Self::Iter(_) => Type::Iterator,
525
+ // LongInt is still `int` in Python - it's an implementation detail
526
+ Self::LongInt(_) => Type::Int,
527
+ Self::Module(_) => Type::Module,
528
+ Self::Coroutine(_) | Self::GatherFuture(_) => Type::Coroutine,
529
+ Self::Path(p) => p.py_type(heap),
530
+ Self::ReMatch(m) => m.py_type(heap),
531
+ Self::RePattern(p) => p.py_type(heap),
532
+ }
533
+ }
534
+
535
+ fn py_estimate_size(&self) -> usize {
536
+ match self {
537
+ Self::Str(s) => s.py_estimate_size(),
538
+ Self::Bytes(b) => b.py_estimate_size(),
539
+ Self::List(l) => l.py_estimate_size(),
540
+ Self::Tuple(t) => t.py_estimate_size(),
541
+ Self::NamedTuple(nt) => nt.py_estimate_size(),
542
+ Self::Dict(d) => d.py_estimate_size(),
543
+ Self::DictKeysView(view) => view.py_estimate_size(),
544
+ Self::DictItemsView(view) => view.py_estimate_size(),
545
+ Self::DictValuesView(view) => view.py_estimate_size(),
546
+ Self::Set(s) => s.py_estimate_size(),
547
+ Self::FrozenSet(fs) => fs.py_estimate_size(),
548
+ // TODO: should include size of captured cells and defaults
549
+ Self::Closure(_) | Self::FunctionDefaults(_) => 0,
550
+ Self::Cell(cell) => std::mem::size_of::<Value>() + cell.0.py_estimate_size(),
551
+ Self::Range(_) => std::mem::size_of::<Range>(),
552
+ Self::Slice(s) => s.py_estimate_size(),
553
+ Self::Exception(e) => std::mem::size_of::<SimpleException>() + e.arg().map_or(0, String::len),
554
+ Self::Dataclass(dc) => dc.py_estimate_size(),
555
+ Self::Iter(_) => std::mem::size_of::<MontyIter>(),
556
+ Self::LongInt(li) => li.estimate_size(),
557
+ Self::Module(m) => std::mem::size_of::<Module>() + m.attrs().py_estimate_size(),
558
+ Self::Coroutine(coro) => {
559
+ std::mem::size_of::<Coroutine>() + coro.namespace.len() * std::mem::size_of::<Value>()
560
+ }
561
+ Self::GatherFuture(gather) => {
562
+ std::mem::size_of::<GatherFuture>()
563
+ + gather.items.len() * std::mem::size_of::<crate::asyncio::GatherItem>()
564
+ + gather.results.len() * std::mem::size_of::<Option<Value>>()
565
+ + gather.pending_calls.len() * std::mem::size_of::<crate::asyncio::CallId>()
566
+ }
567
+ Self::Path(p) => p.py_estimate_size(),
568
+ Self::ReMatch(m) => m.py_estimate_size(),
569
+ Self::RePattern(p) => p.py_estimate_size(),
570
+ Self::ExtFunction(s) => std::mem::size_of::<String>() + s.len(),
571
+ }
572
+ }
573
+
574
+ fn py_len(&self, vm: &VM<'_, '_, impl ResourceTracker>) -> Option<usize> {
575
+ match self {
576
+ Self::Str(s) => s.py_len(vm),
577
+ Self::Bytes(b) => b.py_len(vm),
578
+ Self::List(l) => l.py_len(vm),
579
+ Self::Tuple(t) => t.py_len(vm),
580
+ Self::NamedTuple(nt) => nt.py_len(vm),
581
+ Self::Dict(d) => d.py_len(vm),
582
+ Self::DictKeysView(view) => view.py_len(vm),
583
+ Self::DictItemsView(view) => view.py_len(vm),
584
+ Self::DictValuesView(view) => view.py_len(vm),
585
+ Self::Set(s) => s.py_len(vm),
586
+ Self::FrozenSet(fs) => fs.py_len(vm),
587
+ Self::Range(r) => Some(r.len()),
588
+ // other types don't have length
589
+ _ => None,
590
+ }
591
+ }
592
+
593
+ fn py_eq(&self, other: &Self, vm: &mut VM<'_, '_, impl ResourceTracker>) -> Result<bool, ResourceError> {
594
+ match (self, other) {
595
+ (Self::Str(a), Self::Str(b)) => a.py_eq(b, vm),
596
+ (Self::Bytes(a), Self::Bytes(b)) => a.py_eq(b, vm),
597
+ (Self::List(a), Self::List(b)) => a.py_eq(b, vm),
598
+ (Self::Tuple(a), Self::Tuple(b)) => a.py_eq(b, vm),
599
+ (Self::NamedTuple(a), Self::NamedTuple(b)) => a.py_eq(b, vm),
600
+ // NamedTuple can compare with Tuple by elements (matching CPython behavior)
601
+ (Self::NamedTuple(nt), Self::Tuple(t)) | (Self::Tuple(t), Self::NamedTuple(nt)) => {
602
+ let nt_items = nt.as_vec();
603
+ let t_items = t.as_slice();
604
+ if nt_items.len() != t_items.len() {
605
+ return Ok(false);
606
+ }
607
+ // Helper function pattern: acquire token, call helper, drop token.
608
+ // Cannot use defer_drop! here because the helper needs &mut VM.
609
+ let token = vm.heap.incr_recursion_depth()?;
610
+ defer_drop!(token, vm);
611
+ for (a, b) in nt_items.iter().zip(t_items.iter()) {
612
+ if !a.py_eq(b, vm)? {
613
+ return Ok(false);
614
+ }
615
+ }
616
+ Ok(true)
617
+ }
618
+ (Self::Dict(a), Self::Dict(b)) => a.py_eq(b, vm),
619
+ (Self::DictKeysView(a), Self::DictKeysView(b)) => a.py_eq(b, vm),
620
+ (Self::DictItemsView(a), Self::DictItemsView(b)) => a.py_eq(b, vm),
621
+ (Self::DictValuesView(_), Self::DictValuesView(_)) => Ok(false),
622
+ (Self::DictKeysView(a), Self::Set(b)) | (Self::Set(b), Self::DictKeysView(a)) => a.eq_set(b, vm),
623
+ (Self::DictKeysView(a), Self::FrozenSet(b)) | (Self::FrozenSet(b), Self::DictKeysView(a)) => {
624
+ a.eq_frozenset(b, vm)
625
+ }
626
+ (Self::DictItemsView(a), Self::Set(b)) | (Self::Set(b), Self::DictItemsView(a)) => a.eq_set(b, vm),
627
+ (Self::DictItemsView(a), Self::FrozenSet(b)) | (Self::FrozenSet(b), Self::DictItemsView(a)) => {
628
+ a.eq_frozenset(b, vm)
629
+ }
630
+ (Self::Set(a), Self::Set(b)) => a.py_eq(b, vm),
631
+ (Self::FrozenSet(a), Self::FrozenSet(b)) => a.py_eq(b, vm),
632
+ (Self::Closure(a), Self::Closure(b)) => Ok(a.func_id == b.func_id && a.cells == b.cells),
633
+ (Self::FunctionDefaults(a), Self::FunctionDefaults(b)) => Ok(a.func_id == b.func_id),
634
+ (Self::Range(a), Self::Range(b)) => a.py_eq(b, vm),
635
+ (Self::Dataclass(a), Self::Dataclass(b)) => a.py_eq(b, vm),
636
+ // LongInt equality
637
+ (Self::LongInt(a), Self::LongInt(b)) => Ok(a == b),
638
+ // Slice equality
639
+ (Self::Slice(a), Self::Slice(b)) => a.py_eq(b, vm),
640
+ // Path equality
641
+ (Self::Path(a), Self::Path(b)) => a.py_eq(b, vm),
642
+ // ReMatch objects are not comparable
643
+ (Self::ReMatch(a), Self::ReMatch(b)) => a.py_eq(b, vm),
644
+ // RePattern equality by pattern string and flags
645
+ (Self::RePattern(a), Self::RePattern(b)) => a.py_eq(b, vm),
646
+ // Cells, Exceptions, Iterators, Modules, and async types compare by identity only
647
+ // (handled at Value level via HeapId comparison)
648
+ (Self::Cell(_), Self::Cell(_))
649
+ | (Self::Exception(_), Self::Exception(_))
650
+ | (Self::Iter(_), Self::Iter(_))
651
+ | (Self::Module(_), Self::Module(_))
652
+ | (Self::Coroutine(_), Self::Coroutine(_))
653
+ | (Self::GatherFuture(_), Self::GatherFuture(_)) => Ok(false),
654
+ _ => Ok(false), // Different types are never equal
655
+ }
656
+ }
657
+
658
+ fn py_cmp(
659
+ &self,
660
+ other: &Self,
661
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
662
+ ) -> Result<Option<std::cmp::Ordering>, ResourceError> {
663
+ match (self, other) {
664
+ (Self::Str(a), Self::Str(b)) => a.py_cmp(b, vm),
665
+ (Self::Bytes(a), Self::Bytes(b)) => a.py_cmp(b, vm),
666
+ (Self::Tuple(a), Self::Tuple(b)) => a.py_cmp(b, vm),
667
+ _ => Ok(None),
668
+ }
669
+ }
670
+
671
+ fn py_dec_ref_ids(&mut self, stack: &mut Vec<HeapId>) {
672
+ match self {
673
+ Self::Str(s) => s.py_dec_ref_ids(stack),
674
+ Self::Bytes(b) => b.py_dec_ref_ids(stack),
675
+ Self::List(l) => l.py_dec_ref_ids(stack),
676
+ Self::Tuple(t) => t.py_dec_ref_ids(stack),
677
+ Self::NamedTuple(nt) => nt.py_dec_ref_ids(stack),
678
+ Self::Dict(d) => d.py_dec_ref_ids(stack),
679
+ Self::DictKeysView(view) => view.py_dec_ref_ids(stack),
680
+ Self::DictItemsView(view) => view.py_dec_ref_ids(stack),
681
+ Self::DictValuesView(view) => view.py_dec_ref_ids(stack),
682
+ Self::Set(s) => s.py_dec_ref_ids(stack),
683
+ Self::FrozenSet(fs) => fs.py_dec_ref_ids(stack),
684
+ Self::Closure(closure) => {
685
+ // Decrement ref count for captured cells
686
+ stack.extend(closure.cells.iter().copied());
687
+ // Decrement ref count for default values that are heap references
688
+ for default in &mut closure.defaults {
689
+ default.py_dec_ref_ids(stack);
690
+ }
691
+ }
692
+ Self::FunctionDefaults(fd) => {
693
+ // Decrement ref count for default values that are heap references
694
+ for default in &mut fd.defaults {
695
+ default.py_dec_ref_ids(stack);
696
+ }
697
+ }
698
+ Self::Cell(cell) => cell.0.py_dec_ref_ids(stack),
699
+ Self::Dataclass(dc) => dc.py_dec_ref_ids(stack),
700
+ Self::Iter(iter) => iter.py_dec_ref_ids(stack),
701
+ Self::Module(m) => m.py_dec_ref_ids(stack),
702
+ Self::Coroutine(coro) => {
703
+ // Decrement ref count for namespace values that are heap references
704
+ for value in &mut coro.namespace {
705
+ value.py_dec_ref_ids(stack);
706
+ }
707
+ }
708
+ Self::GatherFuture(gather) => {
709
+ // Decrement ref count for coroutine HeapIds
710
+ for item in &gather.items {
711
+ if let GatherItem::Coroutine(id) = item {
712
+ stack.push(*id);
713
+ }
714
+ }
715
+ // Decrement ref count for result values that are heap references
716
+ for result in gather.results.iter_mut().flatten() {
717
+ result.py_dec_ref_ids(stack);
718
+ }
719
+ }
720
+ // other types have no nested heap references
721
+ _ => {}
722
+ }
723
+ }
724
+
725
+ fn py_bool(&self, vm: &VM<'_, '_, impl ResourceTracker>) -> bool {
726
+ match self {
727
+ Self::Str(s) => s.py_bool(vm),
728
+ Self::Bytes(b) => b.py_bool(vm),
729
+ Self::List(l) => l.py_bool(vm),
730
+ Self::Tuple(t) => t.py_bool(vm),
731
+ Self::NamedTuple(nt) => nt.py_bool(vm),
732
+ Self::Dict(d) => d.py_bool(vm),
733
+ Self::DictKeysView(view) => view.py_bool(vm),
734
+ Self::DictItemsView(view) => view.py_bool(vm),
735
+ Self::DictValuesView(view) => view.py_bool(vm),
736
+ Self::Set(s) => s.py_bool(vm),
737
+ Self::FrozenSet(fs) => fs.py_bool(vm),
738
+ Self::Closure(_) | Self::FunctionDefaults(_) | Self::ExtFunction(_) => true,
739
+ Self::Cell(_) => true, // Cells are always truthy
740
+ Self::Range(r) => r.py_bool(vm),
741
+ Self::Slice(s) => s.py_bool(vm),
742
+ Self::Exception(_) => true, // Exceptions are always truthy
743
+ Self::Dataclass(dc) => dc.py_bool(vm),
744
+ Self::Iter(_) => true, // Iterators are always truthy
745
+ Self::LongInt(li) => !li.is_zero(),
746
+ Self::Module(_) => true, // Modules are always truthy
747
+ Self::Coroutine(_) => true, // Coroutines are always truthy
748
+ Self::GatherFuture(_) => true, // GatherFutures are always truthy
749
+ Self::Path(p) => p.py_bool(vm),
750
+ Self::ReMatch(m) => m.py_bool(vm),
751
+ Self::RePattern(p) => p.py_bool(vm),
752
+ }
753
+ }
754
+
755
+ fn py_repr_fmt(
756
+ &self,
757
+ f: &mut impl Write,
758
+ vm: &VM<'_, '_, impl ResourceTracker>,
759
+ heap_ids: &mut AHashSet<HeapId>,
760
+ ) -> std::fmt::Result {
761
+ match self {
762
+ Self::Str(s) => s.py_repr_fmt(f, vm, heap_ids),
763
+ Self::Bytes(b) => b.py_repr_fmt(f, vm, heap_ids),
764
+ Self::List(l) => l.py_repr_fmt(f, vm, heap_ids),
765
+ Self::Tuple(t) => t.py_repr_fmt(f, vm, heap_ids),
766
+ Self::NamedTuple(nt) => nt.py_repr_fmt(f, vm, heap_ids),
767
+ Self::Dict(d) => d.py_repr_fmt(f, vm, heap_ids),
768
+ Self::DictKeysView(view) => view.py_repr_fmt(f, vm, heap_ids),
769
+ Self::DictItemsView(view) => view.py_repr_fmt(f, vm, heap_ids),
770
+ Self::DictValuesView(view) => view.py_repr_fmt(f, vm, heap_ids),
771
+ Self::Set(s) => s.py_repr_fmt(f, vm, heap_ids),
772
+ Self::FrozenSet(fs) => fs.py_repr_fmt(f, vm, heap_ids),
773
+ Self::Closure(closure) => vm
774
+ .interns
775
+ .get_function(closure.func_id)
776
+ .py_repr_fmt(f, vm.interns, 0),
777
+ Self::FunctionDefaults(fd) => vm.interns.get_function(fd.func_id).py_repr_fmt(f, vm.interns, 0),
778
+ // Cell repr shows the contained value's type
779
+ Self::Cell(cell) => write!(f, "<cell: {} object>", cell.0.py_type(vm.heap)),
780
+ Self::Range(r) => r.py_repr_fmt(f, vm, heap_ids),
781
+ Self::Slice(s) => s.py_repr_fmt(f, vm, heap_ids),
782
+ Self::Exception(e) => e.py_repr_fmt(f),
783
+ Self::Dataclass(dc) => dc.py_repr_fmt(f, vm, heap_ids),
784
+ Self::Iter(_) => write!(f, "<iterator>"),
785
+ Self::LongInt(li) => write!(f, "{li}"),
786
+ Self::Module(m) => write!(f, "<module '{}'>", vm.interns.get_str(m.name())),
787
+ Self::Coroutine(coro) => {
788
+ let func = vm.interns.get_function(coro.func_id);
789
+ let name = vm.interns.get_str(func.name.name_id);
790
+ write!(f, "<coroutine object {name}>")
791
+ }
792
+ Self::GatherFuture(gather) => write!(f, "<gather({})>", gather.item_count()),
793
+ Self::Path(p) => p.py_repr_fmt(f, vm, heap_ids),
794
+ Self::ReMatch(m) => m.py_repr_fmt(f, vm, heap_ids),
795
+ Self::RePattern(p) => p.py_repr_fmt(f, vm, heap_ids),
796
+ Self::ExtFunction(name) => write!(f, "<function '{name}' external>"),
797
+ }
798
+ }
799
+
800
+ fn py_str(&self, vm: &VM<'_, '_, impl ResourceTracker>) -> Cow<'static, str> {
801
+ match self {
802
+ // Strings return their value directly without quotes
803
+ Self::Str(s) => s.py_str(vm),
804
+ // LongInt returns its string representation
805
+ Self::LongInt(li) => Cow::Owned(li.to_string()),
806
+ // Exceptions return just the message (or empty string if no message)
807
+ Self::Exception(e) => Cow::Owned(e.py_str()),
808
+ // Paths return the path string without the PosixPath() wrapper
809
+ Self::Path(p) => Cow::Owned(p.as_str().to_owned()),
810
+ // All other types use repr
811
+ _ => self.py_repr(vm),
812
+ }
813
+ }
814
+
815
+ fn py_add(
816
+ &self,
817
+ other: &Self,
818
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
819
+ ) -> Result<Option<Value>, ResourceError> {
820
+ match (self, other) {
821
+ (Self::Str(a), Self::Str(b)) => a.py_add(b, vm),
822
+ (Self::Bytes(a), Self::Bytes(b)) => a.py_add(b, vm),
823
+ (Self::List(a), Self::List(b)) => a.py_add(b, vm),
824
+ (Self::Tuple(a), Self::Tuple(b)) => a.py_add(b, vm),
825
+ (Self::Dict(a), Self::Dict(b)) => a.py_add(b, vm),
826
+ (Self::LongInt(a), Self::LongInt(b)) => {
827
+ let bi = a.inner() + b.inner();
828
+ Ok(LongInt::new(bi).into_value(vm.heap).map(Some)?)
829
+ }
830
+ // Cells and Dataclasses don't support arithmetic operations
831
+ _ => Ok(None),
832
+ }
833
+ }
834
+
835
+ fn py_sub(
836
+ &self,
837
+ other: &Self,
838
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
839
+ ) -> Result<Option<Value>, ResourceError> {
840
+ match (self, other) {
841
+ (Self::Str(a), Self::Str(b)) => a.py_sub(b, vm),
842
+ (Self::Bytes(a), Self::Bytes(b)) => a.py_sub(b, vm),
843
+ (Self::List(a), Self::List(b)) => a.py_sub(b, vm),
844
+ (Self::Tuple(a), Self::Tuple(b)) => a.py_sub(b, vm),
845
+ (Self::Dict(a), Self::Dict(b)) => a.py_sub(b, vm),
846
+ (Self::Set(a), Self::Set(b)) => a.py_sub(b, vm),
847
+ (Self::FrozenSet(a), Self::FrozenSet(b)) => a.py_sub(b, vm),
848
+ (Self::LongInt(a), Self::LongInt(b)) => {
849
+ let bi = a.inner() - b.inner();
850
+ Ok(LongInt::new(bi).into_value(vm.heap).map(Some)?)
851
+ }
852
+ // Cells don't support arithmetic operations
853
+ _ => Ok(None),
854
+ }
855
+ }
856
+
857
+ fn py_mod(&self, other: &Self, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<Option<Value>> {
858
+ match (self, other) {
859
+ (Self::Str(a), Self::Str(b)) => a.py_mod(b, vm),
860
+ (Self::Bytes(a), Self::Bytes(b)) => a.py_mod(b, vm),
861
+ (Self::List(a), Self::List(b)) => a.py_mod(b, vm),
862
+ (Self::Tuple(a), Self::Tuple(b)) => a.py_mod(b, vm),
863
+ (Self::Dict(a), Self::Dict(b)) => a.py_mod(b, vm),
864
+ (Self::LongInt(a), Self::LongInt(b)) => {
865
+ if b.is_zero() {
866
+ Err(ExcType::zero_division().into())
867
+ } else {
868
+ let bi = a.inner().mod_floor(b.inner());
869
+ Ok(LongInt::new(bi).into_value(vm.heap).map(Some)?)
870
+ }
871
+ }
872
+ // Cells don't support arithmetic operations
873
+ _ => Ok(None),
874
+ }
875
+ }
876
+
877
+ fn py_mod_eq(&self, other: &Self, right_value: i64) -> Option<bool> {
878
+ match (self, other) {
879
+ (Self::Str(a), Self::Str(b)) => a.py_mod_eq(b, right_value),
880
+ (Self::Bytes(a), Self::Bytes(b)) => a.py_mod_eq(b, right_value),
881
+ (Self::List(a), Self::List(b)) => a.py_mod_eq(b, right_value),
882
+ (Self::Tuple(a), Self::Tuple(b)) => a.py_mod_eq(b, right_value),
883
+ (Self::Dict(a), Self::Dict(b)) => a.py_mod_eq(b, right_value),
884
+ // Cells don't support arithmetic operations
885
+ _ => None,
886
+ }
887
+ }
888
+
889
+ fn py_iadd(
890
+ &mut self,
891
+ other: &Value,
892
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
893
+ self_id: Option<HeapId>,
894
+ ) -> Result<bool, ResourceError> {
895
+ match self {
896
+ Self::List(list) => list.py_iadd(other, vm, self_id),
897
+ Self::Dict(dict) => dict.py_iadd(other, vm, self_id),
898
+ _ => Ok(false),
899
+ }
900
+ }
901
+
902
+ fn py_call_attr(
903
+ &mut self,
904
+ self_id: HeapId,
905
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
906
+ attr: &EitherStr,
907
+ args: ArgValues,
908
+ ) -> RunResult<CallResult> {
909
+ match self {
910
+ Self::Str(s) => s.py_call_attr(self_id, vm, attr, args),
911
+ Self::Bytes(b) => b.py_call_attr(self_id, vm, attr, args),
912
+ Self::List(l) => l.py_call_attr(self_id, vm, attr, args),
913
+ Self::Tuple(t) => t.py_call_attr(self_id, vm, attr, args),
914
+ Self::Dict(d) => d.py_call_attr(self_id, vm, attr, args),
915
+ Self::DictKeysView(view) => view.py_call_attr(self_id, vm, attr, args),
916
+ Self::DictItemsView(view) => view.py_call_attr(self_id, vm, attr, args),
917
+ Self::DictValuesView(view) => view.py_call_attr(self_id, vm, attr, args),
918
+ Self::Set(s) => s.py_call_attr(self_id, vm, attr, args),
919
+ Self::FrozenSet(fs) => fs.py_call_attr(self_id, vm, attr, args),
920
+ Self::Dataclass(dc) => dc.py_call_attr(self_id, vm, attr, args),
921
+ Self::Path(p) => p.py_call_attr(self_id, vm, attr, args),
922
+ Self::Module(m) => m.py_call_attr(self_id, vm, attr, args),
923
+ Self::ReMatch(m) => m.py_call_attr(self_id, vm, attr, args),
924
+ Self::RePattern(p) => p.py_call_attr(self_id, vm, attr, args),
925
+ _ => Err(ExcType::attribute_error(
926
+ self.py_type(vm.heap),
927
+ attr.as_str(vm.interns),
928
+ )),
929
+ }
930
+ }
931
+
932
+ fn py_getitem(&self, key: &Value, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<Value> {
933
+ match self {
934
+ Self::Str(s) => s.py_getitem(key, vm),
935
+ Self::Bytes(b) => b.py_getitem(key, vm),
936
+ Self::List(l) => l.py_getitem(key, vm),
937
+ Self::Tuple(t) => t.py_getitem(key, vm),
938
+ Self::NamedTuple(nt) => nt.py_getitem(key, vm),
939
+ Self::Dict(d) => d.py_getitem(key, vm),
940
+ Self::Range(r) => r.py_getitem(key, vm),
941
+ Self::ReMatch(m) => m.py_getitem(key, vm),
942
+ _ => Err(ExcType::type_error_not_sub(self.py_type(vm.heap))),
943
+ }
944
+ }
945
+
946
+ fn py_setitem(
947
+ &mut self,
948
+ key: Value,
949
+ value: Value,
950
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
951
+ ) -> RunResult<()> {
952
+ match self {
953
+ Self::Str(s) => s.py_setitem(key, value, vm),
954
+ Self::Bytes(b) => b.py_setitem(key, value, vm),
955
+ Self::List(l) => l.py_setitem(key, value, vm),
956
+ Self::Tuple(t) => t.py_setitem(key, value, vm),
957
+ Self::Dict(d) => d.py_setitem(key, value, vm),
958
+ _ => Err(ExcType::type_error_not_sub_assignment(self.py_type(vm.heap))),
959
+ }
960
+ }
961
+
962
+ fn py_getattr(
963
+ &self,
964
+ attr: &EitherStr,
965
+ vm: &mut VM<'_, '_, impl ResourceTracker>,
966
+ ) -> RunResult<Option<CallResult>> {
967
+ match self {
968
+ Self::Dataclass(dc) => dc.py_getattr(attr, vm),
969
+ Self::Module(m) => Ok(m.py_getattr(attr, vm.heap, vm.interns)),
970
+ Self::NamedTuple(nt) => nt.py_getattr(attr, vm),
971
+ Self::Slice(s) => s.py_getattr(attr, vm),
972
+ Self::Exception(exc) => exc.py_getattr(attr, vm.heap, vm.interns),
973
+ Self::Path(p) => p.py_getattr(attr, vm),
974
+ Self::ReMatch(m) => m.py_getattr(attr, vm),
975
+ Self::RePattern(p) => p.py_getattr(attr, vm),
976
+ // All other types don't support attribute access via py_getattr
977
+ _ => Ok(None),
978
+ }
979
+ }
980
+ }
981
+ };
982
+ }
983
+
984
+ impl_py_trait_dispatch!(HeapDataMut<'_>);
985
+ impl_py_trait_dispatch!(HeapData);