openscad-cpp-evaluator 0.29.1__tar.gz → 0.29.2__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 (199) hide show
  1. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/.github/workflows/wheels.yml +21 -1
  2. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/PKG-INFO +1 -1
  3. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/export.hpp +4 -1
  4. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/pyproject.toml +1 -1
  5. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_import_export.cpp +34 -0
  6. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_zip_stored.cpp +84 -0
  7. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/.github/workflows/ci.yml +0 -0
  8. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/.gitignore +0 -0
  9. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/.gitmodules +0 -0
  10. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/CLAUDE.md +0 -0
  11. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/CMakeLists.txt +0 -0
  12. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/LICENSE +0 -0
  13. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/README.md +0 -0
  14. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/bindings/CMakeLists.txt +0 -0
  15. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/bindings/ast_to_py.cpp +0 -0
  16. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/bindings/module.cpp +0 -0
  17. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/cmake/embed_font.cmake +0 -0
  18. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/examples/CMakeLists.txt +0 -0
  19. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/examples/eval_perf_benchmark.cpp +0 -0
  20. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/examples/manifold_cache_reuse.cpp +0 -0
  21. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/examples/minimal_debugger.cpp +0 -0
  22. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  23. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/.gitignore +0 -0
  24. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  25. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  26. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/README.md +0 -0
  27. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  28. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  29. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  30. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  31. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  32. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  33. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  34. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  35. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  36. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  37. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  38. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  39. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  40. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  41. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  42. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  43. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/api.cpp +0 -0
  44. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  45. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  46. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  47. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  48. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  49. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  50. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  51. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  52. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  53. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  54. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  55. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  56. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  57. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  58. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  59. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  60. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/position.cpp +0 -0
  61. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  62. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  63. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  64. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  65. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  66. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  67. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  68. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  69. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  70. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  71. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  72. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  73. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  74. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  75. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  76. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  77. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  78. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  79. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  80. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  81. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  82. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  83. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  84. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  85. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  86. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  87. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  88. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  89. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  90. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  91. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  92. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  93. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  94. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  95. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  96. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  97. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  98. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  99. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  100. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  101. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  102. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  103. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  104. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  105. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  106. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  107. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  108. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  109. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  110. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  111. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  112. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  113. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  114. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  115. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  116. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  117. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/value.hpp +0 -0
  118. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  119. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/python/openscad_cpp_evaluator/__init__.py +0 -0
  120. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/resources/fonts/LICENSE +0 -0
  121. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  122. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/CMakeLists.txt +0 -0
  123. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/booleans.cpp +0 -0
  124. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/builtins.hpp +0 -0
  125. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/call_args.cpp +0 -0
  126. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/color.cpp +0 -0
  127. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/control.cpp +0 -0
  128. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/extrude.cpp +0 -0
  129. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/function_builtins.cpp +0 -0
  130. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/import.cpp +0 -0
  131. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/modifiers.cpp +0 -0
  132. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/primitives_2d.cpp +0 -0
  133. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/primitives_3d.cpp +0 -0
  134. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/registry.cpp +0 -0
  135. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/roof.cpp +0 -0
  136. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/segments.cpp +0 -0
  137. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/surface.cpp +0 -0
  138. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/text.cpp +0 -0
  139. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/topology.cpp +0 -0
  140. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/builtins/transforms.cpp +0 -0
  141. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/bytecode_compiler.cpp +0 -0
  142. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/bytecode_vm.cpp +0 -0
  143. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/colored_body.cpp +0 -0
  144. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/csg_generate.cpp +0 -0
  145. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/csg_resolve.cpp +0 -0
  146. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/css_colors.cpp +0 -0
  147. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/debug/debug_repl.cpp +0 -0
  148. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/debug_profile.cpp +0 -0
  149. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/eval_context.cpp +0 -0
  150. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/eval_error.cpp +0 -0
  151. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/eval_use.cpp +0 -0
  152. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/export.cpp +0 -0
  153. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/expr_eval.cpp +0 -0
  154. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/import/dxf_import.cpp +0 -0
  155. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/import/mesh_import.cpp +0 -0
  156. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/import/surface_load.cpp +0 -0
  157. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/import/svg_import.cpp +0 -0
  158. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/manifold_cache.cpp +0 -0
  159. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/mesh_check.cpp +0 -0
  160. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/stmt_eval.cpp +0 -0
  161. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/text/stb_font_provider.cpp +0 -0
  162. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/text/text_metrics.cpp +0 -0
  163. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/user_calls.cpp +0 -0
  164. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/value.cpp +0 -0
  165. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/src/zip_stored.cpp +0 -0
  166. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/CMakeLists.txt +0 -0
  167. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_booleans.cpp +0 -0
  168. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_bytecode_compiler.cpp +0 -0
  169. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_cli.cpp +0 -0
  170. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_control_flow.cpp +0 -0
  171. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_csg_tree.cpp +0 -0
  172. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_debug_hooks.cpp +0 -0
  173. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_dxf_svg_import.cpp +0 -0
  174. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_eval_context.cpp +0 -0
  175. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_export.cpp +0 -0
  176. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_expr_eval.cpp +0 -0
  177. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_extrude_roof.cpp +0 -0
  178. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_function_builtins.cpp +0 -0
  179. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_helpers.hpp +0 -0
  180. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_manifold_cache.cpp +0 -0
  181. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_mesh_check.cpp +0 -0
  182. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_multi_color_merge.cpp +0 -0
  183. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_primitives.cpp +0 -0
  184. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_profiling.cpp +0 -0
  185. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_python_bindings.py +0 -0
  186. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_scope_trail.cpp +0 -0
  187. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_scoping.cpp +0 -0
  188. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_surface.cpp +0 -0
  189. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_tail_calls.cpp +0 -0
  190. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_text.cpp +0 -0
  191. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_transforms.cpp +0 -0
  192. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_use.cpp +0 -0
  193. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_value.cpp +0 -0
  194. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tests/test_viewport_params.cpp +0 -0
  195. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tools/cli/CMakeLists.txt +0 -0
  196. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tools/cli/cli_lib.cpp +0 -0
  197. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tools/cli/cli_lib.hpp +0 -0
  198. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/tools/cli/main.cpp +0 -0
  199. {openscad_cpp_evaluator-0.29.1 → openscad_cpp_evaluator-0.29.2}/uv.lock +0 -0
@@ -57,7 +57,27 @@ jobs:
57
57
  CIBW_SKIP: "*-musllinux*"
58
58
  # cibuildwheel builds win32 in addition to win_amd64 by default;
59
59
  # this project only targets 64-bit Windows.
60
- CIBW_ARCHS_WINDOWS: AMD64
60
+ # ARM64 is cross-compiled here on the x86_64 runner rather than
61
+ # built on a windows-11-arm one, because bison and flex are host
62
+ # build tools: they generate C++ that MSVC then cross-compiles for
63
+ # ARM64. MSYS2 -- which is where this build gets a bison new enough
64
+ # for the grammar (3.8+, winflexbison3 ships 3.7.4) -- has no native
65
+ # ARM64 build at all, so building on an ARM runner would have to
66
+ # emulate it. cibuildwheel skips CIBW_TEST_COMMAND for the
67
+ # cross-compiled wheel, since an x86_64 host cannot run it.
68
+ CIBW_ARCHS_WINDOWS: "AMD64 ARM64"
69
+ # delvewheel vendors the MSVC runtime into the wheel, but on an
70
+ # x86_64 host it can only find the x86_64 copy -- repairing the
71
+ # cross-built ARM64 wheel died with "Unable to find library:
72
+ # msvcp140.dll". The ARM64 wheel therefore leaves the runtime to
73
+ # the system, which is what every Python extension on Windows
74
+ # already assumes (CPython itself needs the redistributable).
75
+ # AMD64 keeps vendoring it, unchanged.
76
+ CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: >-
77
+ cmd /c "echo {wheel} | findstr /C:win_arm64 >nul &&
78
+ (delvewheel repair --exclude msvcp140.dll --exclude vcruntime140.dll
79
+ --exclude vcruntime140_1.dll -w {dest_dir} {wheel}) ||
80
+ (delvewheel repair -w {dest_dir} {wheel})"
61
81
  CIBW_MANYLINUX_X86_64_IMAGE: manylinux_2_28
62
82
  CIBW_MANYLINUX_AARCH64_IMAGE: manylinux_2_28
63
83
  # manylinux_2_28 (AlmaLinux 8) uses dnf, not apt -- but its default
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.29.1
3
+ Version: 0.29.2
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -39,7 +39,10 @@ void writeObj(const std::string& path, const std::vector<ColoredBody>& bodies);
39
39
  void writeOff(const std::string& path, const std::vector<ColoredBody>& bodies);
40
40
 
41
41
  // 3MF: one mesh object + a base-color colorgroup per body (skipping empty
42
- // bodies), written as a stored (uncompressed) ZIP -- see zip_stored.hpp.
42
+ // bodies), written as a DEFLATE-compressed ZIP (writeDeflateZip, see
43
+ // zip_stored.hpp) -- the XML is highly compressible, so storing it would
44
+ // make the file several times larger for nothing. An entry that does not
45
+ // actually shrink is stored raw, as any ZIP writer would.
43
46
  // Mirrors export.py's write_3mf's XML shape exactly (core + material
44
47
  // namespaces, %.6g vertex formatting); throws std::runtime_error if there's
45
48
  // no geometry to export.
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.29.1"
7
+ version = "0.29.2"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -77,6 +77,40 @@ TEST(ImportModuleContext, ThreeMfRoundTripPreservesVolume) {
77
77
  std::filesystem::remove(path);
78
78
  }
79
79
 
80
+ // The .3mf writeThreeMf() produces is DEFLATE-compressed, not stored. The
81
+ // round-trip test above passes either way -- the reader accepts both
82
+ // methods -- so without this a regression to STORED would show up only as
83
+ // files several times bigger than they need to be.
84
+ TEST(ImportModuleContext, ThreeMfIsDeflateCompressed) {
85
+ const auto path = tempPath("cube_compressed.3mf");
86
+ writeCubeAs(path, &writeThreeMf);
87
+
88
+ std::ifstream in(path, std::ios::binary);
89
+ ASSERT_TRUE(in);
90
+ std::vector<uint8_t> buf((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
91
+ in.close();
92
+
93
+ bool sawModel = false;
94
+ for (size_t i = 0; i + 46 <= buf.size(); ++i) {
95
+ if (!(buf[i] == 0x50 && buf[i + 1] == 0x4B && buf[i + 2] == 0x01 && buf[i + 3] == 0x02)) continue;
96
+ const uint16_t method = static_cast<uint16_t>(buf[i + 10] | (buf[i + 11] << 8));
97
+ const uint32_t compressedSize =
98
+ static_cast<uint32_t>(buf[i + 20] | (buf[i + 21] << 8) | (buf[i + 22] << 16) | (buf[i + 23] << 24));
99
+ const uint32_t rawSize =
100
+ static_cast<uint32_t>(buf[i + 24] | (buf[i + 25] << 8) | (buf[i + 26] << 16) | (buf[i + 27] << 24));
101
+ const uint16_t nameLen = static_cast<uint16_t>(buf[i + 28] | (buf[i + 29] << 8));
102
+ if (i + 46 + nameLen > buf.size()) continue;
103
+ const std::string name(reinterpret_cast<const char*>(&buf[i + 46]), nameLen);
104
+ if (name.find("3dmodel.model") == std::string::npos) continue;
105
+ sawModel = true;
106
+ EXPECT_EQ(method, 8) << "3dmodel.model stored uncompressed";
107
+ EXPECT_LT(compressedSize, rawSize) << "compressed " << compressedSize << " vs raw " << rawSize;
108
+ }
109
+ EXPECT_TRUE(sawModel) << "no 3dmodel.model entry in the archive";
110
+
111
+ std::filesystem::remove(path);
112
+ }
113
+
80
114
  TEST(ImportModuleContext, UnsupportedExtensionErrors) {
81
115
  Evaluator ev;
82
116
  auto ast = parseSrc("import(\"nope.xyz\");");
@@ -1,6 +1,12 @@
1
1
  // Direct tests for zip_stored.hpp -- writeStoredZip()'s own STORED-entry
2
2
  // round trip, plus reading a DEFLATE-compressed (method 8) entry, which is
3
3
  // what most third-party ZIP/3MF writers actually emit.
4
+ //
5
+ // Also what writeDeflateZip() and writeThreeMf() put in the archive. That
6
+ // went untested: the round-trip tests pass either way, since the reader
7
+ // handles both methods, so a silent regression to STORED would only show
8
+ // up as files several times larger. The method byte is read out of the
9
+ // central directory here so it cannot regress unnoticed.
4
10
 
5
11
  #include "openscad_cpp_evaluator/zip_stored.hpp"
6
12
 
@@ -169,3 +175,81 @@ TEST(ZipStored, UnsupportedCompressionMethodThrows) {
169
175
  EXPECT_THROW(readStoredZipEntry(path.string(), "hello.txt"), std::runtime_error);
170
176
  std::filesystem::remove(path);
171
177
  }
178
+
179
+
180
+ // --- what we WRITE, not just what we can read -------------------------
181
+
182
+ namespace {
183
+
184
+ // The compression method of the first central-directory entry whose name
185
+ // ends with `suffix`. Read from the central directory rather than the local
186
+ // header, since that is the authoritative copy.
187
+ uint16_t centralDirMethodBySuffix(const std::string& path, const std::string& suffix) {
188
+ std::ifstream in(path, std::ios::binary);
189
+ EXPECT_TRUE(in) << "cannot open " << path;
190
+ std::vector<uint8_t> buf((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
191
+ // Walk central-directory headers by signature; these archives are small
192
+ // and have no ZIP comment, so a forward scan is enough.
193
+ for (size_t i = 0; i + 46 <= buf.size(); ++i) {
194
+ if (!(buf[i] == 0x50 && buf[i + 1] == 0x4B && buf[i + 2] == 0x01 && buf[i + 3] == 0x02)) continue;
195
+ const uint16_t method = static_cast<uint16_t>(buf[i + 10] | (buf[i + 11] << 8));
196
+ const uint16_t nameLen = static_cast<uint16_t>(buf[i + 28] | (buf[i + 29] << 8));
197
+ if (i + 46 + nameLen > buf.size()) continue;
198
+ const std::string name(reinterpret_cast<const char*>(&buf[i + 46]), nameLen);
199
+ if (name.size() >= suffix.size() && name.compare(name.size() - suffix.size(), suffix.size(), suffix) == 0)
200
+ return method;
201
+ }
202
+ ADD_FAILURE() << "no central-directory entry ending in " << suffix;
203
+ return 0xFFFF;
204
+ }
205
+
206
+ // Compressible: long runs, which is what 3MF's indented XML looks like.
207
+ std::vector<uint8_t> compressibleBytes(size_t n) {
208
+ std::vector<uint8_t> out;
209
+ out.reserve(n);
210
+ const std::string unit = "\t\t\t\t\t<vertex x=\"0\" y=\"0\" z=\"0\" />\n";
211
+ while (out.size() < n) out.insert(out.end(), unit.begin(), unit.end());
212
+ out.resize(n);
213
+ return out;
214
+ }
215
+
216
+ } // namespace
217
+
218
+ TEST(ZipStored, DeflateZipReallyWritesMethod8) {
219
+ const auto path = tempPath("deflate_method.zip");
220
+ const auto data = compressibleBytes(64 * 1024);
221
+ writeDeflateZip(path.string(), {ZipEntry{"3D/3dmodel.model", data}});
222
+ EXPECT_EQ(centralDirMethodBySuffix(path.string(), "3dmodel.model"), 8);
223
+ // And it still reads back byte for byte.
224
+ EXPECT_EQ(readStoredZipEntry(path.string(), "3D/3dmodel.model"), data);
225
+ std::filesystem::remove(path);
226
+ }
227
+
228
+ TEST(ZipStored, DeflateZipActuallyShrinksCompressibleData) {
229
+ const auto path = tempPath("deflate_size.zip");
230
+ const auto data = compressibleBytes(256 * 1024);
231
+ writeDeflateZip(path.string(), {ZipEntry{"3D/3dmodel.model", data}});
232
+ const auto onDisk = std::filesystem::file_size(path);
233
+ // Highly repetitive input; anything near its original size means the
234
+ // compressor did not run.
235
+ EXPECT_LT(onDisk, data.size() / 4) << "archive " << onDisk << " for " << data.size() << " bytes of input";
236
+ std::filesystem::remove(path);
237
+ }
238
+
239
+ TEST(ZipStored, DeflateZipStoresDataThatWouldNotShrink) {
240
+ const auto path = tempPath("deflate_tiny.zip");
241
+ const std::vector<uint8_t> tiny{'x'};
242
+ writeDeflateZip(path.string(), {ZipEntry{"a.txt", tiny}});
243
+ EXPECT_EQ(centralDirMethodBySuffix(path.string(), "a.txt"), 0);
244
+ EXPECT_EQ(readStoredZipEntry(path.string(), "a.txt"), tiny);
245
+ std::filesystem::remove(path);
246
+ }
247
+
248
+ TEST(ZipStored, StoredZipWritesMethod0) {
249
+ // The control for the tests above: same call shape, opposite method.
250
+ const auto path = tempPath("stored_method.zip");
251
+ const auto data = compressibleBytes(64 * 1024);
252
+ writeStoredZip(path.string(), {ZipEntry{"3D/3dmodel.model", data}});
253
+ EXPECT_EQ(centralDirMethodBySuffix(path.string(), "3dmodel.model"), 0);
254
+ std::filesystem::remove(path);
255
+ }