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,756 @@
1
+ # Tests for the re (regular expression) module - basic functionality
2
+
3
+ import re
4
+
5
+ # === Constant ===
6
+ assert re.NOFLAG == 0, 're.NOFLAG == 0'
7
+ assert re.I == re.IGNORECASE == 2, 're.I == re.IGNORECASE == 2'
8
+ assert re.M == re.MULTILINE == 8, 're.M == re.MULTILINE == 8'
9
+ assert re.S == re.DOTALL == 16, 're.S == re.DOTALL == 16'
10
+
11
+ # === re.search() basic ===
12
+ m = re.search('hello', 'say hello world')
13
+ assert m is not None, 're.search finds a match'
14
+ assert m.group() == 'hello', 're.search group(0) returns matched text'
15
+ assert m.group(0) == 'hello', 're.search group(0) explicit returns matched text'
16
+ assert m.start() == 4, 're.search start() returns start position'
17
+ assert m.end() == 9, 're.search end() returns end position'
18
+ assert m.span() == (4, 9), 're.search span() returns (start, end) tuple'
19
+
20
+ # === re.search() with no match ===
21
+ m = re.search('xyz', 'hello world')
22
+ assert m is None, 're.search returns None when no match'
23
+
24
+ # === re.search() with error ===
25
+ try:
26
+ re.search('(', 'test')
27
+ assert False, 're.search with invalid pattern should raise error'
28
+ except re.PatternError as e:
29
+ # The error message may vary based on the regex engine, but it should not be empty
30
+ assert len(str(e)) > 0, 're.search with invalid pattern raises PatternError with message'
31
+
32
+ # === re.match() ===
33
+ m = re.match('hello', 'hello world')
34
+ assert m is not None, 're.match matches at start'
35
+ assert m.group() == 'hello', 're.match group returns matched text'
36
+
37
+ m = re.match('world', 'hello world')
38
+ assert m is None, 're.match does not match in the middle'
39
+
40
+ # === re.fullmatch() ===
41
+ m = re.fullmatch('hello', 'hello')
42
+ assert m is not None, 're.fullmatch matches exact string'
43
+ assert m.group() == 'hello', 're.fullmatch group returns full match'
44
+
45
+ m = re.fullmatch('hello', 'hello world')
46
+ assert m is None, 're.fullmatch does not match partial string'
47
+
48
+ # === re.findall() with no groups ===
49
+ result = re.findall(r'\d+', 'a1 b22 c333')
50
+ assert result == ['1', '22', '333'], 'findall without groups returns list of matches'
51
+
52
+ # === re.findall() with no match ===
53
+ result = re.findall(r'\d+', 'no numbers')
54
+ assert result == [], 'findall with no match returns empty list'
55
+
56
+ # === re.sub() ===
57
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3')
58
+ assert result == 'aX bX cX', 're.sub replaces all matches'
59
+
60
+ # === re.sub() with count ===
61
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', 1)
62
+ assert result == 'aX b2 c3', 're.sub with count=1 replaces only first'
63
+
64
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', 2)
65
+ assert result == 'aX bX c3', 're.sub with count=2 replaces first two'
66
+
67
+ # === re.compile() ===
68
+ pattern = re.compile(r'\d+')
69
+ m = pattern.search('abc 123 def')
70
+ assert m is not None, 'compiled pattern search finds match'
71
+ assert m.group() == '123', 'compiled pattern match returns correct group'
72
+
73
+ m = pattern.match('123 abc')
74
+ assert m is not None, 'compiled pattern match at start'
75
+ assert m.group() == '123', 'compiled pattern match group'
76
+
77
+ m = pattern.match('abc 123')
78
+ assert m is None, 'compiled pattern match does not match in middle'
79
+
80
+ # === compiled pattern fullmatch ===
81
+ pattern = re.compile(r'\d+')
82
+ m = pattern.fullmatch('123')
83
+ assert m is not None, 'compiled pattern fullmatch on exact string'
84
+ assert m.group() == '123', 'compiled pattern fullmatch group'
85
+
86
+ m = pattern.fullmatch('123abc')
87
+ assert m is None, 'compiled pattern fullmatch rejects partial match'
88
+
89
+ # === compiled pattern findall ===
90
+ pattern = re.compile(r'\d+')
91
+ result = pattern.findall('a1 b2 c3')
92
+ assert result == ['1', '2', '3'], 'compiled pattern findall'
93
+
94
+ # === compiled pattern sub ===
95
+ pattern = re.compile(r'\d+')
96
+ result = pattern.sub('X', 'a1 b2 c3')
97
+ assert result == 'aX bX cX', 'compiled pattern sub'
98
+
99
+ result = pattern.sub('X', 'a1 b2 c3', 1)
100
+ assert result == 'aX b2 c3', 'compiled pattern sub with count'
101
+
102
+ # === Flags: IGNORECASE ===
103
+ pattern = re.compile(r'hello', re.IGNORECASE)
104
+ m = pattern.search('Hello World')
105
+ assert m is not None, 'IGNORECASE flag works'
106
+ assert m.group() == 'Hello', 'IGNORECASE matches case-insensitively'
107
+
108
+ # === Flags: DOTALL ===
109
+ pattern = re.compile(r'a.b', re.DOTALL)
110
+ m = pattern.search('a\nb')
111
+ assert m is not None, 'DOTALL flag allows dot to match newline'
112
+ assert m.group() == 'a\nb', 'DOTALL matches newline with dot'
113
+
114
+ # === Flags: MULTILINE ===
115
+ pattern = re.compile(r'^\w+', re.MULTILINE)
116
+ result = pattern.findall('hello\nworld')
117
+ assert result == ['hello', 'world'], 'MULTILINE allows ^ to match at line boundaries'
118
+
119
+ # === Pattern attributes ===
120
+ pattern = re.compile(r'\d+', re.IGNORECASE)
121
+ assert pattern.pattern == r'\d+', '.pattern returns the pattern string'
122
+ # CPython flags include re.UNICODE (32) by default, so we check flags & 2 instead
123
+ assert pattern.flags & re.IGNORECASE, '.flags includes IGNORECASE'
124
+
125
+ # === Pattern repr ===
126
+ p = re.compile(r'\d+')
127
+ assert repr(p) == r"re.compile('\\d+')", 'Pattern repr without flags'
128
+
129
+ p = re.compile(r'\d+', re.IGNORECASE)
130
+ assert repr(p) == r"re.compile('\\d+', re.IGNORECASE)", 'Pattern repr with IGNORECASE'
131
+
132
+ # === Flag constants ===
133
+ assert re.IGNORECASE == 2, 'IGNORECASE flag value'
134
+ assert re.MULTILINE == 8, 'MULTILINE flag value'
135
+ assert re.DOTALL == 16, 'DOTALL flag value'
136
+
137
+ # === Combined flags ===
138
+ pattern = re.compile(r'^hello', re.IGNORECASE | re.MULTILINE)
139
+ result = pattern.findall('Hello\nhello\nHELLO')
140
+ assert result == ['Hello', 'hello', 'HELLO'], 'Combined IGNORECASE | MULTILINE flags'
141
+
142
+ # === More MULTILINE tests ===
143
+ # Without MULTILINE, ^ matches only start of string
144
+ pattern = re.compile(r'^\w+')
145
+ result = pattern.findall('line1\nline2\nline3')
146
+ assert result == ['line1'], 'Without MULTILINE, ^ matches only start of string'
147
+
148
+ # With MULTILINE, ^ matches each line start
149
+ pattern = re.compile(r'^\w+', re.MULTILINE)
150
+ result = pattern.findall('line1\nline2\nline3')
151
+ assert result == ['line1', 'line2', 'line3'], 'With MULTILINE, ^ matches each line start'
152
+
153
+ # Without MULTILINE, $ matches only end of string
154
+ pattern = re.compile(r'\w+$')
155
+ result = pattern.findall('line1\nline2\nline3')
156
+ assert result == ['line3'], 'Without MULTILINE, $ matches only end of string'
157
+
158
+ # With MULTILINE, $ matches each line end
159
+ pattern = re.compile(r'\w+$', re.MULTILINE)
160
+ result = pattern.findall('line1\nline2\nline3')
161
+ assert result == ['line1', 'line2', 'line3'], 'With MULTILINE, $ matches each line end'
162
+
163
+ # === More DOTALL tests ===
164
+ # Without DOTALL, . does not match newline
165
+ pattern = re.compile(r'a.b')
166
+ m = pattern.search('a\nb')
167
+ assert m is None, 'Without DOTALL, . does not match newline'
168
+
169
+ # With DOTALL, . matches newline
170
+ pattern = re.compile(r'a.b', re.DOTALL)
171
+ m = pattern.search('a\nb')
172
+ assert m is not None, 'With DOTALL, . matches newline'
173
+ assert m.group() == 'a\nb', 'DOTALL allows . to match newline'
174
+
175
+ # DOTALL with multiple newlines
176
+ pattern = re.compile(r'start.*end', re.DOTALL)
177
+ m = pattern.search('start\nline1\nline2\nend')
178
+ assert m is not None, 'DOTALL .* matches multiple newlines'
179
+ assert m.group() == 'start\nline1\nline2\nend', 'DOTALL .* captures everything including newlines'
180
+
181
+ # === Pattern repr with multiple flags (I, M, D order) ===
182
+ p = re.compile(r'test', re.IGNORECASE)
183
+ assert repr(p) == r"re.compile('test', re.IGNORECASE)", 'Pattern repr with I flag'
184
+
185
+ p = re.compile(r'test', re.MULTILINE)
186
+ assert repr(p) == r"re.compile('test', re.MULTILINE)", 'Pattern repr with M flag'
187
+
188
+ p = re.compile(r'test', re.DOTALL)
189
+ assert repr(p) == r"re.compile('test', re.DOTALL)", 'Pattern repr with D flag'
190
+
191
+ p = re.compile(r'test', re.IGNORECASE | re.MULTILINE)
192
+ assert repr(p) == r"re.compile('test', re.IGNORECASE|re.MULTILINE)", 'Pattern repr with I|M flags'
193
+
194
+ p = re.compile(r'test', re.IGNORECASE | re.DOTALL)
195
+ assert repr(p) == r"re.compile('test', re.IGNORECASE|re.DOTALL)", 'Pattern repr with I|D flags'
196
+
197
+ p = re.compile(r'test', re.MULTILINE | re.DOTALL)
198
+ assert repr(p) == r"re.compile('test', re.MULTILINE|re.DOTALL)", 'Pattern repr with M|D flags'
199
+
200
+ p = re.compile(r'test', re.IGNORECASE | re.MULTILINE | re.DOTALL)
201
+ assert repr(p) == r"re.compile('test', re.IGNORECASE|re.MULTILINE|re.DOTALL)", 'Pattern repr with I|M|D flags'
202
+
203
+ # === Combined IGNORECASE and DOTALL ===
204
+ pattern = re.compile(r'Hello.*World', re.IGNORECASE | re.DOTALL)
205
+ m = pattern.search('HELLO\nmiddle\nWORLD')
206
+ assert m is not None, 'Combined IGNORECASE|DOTALL finds match'
207
+ assert m.group() == 'HELLO\nmiddle\nWORLD', 'IGNORECASE|DOTALL matches case-insensitively across newlines'
208
+
209
+ # === Combined MULTILINE and DOTALL ===
210
+ pattern = re.compile(r'^a.*b$', re.MULTILINE | re.DOTALL)
211
+ result = pattern.findall('a\nb\nc\nb')
212
+ assert result == ['a\nb\nc\nb'], 'Combined MULTILINE|DOTALL with ^ and $ and .'
213
+
214
+ # === All three flags combined ===
215
+ pattern = re.compile(r'^Hello.*World$', re.IGNORECASE | re.MULTILINE | re.DOTALL)
216
+ m = pattern.search('first\nHELLO\nsome\nlines\nWORLD\nlast')
217
+ assert m is not None, 'All three flags combined finds match'
218
+ assert m.group() == 'HELLO\nsome\nlines\nWORLD', 'I|M|D flags work together'
219
+
220
+ # === Empty pattern ===
221
+ m = re.search(r'', 'abc')
222
+ assert m is not None, 'search with empty pattern finds match'
223
+ assert m.start() == 0 and m.end() == 0, 'empty pattern matches at start of string'
224
+
225
+ # === Zero-length matches ===
226
+ m = re.search(r'a*', 'bc')
227
+ assert m is not None, 'search with zero-length match finds match'
228
+ assert m.group() == '', 'zero-length match returns empty string'
229
+
230
+ # === Object identity of compiled patterns ===
231
+ p1 = re.compile(r'\d+')
232
+ p2 = re.compile(r'\d+')
233
+ assert p1 == p2, 'separately compiled patterns with same pattern are equal'
234
+ match1 = p1.search('123')
235
+ match2 = p2.search('123')
236
+ assert match1 != match2, 'matches from different pattern objects are distinct'
237
+
238
+ # === re.sub() error: missing pattern ===
239
+ try:
240
+ re.sub()
241
+ assert False, 're.sub() with no args should raise TypeError'
242
+ except TypeError as e:
243
+ assert 'pattern' in str(e).lower(), 're.sub missing pattern error mentions pattern'
244
+
245
+ # === re.sub() error: missing repl ===
246
+ try:
247
+ re.sub(r'\d+')
248
+ assert False, 're.sub(pattern) should raise TypeError'
249
+ except TypeError as e:
250
+ assert 'repl' in str(e).lower(), 're.sub missing repl error mentions repl'
251
+
252
+ # === re.sub() error: missing string ===
253
+ try:
254
+ re.sub(r'\d+', 'X')
255
+ assert False, 're.sub(pattern, repl) should raise TypeError'
256
+ except TypeError as e:
257
+ assert 'string' in str(e).lower(), 're.sub missing string error mentions string'
258
+
259
+ # === re.sub() error: count is not an integer ===
260
+ try:
261
+ re.sub(r'\d+', 'X', 'a1b2', 1.5)
262
+ assert False, 're.sub with float count should raise TypeError'
263
+ except TypeError as e:
264
+ assert "'float' object cannot be interpreted as an integer" in str(e), 're.sub float count error'
265
+
266
+ try:
267
+ re.sub(r'\d+', 'X', 'a1b2', 'one')
268
+ assert False, 're.sub with string count should raise TypeError'
269
+ except TypeError as e:
270
+ assert "'str' object cannot be interpreted as an integer" in str(e), 're.sub string count error'
271
+
272
+ # === Pattern.sub() error: missing repl ===
273
+ pattern = re.compile(r'\d+')
274
+ try:
275
+ pattern.sub()
276
+ assert False, 'Pattern.sub() with no args should raise TypeError'
277
+ except TypeError as e:
278
+ assert 'repl' in str(e).lower(), 'Pattern.sub missing repl error mentions repl'
279
+
280
+ # === Pattern.sub() error: missing string ===
281
+ try:
282
+ pattern.sub('X')
283
+ assert False, 'Pattern.sub(repl) should raise TypeError'
284
+ except TypeError as e:
285
+ assert 'string' in str(e).lower(), 'Pattern.sub missing string error mentions string'
286
+
287
+ # === re.sub() with count=0 (replace all) ===
288
+ result = re.sub(r'\d', 'X', '1a2b3c', 0)
289
+ assert result == 'XaXbXc', 're.sub with count=0 replaces all'
290
+
291
+ # === re.sub() empty replacement ===
292
+ result = re.sub(r'\d+', '', 'a1 b2 c3')
293
+ assert result == 'a b c', 're.sub with empty replacement removes matches'
294
+
295
+ # === Pattern.sub() edge case: empty match ===
296
+ pattern = re.compile(r'a*')
297
+ result = pattern.sub('X', 'bac')
298
+ # Note: this might be a zero-width match behavior that's different
299
+ assert 'X' in result, 'Pattern.sub handles zero-width matches'
300
+
301
+ # === re.compile() error: invalid pattern ===
302
+ try:
303
+ re.compile('(unclosed')
304
+ assert False, 're.compile with invalid pattern should raise PatternError'
305
+ except re.PatternError as e:
306
+ assert len(str(e)) > 0, 're.compile invalid pattern raises PatternError'
307
+
308
+ # === re.search() error: pattern is not a string ===
309
+ try:
310
+ re.search(123, 'hello')
311
+ assert False, 're.search with int pattern should raise TypeError'
312
+ except TypeError as e:
313
+ assert 'string' in str(e).lower(), 're.search non-string pattern error'
314
+
315
+ # === re.search() error: string is not a string ===
316
+ try:
317
+ re.search(r'\d+', 123)
318
+ assert False, 're.search with int string should raise TypeError'
319
+ except TypeError as e:
320
+ assert 'string' in str(e).lower(), 're.search non-string string error'
321
+
322
+ # === re.match() error: pattern is not a string ===
323
+ try:
324
+ re.match(None, 'hello')
325
+ assert False, 're.match with None pattern should raise TypeError'
326
+ except TypeError as e:
327
+ assert 'string' in str(e).lower(), 're.match None pattern error'
328
+
329
+ # === re.fullmatch() error: string is not a string ===
330
+ try:
331
+ re.fullmatch(r'\d+', None)
332
+ assert False, 're.fullmatch with None string should raise TypeError'
333
+ except TypeError as e:
334
+ assert 'string' in str(e).lower(), 're.fullmatch None string error'
335
+
336
+ # === Object basic ===
337
+ assert bool(re.compile(r'\d+'))
338
+ assert bool(re.search(r'\w+', 'hello'))
339
+ assert isinstance(re.compile(r'\d+'), re.Pattern), 're.compile returns re.Pattern instance'
340
+ assert isinstance(re.search(r'\w+', 'hello'), re.Match), 're.search returns re.Match instance'
341
+ assert str(type(re.compile(r'\d+'))) == "<class 're.Pattern'>", 'type of compiled pattern is re.Pattern'
342
+ assert str(type(re.search(r'\w+', 'hello'))) == "<class 're.Match'>", 'type of search match is re.Match'
343
+
344
+ # === fullmatch with alternation ===
345
+ # fullmatch must try all alternatives to find a full-string match,
346
+ # not just pick the first alternative that matches somewhere
347
+ m = re.fullmatch('a|ab', 'ab')
348
+ assert m is not None, 'fullmatch with alternation finds full match'
349
+ assert m.group() == 'ab', 'fullmatch alternation matches full-string alternative'
350
+
351
+ m = re.fullmatch('ab|a', 'ab')
352
+ assert m is not None, 'fullmatch when full-match alternative is first'
353
+ assert m.group() == 'ab', 'fullmatch returns correct match when first alt matches'
354
+
355
+ m = re.fullmatch('cat|category', 'category')
356
+ assert m is not None, 'fullmatch alternation picks full-string alternative'
357
+ assert m.group() == 'category', 'fullmatch alternation returns correct match'
358
+
359
+ m = re.fullmatch('x|ab|a', 'ab')
360
+ assert m is not None, 'fullmatch with three alternatives'
361
+ assert m.group() == 'ab', 'fullmatch picks correct alternative from three'
362
+
363
+ # compiled pattern fullmatch with alternation
364
+ p = re.compile('a|ab')
365
+ m = p.fullmatch('ab')
366
+ assert m is not None, 'compiled fullmatch with alternation finds full match'
367
+ assert m.group() == 'ab', 'compiled fullmatch alternation matches correctly'
368
+
369
+ # fullmatch with alternation and groups
370
+ m = re.fullmatch('(a)|(ab)', 'ab')
371
+ assert m is not None, 'fullmatch alternation with groups'
372
+ assert m.group(0) == 'ab', 'fullmatch alternation groups: group(0) is full match'
373
+ assert m.group(1) is None, 'fullmatch alternation groups: group(1) did not match'
374
+ assert m.group(2) == 'ab', 'fullmatch alternation groups: group(2) matched'
375
+
376
+ # fullmatch with quantifiers
377
+ m = re.fullmatch('a+|b+', 'aaa')
378
+ assert m is not None, 'fullmatch a+|b+ on aaa'
379
+ assert m.group() == 'aaa', 'fullmatch a+|b+ returns full match'
380
+
381
+ # fullmatch with .* (greedy)
382
+ m = re.fullmatch('.*', 'anything')
383
+ assert m is not None, 'fullmatch .* matches anything'
384
+ assert m.group() == 'anything', 'fullmatch .* returns full string'
385
+
386
+ # fullmatch on empty string with empty pattern
387
+ m = re.fullmatch('', '')
388
+ assert m is not None, 'fullmatch empty pattern on empty string'
389
+ assert m.group() == '', 'fullmatch empty returns empty'
390
+
391
+ # fullmatch should not match partial strings even with alternation
392
+ m = re.fullmatch('a|ab', 'abc')
393
+ assert m is None, 'fullmatch rejects when no alternative spans full string'
394
+
395
+ # fullmatch with MULTILINE should still require full-string match
396
+ p = re.compile('hello', re.MULTILINE)
397
+ m = p.fullmatch('hello')
398
+ assert m is not None, 'fullmatch MULTILINE on single line'
399
+ assert m.group() == 'hello', 'fullmatch MULTILINE returns correct match'
400
+
401
+ m = p.fullmatch('hello\nworld')
402
+ assert m is None, 'fullmatch MULTILINE rejects multi-line input'
403
+
404
+ # fullmatch with alternation and flags combined
405
+ p = re.compile('(a+)|(b+)', re.MULTILINE)
406
+ m = p.fullmatch('bbb')
407
+ assert m is not None, 'fullmatch groups with MULTILINE flag'
408
+ assert m.group(0) == 'bbb', 'fullmatch groups MULTILINE: group(0) correct'
409
+ assert m.group(1) is None, 'fullmatch groups MULTILINE: group(1) did not match'
410
+ assert m.group(2) == 'bbb', 'fullmatch groups MULTILINE: group(2) matched'
411
+
412
+ # === Literal $ in replacement ===
413
+ result = re.sub(r'\d+', '$', 'a1b2')
414
+ assert result == 'a$b$', 'literal $ in replacement is preserved'
415
+
416
+ result = re.sub(r'\d+', '$1', 'a1b2')
417
+ assert result == 'a$1b$1', 'literal $1 in replacement is preserved (not backreference)'
418
+
419
+ result = re.sub(r'\d+', '$$', 'a1b2')
420
+ assert result == 'a$$b$$', 'literal $$ in replacement is preserved'
421
+
422
+ # compiled pattern with $ in replacement
423
+ p = re.compile(r'\d+')
424
+ result = p.sub('$', 'a1b2')
425
+ assert result == 'a$b$', 'compiled pattern: literal $ in replacement is preserved'
426
+
427
+ result = re.sub(r'\d+', '$$$', 'a1b2')
428
+ assert result == 'a$$$b$$$', 'triple $ in replacement preserved'
429
+
430
+ # plain replacement with no special chars
431
+ result = re.sub(r'\d+', 'NUM', 'a1 b2')
432
+ assert result == 'aNUM bNUM', 'plain replacement without special chars'
433
+
434
+ # === Negative count in re.sub ===
435
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', -1)
436
+ assert result == 'a1 b2 c3', 're.sub with negative count returns string unchanged'
437
+
438
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', -100)
439
+ assert result == 'a1 b2 c3', 're.sub with large negative count returns string unchanged'
440
+
441
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', -999)
442
+ assert result == 'a1 b2 c3', 're.sub with very large negative count returns string unchanged'
443
+
444
+ # compiled pattern with negative count
445
+ p = re.compile(r'\d+')
446
+ result = p.sub('X', 'a1 b2 c3', -1)
447
+ assert result == 'a1 b2 c3', 'compiled pattern: negative count returns string unchanged'
448
+
449
+ result = p.sub('X', 'a1 b2 c3', -100)
450
+ assert result == 'a1 b2 c3', 'compiled pattern: large negative count returns string unchanged'
451
+
452
+ # negative count with empty string
453
+ result = re.sub(r'\d+', 'X', '', -1)
454
+ assert result == '', 're.sub negative count on empty string'
455
+
456
+ # === re.sub with count boundary values ===
457
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', 0)
458
+ assert result == 'aX bX cX', 're.sub count=0 replaces all (explicit)'
459
+
460
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', 1)
461
+ assert result == 'aX b2 c3', 're.sub count=1 replaces first only'
462
+
463
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', 3)
464
+ assert result == 'aX bX cX', 're.sub count=3 replaces all three'
465
+
466
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', 100)
467
+ assert result == 'aX bX cX', 're.sub count exceeding matches replaces all'
468
+
469
+ # === Pattern.sub() error: too many arguments ===
470
+ p = re.compile(r'\d+')
471
+ try:
472
+ p.sub('X', 'a1b2', 0, 'extra')
473
+ assert False, 'Pattern.sub with 4 args should raise TypeError'
474
+ except TypeError as e:
475
+ assert 'at most 3' in str(e), 'Pattern.sub too many args error'
476
+
477
+ # === Flags on module-level functions ===
478
+ # re.search with flags
479
+ m = re.search(r'hello', 'HELLO WORLD', re.IGNORECASE)
480
+ assert m is not None, 're.search with IGNORECASE flag'
481
+ assert m.group() == 'HELLO', 're.search IGNORECASE matches case-insensitively'
482
+
483
+ m = re.search(r'hello', 'HELLO WORLD')
484
+ assert m is None, 're.search without flags is case-sensitive'
485
+
486
+ # re.match with flags
487
+ m = re.match(r'hello', 'HELLO WORLD', re.IGNORECASE)
488
+ assert m is not None, 're.match with IGNORECASE flag'
489
+ assert m.group() == 'HELLO', 're.match IGNORECASE matches case-insensitively'
490
+
491
+ # re.fullmatch with flags
492
+ m = re.fullmatch(r'hello', 'HELLO', re.IGNORECASE)
493
+ assert m is not None, 're.fullmatch with IGNORECASE flag'
494
+ assert m.group() == 'HELLO', 're.fullmatch IGNORECASE matches case-insensitively'
495
+
496
+ # re.findall with flags
497
+ result = re.findall(r'hello', 'Hello HELLO hello', re.IGNORECASE)
498
+ assert result == ['Hello', 'HELLO', 'hello'], 're.findall with IGNORECASE flag'
499
+
500
+ # re.sub with flags (5th positional arg)
501
+ result = re.sub(r'hello', 'X', 'Hello HELLO hello', 0, re.IGNORECASE)
502
+ assert result == 'X X X', 're.sub with flags as 5th arg'
503
+
504
+ # re.search with DOTALL flag
505
+ m = re.search(r'a.b', 'a\nb', re.DOTALL)
506
+ assert m is not None, 're.search with DOTALL flag'
507
+ assert m.group() == 'a\nb', 're.search DOTALL matches across newlines'
508
+
509
+ # re.findall with MULTILINE
510
+ result = re.findall(r'^\w+', 'hello\nworld\nfoo', re.MULTILINE)
511
+ assert result == ['hello', 'world', 'foo'], 're.findall with MULTILINE flag'
512
+
513
+ # re.search with combined flags
514
+ m = re.search(r'hello.*world', 'HELLO\nWORLD', re.IGNORECASE | re.DOTALL)
515
+ assert m is not None, 're.search with IGNORECASE | DOTALL'
516
+ assert m.group() == 'HELLO\nWORLD', 're.search combined flags work'
517
+
518
+ # === re.ASCII flag ===
519
+ assert re.ASCII == 256, 're.ASCII flag value'
520
+ assert re.A == re.ASCII, 're.A is alias for re.ASCII'
521
+
522
+ # re.ASCII flag is accepted (doesn't error)
523
+ p = re.compile(r'\w+', re.ASCII)
524
+ m = p.search('cafe')
525
+ assert m is not None, 'ASCII mode matches ASCII word chars'
526
+ assert m.group() == 'cafe', 'ASCII mode returns correct match'
527
+
528
+ # re.ASCII can be combined with other flags
529
+ p = re.compile(r'hello', re.ASCII | re.IGNORECASE)
530
+ m = p.search('HELLO')
531
+ assert m is not None, 'ASCII | IGNORECASE combined'
532
+ assert m.group() == 'HELLO', 'ASCII | IGNORECASE matches correctly'
533
+
534
+ # Pattern repr with re.ASCII flag
535
+ p = re.compile(r'\w+', re.ASCII)
536
+ assert repr(p) == r"re.compile('\\w+', re.ASCII)", 'Pattern repr with ASCII flag'
537
+
538
+ p = re.compile(r'\w+', re.ASCII | re.IGNORECASE)
539
+ assert repr(p) == r"re.compile('\\w+', re.IGNORECASE|re.ASCII)", 'Pattern repr with ASCII|IGNORECASE flags'
540
+
541
+ # re.ASCII on module-level functions
542
+ m = re.search(r'\w+', 'cafe', re.ASCII)
543
+ assert m is not None, 're.search with re.ASCII flag'
544
+ assert m.group() == 'cafe', 're.search re.ASCII returns correct match'
545
+
546
+ m = re.match(r'\w+', 'cafe', re.A)
547
+ assert m is not None, 're.match with re.A alias'
548
+ assert m.group() == 'cafe', 're.match re.A returns correct match'
549
+
550
+ m = re.fullmatch(r'\w+', 'cafe', re.ASCII)
551
+ assert m is not None, 're.fullmatch with re.ASCII flag'
552
+ assert m.group() == 'cafe', 're.fullmatch re.ASCII returns correct match'
553
+
554
+ result = re.findall(r'\w+', 'a b c', re.ASCII)
555
+ assert result == ['a', 'b', 'c'], 're.findall with re.ASCII flag'
556
+
557
+ # === match with alternation (anchored) ===
558
+ # re.match('b|ab', 'ab') must try alternation at position 0
559
+ m = re.match(r'b|ab', 'ab')
560
+ assert m is not None, 're.match with alternation at start'
561
+ assert m.group() == 'ab', 're.match alternation: second alt matches at pos 0'
562
+
563
+ # re.match with alternation: first alt doesn't start at pos 0
564
+ m = re.match(r'world|hello', 'hello world')
565
+ assert m is not None, 're.match alternation: finds match starting at pos 0'
566
+ assert m.group() == 'hello', 're.match alternation: correct alternative matches'
567
+
568
+ # compiled pattern match with alternation
569
+ p = re.compile(r'b|ab')
570
+ m = p.match('ab')
571
+ assert m is not None, 'Pattern.match with alternation'
572
+ assert m.group() == 'ab', 'Pattern.match alternation: second alt matches at pos 0'
573
+
574
+ # match with alternation where shorter alt matches at pos 0
575
+ m = re.match(r'a|ab', 'ab')
576
+ assert m is not None, 're.match alternation: shorter alt at pos 0'
577
+ assert m.group() == 'a', 're.match alternation: leftmost match wins (like CPython)'
578
+
579
+ # match with alternation + flags
580
+ m = re.match(r'B|AB', 'ab', re.IGNORECASE)
581
+ assert m is not None, 're.match alternation with IGNORECASE flag'
582
+ assert m.group() == 'ab', 're.match alternation IGNORECASE: second alt matches at pos 0'
583
+
584
+ # compiled match with alternation + flags
585
+ p = re.compile(r'B|AB', re.IGNORECASE)
586
+ m = p.match('ab')
587
+ assert m is not None, 'Pattern.match alternation with IGNORECASE flag'
588
+ assert m.group() == 'ab', 'Pattern.match alternation IGNORECASE matches correctly'
589
+
590
+ # === \g<N> numeric backreference in replacement ===
591
+ result = re.sub(r'(\w+)\s+(\w+)', r'\g<2> \g<1>', 'hello world')
592
+ assert result == 'world hello', r'\g<N> numeric backreference swaps groups'
593
+
594
+ result = re.sub(r'(\w+)\s+(\w+)', r'\g<0>', 'hello world')
595
+ assert result == 'hello world', r'\g<0> is the full match'
596
+
597
+ result = re.sub(r'(\w+)', r'\g<1>!', 'hello world')
598
+ assert result == 'hello! world!', r'\g<1> with suffix'
599
+
600
+ # \g<N> with multiple replacements in one string
601
+ result = re.sub(r'(\w+)\s+(\w+)\s+(\w+)', r'\g<3>-\g<2>-\g<1>', 'a b c')
602
+ assert result == 'c-b-a', r'\g<N> multiple groups reversed'
603
+
604
+ # \g<N> mixed with \1 style backrefs
605
+ result = re.sub(r'(\w+)\s+(\w+)', r'\1-\g<2>', 'hello world')
606
+ assert result == 'hello-world', r'\1 and \g<2> mixed in replacement'
607
+
608
+ # \g<N> mixed with literal $
609
+ result = re.sub(r'(\w+)', r'$\g<1>$', 'hi')
610
+ assert result == '$hi$', r'\g<1> with literal $ signs'
611
+
612
+ # === \g<name> named backreference in replacement ===
613
+ result = re.sub(r'(?P<first>\w+)\s+(?P<second>\w+)', r'\g<second> \g<first>', 'hello world')
614
+ assert result == 'world hello', r'\g<name> named backreference swaps groups'
615
+
616
+ # \g<name> on compiled pattern
617
+ p = re.compile(r'(?P<word>\w+)')
618
+ result = p.sub(r'[\g<word>]', 'hello world')
619
+ assert result == '[hello] [world]', r'compiled pattern \g<name> backreference'
620
+
621
+ # \g<name> mixed with \g<N>
622
+ result = re.sub(r'(?P<a>\w+)\s+(\w+)', r'\g<a>-\g<2>', 'hello world')
623
+ assert result == 'hello-world', r'\g<name> and \g<N> mixed'
624
+
625
+ # === \g combined with other replacement features ===
626
+ result = re.sub(r'(\w+)', r'[\g<1>]', 'hi')
627
+ assert result == '[hi]', r'\g<1> with surrounding literal brackets'
628
+
629
+ # compiled pattern with \g
630
+ p = re.compile(r'(\w+)\s+(\w+)')
631
+ result = p.sub(r'\g<2>-\g<1>', 'hello world')
632
+ assert result == 'world-hello', r'compiled pattern \g<N> backreference'
633
+
634
+ # === Bool as int in re functions ===
635
+ # bool as flags (True=1, False=0)
636
+ m = re.search(r'hello', 'HELLO', False)
637
+ assert m is None, 'search flags=False (0) is case-sensitive'
638
+
639
+ m = re.match(r'hello', 'HELLO', False)
640
+ assert m is None, 'match flags=False is case-sensitive'
641
+
642
+ m = re.fullmatch(r'hello', 'HELLO', False)
643
+ assert m is None, 'fullmatch flags=False is case-sensitive'
644
+
645
+ result = re.findall(r'hello', 'HELLO hello', False)
646
+ assert result == ['hello'], 'findall flags=False is case-sensitive'
647
+
648
+ p = re.compile(r'hello', False)
649
+ assert p.flags & re.IGNORECASE == 0, 'compile with flags=False has no IGNORECASE'
650
+
651
+ p = re.compile(r'hello', True)
652
+ assert p.flags & 1 != 0, 'compile with flags=True stores 1'
653
+
654
+ # bool as count in re.sub (True=1 replacement, False=0=all)
655
+ result = re.sub(r'\d', 'X', '123', True)
656
+ assert result == 'X23', 'count=True replaces only first match'
657
+
658
+ result = re.sub(r'\d', 'X', '123', False)
659
+ assert result == 'XXX', 'count=False (0) replaces all matches'
660
+
661
+ # bool as count in Pattern.sub
662
+ p = re.compile(r'\d')
663
+ result = p.sub('X', '123', True)
664
+ assert result == 'X23', 'Pattern.sub count=True replaces only first'
665
+
666
+ result = p.sub('X', '123', False)
667
+ assert result == 'XXX', 'Pattern.sub count=False replaces all'
668
+
669
+ # === re.error alias (same as re.PatternError) ===
670
+ assert re.error is re.PatternError, 're.error is alias for re.PatternError'
671
+ try:
672
+ re.compile('(unclosed')
673
+ assert False, 'should raise'
674
+ except re.error as e:
675
+ assert len(str(e)) > 0, 're.error catches PatternError'
676
+
677
+ # === re.escape() ===
678
+ assert re.escape('hello') == 'hello', 're.escape leaves alphanumeric unchanged'
679
+ assert re.escape('hello world!') == 'hello\\ world!', 're.escape escapes space but not !'
680
+ assert re.escape('a.b+c*d?e') == 'a\\.b\\+c\\*d\\?e', 're.escape escapes regex metacharacters'
681
+ assert re.escape('') == '', 're.escape on empty string'
682
+ assert re.escape('[test]') == '\\[test\\]', 're.escape escapes brackets'
683
+ assert re.escape('price: $10') == 'price:\\ \\$10', 're.escape escapes space and dollar'
684
+ assert re.escape('a_b') == 'a_b', 're.escape preserves underscores'
685
+
686
+ # re.escape result works as a literal pattern
687
+ text = 'price is $10.00 (USD)'
688
+ escaped = re.escape('$10.00')
689
+ m = re.search(escaped, text)
690
+ assert m is not None, 'escaped pattern matches literally'
691
+ assert m.group() == '$10.00', 'escaped pattern matches the exact string'
692
+
693
+ # === re.sub() with keyword arguments ===
694
+ result = re.sub(r'\d+', 'X', 'a1 b2 c3', count=1)
695
+ assert result == 'aX b2 c3', 're.sub with count kwarg'
696
+
697
+ result = re.sub(r'hello', 'X', 'Hello HELLO hello', count=0, flags=re.IGNORECASE)
698
+ assert result == 'X X X', 're.sub with flags kwarg'
699
+
700
+ # Pattern.sub with count kwarg
701
+ p = re.compile(r'\d+')
702
+ result = p.sub('X', 'a1 b2 c3', count=1)
703
+ assert result == 'aX b2 c3', 'Pattern.sub with count kwarg'
704
+
705
+ # === re.split() ===
706
+ result = re.split(r'\s+', 'hello world foo')
707
+ assert result == ['hello', 'world', 'foo'], 're.split basic'
708
+
709
+ result = re.split(r'[,;]', 'a,b;c')
710
+ assert result == ['a', 'b', 'c'], 're.split on multiple delimiters'
711
+
712
+ result = re.split(r'\s+', 'hello world foo', maxsplit=1)
713
+ assert result == ['hello', 'world foo'], 're.split with maxsplit=1'
714
+
715
+ result = re.split(r'\s+', 'hello')
716
+ assert result == ['hello'], 're.split with no matches'
717
+
718
+ result = re.split(r'\s+', '')
719
+ assert result == [''], 're.split on empty string'
720
+
721
+ # Pattern.split
722
+ p = re.compile(r'[,;]')
723
+ result = p.split('a,b;c')
724
+ assert result == ['a', 'b', 'c'], 'Pattern.split basic'
725
+
726
+ result = p.split('a,b;c', maxsplit=1)
727
+ assert result == ['a', 'b;c'], 'Pattern.split with maxsplit kwarg'
728
+
729
+ # === re.finditer() ===
730
+ matches = list(re.finditer(r'\d+', 'a1 b22 c333'))
731
+ assert len(matches) == 3, 'finditer returns 3 matches'
732
+ assert matches[0].group() == '1', 'finditer match 0'
733
+ assert matches[1].group() == '22', 'finditer match 1'
734
+ assert matches[2].group() == '333', 'finditer match 2'
735
+
736
+ # finditer with no matches
737
+ matches = list(re.finditer(r'\d+', 'no numbers'))
738
+ assert len(matches) == 0, 'finditer with no matches returns empty'
739
+
740
+ # finditer iteration
741
+ groups = [m.group() for m in re.finditer(r'\w+', 'hello world')]
742
+ assert groups == ['hello', 'world'], 'finditer in list comprehension'
743
+
744
+ # Pattern.finditer
745
+ p = re.compile(r'\d+')
746
+ matches = list(p.finditer('a1 b22'))
747
+ assert len(matches) == 2, 'Pattern.finditer returns 2 matches'
748
+ assert matches[0].group() == '1', 'Pattern.finditer match 0'
749
+ assert matches[1].group() == '22', 'Pattern.finditer match 1'
750
+
751
+ # finditer with capture groups
752
+ matches = list(re.finditer(r'(\w+)=(\w+)', 'a=1 b=2'))
753
+ assert len(matches) == 2, 'finditer with groups returns 2 matches'
754
+ assert matches[0].group(1) == 'a', 'finditer group 1 of match 0'
755
+ assert matches[0].group(2) == '1', 'finditer group 2 of match 0'
756
+ assert matches[1].group(1) == 'b', 'finditer group 1 of match 1'