openscad-cpp-evaluator 1.28.3__tar.gz → 1.28.5__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 (221) hide show
  1. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/eval_use.hpp +4 -0
  3. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/primitives_3d.cpp +36 -6
  5. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/csg_resolve.cpp +4 -1
  6. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/eval_use.cpp +5 -0
  7. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_coverage.cpp +28 -0
  8. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_primitives.cpp +16 -0
  9. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/uv.lock +1 -1
  10. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/.github/workflows/ci.yml +0 -0
  11. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/.github/workflows/wheels.yml +0 -0
  12. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/.gitignore +0 -0
  13. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/.gitmodules +0 -0
  14. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/CLAUDE.md +0 -0
  15. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/CMakeLists.txt +0 -0
  16. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/LICENSE +0 -0
  17. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/README.md +0 -0
  18. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/bindings/CMakeLists.txt +0 -0
  19. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/bindings/ast_to_py.cpp +0 -0
  20. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/bindings/module.cpp +0 -0
  21. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/cmake/embed_font.cmake +0 -0
  22. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/examples/CMakeLists.txt +0 -0
  23. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/examples/eval_perf_benchmark.cpp +0 -0
  24. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/examples/manifold_cache_reuse.cpp +0 -0
  25. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/examples/minimal_debugger.cpp +0 -0
  26. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  27. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/.gitignore +0 -0
  28. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  29. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  30. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/README.md +0 -0
  31. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  32. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  33. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  34. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  35. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  36. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  37. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  38. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  39. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  40. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  41. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  42. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  43. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  44. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  45. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  46. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  47. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  48. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/api.cpp +0 -0
  49. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  50. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  51. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  52. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  53. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  54. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  55. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  56. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  57. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  58. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  59. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  60. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  61. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  62. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  63. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  64. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  65. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/position.cpp +0 -0
  66. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  67. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  68. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  69. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  70. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  71. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  72. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  73. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  74. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  75. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  76. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  77. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  78. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  79. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  80. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  81. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  82. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  83. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  84. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  85. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  86. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  87. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  88. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  89. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  90. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  91. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  92. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  93. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  94. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  95. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  96. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  97. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  98. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  99. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  100. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  101. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  102. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  103. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  104. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  105. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  106. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  107. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  108. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  109. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  110. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  111. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/export.hpp +0 -0
  112. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  113. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  114. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  115. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  116. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  117. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  118. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  119. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  120. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  121. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  122. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  123. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  124. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  125. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  126. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  127. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  128. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/value.hpp +0 -0
  129. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  130. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/python/openscad_cpp_evaluator/__init__.py +0 -0
  131. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/resources/fonts/LICENSE +0 -0
  132. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  133. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  134. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  135. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  136. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/CMakeLists.txt +0 -0
  137. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/booleans.cpp +0 -0
  138. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/builtins.hpp +0 -0
  139. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/call_args.cpp +0 -0
  140. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/color.cpp +0 -0
  141. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/control.cpp +0 -0
  142. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/dxf_dim.cpp +0 -0
  143. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/extrude.cpp +0 -0
  144. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/function_builtins.cpp +0 -0
  145. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/import.cpp +0 -0
  146. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/modifiers.cpp +0 -0
  147. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/primitives_2d.cpp +0 -0
  148. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/registry.cpp +0 -0
  149. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/roof.cpp +0 -0
  150. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/segments.cpp +0 -0
  151. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/surface.cpp +0 -0
  152. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/text.cpp +0 -0
  153. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/topology.cpp +0 -0
  154. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/builtins/transforms.cpp +0 -0
  155. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/bytecode_compiler.cpp +0 -0
  156. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/bytecode_vm.cpp +0 -0
  157. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/colored_body.cpp +0 -0
  158. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/coverage.cpp +0 -0
  159. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/csg_generate.cpp +0 -0
  160. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/css_colors.cpp +0 -0
  161. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/debug/debug_repl.cpp +0 -0
  162. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/debug_profile.cpp +0 -0
  163. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/eval_context.cpp +0 -0
  164. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/eval_error.cpp +0 -0
  165. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/export.cpp +0 -0
  166. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/expr_eval.cpp +0 -0
  167. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/format_closure.cpp +0 -0
  168. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/import/dxf_import.cpp +0 -0
  169. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/import/mesh_import.cpp +0 -0
  170. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/import/surface_load.cpp +0 -0
  171. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/import/svg_import.cpp +0 -0
  172. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/manifold_cache.cpp +0 -0
  173. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/measure_geometry.cpp +0 -0
  174. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/mesh_check.cpp +0 -0
  175. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/stmt_eval.cpp +0 -0
  176. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/text/font_match.cpp +0 -0
  177. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/text/freetype_font_provider.cpp +0 -0
  178. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/text/text_metrics.cpp +0 -0
  179. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/user_calls.cpp +0 -0
  180. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/utf8.cpp +0 -0
  181. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/value.cpp +0 -0
  182. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/src/zip_stored.cpp +0 -0
  183. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/CMakeLists.txt +0 -0
  184. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_booleans.cpp +0 -0
  185. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_bytecode_compiler.cpp +0 -0
  186. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_children_separate.cpp +0 -0
  187. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_cli.cpp +0 -0
  188. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_control_flow.cpp +0 -0
  189. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_csg_tree.cpp +0 -0
  190. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_debug_hooks.cpp +0 -0
  191. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_dxf_svg_import.cpp +0 -0
  192. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_eval_context.cpp +0 -0
  193. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_export.cpp +0 -0
  194. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_expr_eval.cpp +0 -0
  195. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_extrude_roof.cpp +0 -0
  196. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_feature_detection.cpp +0 -0
  197. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_function_builtins.cpp +0 -0
  198. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_helpers.hpp +0 -0
  199. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_import_export.cpp +0 -0
  200. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_include_cache.cpp +0 -0
  201. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_manifold_cache.cpp +0 -0
  202. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_mesh_check.cpp +0 -0
  203. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_multi_color_merge.cpp +0 -0
  204. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_profiling.cpp +0 -0
  205. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_python_bindings.py +0 -0
  206. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_render_expr.cpp +0 -0
  207. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_scope_trail.cpp +0 -0
  208. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_scoping.cpp +0 -0
  209. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_surface.cpp +0 -0
  210. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_tail_calls.cpp +0 -0
  211. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_text.cpp +0 -0
  212. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_transforms.cpp +0 -0
  213. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_unexpected_args.cpp +0 -0
  214. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_use.cpp +0 -0
  215. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_value.cpp +0 -0
  216. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_viewport_params.cpp +0 -0
  217. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tests/test_zip_stored.cpp +0 -0
  218. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tools/cli/CMakeLists.txt +0 -0
  219. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tools/cli/cli_lib.cpp +0 -0
  220. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tools/cli/cli_lib.hpp +0 -0
  221. {openscad_cpp_evaluator-1.28.3 → openscad_cpp_evaluator-1.28.5}/tools/cli/main.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.28.3
3
+ Version: 1.28.5
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -24,6 +24,10 @@ namespace oscadeval {
24
24
  struct UsedFileGlobals {
25
25
  const oscad::Scope* root = nullptr;
26
26
  std::vector<const oscad::ASTNode*> assignments;
27
+ // Every module/function the file sees -- its own and what it use<>d --
28
+ // for coverage, which is otherwise handed only the top file's nodes, so
29
+ // a file reached only by a nested use<> went unreported.
30
+ std::vector<const oscad::ASTNode*> declarations;
27
31
  };
28
32
 
29
33
  struct ResolvedUseScopes {
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "1.28.3"
7
+ version = "1.28.5"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -53,11 +53,18 @@ struct BoundaryEdges {
53
53
  // three bad edges in a few thousand triangles cannot be found by eye,
54
54
  // which is what happened in BelfrySCAD #521 / issue #187.
55
55
  std::optional<std::pair<uint32_t, uint32_t>> first;
56
+ // An edge both of whose faces run it the SAME way: the mesh is closed
57
+ // but a face is wound backwards. Named so the author knows which face
58
+ // to flip (BelfrySCAD #566, where "not closed -- 0 boundary edges"
59
+ // described a closed tetrahedron with two reversed faces).
60
+ size_t misoriented = 0;
61
+ std::optional<std::pair<uint32_t, uint32_t>> firstMisoriented;
56
62
  };
57
63
 
58
64
  template <typename M>
59
65
  BoundaryEdges findBoundaryEdges(const M& mesh) {
60
66
  std::map<std::pair<uint32_t, uint32_t>, int> uses;
67
+ std::map<std::pair<uint32_t, uint32_t>, int> forward; // uses running low -> high
61
68
  for (size_t i = 0; i + 2 < mesh.triVerts.size(); i += 3) {
62
69
  const uint32_t v[3] = {static_cast<uint32_t>(mesh.triVerts[i]),
63
70
  static_cast<uint32_t>(mesh.triVerts[i + 1]),
@@ -65,6 +72,7 @@ BoundaryEdges findBoundaryEdges(const M& mesh) {
65
72
  for (int e = 0; e < 3; ++e) {
66
73
  const uint32_t a = v[e], b = v[(e + 1) % 3];
67
74
  ++uses[{std::min(a, b), std::max(a, b)}];
75
+ if (a < b) ++forward[{a, b}];
68
76
  }
69
77
  }
70
78
  BoundaryEdges out;
@@ -75,7 +83,16 @@ BoundaryEdges findBoundaryEdges(const M& mesh) {
75
83
  // A cluster of open edges is nearly always one hole, so the first is
76
84
  // usually representative of the rest.
77
85
  for (const auto& [edge, count] : uses) {
78
- if (count % 2 == 0) continue;
86
+ if (count % 2 == 0) {
87
+ // Closed here; consistently wound only if the uses split evenly
88
+ // between the two directions.
89
+ const auto f = forward.find(edge);
90
+ if ((f == forward.end() ? 0 : f->second) * 2 != count) {
91
+ ++out.misoriented;
92
+ if (!out.firstMisoriented) out.firstMisoriented = edge;
93
+ }
94
+ continue;
95
+ }
79
96
  ++out.count;
80
97
  if (!out.first) out.first = edge;
81
98
  }
@@ -857,10 +874,22 @@ std::vector<ColoredBody> generatePolyhedron(Evaluator& ev, const CSGParams& para
857
874
  // Name one of them. Where the hole IS is the only part of this
858
875
  // message an author can act on; the count alone just says to go
859
876
  // looking, across the whole mesh.
860
- const std::string where =
861
- open.first ? ", first at " + describeEdge(mesh, *open.first) : std::string();
862
- ev.warn("polyhedron: mesh is not closed -- " + std::to_string(open.count) +
863
- " boundary edge(s)" + where +
877
+ std::string what;
878
+ if (open.count) {
879
+ what = "mesh is not closed -- " + std::to_string(open.count) + " boundary edge(s)" +
880
+ (open.first ? ", first at " + describeEdge(mesh, *open.first) : std::string());
881
+ } else if (open.misoriented) {
882
+ // Closed, but some faces wound backwards: "not closed -- 0
883
+ // boundary edge(s)" contradicted itself (BelfrySCAD #566).
884
+ what = "faces are not consistently wound -- " + std::to_string(open.misoriented) +
885
+ " edge(s) run the same way by both faces sharing them" +
886
+ (open.firstMisoriented ? ", first at " + describeEdge(mesh, *open.firstMisoriented)
887
+ : std::string()) +
888
+ "; reverse the point order of the faces on one side of it";
889
+ } else {
890
+ what = "mesh is not a valid solid (" + checkMesh(mesh).summary() + ")";
891
+ }
892
+ ev.warn("polyhedron: " + what +
864
893
  // "drawing it as a surface" was read by a reporter as
865
894
  // the HOLE being surfaced over -- i.e. as automatic
866
895
  // repair hiding their defect. Nothing is repaired: the
@@ -868,7 +897,8 @@ std::vector<ColoredBody> generatePolyhedron(Evaluator& ev, const CSGParams& para
868
897
  // object as the thing being drawn, and say what it is
869
898
  // NOT, since "surface" alone does not imply "not solid"
870
899
  // to someone who did not know it could be either.
871
- "; drawing the object as an open surface rather than a "
900
+ (open.count ? "; drawing the object as an open surface rather than a "
901
+ : "; drawing the object as a surface rather than a ") +
872
902
  "solid -- nothing is patched. hull() can still "
873
903
  "use its points, but it cannot take part in union/difference/intersection",
874
904
  &node.position());
@@ -303,7 +303,10 @@ std::vector<ColoredBody> Evaluator::evaluateImpl(const NodeList& nodes, EvalCont
303
303
  roots.reserve(nodes.size());
304
304
  for (const auto& n : nodes) roots.push_back(&*n);
305
305
  std::vector<const oscad::ASTNode*> extra;
306
- for (const UsedFileGlobals& g : usedFileGlobals_) extra.insert(extra.end(), g.assignments.begin(), g.assignments.end());
306
+ for (const UsedFileGlobals& g : usedFileGlobals_) {
307
+ extra.insert(extra.end(), g.assignments.begin(), g.assignments.end());
308
+ roots.insert(roots.end(), g.declarations.begin(), g.declarations.end()); // merged by position
309
+ }
307
310
  coverageResult = buildCoverageResult(roots, extra, coverageRecorder_);
308
311
  }
309
312
 
@@ -92,6 +92,11 @@ ResolvedUseScopes resolveUseScopesInto(const std::vector<const oscad::ASTNode*>&
92
92
  for (const oscad::ASTNode* n : nested.ownNodesFiltered) {
93
93
  if (n->kind() == oscad::NodeKind::Assignment) globals.assignments.push_back(n);
94
94
  }
95
+ for (const oscad::ASTNode* n : nested.processedNodes) {
96
+ if (n->kind() == oscad::NodeKind::ModuleDeclaration || n->kind() == oscad::NodeKind::FunctionDeclaration) {
97
+ globals.declarations.push_back(n);
98
+ }
99
+ }
95
100
  result.usedFileGlobals.push_back(std::move(globals));
96
101
  }
97
102
 
@@ -299,4 +299,32 @@ TEST(Coverage, AFileUsedTwiceIsListedOnce) {
299
299
  fs::remove_all(dir);
300
300
  }
301
301
 
302
+ // A file reached only through a used file's own use<> ran too. Only the top
303
+ // file's nodes were handed to coverage, so its declarations went unlisted.
304
+ TEST(Coverage, AFileReachedByNestedUseIsListed) {
305
+ namespace fs = std::filesystem;
306
+ const fs::path dir = fs::temp_directory_path() / "oscad_cov_nested";
307
+ fs::create_directories(dir);
308
+ const fs::path lib = dir / "lib.scad", mid = dir / "mid.scad", main = dir / "main.scad";
309
+ std::ofstream(lib) << "g = 1;\nfunction hit(x) = x + g;\nfunction miss(x) = x;\n";
310
+ std::ofstream(mid) << "use <lib.scad>\nfunction f() = hit(1);\n";
311
+ std::ofstream(main) << "use <mid.scad>\necho(f(), f());\n";
312
+ auto ast = oscad::getASTFromFile(main.string());
313
+ ResolvedUseScopes uses = resolveUseScopes(ast, main.string(), {});
314
+ Evaluator ev({}, nullptr, nullptr, {}, false, /*coverage=*/true);
315
+ ev.setUsedFileGlobals(uses.usedFileGlobals);
316
+ EvalContext ctx = EvalContext::makeRoot(uses.rootScope.get());
317
+ ev.evaluate(uses.processedNodes, ctx, {}, false);
318
+ ASSERT_TRUE(ev.coverageResult.has_value());
319
+ std::map<std::pair<int, CoverageKind>, std::vector<std::uint32_t>> libSpans;
320
+ for (const CoverageSpan& s : ev.coverageResult->spans) {
321
+ if (fs::path(s.origin).filename() == "lib.scad") libSpans[{s.line, s.kind}].push_back(s.hits);
322
+ }
323
+ auto hits = [&](int line, CoverageKind kind) { return libSpans[std::make_pair(line, kind)]; };
324
+ EXPECT_EQ(hits(2, CoverageKind::Body), std::vector<std::uint32_t>{2u});
325
+ EXPECT_EQ(hits(3, CoverageKind::Body), std::vector<std::uint32_t>{0u});
326
+ EXPECT_EQ(hits(1, CoverageKind::Statement), std::vector<std::uint32_t>{1u}); // its global, read and so evaluated, once
327
+ fs::remove_all(dir);
328
+ }
329
+
302
330
  } // namespace oscadeval
@@ -442,6 +442,22 @@ TEST(SphereStyle, StyleRespectsFnAndRadius) {
442
442
  // cube()'s size as OpenSCAD 2026.02.01 reads it: undef, absent or explicit,
443
443
  // is the default of 1; anything but a number or three numbers warns and
444
444
  // falls back to 1. Explicit undef built a zero-size cube -- nothing at all.
445
+ // BelfrySCAD #566: a closed tetrahedron with two faces wound backwards was
446
+ // reported as "mesh is not closed -- 0 boundary edge(s)". It is closed; say
447
+ // what is actually wrong, name an edge, and still draw it.
448
+ TEST(Primitives, PolyhedronWithReversedFacesSaysSo) {
449
+ std::vector<std::string> log;
450
+ Evaluated e = evalSrc("polyhedron([[0,0,0], [10,0,0], [0,10,0], [0,0,10]],\n"
451
+ " [[0,1,2], [0,1,3], [0,2,3], [1,2,3]]);",
452
+ [&](const std::string& m) { log.push_back(m); });
453
+ ASSERT_EQ(log.size(), 1u);
454
+ EXPECT_NE(log[0].find("faces are not consistently wound -- 4 edge(s)"), std::string::npos) << log[0];
455
+ EXPECT_NE(log[0].find("first at [0, 0, 0] - [10, 0, 0]"), std::string::npos) << log[0];
456
+ EXPECT_EQ(log[0].find("not closed"), std::string::npos) << log[0];
457
+ EXPECT_EQ(log[0].find("open surface"), std::string::npos) << log[0];
458
+ ASSERT_EQ(e.bodies.size(), 1u); // still drawn, as a display-only surface
459
+ }
460
+
445
461
  TEST(Primitives, CubeBadSizeIsAUnitCube) {
446
462
  const std::pair<const char*, const char*> cases[] = {
447
463
  {"undef", ""},
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "openscad-cpp-evaluator"
58
- version = "1.28.3"
58
+ version = "1.28.5"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "numpy" },