mirascript 0.1.76__tar.gz → 0.1.78__tar.gz
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.
- {mirascript-0.1.76 → mirascript-0.1.78}/Cargo.lock +9 -9
- {mirascript-0.1.76 → mirascript-0.1.78}/PKG-INFO +3 -3
- {mirascript-0.1.76/crates/python → mirascript-0.1.78}/README.md +2 -2
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/Cargo.toml +1 -1
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/opcode.rs +0 -4
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/Cargo.toml +1 -1
- {mirascript-0.1.76 → mirascript-0.1.78/crates/python}/README.md +2 -2
- mirascript-0.1.78/crates/python/tests/snapshots/test_snapshot/test_shared_context_keys/shared_context_keys.txt +1 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_cli.py +95 -25
- mirascript-0.1.78/crates/python/tests/test_compiler.py +119 -0
- mirascript-0.1.78/crates/python/tests/test_constants.py +22 -0
- mirascript-0.1.78/crates/python/tests/test_helper_convert.py +74 -0
- mirascript-0.1.78/crates/python/tests/test_helper_types.py +132 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_serialize.py +6 -0
- mirascript-0.1.78/crates/python/tests/test_vm_operations.py +104 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/__main__.py +4 -3
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/diagnostics.py +4 -4
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/emitter.py +0 -5
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/script.py +10 -10
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/checker.py +1 -3
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/constants.py +12 -6
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_format.py +3 -3
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_number.py +1 -3
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_string.py +36 -18
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/serialize.py +2 -10
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/types.py +17 -4
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/_helpers.py +10 -13
- mirascript-0.1.78/mirascript/_vm/lib/vm_global/json.py +68 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/mod/_matrix.py +3 -3
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/__init__.py +4 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/all_any.py +4 -4
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/find.py +1 -1
- mirascript-0.1.78/mirascript/_vm/lib/vm_global/sequence/fold.py +25 -0
- mirascript-0.1.78/mirascript/_vm/lib/vm_global/sequence/group.py +23 -0
- mirascript-0.1.78/mirascript/_vm/lib/vm_global/sequence/map_filter.py +49 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/__init__.py +0 -2
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/common.py +1 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/compound.py +25 -21
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/helpers.py +32 -18
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/operator.py +3 -1
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/utils.py +7 -7
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/module.py +9 -8
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/wrapper.py +11 -13
- mirascript-0.1.76/crates/python/tests/snapshots/test_snapshot/test_shared_context_keys/shared_context_keys.txt +0 -1
- mirascript-0.1.76/mirascript/_vm/lib/vm_global/json.py +0 -56
- mirascript-0.1.76/mirascript/_vm/lib/vm_global/sequence/map_filter.py +0 -51
- {mirascript-0.1.76 → mirascript-0.1.78}/Cargo.toml +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/benches/compile.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/benches/lexer.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/benches/main.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/compile/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/compile/recover_token.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/config/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/config/wasm.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/diagnostic_code.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/diagnostics_collector.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/encode_diagnostics.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/source_diagnostic.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/chunk.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/closure.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/constant.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_closure.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_codes.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_expression.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_pattern.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_pub.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_scope.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_statement.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_struct.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/scope.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/static_checker.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/utils.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/variable.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/array_element.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/callable.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/else_block.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/expression.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/iterable.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/list_items.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/token.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/trivia.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/types.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/parameter_list.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/pattern.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/range.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/record_element.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/statement.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/identifier.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/keyword.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/numeric.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/operator.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/string.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/token.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/token_kind.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/tokens.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/trivia.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lib.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/array_element.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/array_helper.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/ast_visitor.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/basic_expressions.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/block_expressions.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/expression.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/expressions.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/helper.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/iterable.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/json_expressions.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/list_item.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/mod.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/parameter_list.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/pattern.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/patterns.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/range.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/record_element.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/record_helper.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/script.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/scripts.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/statement.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/statements.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/token_ref.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/.gitignore +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/src/lib.rs +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/conftest.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/deepequals.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/snapshots/test_snapshot/test_module_exports/exports.txt +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_black_box.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_deepequals.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_snapshot.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/uv.lock +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/ast_helper.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/consts.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/core.pyi +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/emit.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/opcode.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_boolean.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/error.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/_helpers_utils.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/_loader.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/bit.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/debug.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/_helper.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/arr.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/const.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/math.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/tgamma.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/to_int.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/unary.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/mod/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/entries.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/flatten.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/len.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/new.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/repeat.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/reverse.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/sort.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/unique.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/with_.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/zip.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/string.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/time.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/to_primitive.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/array_range.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/call.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/convert.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/cp.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/slice.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/type_check.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/__init__.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/context.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/function.py +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/py.typed +0 -0
- {mirascript-0.1.76 → mirascript-0.1.78}/pyproject.toml +0 -0
|
@@ -22,9 +22,9 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
|
|
22
22
|
|
|
23
23
|
[[package]]
|
|
24
24
|
name = "cc"
|
|
25
|
-
version = "1.
|
|
25
|
+
version = "1.4.0"
|
|
26
26
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
27
|
-
checksum = "
|
|
27
|
+
checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9"
|
|
28
28
|
dependencies = [
|
|
29
29
|
"find-msvc-tools",
|
|
30
30
|
"shlex",
|
|
@@ -89,9 +89,9 @@ dependencies = [
|
|
|
89
89
|
|
|
90
90
|
[[package]]
|
|
91
91
|
name = "ctor"
|
|
92
|
-
version = "1.0.
|
|
92
|
+
version = "1.0.11"
|
|
93
93
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
94
|
-
checksum = "
|
|
94
|
+
checksum = "e9bb72bb94fdc1bd619f4c18cc91ecf6302aeb333d31b3c6ec0bb841cd920209"
|
|
95
95
|
|
|
96
96
|
[[package]]
|
|
97
97
|
name = "divan"
|
|
@@ -282,7 +282,7 @@ dependencies = [
|
|
|
282
282
|
|
|
283
283
|
[[package]]
|
|
284
284
|
name = "mira-constants"
|
|
285
|
-
version = "0.1.
|
|
285
|
+
version = "0.1.78"
|
|
286
286
|
dependencies = [
|
|
287
287
|
"mira-core",
|
|
288
288
|
"wasm-bindgen",
|
|
@@ -290,7 +290,7 @@ dependencies = [
|
|
|
290
290
|
|
|
291
291
|
[[package]]
|
|
292
292
|
name = "mira-core"
|
|
293
|
-
version = "0.1.
|
|
293
|
+
version = "0.1.78"
|
|
294
294
|
dependencies = [
|
|
295
295
|
"divan",
|
|
296
296
|
"mimalloc",
|
|
@@ -304,7 +304,7 @@ dependencies = [
|
|
|
304
304
|
|
|
305
305
|
[[package]]
|
|
306
306
|
name = "mira-napi"
|
|
307
|
-
version = "0.1.
|
|
307
|
+
version = "0.1.78"
|
|
308
308
|
dependencies = [
|
|
309
309
|
"mira-core",
|
|
310
310
|
"napi",
|
|
@@ -314,7 +314,7 @@ dependencies = [
|
|
|
314
314
|
|
|
315
315
|
[[package]]
|
|
316
316
|
name = "mira-python"
|
|
317
|
-
version = "0.1.
|
|
317
|
+
version = "0.1.78"
|
|
318
318
|
dependencies = [
|
|
319
319
|
"mira-core",
|
|
320
320
|
"pyo3",
|
|
@@ -323,7 +323,7 @@ dependencies = [
|
|
|
323
323
|
|
|
324
324
|
[[package]]
|
|
325
325
|
name = "mira-wasm"
|
|
326
|
-
version = "0.1.
|
|
326
|
+
version = "0.1.78"
|
|
327
327
|
dependencies = [
|
|
328
328
|
"console_error_panic_hook",
|
|
329
329
|
"mira-core",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mirascript
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.78
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Programming Language :: Rust
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -31,9 +31,9 @@ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
|
31
31
|
Project-URL: Documentation, https://mira.cloudpss.net/
|
|
32
32
|
Project-URL: Repository, https://github.com/CloudPSS/MiraScript
|
|
33
33
|
|
|
34
|
-
# MiraScript
|
|
34
|
+
# MiraScript
|
|
35
35
|
|
|
36
|
-
Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
|
|
36
|
+
MiraScript 是 CloudPSS 维护的表达式优先脚本语言项目。Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
|
|
37
37
|
|
|
38
38
|
## 安装
|
|
39
39
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
['E', 'LN10', 'LN2', 'LOG10E', 'LOG2E', 'PI', 'SQRT1_2', 'SQRT2', 'abs', 'acos', 'acosh', 'all', 'any', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'b_and', 'b_not', 'b_or', 'b_xor', 'cbrt', 'ceil', 'chars', 'contains', 'cos', 'cosh', 'debug_print', 'e', 'ends_with', 'entries', 'exp', 'expm1', 'factorial', 'filter', 'filter_map', 'find', 'flatten', 'floor', 'fold', 'format', 'from_json', 'gamma', 'group_by', 'hypot', 'join', 'keys', 'len', 'log', 'log10', 'log1p', 'log2', 'map', 'matrix', 'max', 'min', 'new_array', 'new_record', 'panic', 'pi', 'pow', 'product', 'random', 'repeat', 'replace', 'reverse', 'round', 'sar', 'shl', 'shr', 'sign', 'sin', 'sinh', 'sort', 'sort_by', 'split', 'sqrt', 'starts_with', 'sum', 'tan', 'tanh', 'to_datetime', 'to_iso8601', 'to_json', 'to_lowercase', 'to_number', 'to_string', 'to_timestamp', 'to_uppercase', 'trim', 'trim_end', 'trim_start', 'trunc', 'unique', 'unique_by', 'values', 'with', 'zip']
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import ast
|
|
8
9
|
import sys
|
|
10
|
+
import types
|
|
9
11
|
from io import StringIO
|
|
10
12
|
from pathlib import Path
|
|
11
13
|
from tempfile import TemporaryDirectory
|
|
@@ -13,7 +15,7 @@ from unittest.mock import patch
|
|
|
13
15
|
|
|
14
16
|
import pytest
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
import mirascript.__main__ as cli
|
|
17
19
|
|
|
18
20
|
# 示例 .mira 文件目录
|
|
19
21
|
EXAMPLES_DIR = (Path(__file__).parent / "../../../examples").resolve()
|
|
@@ -25,7 +27,7 @@ EXAMPLES_DIR = (Path(__file__).parent / "../../../examples").resolve()
|
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
def _run_main(
|
|
28
|
-
args: list[str], *, prog: str | None = "mirascript"
|
|
30
|
+
args: list[str], *, prog: str | None = "mirascript", stdin: str | None = None
|
|
29
31
|
) -> tuple[int, str, str]:
|
|
30
32
|
"""运行 main 函数,返回 (exit_code, stdout, stderr)。"""
|
|
31
33
|
|
|
@@ -35,8 +37,9 @@ def _run_main(
|
|
|
35
37
|
@patch("sys.argv", [prog or "mirascript", *args])
|
|
36
38
|
@patch("sys.stdout", stdout)
|
|
37
39
|
@patch("sys.stderr", stderr)
|
|
40
|
+
@patch("sys.stdin", StringIO(stdin) if stdin is not None else StringIO())
|
|
38
41
|
def run_main():
|
|
39
|
-
return main(prog=prog)
|
|
42
|
+
return cli.main(prog=prog)
|
|
40
43
|
|
|
41
44
|
exit_code = run_main()
|
|
42
45
|
return exit_code, stdout.getvalue(), stderr.getvalue()
|
|
@@ -77,21 +80,21 @@ def test_eval_string():
|
|
|
77
80
|
"""通过 --eval 执行字符串表达式。"""
|
|
78
81
|
exit_code, stdout, stderr = _run_main(["-e", 'return "hello";'])
|
|
79
82
|
assert exit_code == 0
|
|
80
|
-
assert "[OK] hello"
|
|
83
|
+
assert stdout == "[OK] 'hello'\n"
|
|
81
84
|
|
|
82
85
|
|
|
83
86
|
def test_eval_arithmetic():
|
|
84
87
|
"""通过 --eval 执行算术表达式。"""
|
|
85
88
|
exit_code, stdout, stderr = _run_main(["-e", "return 1 + 2 * 3;"])
|
|
86
89
|
assert exit_code == 0
|
|
87
|
-
assert "[OK] 7"
|
|
90
|
+
assert stdout == "[OK] 7\n"
|
|
88
91
|
|
|
89
92
|
|
|
90
93
|
def test_eval_with_prog_none():
|
|
91
94
|
"""__main__ 直接调用时 --eval 也能正常工作。"""
|
|
92
95
|
exit_code, stdout, stderr = _run_main(["-e", "return 99;"], prog=None)
|
|
93
96
|
assert exit_code == 0
|
|
94
|
-
assert "[OK] 99"
|
|
97
|
+
assert stdout == "[OK] 99\n"
|
|
95
98
|
|
|
96
99
|
|
|
97
100
|
# ---------------------------------------------------------------------------
|
|
@@ -103,7 +106,7 @@ def test_eval_with_single_variable():
|
|
|
103
106
|
"""通过 -v 传入单个变量。"""
|
|
104
107
|
exit_code, stdout, stderr = _run_main(["-v", "x=10", "-e", "return x;"])
|
|
105
108
|
assert exit_code == 0
|
|
106
|
-
assert "[OK] 10"
|
|
109
|
+
assert stdout == "[OK] 10\n"
|
|
107
110
|
|
|
108
111
|
|
|
109
112
|
def test_eval_with_multiple_variables():
|
|
@@ -112,7 +115,7 @@ def test_eval_with_multiple_variables():
|
|
|
112
115
|
["-v", "a=3", "-v", "b=4", "-e", "return a + b;"]
|
|
113
116
|
)
|
|
114
117
|
assert exit_code == 0
|
|
115
|
-
assert "[OK] 7"
|
|
118
|
+
assert stdout == "[OK] 7\n"
|
|
116
119
|
|
|
117
120
|
|
|
118
121
|
def test_eval_with_string_variable():
|
|
@@ -121,14 +124,14 @@ def test_eval_with_string_variable():
|
|
|
121
124
|
["-v", 'name="Mira"', "-e", 'return "Hello, $name!";']
|
|
122
125
|
)
|
|
123
126
|
assert exit_code == 0
|
|
124
|
-
assert "[OK] Hello, Mira!"
|
|
127
|
+
assert stdout == "[OK] 'Hello, Mira!'\n"
|
|
125
128
|
|
|
126
129
|
|
|
127
130
|
def test_eval_with_expression_variable():
|
|
128
131
|
"""变量值可以是表达式。"""
|
|
129
132
|
exit_code, stdout, stderr = _run_main(["-v", "x=3*4", "-e", "return x;"])
|
|
130
133
|
assert exit_code == 0
|
|
131
|
-
assert "[OK] 12"
|
|
134
|
+
assert stdout == "[OK] 12\n"
|
|
132
135
|
|
|
133
136
|
|
|
134
137
|
def test_invalid_variable_format():
|
|
@@ -152,8 +155,6 @@ def test_invalid_variable_value():
|
|
|
152
155
|
def test_run_mira_file():
|
|
153
156
|
"""执行一个 .mira 脚本文件。"""
|
|
154
157
|
hello_file = EXAMPLES_DIR / "01_hello_world.mira"
|
|
155
|
-
if not hello_file.is_file():
|
|
156
|
-
pytest.skip("Example file not found")
|
|
157
158
|
exit_code, stdout, stderr = _run_main([str(hello_file)])
|
|
158
159
|
# hello_world.mira 没有 return 语句,结果可能是 nil
|
|
159
160
|
assert exit_code == 0
|
|
@@ -162,8 +163,6 @@ def test_run_mira_file():
|
|
|
162
163
|
def test_run_mira_file_41_fib():
|
|
163
164
|
"""执行 fib 示例确认返回值。"""
|
|
164
165
|
fib_file = EXAMPLES_DIR / "41_fib.mira"
|
|
165
|
-
if not fib_file.is_file():
|
|
166
|
-
pytest.skip("Example file not found")
|
|
167
166
|
exit_code, stdout, stderr = _run_main([str(fib_file)])
|
|
168
167
|
assert exit_code == 0
|
|
169
168
|
|
|
@@ -182,17 +181,9 @@ def test_nonexistent_file():
|
|
|
182
181
|
|
|
183
182
|
def test_stdin_input():
|
|
184
183
|
"""通过 stdin 传入代码。"""
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
with patch.object(sys, "argv", ["mirascript", "-"]), patch.object(
|
|
189
|
-
sys, "stdin", stdin_mock
|
|
190
|
-
), patch.object(sys, "stdout", StringIO()), patch.object(sys, "stderr", StringIO()):
|
|
191
|
-
exit_code = main()
|
|
192
|
-
# stdin 模式下会读取 stdin 内容并执行
|
|
193
|
-
# 注意: main 内部使用 sys.stdin.read(),mock 后应正常
|
|
194
|
-
# 这里只验证不崩溃即可
|
|
195
|
-
assert exit_code in (0, 1)
|
|
184
|
+
exit_code, stdout, stderr = _run_main(["-"], stdin="return 123;")
|
|
185
|
+
assert exit_code == 0
|
|
186
|
+
assert stdout == "[OK] 123\n"
|
|
196
187
|
|
|
197
188
|
|
|
198
189
|
# ---------------------------------------------------------------------------
|
|
@@ -259,3 +250,82 @@ def test_eval_with_no_return():
|
|
|
259
250
|
"""没有 return 语句的 eval(模板模式测试)。"""
|
|
260
251
|
exit_code, stdout, stderr = _run_main(["-t", "-e", "just a string"])
|
|
261
252
|
assert exit_code == 0
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# ---------------------------------------------------------------------------
|
|
256
|
+
# 白盒:__main__ 内部函数与异常路径
|
|
257
|
+
# ---------------------------------------------------------------------------
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def test_compile_exception_exits_with_code_2():
|
|
261
|
+
with patch.object(cli, "compile", side_effect=RuntimeError("boom")):
|
|
262
|
+
with pytest.raises(SystemExit) as exc:
|
|
263
|
+
cli._compile("return 1;", "script")
|
|
264
|
+
assert exc.value.code == 2
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
if sys.version_info >= (3, 9):
|
|
268
|
+
|
|
269
|
+
def test_get_unparse_prefers_stdlib():
|
|
270
|
+
unparse = cli._get_unparse()
|
|
271
|
+
assert unparse is ast.unparse
|
|
272
|
+
|
|
273
|
+
def test_get_unparse_raises_if_all_missing(monkeypatch: pytest.MonkeyPatch):
|
|
274
|
+
monkeypatch.delattr(ast, "unparse", raising=False)
|
|
275
|
+
monkeypatch.delitem(sys.modules, "astunparse", raising=False)
|
|
276
|
+
|
|
277
|
+
with pytest.raises(ImportError):
|
|
278
|
+
cli._get_unparse()
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def test_get_unparse_fallback_to_astunparse(monkeypatch: pytest.MonkeyPatch):
|
|
282
|
+
monkeypatch.delattr(ast, "unparse", raising=False)
|
|
283
|
+
|
|
284
|
+
fake = types.ModuleType("astunparse")
|
|
285
|
+
|
|
286
|
+
def fake_unparse(node):
|
|
287
|
+
return "fake_unparse"
|
|
288
|
+
|
|
289
|
+
fake.unparse = fake_unparse # pyright: ignore[reportAttributeAccessIssue]
|
|
290
|
+
monkeypatch.setitem(sys.modules, "astunparse", fake)
|
|
291
|
+
|
|
292
|
+
unparse = cli._get_unparse()
|
|
293
|
+
assert unparse is fake_unparse
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def test_print_debug_writes_python_file(tmp_path: Path):
|
|
297
|
+
script, diagnostics = cli.compile(
|
|
298
|
+
"return 42;", input_mode="script", filename="<test>"
|
|
299
|
+
)
|
|
300
|
+
assert diagnostics is not None
|
|
301
|
+
assert script is not None
|
|
302
|
+
|
|
303
|
+
out = tmp_path / "debug_out.py"
|
|
304
|
+
cli._print_debug(script, str(out), {"x": 1})
|
|
305
|
+
|
|
306
|
+
content = out.read_text(encoding="utf-8")
|
|
307
|
+
assert "if __name__ == '__main__'" in content
|
|
308
|
+
assert "result = script({'x': 1})" in content
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def test_main_returns_1_when_script_raises():
|
|
312
|
+
def bad_script(_ctx=None):
|
|
313
|
+
raise RuntimeError("runtime failure")
|
|
314
|
+
|
|
315
|
+
with patch.object(cli, "_compile", return_value=(bad_script, [])):
|
|
316
|
+
exit_code, stdout, stderr = _run_main(["-e", "return 1;"])
|
|
317
|
+
|
|
318
|
+
assert exit_code == 1
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def test_main_variable_evaluation_exception_returns_1():
|
|
322
|
+
def compile_side_effect(code, mode, filename=None):
|
|
323
|
+
if filename and filename.startswith("<variable:"):
|
|
324
|
+
raise RuntimeError("var compile failure")
|
|
325
|
+
return cli.compile(code, input_mode=mode, filename=filename)
|
|
326
|
+
|
|
327
|
+
with patch.object(cli, "_compile", side_effect=compile_side_effect):
|
|
328
|
+
exit_code, stdout, stderr = _run_main(["-v", "x=1", "-e", "return 1;"])
|
|
329
|
+
|
|
330
|
+
assert exit_code == 1
|
|
331
|
+
assert "Error evaluating variable" in stderr
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import struct
|
|
4
|
+
import sys
|
|
5
|
+
import types
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from mirascript._compiler.consts import (
|
|
10
|
+
_read_constant,
|
|
11
|
+
read_constants,
|
|
12
|
+
read_index,
|
|
13
|
+
read_param,
|
|
14
|
+
split_chunk,
|
|
15
|
+
)
|
|
16
|
+
from mirascript._compiler.diagnostics import Diagnostic, decode_diagnostics
|
|
17
|
+
from mirascript._compiler.opcode import OpCode, get_opcode_name
|
|
18
|
+
from mirascript._compiler.script import wrap_vm_script
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_consts_read_constant_and_errors():
|
|
22
|
+
assert _read_constant(bytes([0]), 0) == (None, 1)
|
|
23
|
+
assert _read_constant(bytes([1]), 0) == (True, 1)
|
|
24
|
+
assert _read_constant(bytes([2]), 0) == (False, 1)
|
|
25
|
+
|
|
26
|
+
ordinal = bytes([3]) + struct.pack("<i", 7)
|
|
27
|
+
assert _read_constant(ordinal, 0) == (7.0, 5)
|
|
28
|
+
|
|
29
|
+
num = bytes([4]) + struct.pack("<d", 1.5)
|
|
30
|
+
assert _read_constant(num, 0) == (1.5, 9)
|
|
31
|
+
|
|
32
|
+
text = "abc".encode("utf-8")
|
|
33
|
+
s = bytes([5]) + struct.pack("<I", len(text)) + text
|
|
34
|
+
assert _read_constant(s, 0) == ("abc", 8)
|
|
35
|
+
|
|
36
|
+
with pytest.raises(ValueError):
|
|
37
|
+
_read_constant(bytes([9]), 0)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_consts_read_constants_split_and_index_param():
|
|
41
|
+
c1 = bytes([1])
|
|
42
|
+
c2 = bytes([3]) + struct.pack("<i", 8)
|
|
43
|
+
assert read_constants(c1 + c2) == (True, 8.0)
|
|
44
|
+
|
|
45
|
+
code_data = b"ABCD"
|
|
46
|
+
const_data = b"XYZ"
|
|
47
|
+
chunk_size = 12 + len(code_data) + len(const_data)
|
|
48
|
+
chunk = (
|
|
49
|
+
struct.pack("<I", chunk_size)
|
|
50
|
+
+ struct.pack("<I", len(code_data))
|
|
51
|
+
+ code_data
|
|
52
|
+
+ struct.pack("<I", len(const_data))
|
|
53
|
+
+ const_data
|
|
54
|
+
)
|
|
55
|
+
got_const, got_code = split_chunk(chunk)
|
|
56
|
+
assert got_const == const_data
|
|
57
|
+
assert got_code == code_data
|
|
58
|
+
|
|
59
|
+
with pytest.raises(ValueError):
|
|
60
|
+
split_chunk(b"short")
|
|
61
|
+
with pytest.raises(ValueError):
|
|
62
|
+
split_chunk(struct.pack("<I", 9999) + b"\x00" * 20)
|
|
63
|
+
|
|
64
|
+
assert read_param(bytes([5]), 0, False) == (5, 1)
|
|
65
|
+
assert read_param(struct.pack("<I", 300), 0, True) == (300, 4)
|
|
66
|
+
assert read_index(struct.pack("<b", -7), 0, False) == (-7, 1)
|
|
67
|
+
assert read_index(struct.pack("<i", -300), 0, True) == (-300, 4)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_diagnostic_paths_and_decode(monkeypatch: pytest.MonkeyPatch):
|
|
71
|
+
d = Diagnostic(1, 2, 3, 4, 12000)
|
|
72
|
+
assert d.level == "SourceMap"
|
|
73
|
+
|
|
74
|
+
fake_core = types.ModuleType("mirascript._compiler.core")
|
|
75
|
+
monkeypatch.setitem(sys.modules, "mirascript._compiler.core", fake_core)
|
|
76
|
+
Diagnostic._cache.clear()
|
|
77
|
+
unknown = Diagnostic(1, 1, 1, 1, 987654)
|
|
78
|
+
assert unknown.level == "Unknown"
|
|
79
|
+
assert "Unknown diagnostic code" in unknown.message
|
|
80
|
+
|
|
81
|
+
diagnostics, source_map = decode_diagnostics(
|
|
82
|
+
[
|
|
83
|
+
1,
|
|
84
|
+
2,
|
|
85
|
+
3,
|
|
86
|
+
4,
|
|
87
|
+
1001,
|
|
88
|
+
10,
|
|
89
|
+
11,
|
|
90
|
+
12,
|
|
91
|
+
13,
|
|
92
|
+
12000,
|
|
93
|
+
]
|
|
94
|
+
)
|
|
95
|
+
assert len(diagnostics) == 1
|
|
96
|
+
assert len(source_map) == 1
|
|
97
|
+
assert "[" in str(diagnostics[0])
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_opcode_immutability_and_names():
|
|
101
|
+
with pytest.raises(AttributeError):
|
|
102
|
+
OpCode.NEW = 1
|
|
103
|
+
with pytest.raises(AttributeError):
|
|
104
|
+
del OpCode.ADD
|
|
105
|
+
with pytest.raises(AttributeError):
|
|
106
|
+
_ = OpCode.NO_SUCH
|
|
107
|
+
|
|
108
|
+
assert get_opcode_name(-99999) == "-99999"
|
|
109
|
+
|
|
110
|
+
public_names = [k for k in OpCode.__dict__.keys() if not k.startswith("_")]
|
|
111
|
+
assert public_names
|
|
112
|
+
assert OpCode.__getattr__(public_names[0]) == OpCode.__dict__[public_names[0]]
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_wrap_vm_script_exception_branch():
|
|
116
|
+
wrapped = wrap_vm_script(RuntimeError("x"), filename="f", source="s", ast=None)
|
|
117
|
+
with pytest.raises(RuntimeError):
|
|
118
|
+
wrapped()
|
|
119
|
+
assert getattr(wrapped, "filename") == "f"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from mirascript import Uninitialized, VmUninitialized
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_uninitialized_constant():
|
|
5
|
+
"""测试 Uninitialized 常量的类型和行为。"""
|
|
6
|
+
|
|
7
|
+
# 检查类型
|
|
8
|
+
assert Uninitialized is not None
|
|
9
|
+
|
|
10
|
+
# 检查字符串表示
|
|
11
|
+
assert str(Uninitialized) == "<uninitialized>"
|
|
12
|
+
assert repr(Uninitialized) == "<uninitialized>"
|
|
13
|
+
|
|
14
|
+
# 检查比较操作
|
|
15
|
+
assert Uninitialized == Uninitialized
|
|
16
|
+
assert not (Uninitialized != Uninitialized)
|
|
17
|
+
|
|
18
|
+
# 检查哈希值
|
|
19
|
+
assert hash(Uninitialized) == hash(Uninitialized)
|
|
20
|
+
|
|
21
|
+
# 检查布尔值
|
|
22
|
+
assert bool(Uninitialized) is False
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from mirascript import to_boolean, to_string, to_number, to_format, VmError, VmValue
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_to_boolean():
|
|
11
|
+
assert to_boolean(True) is True
|
|
12
|
+
assert to_boolean(False) is False
|
|
13
|
+
assert to_boolean(1, fallback=False) is False
|
|
14
|
+
with pytest.raises(Exception):
|
|
15
|
+
to_boolean(1)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_to_string():
|
|
19
|
+
assert to_string("abc") == "abc"
|
|
20
|
+
assert to_string(123) == "123"
|
|
21
|
+
assert to_string(-0.0) == "0"
|
|
22
|
+
assert to_string(float("nan")) == "nan"
|
|
23
|
+
assert to_string(float("inf")) == "inf"
|
|
24
|
+
assert to_string(-float("inf")) == "-inf"
|
|
25
|
+
assert to_string({"a": -0.0, "b": 1}) == "a: 0, b: 1"
|
|
26
|
+
assert to_string([float("nan"), -0.0, 0.0, 0, 1]) == "nan, 0, 0, 0, 1"
|
|
27
|
+
|
|
28
|
+
class CantString:
|
|
29
|
+
def __str__(self):
|
|
30
|
+
raise Exception("Cannot convert to string")
|
|
31
|
+
|
|
32
|
+
value: VmValue = CantString() # pyright: ignore[reportAssignmentType]
|
|
33
|
+
|
|
34
|
+
assert to_string(value, fallback="fallback") == "fallback"
|
|
35
|
+
with pytest.raises(VmError):
|
|
36
|
+
to_string(value)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_to_number():
|
|
40
|
+
assert to_number(123) == 123
|
|
41
|
+
assert to_number(-0.0) == -0.0
|
|
42
|
+
assert math.isnan(to_number(float("nan")))
|
|
43
|
+
assert to_number(float("inf")) == float("inf")
|
|
44
|
+
assert to_number(-float("inf")) == -float("inf")
|
|
45
|
+
assert to_number("123") == 123
|
|
46
|
+
assert to_number("-0") == 0 and math.copysign(1, to_number("-0")) == -1
|
|
47
|
+
assert to_number("0x1A") == 26
|
|
48
|
+
assert to_number("0b101") == 5
|
|
49
|
+
assert to_number("0o17") == 15
|
|
50
|
+
assert to_number("1.23e4") == 12300.0
|
|
51
|
+
assert to_number(" 42 ") == 42
|
|
52
|
+
assert math.isnan(to_number("nan"))
|
|
53
|
+
assert to_number("inf") == float("inf")
|
|
54
|
+
assert to_number("-inf") == -float("inf")
|
|
55
|
+
|
|
56
|
+
value: VmValue = [1]
|
|
57
|
+
|
|
58
|
+
assert to_number(value, fallback=12) == 12
|
|
59
|
+
with pytest.raises(VmError):
|
|
60
|
+
to_number(value)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_to_format():
|
|
64
|
+
assert to_format("abc") == "abc"
|
|
65
|
+
assert to_format(123) == "123"
|
|
66
|
+
assert to_format(-0.0) == "0"
|
|
67
|
+
assert to_format(float("nan")) == "nan"
|
|
68
|
+
assert to_format(float("inf")) == "inf"
|
|
69
|
+
assert to_format(-float("inf")) == "-inf"
|
|
70
|
+
assert to_format({"a": -0.0, "b": 1}) == "a: 0, b: 1"
|
|
71
|
+
assert to_format([float("nan"), -0.0, 0.0, 0, 1]) == "nan, 0, 0, 0, 1"
|
|
72
|
+
assert to_format(math.pi) == "3.14159"
|
|
73
|
+
assert to_format(math.pi, ".0") == "3"
|
|
74
|
+
assert to_format(math.pi, ".-1") == "3.14159"
|