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.
- package/__tests__/adapter-schema.test.js +2 -0
- package/__tests__/config.test.js +62 -1
- package/__tests__/help-json.test.js +2 -0
- package/__tests__/mcp-adapter.test.js +14 -4
- package/__tests__/mcp-local.test.js +159 -0
- package/__tests__/mcp-stdio-jsonrpc.test.js +105 -0
- package/__tests__/monty-plugin.test.js +121 -0
- package/__tests__/plugin-browser-use-uninstall.test.js +23 -0
- package/__tests__/plugin-browser-use.test.js +77 -0
- package/__tests__/plugins-command.test.js +92 -1
- package/__tests__/plugins-learn.test.js +62 -0
- package/__tests__/plugins-registry.test.js +3 -1
- package/__tests__/resend-plugin.test.js +122 -0
- package/__tests__/skills.test.js +4 -0
- package/cli/adapter-schema.js +3 -2
- package/cli/adapters/mcp.js +22 -3
- package/cli/adapters/process.js +34 -7
- package/cli/config.js +27 -1
- package/cli/help-json.js +2 -2
- package/cli/mcp-diagnostics.js +152 -0
- package/cli/mcp-discovery.js +221 -0
- package/cli/mcp-local.js +267 -25
- package/cli/mcp-stdio-jsonrpc.js +246 -0
- package/cli/plugin-install-guidance.js +25 -0
- package/cli/plugins-command.js +86 -3
- package/cli/plugins-learn.js +177 -0
- package/cli/plugins-manager.js +3 -0
- package/cli/plugins-registry.js +2 -1
- package/cli/skills-mcp.js +102 -0
- package/cli/skills.js +6 -40
- package/cli/supercli.js +7 -2
- package/docs/initial/mcp-local-mode.md +35 -0
- package/docs/mcp-cheatsheet.md +324 -0
- package/docs/plugins.md +7 -0
- package/package.json +1 -1
- package/plugins/browser-use/plugin.json +23 -0
- package/plugins/browser-use/scripts/post-install.js +146 -0
- package/plugins/browser-use/scripts/post-uninstall.js +28 -0
- package/plugins/browser-use/skills/quickstart/SKILL.md +47 -0
- package/plugins/monty/README.md +49 -0
- package/plugins/monty/plugin.json +69 -0
- package/plugins/monty/scripts/post-install.js +73 -0
- package/plugins/monty/scripts/post-uninstall.js +23 -0
- package/plugins/monty/scripts/run-python.js +140 -0
- package/plugins/monty/scripts/setup-monty.js +27 -0
- package/plugins/plugins.json +29 -0
- package/plugins/resend/plugin.json +371 -0
- package/plugins/resend/scripts/post-install.js +59 -0
- package/plugins/resend/scripts/post-uninstall.js +23 -0
- package/plugins/resend/scripts/setup-resend.js +27 -0
- package/plugins/resend/skills/quickstart/SKILL.md +80 -0
- package/ref-monty/.cargo/config.toml +3 -0
- package/ref-monty/.claude/settings.json +60 -0
- package/ref-monty/.claude/skills/fastmod/SKILL.md +22 -0
- package/ref-monty/.claude/skills/python-playground/SKILL.md +47 -0
- package/ref-monty/.codecov.yml +12 -0
- package/ref-monty/.github/actions/build-pgo-wheel/action.yml +72 -0
- package/ref-monty/.github/workflows/ci.yml +776 -0
- package/ref-monty/.github/workflows/codspeed.yml +45 -0
- package/ref-monty/.github/workflows/init-npm-packages.yml +82 -0
- package/ref-monty/.pre-commit-config.yaml +47 -0
- package/ref-monty/.python-version +1 -0
- package/ref-monty/.rustfmt.toml +4 -0
- package/ref-monty/.zed/settings.json +11 -0
- package/ref-monty/CLAUDE.md +535 -0
- package/ref-monty/Cargo.lock +3798 -0
- package/ref-monty/Cargo.toml +87 -0
- package/ref-monty/LICENSE +21 -0
- package/ref-monty/Makefile +216 -0
- package/ref-monty/README.md +430 -0
- package/ref-monty/RELEASING.md +47 -0
- package/ref-monty/crates/fuzz/Cargo.toml +30 -0
- package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +37 -0
- package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +552 -0
- package/ref-monty/crates/monty/Cargo.toml +68 -0
- package/ref-monty/crates/monty/benches/main.rs +247 -0
- package/ref-monty/crates/monty/build.rs +10 -0
- package/ref-monty/crates/monty/src/args.rs +733 -0
- package/ref-monty/crates/monty/src/asyncio.rs +179 -0
- package/ref-monty/crates/monty/src/builtins/abs.rs +55 -0
- package/ref-monty/crates/monty/src/builtins/all.rs +30 -0
- package/ref-monty/crates/monty/src/builtins/any.rs +30 -0
- package/ref-monty/crates/monty/src/builtins/bin.rs +59 -0
- package/ref-monty/crates/monty/src/builtins/chr.rs +46 -0
- package/ref-monty/crates/monty/src/builtins/divmod.rs +164 -0
- package/ref-monty/crates/monty/src/builtins/enumerate.rs +52 -0
- package/ref-monty/crates/monty/src/builtins/filter.rs +67 -0
- package/ref-monty/crates/monty/src/builtins/getattr.rs +65 -0
- package/ref-monty/crates/monty/src/builtins/hash.rs +28 -0
- package/ref-monty/crates/monty/src/builtins/hex.rs +58 -0
- package/ref-monty/crates/monty/src/builtins/id.rs +24 -0
- package/ref-monty/crates/monty/src/builtins/isinstance.rs +68 -0
- package/ref-monty/crates/monty/src/builtins/len.rs +25 -0
- package/ref-monty/crates/monty/src/builtins/map.rs +98 -0
- package/ref-monty/crates/monty/src/builtins/min_max.rs +113 -0
- package/ref-monty/crates/monty/src/builtins/mod.rs +246 -0
- package/ref-monty/crates/monty/src/builtins/next.rs +21 -0
- package/ref-monty/crates/monty/src/builtins/oct.rs +59 -0
- package/ref-monty/crates/monty/src/builtins/ord.rs +67 -0
- package/ref-monty/crates/monty/src/builtins/pow.rs +365 -0
- package/ref-monty/crates/monty/src/builtins/print.rs +141 -0
- package/ref-monty/crates/monty/src/builtins/repr.rs +16 -0
- package/ref-monty/crates/monty/src/builtins/reversed.rs +28 -0
- package/ref-monty/crates/monty/src/builtins/round.rs +174 -0
- package/ref-monty/crates/monty/src/builtins/sorted.rs +151 -0
- package/ref-monty/crates/monty/src/builtins/sum.rs +66 -0
- package/ref-monty/crates/monty/src/builtins/type_.rs +16 -0
- package/ref-monty/crates/monty/src/builtins/zip.rs +77 -0
- package/ref-monty/crates/monty/src/bytecode/builder.rs +699 -0
- package/ref-monty/crates/monty/src/bytecode/code.rs +310 -0
- package/ref-monty/crates/monty/src/bytecode/compiler.rs +3206 -0
- package/ref-monty/crates/monty/src/bytecode/mod.rs +24 -0
- package/ref-monty/crates/monty/src/bytecode/op.rs +617 -0
- package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +1058 -0
- package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +63 -0
- package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +487 -0
- package/ref-monty/crates/monty/src/bytecode/vm/call.rs +767 -0
- package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +741 -0
- package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +147 -0
- package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +297 -0
- package/ref-monty/crates/monty/src/bytecode/vm/format.rs +132 -0
- package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +1958 -0
- package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +620 -0
- package/ref-monty/crates/monty/src/exception_private.rs +1513 -0
- package/ref-monty/crates/monty/src/exception_public.rs +346 -0
- package/ref-monty/crates/monty/src/expressions.rs +694 -0
- package/ref-monty/crates/monty/src/fstring.rs +854 -0
- package/ref-monty/crates/monty/src/function.rs +119 -0
- package/ref-monty/crates/monty/src/heap.rs +1073 -0
- package/ref-monty/crates/monty/src/heap_data.rs +985 -0
- package/ref-monty/crates/monty/src/heap_traits.rs +312 -0
- package/ref-monty/crates/monty/src/intern.rs +837 -0
- package/ref-monty/crates/monty/src/io.rs +106 -0
- package/ref-monty/crates/monty/src/lib.rs +52 -0
- package/ref-monty/crates/monty/src/modules/asyncio.rs +144 -0
- package/ref-monty/crates/monty/src/modules/math.rs +1453 -0
- package/ref-monty/crates/monty/src/modules/mod.rs +120 -0
- package/ref-monty/crates/monty/src/modules/os.rs +116 -0
- package/ref-monty/crates/monty/src/modules/pathlib.rs +33 -0
- package/ref-monty/crates/monty/src/modules/re.rs +606 -0
- package/ref-monty/crates/monty/src/modules/sys.rs +60 -0
- package/ref-monty/crates/monty/src/modules/typing.rs +70 -0
- package/ref-monty/crates/monty/src/namespace.rs +21 -0
- package/ref-monty/crates/monty/src/object.rs +1040 -0
- package/ref-monty/crates/monty/src/os.rs +215 -0
- package/ref-monty/crates/monty/src/parse.rs +1730 -0
- package/ref-monty/crates/monty/src/prepare.rs +3015 -0
- package/ref-monty/crates/monty/src/repl.rs +1109 -0
- package/ref-monty/crates/monty/src/resource.rs +559 -0
- package/ref-monty/crates/monty/src/run.rs +457 -0
- package/ref-monty/crates/monty/src/run_progress.rs +821 -0
- package/ref-monty/crates/monty/src/signature.rs +651 -0
- package/ref-monty/crates/monty/src/sorting.rs +100 -0
- package/ref-monty/crates/monty/src/types/bytes.rs +2356 -0
- package/ref-monty/crates/monty/src/types/dataclass.rs +345 -0
- package/ref-monty/crates/monty/src/types/dict.rs +879 -0
- package/ref-monty/crates/monty/src/types/dict_view.rs +619 -0
- package/ref-monty/crates/monty/src/types/iter.rs +799 -0
- package/ref-monty/crates/monty/src/types/list.rs +929 -0
- package/ref-monty/crates/monty/src/types/long_int.rs +211 -0
- package/ref-monty/crates/monty/src/types/mod.rs +48 -0
- package/ref-monty/crates/monty/src/types/module.rs +146 -0
- package/ref-monty/crates/monty/src/types/namedtuple.rs +261 -0
- package/ref-monty/crates/monty/src/types/path.rs +596 -0
- package/ref-monty/crates/monty/src/types/property.rs +35 -0
- package/ref-monty/crates/monty/src/types/py_trait.rs +322 -0
- package/ref-monty/crates/monty/src/types/range.rs +285 -0
- package/ref-monty/crates/monty/src/types/re_match.rs +522 -0
- package/ref-monty/crates/monty/src/types/re_pattern.rs +726 -0
- package/ref-monty/crates/monty/src/types/set.rs +1373 -0
- package/ref-monty/crates/monty/src/types/slice.rs +257 -0
- package/ref-monty/crates/monty/src/types/str.rs +2051 -0
- package/ref-monty/crates/monty/src/types/tuple.rs +376 -0
- package/ref-monty/crates/monty/src/types/type.rs +407 -0
- package/ref-monty/crates/monty/src/value.rs +2558 -0
- package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__id_too_many.py +2 -0
- package/ref-monty/crates/monty/test_cases/args__len_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/args__len_too_many.py +2 -0
- package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +9 -0
- package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +9 -0
- package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +9 -0
- package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +2 -0
- package/ref-monty/crates/monty/test_cases/assert__fail.py +2 -0
- package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +2 -0
- package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +3 -0
- package/ref-monty/crates/monty/test_cases/assert__ops.py +11 -0
- package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +47 -0
- package/ref-monty/crates/monty/test_cases/async__basic.py +10 -0
- package/ref-monty/crates/monty/test_cases/async__closure.py +14 -0
- package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +16 -0
- package/ref-monty/crates/monty/test_cases/async__exception.py +10 -0
- package/ref-monty/crates/monty/test_cases/async__ext_call.py +73 -0
- package/ref-monty/crates/monty/test_cases/async__gather_all.py +85 -0
- package/ref-monty/crates/monty/test_cases/async__nested_await.py +15 -0
- package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +37 -0
- package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +10 -0
- package/ref-monty/crates/monty/test_cases/async__not_imported.py +14 -0
- package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +27 -0
- package/ref-monty/crates/monty/test_cases/async__return_types.py +31 -0
- package/ref-monty/crates/monty/test_cases/async__sequential.py +16 -0
- package/ref-monty/crates/monty/test_cases/async__traceback.py +19 -0
- package/ref-monty/crates/monty/test_cases/async__with_args.py +14 -0
- package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +12 -0
- package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +68 -0
- package/ref-monty/crates/monty/test_cases/bool__ops.py +20 -0
- package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/builtin__filter.py +62 -0
- package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +11 -0
- package/ref-monty/crates/monty/test_cases/builtin__getattr.py +84 -0
- package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +42 -0
- package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +66 -0
- package/ref-monty/crates/monty/test_cases/builtin__map.py +74 -0
- package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +11 -0
- package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +154 -0
- package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +148 -0
- package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +10 -0
- package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +9 -0
- package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +12 -0
- package/ref-monty/crates/monty/test_cases/builtin__repr.py +3 -0
- package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +73 -0
- package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +18 -0
- package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +10 -0
- package/ref-monty/crates/monty/test_cases/bytes__methods.py +394 -0
- package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +9 -0
- package/ref-monty/crates/monty/test_cases/bytes__ops.py +90 -0
- package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/call_object.py +3 -0
- package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +79 -0
- package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +81 -0
- package/ref-monty/crates/monty/test_cases/closure__pep448.py +203 -0
- package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +13 -0
- package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +120 -0
- package/ref-monty/crates/monty/test_cases/comprehension__all.py +208 -0
- package/ref-monty/crates/monty/test_cases/comprehension__scope.py +7 -0
- package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +14 -0
- package/ref-monty/crates/monty/test_cases/dataclass__basic.py +238 -0
- package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +12 -0
- package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +12 -0
- package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +3 -0
- package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +3 -0
- package/ref-monty/crates/monty/test_cases/dict__methods.py +151 -0
- package/ref-monty/crates/monty/test_cases/dict__ops.py +133 -0
- package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +4 -0
- package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +9 -0
- package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +3 -0
- package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__views.py +165 -0
- package/ref-monty/crates/monty/test_cases/edge__all.py +26 -0
- package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +2 -0
- package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +2 -0
- package/ref-monty/crates/monty/test_cases/exc__args.py +16 -0
- package/ref-monty/crates/monty/test_cases/exc__str.py +15 -0
- package/ref-monty/crates/monty/test_cases/execute_ok__all.py +54 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +4 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +4 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +3 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +4 -0
- package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +22 -0
- package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +7 -0
- package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +34 -0
- package/ref-monty/crates/monty/test_cases/ext_call__basic.py +99 -0
- package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +37 -0
- package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +16 -0
- package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +26 -0
- package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +18 -0
- package/ref-monty/crates/monty/test_cases/ext_call__elif.py +171 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc.py +4 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +39 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +31 -0
- package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +171 -0
- package/ref-monty/crates/monty/test_cases/ext_call__for.py +114 -0
- package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +12 -0
- package/ref-monty/crates/monty/test_cases/ext_call__if.py +135 -0
- package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +37 -0
- package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +14 -0
- package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +40 -0
- package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +7 -0
- package/ref-monty/crates/monty/test_cases/ext_call__literals.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +32 -0
- package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +69 -0
- package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +4 -0
- package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +14 -0
- package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +19 -0
- package/ref-monty/crates/monty/test_cases/ext_call__return.py +28 -0
- package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +25 -0
- package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +7 -0
- package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +28 -0
- package/ref-monty/crates/monty/test_cases/ext_call__try.py +280 -0
- package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +10 -0
- package/ref-monty/crates/monty/test_cases/ext_call__unary.py +13 -0
- package/ref-monty/crates/monty/test_cases/frozenset__ops.py +178 -0
- package/ref-monty/crates/monty/test_cases/fstring__all.py +236 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +4 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +4 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +4 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +3 -0
- package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__call_unpack.py +42 -0
- package/ref-monty/crates/monty/test_cases/function__defaults.py +117 -0
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +9 -0
- package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +9 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +9 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +13 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +8 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +173 -0
- package/ref-monty/crates/monty/test_cases/function__ops.py +294 -0
- package/ref-monty/crates/monty/test_cases/function__return_none.py +42 -0
- package/ref-monty/crates/monty/test_cases/function__signatures.py +47 -0
- package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +6 -0
- package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +7 -0
- package/ref-monty/crates/monty/test_cases/global__ops.py +163 -0
- package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +2 -0
- package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +2 -0
- package/ref-monty/crates/monty/test_cases/hash__ops.py +153 -0
- package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +3 -0
- package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +5 -0
- package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +3 -0
- package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +10 -0
- package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +6 -0
- package/ref-monty/crates/monty/test_cases/id__ops.py +97 -0
- package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +3 -0
- package/ref-monty/crates/monty/test_cases/if__elif_else.py +207 -0
- package/ref-monty/crates/monty/test_cases/if__raise_elif.py +11 -0
- package/ref-monty/crates/monty/test_cases/if__raise_else.py +13 -0
- package/ref-monty/crates/monty/test_cases/if__raise_if.py +9 -0
- package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +18 -0
- package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +16 -0
- package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +55 -0
- package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__local_scope.py +68 -0
- package/ref-monty/crates/monty/test_cases/import__os.py +25 -0
- package/ref-monty/crates/monty/test_cases/import__relative_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +14 -0
- package/ref-monty/crates/monty/test_cases/import__star_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/import__sys.py +47 -0
- package/ref-monty/crates/monty/test_cases/import__sys_monty.py +28 -0
- package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +37 -0
- package/ref-monty/crates/monty/test_cases/import__typing.py +25 -0
- package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +4 -0
- package/ref-monty/crates/monty/test_cases/int__bigint.py +467 -0
- package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +260 -0
- package/ref-monty/crates/monty/test_cases/int__ops.py +219 -0
- package/ref-monty/crates/monty/test_cases/int__overflow_division.py +84 -0
- package/ref-monty/crates/monty/test_cases/is_variant__all.py +36 -0
- package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +4 -0
- package/ref-monty/crates/monty/test_cases/iter__for.py +243 -0
- package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +66 -0
- package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +20 -0
- package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +7 -0
- package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +3 -0
- package/ref-monty/crates/monty/test_cases/lambda__all.py +145 -0
- package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +7 -0
- package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +3 -0
- package/ref-monty/crates/monty/test_cases/list__index_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +10 -0
- package/ref-monty/crates/monty/test_cases/list__ops.py +473 -0
- package/ref-monty/crates/monty/test_cases/list__pop_empty.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +13 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +13 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/longint__index_error.py +3 -0
- package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +3 -0
- package/ref-monty/crates/monty/test_cases/loop__break_continue.py +113 -0
- package/ref-monty/crates/monty/test_cases/loop__break_finally.py +69 -0
- package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +13 -0
- package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +55 -0
- package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +81 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +13 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +60 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__module.py +1432 -0
- package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +259 -0
- package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +19 -0
- package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +12 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +9 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +9 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +16 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +10 -0
- package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +11 -0
- package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +34 -0
- package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +3 -0
- package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +353 -0
- package/ref-monty/crates/monty/test_cases/os__environ.py +40 -0
- package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +5 -0
- package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +5 -0
- package/ref-monty/crates/monty/test_cases/parse_error__complex.py +3 -0
- package/ref-monty/crates/monty/test_cases/pathlib__import.py +11 -0
- package/ref-monty/crates/monty/test_cases/pathlib__os.py +136 -0
- package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +12 -0
- package/ref-monty/crates/monty/test_cases/pathlib__pure.py +81 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +5 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +6 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +5 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +6 -0
- package/ref-monty/crates/monty/test_cases/range__error_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +2 -0
- package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/range__ops.py +236 -0
- package/ref-monty/crates/monty/test_cases/re__basic.py +756 -0
- package/ref-monty/crates/monty/test_cases/re__grouping.py +241 -0
- package/ref-monty/crates/monty/test_cases/re__match.py +148 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +26 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +23 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +46 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +12 -0
- package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +13 -0
- package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +18 -0
- package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +12 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +14 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +6 -0
- package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +16 -0
- package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +18 -0
- package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +25 -0
- package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +4 -0
- package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +27 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +6 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +4 -0
- package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +37 -0
- package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +34 -0
- package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +31 -0
- package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +4 -0
- package/ref-monty/crates/monty/test_cases/refcount__single_list.py +3 -0
- package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +24 -0
- package/ref-monty/crates/monty/test_cases/set__ops.py +191 -0
- package/ref-monty/crates/monty/test_cases/set__review_bugs.py +35 -0
- package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +2 -0
- package/ref-monty/crates/monty/test_cases/slice__kwargs.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__no_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__ops.py +149 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/str__index_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_no_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_non_string.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__methods.py +327 -0
- package/ref-monty/crates/monty/test_cases/str__ops.py +162 -0
- package/ref-monty/crates/monty/test_cases/str__partition_empty.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +9 -0
- package/ref-monty/crates/monty/test_cases/sys__types.py +7 -0
- package/ref-monty/crates/monty/test_cases/traceback__division_error.py +30 -0
- package/ref-monty/crates/monty/test_cases/traceback__index_error.py +17 -0
- package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +10 -0
- package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +29 -0
- package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +10 -0
- package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +24 -0
- package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +9 -0
- package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +23 -0
- package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +11 -0
- package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +16 -0
- package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +16 -0
- package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +16 -0
- package/ref-monty/crates/monty/test_cases/try_except__all.py +472 -0
- package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +2 -0
- package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +5 -0
- package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +3 -0
- package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +10 -0
- package/ref-monty/crates/monty/test_cases/tuple__methods.py +19 -0
- package/ref-monty/crates/monty/test_cases/tuple__ops.py +133 -0
- package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__ops.py +200 -0
- package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +3 -0
- package/ref-monty/crates/monty/test_cases/type__shadow_int.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__shadow_len.py +3 -0
- package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +6 -0
- package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +4 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +4 -0
- package/ref-monty/crates/monty/test_cases/typing__types.py +24 -0
- package/ref-monty/crates/monty/test_cases/unpack__nested.py +48 -0
- package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +9 -0
- package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +9 -0
- package/ref-monty/crates/monty/test_cases/unpack__ops.py +153 -0
- package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +9 -0
- package/ref-monty/crates/monty/test_cases/unpack__too_many.py +9 -0
- package/ref-monty/crates/monty/test_cases/version__cpython.py +4 -0
- package/ref-monty/crates/monty/test_cases/walrus__all.py +178 -0
- package/ref-monty/crates/monty/test_cases/while__all.py +206 -0
- package/ref-monty/crates/monty/tests/asyncio.rs +764 -0
- package/ref-monty/crates/monty/tests/binary_serde.rs +185 -0
- package/ref-monty/crates/monty/tests/bytecode_limits.rs +248 -0
- package/ref-monty/crates/monty/tests/datatest_runner.rs +2029 -0
- package/ref-monty/crates/monty/tests/inputs.rs +420 -0
- package/ref-monty/crates/monty/tests/json_serde.rs +250 -0
- package/ref-monty/crates/monty/tests/main.rs +71 -0
- package/ref-monty/crates/monty/tests/math_module.rs +114 -0
- package/ref-monty/crates/monty/tests/name_lookup.rs +482 -0
- package/ref-monty/crates/monty/tests/os_tests.rs +459 -0
- package/ref-monty/crates/monty/tests/parse_errors.rs +441 -0
- package/ref-monty/crates/monty/tests/print_writer.rs +238 -0
- package/ref-monty/crates/monty/tests/py_object.rs +121 -0
- package/ref-monty/crates/monty/tests/regex.rs +90 -0
- package/ref-monty/crates/monty/tests/repl.rs +344 -0
- package/ref-monty/crates/monty/tests/resource_limits.rs +1826 -0
- package/ref-monty/crates/monty/tests/try_from.rs +167 -0
- package/ref-monty/crates/monty-cli/Cargo.toml +25 -0
- package/ref-monty/crates/monty-cli/src/main.rs +541 -0
- package/ref-monty/crates/monty-js/.cargo/config.toml +2 -0
- package/ref-monty/crates/monty-js/.prettierignore +8 -0
- package/ref-monty/crates/monty-js/Cargo.toml +32 -0
- package/ref-monty/crates/monty-js/README.md +207 -0
- package/ref-monty/crates/monty-js/__test__/async.spec.ts +350 -0
- package/ref-monty/crates/monty-js/__test__/basic.spec.ts +114 -0
- package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +427 -0
- package/ref-monty/crates/monty-js/__test__/external.spec.ts +354 -0
- package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +143 -0
- package/ref-monty/crates/monty-js/__test__/limits.spec.ts +162 -0
- package/ref-monty/crates/monty-js/__test__/package.json +3 -0
- package/ref-monty/crates/monty-js/__test__/print.spec.ts +229 -0
- package/ref-monty/crates/monty-js/__test__/repl.spec.ts +34 -0
- package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +205 -0
- package/ref-monty/crates/monty-js/__test__/start.spec.ts +443 -0
- package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +147 -0
- package/ref-monty/crates/monty-js/__test__/types.spec.ts +319 -0
- package/ref-monty/crates/monty-js/build.rs +61 -0
- package/ref-monty/crates/monty-js/index-header.d.ts +3 -0
- package/ref-monty/crates/monty-js/package-lock.json +4694 -0
- package/ref-monty/crates/monty-js/package.json +100 -0
- package/ref-monty/crates/monty-js/scripts/smoke-test.sh +69 -0
- package/ref-monty/crates/monty-js/smoke-test/package.json +17 -0
- package/ref-monty/crates/monty-js/smoke-test/test.ts +171 -0
- package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +11 -0
- package/ref-monty/crates/monty-js/src/convert.rs +648 -0
- package/ref-monty/crates/monty-js/src/exceptions.rs +293 -0
- package/ref-monty/crates/monty-js/src/lib.rs +41 -0
- package/ref-monty/crates/monty-js/src/limits.rs +53 -0
- package/ref-monty/crates/monty-js/src/monty_cls.rs +1407 -0
- package/ref-monty/crates/monty-js/tsconfig.json +17 -0
- package/ref-monty/crates/monty-js/wrapper.ts +701 -0
- package/ref-monty/crates/monty-python/Cargo.toml +38 -0
- package/ref-monty/crates/monty-python/README.md +134 -0
- package/ref-monty/crates/monty-python/build.rs +4 -0
- package/ref-monty/crates/monty-python/example.py +40 -0
- package/ref-monty/crates/monty-python/exercise.py +46 -0
- package/ref-monty/crates/monty-python/pyproject.toml +57 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +281 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +677 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +933 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
- package/ref-monty/crates/monty-python/src/convert.rs +273 -0
- package/ref-monty/crates/monty-python/src/dataclass.rs +461 -0
- package/ref-monty/crates/monty-python/src/exceptions.rs +557 -0
- package/ref-monty/crates/monty-python/src/external.rs +165 -0
- package/ref-monty/crates/monty-python/src/lib.rs +77 -0
- package/ref-monty/crates/monty-python/src/limits.rs +142 -0
- package/ref-monty/crates/monty-python/src/monty_cls.rs +1650 -0
- package/ref-monty/crates/monty-python/src/repl.rs +470 -0
- package/ref-monty/crates/monty-python/src/serialization.rs +761 -0
- package/ref-monty/crates/monty-python/tests/test_async.py +1201 -0
- package/ref-monty/crates/monty-python/tests/test_basic.py +66 -0
- package/ref-monty/crates/monty-python/tests/test_dataclasses.py +971 -0
- package/ref-monty/crates/monty-python/tests/test_exceptions.py +361 -0
- package/ref-monty/crates/monty-python/tests/test_external.py +367 -0
- package/ref-monty/crates/monty-python/tests/test_inputs.py +126 -0
- package/ref-monty/crates/monty-python/tests/test_limits.py +257 -0
- package/ref-monty/crates/monty-python/tests/test_os_access.py +1286 -0
- package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +731 -0
- package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +483 -0
- package/ref-monty/crates/monty-python/tests/test_os_calls.py +819 -0
- package/ref-monty/crates/monty-python/tests/test_print.py +208 -0
- package/ref-monty/crates/monty-python/tests/test_re.py +170 -0
- package/ref-monty/crates/monty-python/tests/test_readme_examples.py +20 -0
- package/ref-monty/crates/monty-python/tests/test_repl.py +749 -0
- package/ref-monty/crates/monty-python/tests/test_serialize.py +284 -0
- package/ref-monty/crates/monty-python/tests/test_start.py +346 -0
- package/ref-monty/crates/monty-python/tests/test_threading.py +163 -0
- package/ref-monty/crates/monty-python/tests/test_type_check.py +344 -0
- package/ref-monty/crates/monty-python/tests/test_types.py +553 -0
- package/ref-monty/crates/monty-type-checking/Cargo.toml +32 -0
- package/ref-monty/crates/monty-type-checking/src/db.rs +116 -0
- package/ref-monty/crates/monty-type-checking/src/lib.rs +4 -0
- package/ref-monty/crates/monty-type-checking/src/type_check.rs +280 -0
- package/ref-monty/crates/monty-type-checking/tests/bad_types.py +109 -0
- package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +21 -0
- package/ref-monty/crates/monty-type-checking/tests/good_types.py +475 -0
- package/ref-monty/crates/monty-type-checking/tests/main.rs +205 -0
- package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +56 -0
- package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +41 -0
- package/ref-monty/crates/monty-typeshed/Cargo.toml +29 -0
- package/ref-monty/crates/monty-typeshed/README.md +11 -0
- package/ref-monty/crates/monty-typeshed/build.rs +101 -0
- package/ref-monty/crates/monty-typeshed/custom/README.md +1 -0
- package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +138 -0
- package/ref-monty/crates/monty-typeshed/custom/os.pyi +87 -0
- package/ref-monty/crates/monty-typeshed/custom/sys.pyi +33 -0
- package/ref-monty/crates/monty-typeshed/src/lib.rs +56 -0
- package/ref-monty/crates/monty-typeshed/update.py +321 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +1 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +20 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +105 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +394 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +138 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +1434 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +527 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +2 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +502 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +376 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +149 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +87 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +395 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +8 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +337 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +33 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +741 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +1217 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +716 -0
- package/ref-monty/docs/usage-guide.md +117 -0
- package/ref-monty/examples/README.md +3 -0
- package/ref-monty/examples/expense_analysis/README.md +3 -0
- package/ref-monty/examples/expense_analysis/data.py +124 -0
- package/ref-monty/examples/expense_analysis/main.py +115 -0
- package/ref-monty/examples/sql_playground/README.md +20 -0
- package/ref-monty/examples/sql_playground/external_functions.py +129 -0
- package/ref-monty/examples/sql_playground/main.py +81 -0
- package/ref-monty/examples/sql_playground/sandbox_code.py +82 -0
- package/ref-monty/examples/sql_playground/type_stubs.pyi +14 -0
- package/ref-monty/examples/web_scraper/README.md +15 -0
- package/ref-monty/examples/web_scraper/browser.py +56 -0
- package/ref-monty/examples/web_scraper/example_code.py +59 -0
- package/ref-monty/examples/web_scraper/external_functions.py +324 -0
- package/ref-monty/examples/web_scraper/main.py +193 -0
- package/ref-monty/examples/web_scraper/sub_agent.py +79 -0
- package/ref-monty/monty-npm.md +235 -0
- package/ref-monty/pyproject.toml +162 -0
- package/ref-monty/scripts/check_imports.py +91 -0
- package/ref-monty/scripts/codecov_diff.py +412 -0
- package/ref-monty/scripts/complete_tests.py +146 -0
- package/ref-monty/scripts/flamegraph_to_text.py +208 -0
- package/ref-monty/scripts/iter_test_methods.py +540 -0
- package/ref-monty/scripts/run_traceback.py +180 -0
- package/ref-monty/scripts/startup_performance.py +130 -0
- package/ref-monty/uv.lock +1779 -0
- package/temp_resend_cli/repo/.github/scripts/pr-title-check.js +34 -0
- package/temp_resend_cli/repo/.github/workflows/ci.yml +67 -0
- package/temp_resend_cli/repo/.github/workflows/post-release.yml +51 -0
- package/temp_resend_cli/repo/.github/workflows/pr-title-check.yml +13 -0
- package/temp_resend_cli/repo/.github/workflows/release.yml +175 -0
- package/temp_resend_cli/repo/.github/workflows/test-install-unix.yml +34 -0
- package/temp_resend_cli/repo/.github/workflows/test-install-windows.yml +48 -0
- package/temp_resend_cli/repo/CHANGELOG.md +31 -0
- package/temp_resend_cli/repo/LICENSE +21 -0
- package/temp_resend_cli/repo/README.md +450 -0
- package/temp_resend_cli/repo/biome.json +36 -0
- package/temp_resend_cli/repo/install.ps1 +141 -0
- package/temp_resend_cli/repo/install.sh +301 -0
- package/temp_resend_cli/repo/package.json +61 -0
- package/temp_resend_cli/repo/pnpm-lock.yaml +2439 -0
- package/temp_resend_cli/repo/renovate.json +4 -0
- package/temp_resend_cli/repo/src/cli.ts +98 -0
- package/temp_resend_cli/repo/src/commands/api-keys/create.ts +114 -0
- package/temp_resend_cli/repo/src/commands/api-keys/delete.ts +47 -0
- package/temp_resend_cli/repo/src/commands/api-keys/index.ts +26 -0
- package/temp_resend_cli/repo/src/commands/api-keys/list.ts +35 -0
- package/temp_resend_cli/repo/src/commands/api-keys/utils.ts +8 -0
- package/temp_resend_cli/repo/src/commands/auth/index.ts +20 -0
- package/temp_resend_cli/repo/src/commands/auth/login.ts +234 -0
- package/temp_resend_cli/repo/src/commands/auth/logout.ts +105 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/create.ts +196 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/delete.ts +46 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/get.ts +59 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/index.ts +43 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/list.ts +60 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/send.ts +56 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/update.ts +95 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/utils.ts +35 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/create.ts +118 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/delete.ts +48 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/get.ts +46 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/index.ts +48 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/list.ts +68 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/update.ts +88 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/utils.ts +17 -0
- package/temp_resend_cli/repo/src/commands/contacts/add-segment.ts +78 -0
- package/temp_resend_cli/repo/src/commands/contacts/create.ts +122 -0
- package/temp_resend_cli/repo/src/commands/contacts/delete.ts +49 -0
- package/temp_resend_cli/repo/src/commands/contacts/get.ts +53 -0
- package/temp_resend_cli/repo/src/commands/contacts/index.ts +58 -0
- package/temp_resend_cli/repo/src/commands/contacts/list.ts +57 -0
- package/temp_resend_cli/repo/src/commands/contacts/remove-segment.ts +48 -0
- package/temp_resend_cli/repo/src/commands/contacts/segments.ts +39 -0
- package/temp_resend_cli/repo/src/commands/contacts/topics.ts +45 -0
- package/temp_resend_cli/repo/src/commands/contacts/update-topics.ts +90 -0
- package/temp_resend_cli/repo/src/commands/contacts/update.ts +77 -0
- package/temp_resend_cli/repo/src/commands/contacts/utils.ts +119 -0
- package/temp_resend_cli/repo/src/commands/doctor.ts +216 -0
- package/temp_resend_cli/repo/src/commands/domains/create.ts +83 -0
- package/temp_resend_cli/repo/src/commands/domains/delete.ts +42 -0
- package/temp_resend_cli/repo/src/commands/domains/get.ts +47 -0
- package/temp_resend_cli/repo/src/commands/domains/index.ts +35 -0
- package/temp_resend_cli/repo/src/commands/domains/list.ts +53 -0
- package/temp_resend_cli/repo/src/commands/domains/update.ts +75 -0
- package/temp_resend_cli/repo/src/commands/domains/utils.ts +44 -0
- package/temp_resend_cli/repo/src/commands/domains/verify.ts +38 -0
- package/temp_resend_cli/repo/src/commands/emails/batch.ts +140 -0
- package/temp_resend_cli/repo/src/commands/emails/get.ts +44 -0
- package/temp_resend_cli/repo/src/commands/emails/index.ts +30 -0
- package/temp_resend_cli/repo/src/commands/emails/list.ts +84 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/attachment.ts +55 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/attachments.ts +68 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/get.ts +58 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/index.ts +28 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/list.ts +59 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/utils.ts +38 -0
- package/temp_resend_cli/repo/src/commands/emails/send.ts +189 -0
- package/temp_resend_cli/repo/src/commands/open.ts +27 -0
- package/temp_resend_cli/repo/src/commands/segments/create.ts +50 -0
- package/temp_resend_cli/repo/src/commands/segments/delete.ts +47 -0
- package/temp_resend_cli/repo/src/commands/segments/get.ts +38 -0
- package/temp_resend_cli/repo/src/commands/segments/index.ts +36 -0
- package/temp_resend_cli/repo/src/commands/segments/list.ts +58 -0
- package/temp_resend_cli/repo/src/commands/segments/utils.ts +7 -0
- package/temp_resend_cli/repo/src/commands/teams/index.ts +10 -0
- package/temp_resend_cli/repo/src/commands/teams/list.ts +35 -0
- package/temp_resend_cli/repo/src/commands/teams/remove.ts +86 -0
- package/temp_resend_cli/repo/src/commands/teams/switch.ts +76 -0
- package/temp_resend_cli/repo/src/commands/topics/create.ts +73 -0
- package/temp_resend_cli/repo/src/commands/topics/delete.ts +47 -0
- package/temp_resend_cli/repo/src/commands/topics/get.ts +42 -0
- package/temp_resend_cli/repo/src/commands/topics/index.ts +42 -0
- package/temp_resend_cli/repo/src/commands/topics/list.ts +34 -0
- package/temp_resend_cli/repo/src/commands/topics/update.ts +59 -0
- package/temp_resend_cli/repo/src/commands/topics/utils.ts +16 -0
- package/temp_resend_cli/repo/src/commands/webhooks/create.ts +128 -0
- package/temp_resend_cli/repo/src/commands/webhooks/delete.ts +49 -0
- package/temp_resend_cli/repo/src/commands/webhooks/get.ts +42 -0
- package/temp_resend_cli/repo/src/commands/webhooks/index.ts +42 -0
- package/temp_resend_cli/repo/src/commands/webhooks/list.ts +55 -0
- package/temp_resend_cli/repo/src/commands/webhooks/listen.ts +379 -0
- package/temp_resend_cli/repo/src/commands/webhooks/update.ts +83 -0
- package/temp_resend_cli/repo/src/commands/webhooks/utils.ts +36 -0
- package/temp_resend_cli/repo/src/commands/whoami.ts +71 -0
- package/temp_resend_cli/repo/src/lib/actions.ts +157 -0
- package/temp_resend_cli/repo/src/lib/client.ts +37 -0
- package/temp_resend_cli/repo/src/lib/config.ts +217 -0
- package/temp_resend_cli/repo/src/lib/files.ts +15 -0
- package/temp_resend_cli/repo/src/lib/help-text.ts +38 -0
- package/temp_resend_cli/repo/src/lib/output.ts +56 -0
- package/temp_resend_cli/repo/src/lib/pagination.ts +36 -0
- package/temp_resend_cli/repo/src/lib/prompts.ts +149 -0
- package/temp_resend_cli/repo/src/lib/spinner.ts +100 -0
- package/temp_resend_cli/repo/src/lib/table.ts +57 -0
- package/temp_resend_cli/repo/src/lib/tty.ts +28 -0
- package/temp_resend_cli/repo/src/lib/update-check.ts +169 -0
- package/temp_resend_cli/repo/src/lib/version.ts +4 -0
- package/temp_resend_cli/repo/tests/commands/api-keys/create.test.ts +196 -0
- package/temp_resend_cli/repo/tests/commands/api-keys/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/api-keys/list.test.ts +134 -0
- package/temp_resend_cli/repo/tests/commands/auth/login.test.ts +153 -0
- package/temp_resend_cli/repo/tests/commands/auth/logout.test.ts +153 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/create.test.ts +454 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/delete.test.ts +183 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/get.test.ts +147 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/list.test.ts +199 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/send.test.ts +162 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/update.test.ts +288 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/create.test.ts +251 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/delete.test.ts +184 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/get.test.ts +145 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/list.test.ts +181 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/update.test.ts +217 -0
- package/temp_resend_cli/repo/tests/commands/contacts/add-segment.test.ts +189 -0
- package/temp_resend_cli/repo/tests/commands/contacts/create.test.ts +271 -0
- package/temp_resend_cli/repo/tests/commands/contacts/delete.test.ts +193 -0
- package/temp_resend_cli/repo/tests/commands/contacts/get.test.ts +149 -0
- package/temp_resend_cli/repo/tests/commands/contacts/list.test.ts +176 -0
- package/temp_resend_cli/repo/tests/commands/contacts/remove-segment.test.ts +167 -0
- package/temp_resend_cli/repo/tests/commands/contacts/segments.test.ts +168 -0
- package/temp_resend_cli/repo/tests/commands/contacts/topics.test.ts +164 -0
- package/temp_resend_cli/repo/tests/commands/contacts/update-topics.test.ts +248 -0
- package/temp_resend_cli/repo/tests/commands/contacts/update.test.ts +206 -0
- package/temp_resend_cli/repo/tests/commands/doctor.test.ts +164 -0
- package/temp_resend_cli/repo/tests/commands/domains/create.test.ts +193 -0
- package/temp_resend_cli/repo/tests/commands/domains/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/domains/get.test.ts +138 -0
- package/temp_resend_cli/repo/tests/commands/domains/list.test.ts +165 -0
- package/temp_resend_cli/repo/tests/commands/domains/update.test.ts +224 -0
- package/temp_resend_cli/repo/tests/commands/domains/verify.test.ts +118 -0
- package/temp_resend_cli/repo/tests/commands/emails/batch.test.ts +324 -0
- package/temp_resend_cli/repo/tests/commands/emails/get.test.ts +132 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/attachment.test.ts +141 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/attachments.test.ts +169 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/get.test.ts +141 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/list.test.ts +182 -0
- package/temp_resend_cli/repo/tests/commands/emails/send.test.ts +312 -0
- package/temp_resend_cli/repo/tests/commands/segments/create.test.ts +164 -0
- package/temp_resend_cli/repo/tests/commands/segments/delete.test.ts +183 -0
- package/temp_resend_cli/repo/tests/commands/segments/get.test.ts +138 -0
- package/temp_resend_cli/repo/tests/commands/segments/list.test.ts +174 -0
- package/temp_resend_cli/repo/tests/commands/teams/list.test.ts +62 -0
- package/temp_resend_cli/repo/tests/commands/teams/remove.test.ts +110 -0
- package/temp_resend_cli/repo/tests/commands/teams/switch.test.ts +103 -0
- package/temp_resend_cli/repo/tests/commands/topics/create.test.ts +192 -0
- package/temp_resend_cli/repo/tests/commands/topics/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/topics/get.test.ts +126 -0
- package/temp_resend_cli/repo/tests/commands/topics/list.test.ts +125 -0
- package/temp_resend_cli/repo/tests/commands/topics/update.test.ts +178 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/create.test.ts +225 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/get.test.ts +126 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/list.test.ts +178 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/update.test.ts +207 -0
- package/temp_resend_cli/repo/tests/commands/whoami.test.ts +98 -0
- package/temp_resend_cli/repo/tests/e2e/smoke.test.ts +93 -0
- package/temp_resend_cli/repo/tests/helpers.ts +86 -0
- package/temp_resend_cli/repo/tests/lib/client.test.ts +71 -0
- package/temp_resend_cli/repo/tests/lib/config.test.ts +451 -0
- package/temp_resend_cli/repo/tests/lib/files.test.ts +73 -0
- package/temp_resend_cli/repo/tests/lib/help-text.test.ts +97 -0
- package/temp_resend_cli/repo/tests/lib/output.test.ts +136 -0
- package/temp_resend_cli/repo/tests/lib/prompts.test.ts +185 -0
- package/temp_resend_cli/repo/tests/lib/spinner.test.ts +166 -0
- package/temp_resend_cli/repo/tests/lib/table.test.ts +63 -0
- package/temp_resend_cli/repo/tests/lib/tty.test.ts +89 -0
- package/temp_resend_cli/repo/tests/lib/update-check.test.ts +179 -0
- package/temp_resend_cli/repo/tsconfig.json +14 -0
- package/temp_resend_cli/repo/vitest.config.e2e.ts +8 -0
- package/temp_resend_cli/repo/vitest.config.ts +10 -0
- package/tests/test-mcp-browser-use-smoke.sh +28 -56
- package/tests/test-monty-smoke.sh +32 -0
- 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'
|