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.
Files changed (184) hide show
  1. {mirascript-0.1.76 → mirascript-0.1.78}/Cargo.lock +9 -9
  2. {mirascript-0.1.76 → mirascript-0.1.78}/PKG-INFO +3 -3
  3. {mirascript-0.1.76/crates/python → mirascript-0.1.78}/README.md +2 -2
  4. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/Cargo.toml +1 -1
  5. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/opcode.rs +0 -4
  6. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/Cargo.toml +1 -1
  7. {mirascript-0.1.76 → mirascript-0.1.78/crates/python}/README.md +2 -2
  8. mirascript-0.1.78/crates/python/tests/snapshots/test_snapshot/test_shared_context_keys/shared_context_keys.txt +1 -0
  9. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_cli.py +95 -25
  10. mirascript-0.1.78/crates/python/tests/test_compiler.py +119 -0
  11. mirascript-0.1.78/crates/python/tests/test_constants.py +22 -0
  12. mirascript-0.1.78/crates/python/tests/test_helper_convert.py +74 -0
  13. mirascript-0.1.78/crates/python/tests/test_helper_types.py +132 -0
  14. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_serialize.py +6 -0
  15. mirascript-0.1.78/crates/python/tests/test_vm_operations.py +104 -0
  16. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/__main__.py +4 -3
  17. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/diagnostics.py +4 -4
  18. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/emitter.py +0 -5
  19. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/script.py +10 -10
  20. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/checker.py +1 -3
  21. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/constants.py +12 -6
  22. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_format.py +3 -3
  23. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_number.py +1 -3
  24. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_string.py +36 -18
  25. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/serialize.py +2 -10
  26. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/types.py +17 -4
  27. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/_helpers.py +10 -13
  28. mirascript-0.1.78/mirascript/_vm/lib/vm_global/json.py +68 -0
  29. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/mod/_matrix.py +3 -3
  30. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/__init__.py +4 -0
  31. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/all_any.py +4 -4
  32. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/find.py +1 -1
  33. mirascript-0.1.78/mirascript/_vm/lib/vm_global/sequence/fold.py +25 -0
  34. mirascript-0.1.78/mirascript/_vm/lib/vm_global/sequence/group.py +23 -0
  35. mirascript-0.1.78/mirascript/_vm/lib/vm_global/sequence/map_filter.py +49 -0
  36. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/__init__.py +0 -2
  37. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/common.py +1 -0
  38. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/compound.py +25 -21
  39. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/helpers.py +32 -18
  40. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/operator.py +3 -1
  41. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/utils.py +7 -7
  42. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/module.py +9 -8
  43. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/wrapper.py +11 -13
  44. mirascript-0.1.76/crates/python/tests/snapshots/test_snapshot/test_shared_context_keys/shared_context_keys.txt +0 -1
  45. mirascript-0.1.76/mirascript/_vm/lib/vm_global/json.py +0 -56
  46. mirascript-0.1.76/mirascript/_vm/lib/vm_global/sequence/map_filter.py +0 -51
  47. {mirascript-0.1.76 → mirascript-0.1.78}/Cargo.toml +0 -0
  48. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/benches/compile.rs +0 -0
  49. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/benches/lexer.rs +0 -0
  50. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/benches/main.rs +0 -0
  51. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/compile/mod.rs +0 -0
  52. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/compile/recover_token.rs +0 -0
  53. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/config/mod.rs +0 -0
  54. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/config/wasm.rs +0 -0
  55. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/diagnostic_code.rs +0 -0
  56. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/diagnostics_collector.rs +0 -0
  57. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/encode_diagnostics.rs +0 -0
  58. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/mod.rs +0 -0
  59. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/diagnostic/source_diagnostic.rs +0 -0
  60. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/chunk.rs +0 -0
  61. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/closure.rs +0 -0
  62. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/constant.rs +0 -0
  63. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_closure.rs +0 -0
  64. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_codes.rs +0 -0
  65. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_expression.rs +0 -0
  66. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_pattern.rs +0 -0
  67. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_pub.rs +0 -0
  68. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_scope.rs +0 -0
  69. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_statement.rs +0 -0
  70. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/emitter_struct.rs +0 -0
  71. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/mod.rs +0 -0
  72. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/scope.rs +0 -0
  73. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/static_checker.rs +0 -0
  74. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/utils.rs +0 -0
  75. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/emitter/variable.rs +0 -0
  76. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/array_element.rs +0 -0
  77. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/callable.rs +0 -0
  78. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/else_block.rs +0 -0
  79. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/expression.rs +0 -0
  80. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/iterable.rs +0 -0
  81. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/list_items.rs +0 -0
  82. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/mod.rs +0 -0
  83. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/token.rs +0 -0
  84. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/trivia.rs +0 -0
  85. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/manager/types.rs +0 -0
  86. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/mod.rs +0 -0
  87. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/parameter_list.rs +0 -0
  88. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/pattern.rs +0 -0
  89. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/range.rs +0 -0
  90. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/record_element.rs +0 -0
  91. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/formatter/statement.rs +0 -0
  92. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/identifier.rs +0 -0
  93. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/keyword.rs +0 -0
  94. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/mod.rs +0 -0
  95. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/numeric.rs +0 -0
  96. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/operator.rs +0 -0
  97. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/string.rs +0 -0
  98. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/token.rs +0 -0
  99. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/token_kind.rs +0 -0
  100. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/tokens.rs +0 -0
  101. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lexer/trivia.rs +0 -0
  102. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/lib.rs +0 -0
  103. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/array_element.rs +0 -0
  104. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/array_helper.rs +0 -0
  105. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/ast_visitor.rs +0 -0
  106. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/basic_expressions.rs +0 -0
  107. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/block_expressions.rs +0 -0
  108. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/expression.rs +0 -0
  109. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/expressions.rs +0 -0
  110. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/helper.rs +0 -0
  111. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/iterable.rs +0 -0
  112. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/json_expressions.rs +0 -0
  113. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/list_item.rs +0 -0
  114. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/mod.rs +0 -0
  115. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/parameter_list.rs +0 -0
  116. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/pattern.rs +0 -0
  117. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/patterns.rs +0 -0
  118. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/range.rs +0 -0
  119. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/record_element.rs +0 -0
  120. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/record_helper.rs +0 -0
  121. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/script.rs +0 -0
  122. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/scripts.rs +0 -0
  123. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/statement.rs +0 -0
  124. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/statements.rs +0 -0
  125. {mirascript-0.1.76 → mirascript-0.1.78}/crates/core/src/parser/token_ref.rs +0 -0
  126. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/.gitignore +0 -0
  127. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/src/lib.rs +0 -0
  128. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/__init__.py +0 -0
  129. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/conftest.py +0 -0
  130. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/deepequals.py +0 -0
  131. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/snapshots/test_snapshot/test_module_exports/exports.txt +0 -0
  132. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_black_box.py +0 -0
  133. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_deepequals.py +0 -0
  134. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/tests/test_snapshot.py +0 -0
  135. {mirascript-0.1.76 → mirascript-0.1.78}/crates/python/uv.lock +0 -0
  136. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/__init__.py +0 -0
  137. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/__init__.py +0 -0
  138. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/ast_helper.py +0 -0
  139. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/consts.py +0 -0
  140. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/core.pyi +0 -0
  141. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/emit.py +0 -0
  142. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_compiler/opcode.py +0 -0
  143. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/__init__.py +0 -0
  144. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_helpers/convert/to_boolean.py +0 -0
  145. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/__init__.py +0 -0
  146. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/error.py +0 -0
  147. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/_helpers_utils.py +0 -0
  148. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/_loader.py +0 -0
  149. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/__init__.py +0 -0
  150. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/bit.py +0 -0
  151. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/debug.py +0 -0
  152. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/__init__.py +0 -0
  153. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/_helper.py +0 -0
  154. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/arr.py +0 -0
  155. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/const.py +0 -0
  156. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/math.py +0 -0
  157. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/tgamma.py +0 -0
  158. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/to_int.py +0 -0
  159. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/math/unary.py +0 -0
  160. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/mod/__init__.py +0 -0
  161. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/entries.py +0 -0
  162. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/flatten.py +0 -0
  163. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/len.py +0 -0
  164. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/new.py +0 -0
  165. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/repeat.py +0 -0
  166. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/reverse.py +0 -0
  167. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/sort.py +0 -0
  168. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/unique.py +0 -0
  169. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/with_.py +0 -0
  170. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/sequence/zip.py +0 -0
  171. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/string.py +0 -0
  172. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/time.py +0 -0
  173. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/lib/vm_global/to_primitive.py +0 -0
  174. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/array_range.py +0 -0
  175. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/call.py +0 -0
  176. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/convert.py +0 -0
  177. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/cp.py +0 -0
  178. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/slice.py +0 -0
  179. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/operations/type_check.py +0 -0
  180. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/__init__.py +0 -0
  181. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/context.py +0 -0
  182. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/_vm/types/function.py +0 -0
  183. {mirascript-0.1.76 → mirascript-0.1.78}/mirascript/py.typed +0 -0
  184. {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.3.0"
25
+ version = "1.4.0"
26
26
  source = "registry+https://github.com/rust-lang/crates.io-index"
27
- checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8"
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.10"
92
+ version = "1.0.11"
93
93
  source = "registry+https://github.com/rust-lang/crates.io-index"
94
- checksum = "e2e30e509674ef0ec91e21a7735766db37d163d46151b6a361d8b83dd79116bd"
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.76"
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.76"
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.76"
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.76"
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.76"
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.76
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 Python Bindings
34
+ # MiraScript
35
35
 
36
- Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
36
+ MiraScript 是 CloudPSS 维护的表达式优先脚本语言项目。Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
37
37
 
38
38
  ## 安装
39
39
 
@@ -1,6 +1,6 @@
1
- # MiraScript Python Bindings
1
+ # MiraScript
2
2
 
3
- Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
3
+ MiraScript 是 CloudPSS 维护的表达式优先脚本语言项目。Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
4
4
 
5
5
  ## 安装
6
6
 
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "mira-core"
3
- version = "0.1.76"
3
+ version = "0.1.78"
4
4
  edition = "2024"
5
5
  publish = false
6
6
 
@@ -290,10 +290,6 @@ pub enum OpCode {
290
290
  /// ELSE\
291
291
  /// } else {
292
292
  Else,
293
- /// EL_IF IF*\
294
- /// } else if *** {\
295
- /// This instruction must be followed by an `IF*` instruction\
296
- ElIf,
297
293
  /// IF_END\
298
294
  /// }
299
295
  IfEnd,
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "mira-python"
3
- version = "0.1.76"
3
+ version = "0.1.78"
4
4
  edition = "2021"
5
5
  readme = "README.md"
6
6
 
@@ -1,6 +1,6 @@
1
- # MiraScript Python Bindings
1
+ # MiraScript
2
2
 
3
- Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
3
+ MiraScript 是 CloudPSS 维护的表达式优先脚本语言项目。Python 绑定用于在 Python 中调用 MiraScript 编译器能力,支持脚本编译与执行。
4
4
 
5
5
  ## 安装
6
6
 
@@ -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
- from mirascript.__main__ import main
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" in stdout
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" in stdout
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" in stdout
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" in stdout
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" in stdout
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!" in stdout
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" in stdout
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
- import io
186
-
187
- stdin_mock = io.StringIO("return 123;")
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"