openscad-cpp-evaluator 1.37.0__tar.gz → 1.37.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 (229) hide show
  1. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/CLAUDE.md +24 -0
  2. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/CMakeLists.txt +21 -2
  3. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/PKG-INFO +1 -1
  4. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/grammar/lexer.l +21 -1
  5. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_lexical.cpp +27 -0
  6. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/pyproject.toml +1 -1
  7. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_python_bindings.py +18 -0
  8. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/uv.lock +1 -1
  9. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/.github/workflows/ci.yml +0 -0
  10. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/.github/workflows/wheels.yml +0 -0
  11. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/.gitignore +0 -0
  12. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/.gitmodules +0 -0
  13. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/LICENSE +0 -0
  14. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/README.md +0 -0
  15. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/bindings/CMakeLists.txt +0 -0
  16. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/bindings/ast_to_py.cpp +0 -0
  17. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/bindings/module.cpp +0 -0
  18. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/cmake/embed_font.cmake +0 -0
  19. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/cmake/patch_manifold.cmake +0 -0
  20. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/examples/CMakeLists.txt +0 -0
  21. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/examples/eval_perf_benchmark.cpp +0 -0
  22. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/examples/manifold_cache_reuse.cpp +0 -0
  23. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/examples/minimal_debugger.cpp +0 -0
  24. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  25. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/.gitignore +0 -0
  26. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  27. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  28. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/README.md +0 -0
  29. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  30. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  31. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  32. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  33. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  34. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  35. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  36. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  37. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  38. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  39. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  40. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  41. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  42. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  43. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  44. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  45. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/.DS_Store +0 -0
  46. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  47. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/api.cpp +0 -0
  48. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  49. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  50. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  51. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  52. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  53. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  54. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  55. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  56. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  57. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  58. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  59. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  60. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  61. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  62. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  63. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/position.cpp +0 -0
  64. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  65. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  66. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  67. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  68. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  69. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  70. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  71. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  72. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  73. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_concurrent_parse.cpp +0 -0
  74. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  75. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  76. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  77. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  78. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  79. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  80. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  81. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  82. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  83. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  84. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  85. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  86. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  87. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  88. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  89. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  90. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  91. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  92. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  93. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  94. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  95. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  96. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  97. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  98. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  99. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  100. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  101. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  102. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  103. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  104. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  105. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  106. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  107. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  108. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  109. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  110. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/export.hpp +0 -0
  111. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  112. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  113. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  114. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  115. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  116. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  117. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  118. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  119. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  120. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  121. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  122. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  123. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  124. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  125. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  126. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  127. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/value.hpp +0 -0
  128. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  129. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/python/openscad_cpp_evaluator/__init__.py +0 -0
  130. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/resources/fonts/LICENSE +0 -0
  131. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  132. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  133. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  134. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  135. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/CMakeLists.txt +0 -0
  136. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/booleans.cpp +0 -0
  137. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/builtins.hpp +0 -0
  138. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/call_args.cpp +0 -0
  139. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/color.cpp +0 -0
  140. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/control.cpp +0 -0
  141. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/dxf_dim.cpp +0 -0
  142. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/extrude.cpp +0 -0
  143. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/function_builtins.cpp +0 -0
  144. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/import.cpp +0 -0
  145. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/modifiers.cpp +0 -0
  146. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/primitives_2d.cpp +0 -0
  147. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/primitives_3d.cpp +0 -0
  148. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/registry.cpp +0 -0
  149. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/roof.cpp +0 -0
  150. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/segments.cpp +0 -0
  151. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/surface.cpp +0 -0
  152. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/text.cpp +0 -0
  153. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/topology.cpp +0 -0
  154. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/builtins/transforms.cpp +0 -0
  155. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/bytecode_compiler.cpp +0 -0
  156. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/bytecode_vm.cpp +0 -0
  157. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/colored_body.cpp +0 -0
  158. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/coverage.cpp +0 -0
  159. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/csg_generate.cpp +0 -0
  160. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/csg_resolve.cpp +0 -0
  161. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/css_colors.cpp +0 -0
  162. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/debug/debug_repl.cpp +0 -0
  163. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/debug_profile.cpp +0 -0
  164. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/eval_context.cpp +0 -0
  165. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/eval_error.cpp +0 -0
  166. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/eval_use.cpp +0 -0
  167. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/export.cpp +0 -0
  168. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/expr_eval.cpp +0 -0
  169. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/format_closure.cpp +0 -0
  170. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/import/dxf_import.cpp +0 -0
  171. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/import/mesh_import.cpp +0 -0
  172. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/import/scene_import.cpp +0 -0
  173. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/import/surface_load.cpp +0 -0
  174. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/import/svg_import.cpp +0 -0
  175. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/manifold_cache.cpp +0 -0
  176. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/measure_geometry.cpp +0 -0
  177. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/mesh_check.cpp +0 -0
  178. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/stmt_eval.cpp +0 -0
  179. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/text/font_match.cpp +0 -0
  180. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/text/freetype_font_provider.cpp +0 -0
  181. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/text/text_metrics.cpp +0 -0
  182. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/user_calls.cpp +0 -0
  183. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/utf8.cpp +0 -0
  184. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/value.cpp +0 -0
  185. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/xkcd_colors.cpp +0 -0
  186. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/xkcd_colors.hpp +0 -0
  187. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/src/zip_stored.cpp +0 -0
  188. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/CMakeLists.txt +0 -0
  189. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_booleans.cpp +0 -0
  190. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_bytecode_compiler.cpp +0 -0
  191. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_children_separate.cpp +0 -0
  192. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_cli.cpp +0 -0
  193. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_control_flow.cpp +0 -0
  194. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_coverage.cpp +0 -0
  195. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_csg_tree.cpp +0 -0
  196. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_debug_hooks.cpp +0 -0
  197. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_discretizer.cpp +0 -0
  198. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_dxf_svg_import.cpp +0 -0
  199. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_eval_context.cpp +0 -0
  200. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_export.cpp +0 -0
  201. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_expr_eval.cpp +0 -0
  202. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_extrude_roof.cpp +0 -0
  203. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_feature_detection.cpp +0 -0
  204. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_function_builtins.cpp +0 -0
  205. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_helpers.hpp +0 -0
  206. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_import_export.cpp +0 -0
  207. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_include_cache.cpp +0 -0
  208. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_manifold_cache.cpp +0 -0
  209. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_mesh_check.cpp +0 -0
  210. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_multi_color_merge.cpp +0 -0
  211. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_primitives.cpp +0 -0
  212. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_profiling.cpp +0 -0
  213. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_render_expr.cpp +0 -0
  214. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_scope_trail.cpp +0 -0
  215. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_scoping.cpp +0 -0
  216. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_surface.cpp +0 -0
  217. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_tail_calls.cpp +0 -0
  218. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_text.cpp +0 -0
  219. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_transforms.cpp +0 -0
  220. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_undef_args.cpp +0 -0
  221. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_unexpected_args.cpp +0 -0
  222. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_use.cpp +0 -0
  223. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_value.cpp +0 -0
  224. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_viewport_params.cpp +0 -0
  225. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tests/test_zip_stored.cpp +0 -0
  226. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tools/cli/CMakeLists.txt +0 -0
  227. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tools/cli/cli_lib.cpp +0 -0
  228. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tools/cli/cli_lib.hpp +0 -0
  229. {openscad_cpp_evaluator-1.37.0 → openscad_cpp_evaluator-1.37.2}/tools/cli/main.cpp +0 -0
@@ -507,6 +507,30 @@ Requires the same toolchain as `openscad_cpp_parser`: CMake ≥3.24, a C++20 com
507
507
  (macOS: `brew install bison`, the submodule's own CMakeLists auto-detects Homebrew's), Flex.
508
508
  GoogleTest is fetched automatically via `FetchContent`.
509
509
 
510
+ ### Building offline (Flathub)
511
+
512
+ Every dependency is a `FetchContent` download pinned to a tag, commit or checksummed tarball --
513
+ **keep it that way**: an unpinned `master` makes two builds of one tag differ and rules out a
514
+ build that lists its sources by checksum. A build with no network (Flathub's) hands each one in as
515
+ a source directory and forbids downloading:
516
+
517
+ ```bash
518
+ cmake -S . -B build -DFETCHCONTENT_FULLY_DISCONNECTED=ON -DBUILD_TESTING=OFF \
519
+ -DFETCHCONTENT_SOURCE_DIR_MANIFOLD=... -DFETCHCONTENT_SOURCE_DIR_CLIPPER2=... \
520
+ -DFETCHCONTENT_SOURCE_DIR_BOOST_CONFIG=... -DFETCHCONTENT_SOURCE_DIR_BOOST_POLYGON=... \
521
+ -DFETCHCONTENT_SOURCE_DIR_FREETYPE=... -DFETCHCONTENT_SOURCE_DIR_HARFBUZZ=... \
522
+ -DFETCHCONTENT_SOURCE_DIR_STB=... -DFETCHCONTENT_SOURCE_DIR_CPP_LINENOISE=... \
523
+ -DFETCHCONTENT_SOURCE_DIR_NLOHMANN_JSON=...
524
+ ```
525
+
526
+ That is the whole list for a wheel build (tests off; GoogleTest is the only other download, and
527
+ TBB only with `MANIFOLD_PAR`). Clipper2 is Manifold's own download, pinned in Manifold's
528
+ `cmake/manifoldDeps.cmake`; nlohmann_json is the parser's. FetchContent skips `PATCH_COMMAND` for a
529
+ supplied source, so the root `CMakeLists.txt` runs `cmake/patch_manifold.cmake` itself when
530
+ `FETCHCONTENT_SOURCE_DIR_MANIFOLD` is set -- otherwise an offline build would quietly ship the heap
531
+ overflow that patch fixes. Verified 2026-10-06: a fully disconnected configure + build produced the
532
+ Python module and CLI, and rendered text (freetype + harfbuzz).
533
+
510
534
  Run a single test binary or filter:
511
535
 
512
536
  ```bash
@@ -141,6 +141,16 @@ FetchContent_Declare(
141
141
  # CsgLeafNode::Compose -- see cmake/patch_manifold.cmake.
142
142
  PATCH_COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/patch_manifold.cmake
143
143
  )
144
+ # FetchContent runs PATCH_COMMAND only for a source it downloads itself, so
145
+ # a build handed Manifold's source (FETCHCONTENT_SOURCE_DIR_MANIFOLD, as an
146
+ # offline Flatpak build does) would otherwise compile it unpatched. The
147
+ # script is idempotent, so running it here too is safe.
148
+ if(FETCHCONTENT_SOURCE_DIR_MANIFOLD)
149
+ execute_process(
150
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/patch_manifold.cmake
151
+ WORKING_DIRECTORY ${FETCHCONTENT_SOURCE_DIR_MANIFOLD}
152
+ COMMAND_ERROR_IS_FATAL ANY)
153
+ endif()
144
154
  FetchContent_MakeAvailable(manifold)
145
155
 
146
156
  # Boost.Polygon's Voronoi diagram builder, for roof()'s general (multi-
@@ -158,7 +168,13 @@ FetchContent_MakeAvailable(boost_config boost_polygon)
158
168
  # path, not add_subdirectory/MakeAvailable's target machinery. (It used to
159
169
  # supply stb_truetype.h for the font backend too; FreeType/HarfBuzz below
160
170
  # replaced that.)
161
- FetchContent_Declare(stb GIT_REPOSITORY https://github.com/nothings/stb.git GIT_TAG master GIT_SHALLOW TRUE)
171
+ #
172
+ # Pinned to a commit, as everything here is: stb has no releases, and
173
+ # following master made two builds of the same tag differ, which also rules
174
+ # out an offline (Flathub) build listing its sources by checksum.
175
+ FetchContent_Declare(stb
176
+ URL https://github.com/nothings/stb/archive/2c980bb59875b0d32144a71867fbdebb2f77cd20.tar.gz
177
+ URL_HASH SHA256=9a955b1b49a4410088a2e0ee2a9c057c3c907d0c1d75454144cb980aca0ba515)
162
178
  FetchContent_MakeAvailable(stb)
163
179
 
164
180
  # FreeType (glyph outlines + face metrics) and HarfBuzz (shaping), the two
@@ -221,7 +237,10 @@ FetchContent_MakeAvailable(harfbuzz)
221
237
  # `CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR`, so FetchContent_
222
238
  # MakeAvailable here only exposes its `linenoise` INTERFACE target, matching
223
239
  # the existing MANIFOLD_TEST-override pattern's intent for free.
224
- FetchContent_Declare(cpp_linenoise GIT_REPOSITORY https://github.com/yhirose/cpp-linenoise.git GIT_TAG master GIT_SHALLOW TRUE)
240
+ # Pinned to a commit for the same reason as stb: no releases.
241
+ FetchContent_Declare(cpp_linenoise
242
+ URL https://github.com/yhirose/cpp-linenoise/archive/b0e8b88f53be0de26252180b1b959c6dd67ec4a9.tar.gz
243
+ URL_HASH SHA256=e3e67ea401a9e6e19c300f025c51faab197b83254c83e6bef8ef452ee184548b)
225
244
  FetchContent_MakeAvailable(cpp_linenoise)
226
245
 
227
246
  # Embeds the bundled default font's (resources/fonts/) raw bytes into a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.37.0
3
+ Version: 1.37.2
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -72,11 +72,19 @@ const std::unordered_map<std::string, KeywordFactory>& keywordTable() {
72
72
  %x INCFILE
73
73
 
74
74
  IDENT \$?[_A-Za-z][A-Za-z0-9_]*
75
+ UTF8CH [\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf4][\x80-\xbf]{3}
75
76
  NUMLIT 0[xX][0-9A-Fa-f]+|[0-9]+([.][0-9]*)?([eE][+-]?[0-9]+)?|[.][0-9]+([eE][+-]?[0-9]+)?
76
77
 
77
78
  %%
78
79
 
79
80
  [ \t\r\n]+ { /* skip whitespace */ }
81
+ \xc2\xa0|\xef\xbb\xbf|\xa0 {
82
+ // Also whitespace, as in OpenSCAD's lexer.l: U+00A0 NO-BREAK SPACE
83
+ // (C2 A0), which Qt's editor silently turns into a space -- so a file
84
+ // holding one parsed in the editor and failed from the command line --
85
+ // U+FEFF (EF BB BF, a byte-order mark, anywhere in the file) and a bare
86
+ // A0, Latin-1's no-break space.
87
+ }
80
88
  "//"[^\n]* { /* skip line comment */ }
81
89
  "/*"([^*]|\*+[^*/])*\*+"/" { /* skip block comment */ }
82
90
 
@@ -162,9 +170,21 @@ NUMLIT 0[xX][0-9A-Fa-f]+|[0-9]+([.][0-9]*)?([eE][+-]?[0-9]+)?|[.][0-9]+([eE][+-
162
170
  ">" { return yy::parser::make_GTOP(driver.currentTokenLoc()); }
163
171
  "#" { return yy::parser::make_HASHOP(driver.currentTokenLoc()); }
164
172
 
165
- . {
173
+ {UTF8CH} {
174
+ // A whole character, so the message stays valid UTF-8: quoting just its
175
+ // first byte made a message no consumer could decode.
166
176
  driver.reportError(driver.currentTokenLoc(), std::string("unexpected character '") + yytext + "'");
167
177
  }
178
+ . {
179
+ // A byte that starts no valid UTF-8 character: named, not quoted.
180
+ std::string shown(yytext);
181
+ const auto byte = static_cast<unsigned char>(yytext[0]);
182
+ if (byte >= 0x80 || byte < 0x20) {
183
+ static const char hex[] = "0123456789ABCDEF";
184
+ shown = std::string("\\x") + hex[byte >> 4] + hex[byte & 0xF];
185
+ }
186
+ driver.reportError(driver.currentTokenLoc(), "unexpected character '" + shown + "'");
187
+ }
168
188
 
169
189
  <<EOF>> { return yy::parser::make_YYEOF(driver.currentTokenLoc()); }
170
190
 
@@ -473,3 +473,30 @@ TEST(LexicalStrings, BackslashNewlineStillAdvancesTheLineNumber) {
473
473
  EXPECT_EQ(ast[0]->position().line, 1);
474
474
  EXPECT_EQ(ast[1]->position().line, 3) << "the continuation consumed a line";
475
475
  }
476
+
477
+ // As in OpenSCAD's lexer: U+00A0, U+FEFF and a bare Latin-1 A0 are whitespace.
478
+ TEST(LexicalWhitespace, NoBreakSpaceByteOrderMarkAndLatin1A0) {
479
+ for (const char* ws : {"\xc2\xa0", "\xef\xbb\xbf", "\xa0"}) {
480
+ auto ast = parseSrc(std::string(ws) + "a" + ws + "=" + ws + "1;" + ws + "\nb = 2;");
481
+ ASSERT_EQ(ast.size(), 2u);
482
+ EXPECT_EQ(ast[1]->position().line, 2);
483
+ }
484
+ }
485
+
486
+ // The message quotes a whole character, and names a byte that starts none,
487
+ // so it is always valid UTF-8.
488
+ TEST(LexicalWhitespace, UnexpectedCharacterMessageIsValidUtf8) {
489
+ const std::pair<const char*, const char*> cases[] = {
490
+ {"a = 1 \xc3\xa9;", "unexpected character '\xc3\xa9'"},
491
+ {"a = 1 \xc2;", "unexpected character '\\xC2'"},
492
+ {"a = 1 \xff;", "unexpected character '\\xFF'"},
493
+ };
494
+ for (const auto& [src, want] : cases) {
495
+ try {
496
+ parseSrc(src);
497
+ FAIL() << "expected a parse error for " << src;
498
+ } catch (const ParseError& e) {
499
+ EXPECT_NE(std::string(e.what()).find(want), std::string::npos) << e.what();
500
+ }
501
+ }
502
+ }
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "1.37.0"
7
+ version = "1.37.2"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1259,6 +1259,24 @@ def test_a_cancel_signal_stops_a_silent_script_from_another_thread(tmp_path):
1259
1259
  assert time.perf_counter() - t0 < 5
1260
1260
 
1261
1261
 
1262
+ def test_no_break_space_in_code_is_whitespace_and_errors_stay_decodable(tmp_path):
1263
+ """U+00A0 and U+FEFF in code are whitespace, as in OpenSCAD (BelfrySCAD#679),
1264
+ and a parse error naming a non-ASCII character reaches Python as a
1265
+ readable EvalError -- it was `nanobind::str(): conversion error`, since
1266
+ the message quoted the character's first byte alone."""
1267
+ import pytest
1268
+ from openscad_cpp_evaluator import Evaluator, EvalError
1269
+
1270
+ ok = tmp_path / "nbsp.scad"
1271
+ ok.write_bytes(b"\xef\xbb\xbfcube(1);\xc2\xa0\nsphere(\xc2\xa02);\n")
1272
+ Evaluator(echo_fn=lambda _m: None).evaluate(str(ok), {})
1273
+
1274
+ bad = tmp_path / "bad.scad"
1275
+ bad.write_bytes("cube(1) \u00e9;\n".encode("utf-8"))
1276
+ with pytest.raises(EvalError, match="unexpected character '\u00e9'"):
1277
+ Evaluator(echo_fn=lambda _m: None).evaluate(str(bad), {})
1278
+
1279
+
1262
1280
  def main():
1263
1281
  """`python tests/test_python_bindings.py` -- how cibuildwheel runs this
1264
1282
  file -- runs the whole file under pytest. It used to loop over the test_
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "openscad-cpp-evaluator"
58
- version = "1.37.0"
58
+ version = "1.37.2"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "numpy" },