draftwright 0.4.1__tar.gz → 0.4.3__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 (211) hide show
  1. {draftwright-0.4.1 → draftwright-0.4.3}/.gitignore +1 -0
  2. {draftwright-0.4.1 → draftwright-0.4.3}/CHANGELOG.md +91 -0
  3. {draftwright-0.4.1 → draftwright-0.4.3}/PKG-INFO +7 -1
  4. {draftwright-0.4.1 → draftwright-0.4.3}/README.md +3 -0
  5. {draftwright-0.4.1 → draftwright-0.4.3}/pyproject.toml +11 -1
  6. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/__init__.py +13 -1
  7. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/_core.py +14 -1
  8. draftwright-0.4.3/src/draftwright/_pmi_part21.py +421 -0
  9. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/analysis.py +22 -8
  10. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/_common.py +12 -2
  11. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/from_model.py +343 -110
  12. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/orchestrator.py +28 -2
  13. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/audit.py +14 -7
  14. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/builder.py +10 -3
  15. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/cli.py +11 -10
  16. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/compose.py +9 -6
  17. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/drawing.py +61 -7
  18. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/export.py +57 -1
  19. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/__init__.py +14 -0
  20. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/coverage.py +37 -1
  21. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/issues.py +4 -0
  22. draftwright-0.4.3/src/draftwright/linting/pmi_coverage.py +210 -0
  23. draftwright-0.4.3/src/draftwright/linting/polygonal_stock_coverage.py +114 -0
  24. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/__init__.py +12 -0
  25. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/compiled.py +140 -46
  26. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/declare.py +89 -3
  27. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/detect.py +127 -17
  28. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/ir.py +257 -6
  29. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/planner.py +1 -0
  30. draftwright-0.4.3/src/draftwright/pmi.py +1187 -0
  31. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/__init__.py +10 -0
  32. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/pads.py +17 -7
  33. draftwright-0.4.3/src/draftwright/recognition/polygonal_bosses.py +342 -0
  34. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/result.py +10 -0
  35. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/slots.py +113 -23
  36. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/sheet.py +71 -6
  37. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/sheet_emit.py +391 -40
  38. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/grooved_shaft.json +19 -1
  39. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_add_dimension.py +42 -1
  40. draftwright-0.4.3/tests/test_api_docs.py +31 -0
  41. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_audit_differential.py +28 -3
  42. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_compiled_plan_boundary.py +2 -0
  43. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_declare.py +16 -0
  44. draftwright-0.4.3/tests/test_export_dxf_curves.py +135 -0
  45. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_gdt_placement.py +96 -0
  46. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_import_boundaries.py +2 -0
  47. draftwright-0.4.3/tests/test_issue_1000_envelope_reuse.py +90 -0
  48. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_1058_wheel_profile.py +281 -1
  49. draftwright-0.4.3/tests/test_issue_1073_cross_body_patterns.py +95 -0
  50. draftwright-0.4.3/tests/test_issue_1082_polygonal_stock.py +232 -0
  51. draftwright-0.4.3/tests/test_issue_676_polygonal_boss.py +285 -0
  52. draftwright-0.4.3/tests/test_issue_676_polygonal_boss_declare.py +328 -0
  53. draftwright-0.4.3/tests/test_issue_955_height_contingency.py +195 -0
  54. draftwright-0.4.3/tests/test_issue_958_cross_solid_recognition.py +150 -0
  55. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_make_drawing.py +86 -7
  56. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_parameter_id.py +54 -0
  57. draftwright-0.4.3/tests/test_pmi.py +1451 -0
  58. draftwright-0.4.3/tests/test_pmi_datum_lowering.py +463 -0
  59. draftwright-0.4.3/tests/test_pmi_gtol_lowering.py +244 -0
  60. draftwright-0.4.3/tests/test_pmi_part21.py +473 -0
  61. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recogniser_contract.py +11 -0
  62. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recognition_manifest.py +15 -1
  63. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recognition_result.py +6 -0
  64. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_render_seam.py +20 -2
  65. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_emit.py +581 -35
  66. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_identity_invariant.py +2 -0
  67. draftwright-0.4.3/tests/test_workflows.py +78 -0
  68. draftwright-0.4.1/src/draftwright/pmi.py +0 -363
  69. draftwright-0.4.1/tests/test_pmi.py +0 -248
  70. {draftwright-0.4.1 → draftwright-0.4.3}/LICENSE +0 -0
  71. {draftwright-0.4.1 → draftwright-0.4.3}/docs/adr/README.md +0 -0
  72. {draftwright-0.4.1 → draftwright-0.4.3}/skills/SKILL.md +0 -0
  73. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/_geometry.py +0 -0
  74. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/_warnings.py +0 -0
  75. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotate.py +0 -0
  76. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/__init__.py +0 -0
  77. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/balloons.py +0 -0
  78. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/holes.py +0 -0
  79. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/sections.py +0 -0
  80. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fits.py +0 -0
  81. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  82. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  83. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  84. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  85. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/__init__.py +0 -0
  86. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/intents.py +0 -0
  87. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/layout.py +0 -0
  88. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/channel_coverage.py +0 -0
  89. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/flat_coverage.py +0 -0
  90. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  91. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/slot_coverage.py +0 -0
  92. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/structural.py +0 -0
  93. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/suggest.py +0 -0
  94. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/make_drawing.py +0 -0
  95. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/callout.py +0 -0
  96. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/projection.py +0 -0
  97. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/py.typed +0 -0
  98. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/_features.py +0 -0
  99. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/_record.py +0 -0
  100. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/chamfers.py +0 -0
  101. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/countersinks.py +0 -0
  102. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/fillets.py +0 -0
  103. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/flats.py +0 -0
  104. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/grooves.py +0 -0
  105. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/levels.py +0 -0
  106. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/plates.py +0 -0
  107. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/profiled_bores.py +0 -0
  108. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/turned.py +0 -0
  109. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/registry.py +0 -0
  110. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/repair.py +0 -0
  111. {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/score.py +0 -0
  112. {draftwright-0.4.1 → draftwright-0.4.3}/tests/_kernel.py +0 -0
  113. {draftwright-0.4.1 → draftwright-0.4.3}/tests/_layout_sig.py +0 -0
  114. {draftwright-0.4.1 → draftwright-0.4.3}/tests/conftest.py +0 -0
  115. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  116. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  117. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  118. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  119. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/issue_915_case_study_2.step +0 -0
  120. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  121. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  122. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  123. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  124. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  125. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  126. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  127. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  128. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  129. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  130. {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  131. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/bracket_section.json +0 -0
  132. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/centered_rebate.json +0 -0
  133. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/chamfered.json +0 -0
  134. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/filleted.json +0 -0
  135. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/flange_dense.json +0 -0
  136. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/grid_plate.json +0 -0
  137. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/hex_bar.json +0 -0
  138. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/holed_slot.json +0 -0
  139. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/pocketed.json +0 -0
  140. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/prismatic_ladder.json +0 -0
  141. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/scattered_plate.json +0 -0
  142. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/side_drilled.json +0 -0
  143. {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/turned_stepped.json +0 -0
  144. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_agents_guide.py +0 -0
  145. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_architecture_docs.py +0 -0
  146. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_balloon_ring_standoff.py +0 -0
  147. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_carve_free_position_callers.py +0 -0
  148. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_counting_calls.py +0 -0
  149. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_declared_recognition_gate.py +0 -0
  150. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_dense_sheet_canary.py +0 -0
  151. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_deprecation_dates.py +0 -0
  152. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_detect_once.py +0 -0
  153. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_detect_registry.py +0 -0
  154. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_dimension_role_vocabulary.py +0 -0
  155. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_drawing_encapsulation.py +0 -0
  156. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_e2e_slice.py +0 -0
  157. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_e2e_standards.py +0 -0
  158. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_export_dxf_zoom.py +0 -0
  159. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_fillets_adjacency.py +0 -0
  160. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_fits.py +0 -0
  161. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_flat_completeness.py +0 -0
  162. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_flat_stock_identity.py +0 -0
  163. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_flat_stock_opposition.py +0 -0
  164. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_grid_lattice_convention.py +0 -0
  165. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_885_prismatic_coverage.py +0 -0
  166. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_909_sloped_profile.py +0 -0
  167. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_915_dense_case.py +0 -0
  168. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_916_pocket_leader.py +0 -0
  169. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_917_open_channel.py +0 -0
  170. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_label_provenance.py +0 -0
  171. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout.py +0 -0
  172. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout_cleanliness.py +0 -0
  173. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout_hypothesis.py +0 -0
  174. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout_property.py +0 -0
  175. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_lint_box_cache.py +0 -0
  176. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_lint_reconciliation.py +0 -0
  177. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_lint_structural.py +0 -0
  178. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_linting.py +0 -0
  179. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_location_vocabulary.py +0 -0
  180. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_note_verb.py +0 -0
  181. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_object_aspects.py +0 -0
  182. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_occupancy_boxes.py +0 -0
  183. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_part_model.py +0 -0
  184. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_pitch_dim_footprint.py +0 -0
  185. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_pocket_pattern.py +0 -0
  186. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_pocket_pattern_recognition.py +0 -0
  187. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_principal_profile_classifier.py +0 -0
  188. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_private_test_attr_reads.py +0 -0
  189. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_private_test_imports.py +0 -0
  190. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recognition.py +0 -0
  191. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_refactor_golden.py +0 -0
  192. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_registry.py +0 -0
  193. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_score.py +0 -0
  194. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_script_detail_parity.py +0 -0
  195. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_gdt.py +0 -0
  196. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_notes.py +0 -0
  197. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_of.py +0 -0
  198. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_section.py +0 -0
  199. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_tables.py +0 -0
  200. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slanted_blind_step.py +0 -0
  201. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slot_completeness.py +0 -0
  202. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slot_pattern.py +0 -0
  203. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slot_pattern_recognition.py +0 -0
  204. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_soft_deprecation.py +0 -0
  205. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_solve_trace.py +0 -0
  206. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_strip_layout.py +0 -0
  207. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_suppression_ledger.py +0 -0
  208. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_suppression_marks.py +0 -0
  209. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_tolerances.py +0 -0
  210. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_turned_steps.py +0 -0
  211. {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_witness_label_reconciliation.py +0 -0
@@ -12,4 +12,5 @@ testenv/
12
12
  coverage.xml
13
13
  coverage*.json
14
14
  htmlcov/
15
+ site/
15
16
  .DS_Store
@@ -2,6 +2,97 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.4.3 — 2026-08-09
6
+
7
+ **A trust and validation-throughput patch release.** Whole-part hexagonal stock now receives its
8
+ manufacturing definition, assembly recognition no longer combines evidence across bodies, and
9
+ performance validation is both more stable and faster to run.
10
+
11
+ ### Added
12
+
13
+ - **Whole-part regular hexagonal stock is recognised independently of an attached boss and
14
+ dimensioned as `HEX … A/F` plus its axial length** (#1082). In-plane rotation preserves the
15
+ geometric across-flats size instead of substituting an orientation-dependent bounding-box
16
+ width. Automatic and declared paths share the same compiler and placement machinery, while
17
+ completeness lint distinguishes placed, authored-suppressed, dropped, missing, and ambiguous
18
+ outcomes.
19
+
20
+ ### Fixed
21
+
22
+ - **Slot and pocket patterns cannot group members from separate assembly bodies** (#1073).
23
+ Recognition carries solid ownership through grouping and fails closed when ownership is
24
+ unavailable, preventing plausible-looking phantom patterns across disconnected parts.
25
+
26
+ - **The annotation-obstacle performance guard uses deterministic work-count evidence instead of
27
+ a wall-clock threshold** (#1071). The regression test remains load-bearing under mutation but
28
+ no longer flakes because of machine load or suite ordering.
29
+
30
+ ### Changed
31
+
32
+ - **The post-merge slow tier distributes individual tests across workers** (#1108), using
33
+ `pytest-xdist`'s load scheduling after local benchmark evidence showed a material speed-up
34
+ without weakening fixture coverage. Hosted slow validation remains the single post-merge gate.
35
+
36
+ ## v0.4.2 — 2026-08-09
37
+
38
+ **The trustworthy manufacturing drawings release.** AP242 PMI is now accounted for from its
39
+ source records through lowering and rendering, imported datum faces retain an auditable topology
40
+ identity, and several drawing paths that previously omitted, invented, or stalled on defining
41
+ geometry now fail closed or produce the required annotation.
42
+
43
+ ### Added
44
+
45
+ - **AP242 geometric tolerances and datum features survive as source-backed manufacturing
46
+ requirements** (#62/#675/#1094/#1095/#1099/#1100). The importer recovers range-encoded
47
+ dimensional tolerances, tolerance characteristics, magnitudes, datum chains, and supported
48
+ all-around/all-over modifiers. Datum representation-item faces are resolved to imported
49
+ topology through OCCT's exact transfer relationship rather than geometric resemblance, so the
50
+ NIST CTC-01 datum definitions `A`, `B`, and `C` lower and render without guessing.
51
+
52
+ - **PMI completeness lint reconciles every AP242 source record through extraction, projection,
53
+ lowering, and rendering** (#623). Unsupported or incomplete requirements remain explicit with
54
+ source-specific outcomes instead of allowing a partial PMI transcription to report clean.
55
+
56
+ - **Hexagonal and other regular polygonal bosses are recognised and dimensioned by their
57
+ across-flats size** (#676). Automatic and declared paths share the same feature model, and
58
+ mutation tests reject incomplete, unequal, non-planar, and ambiguous face sets.
59
+
60
+ - **Generated `Sheet` scripts preserve references to named source objects where correspondence
61
+ is proven** (#1041). The `--script` path emits declarations such as
62
+ `sheet.hole(features.tap)` instead of copying detected numbers; ambiguous, stale, non-shape, or
63
+ unused mappings fail closed.
64
+
65
+ - **A curated API reference is published at
66
+ <https://pzfreo.github.io/draftwright/>** (#846), covering the supported entry points,
67
+ `Sheet` declaration surface and fluent handles, `Drawing` results, and feature constructors.
68
+
69
+ ### Fixed
70
+
71
+ - **Recognition no longer combines faces from different solids into phantom slots or pads**
72
+ (#958). Each physical solid is recognised independently before the results are combined.
73
+
74
+ - **`Sheet.from_part(...).envelope()` reuses the detected whole-part envelope** (#1000) instead
75
+ of appending a duplicate feature whose dimensions were then silently deduplicated on the page.
76
+
77
+ - **Crowded Z-turned step chains recover the independently approved overall height when the
78
+ chain cannot be placed** (#955), and placed step lengths retain measurement identity for
79
+ differential audit (#1004).
80
+
81
+ - **All-over GD&T leaders and complex STEP B-spline paths have bounded, export-safe DXF
82
+ conversion** (#1097/#1070). All-over scope now reaches the existing export-safe leader
83
+ representation, while spline conversion reads OCCT knots, poles, and weights through its
84
+ indexed API instead of expensive sequence wrappers; visible curve geometry is preserved.
85
+
86
+ ### Changed
87
+
88
+ - **Hosted CI retains every supported Python version and both dependency/kernel generations on
89
+ macOS and Windows with a smaller compatibility matrix** (#1103). PRs still require lint,
90
+ coverage, Codecov, and the compatibility gates; the slow standards tier runs once after merge.
91
+
92
+ - **The pinned wheel fixture now records mutation-gated evidence for a repeating 13-fold radial
93
+ profile without claiming gear semantics** (#1085). Runtime recognition remains fail-closed
94
+ until a separate feature contract has independently sufficient evidence.
95
+
5
96
  ## v0.4.1 — 2026-08-07
6
97
 
7
98
  **The recognition trust release.** Automatic drawings now fail closed on unsupported inner
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: draftwright
3
- Version: 0.4.1
3
+ Version: 0.4.3
4
4
  Summary: Automated technical-drawing generation for build123d
5
5
  Project-URL: Homepage, https://github.com/pzfreo/draftwright
6
6
  Project-URL: Repository, https://github.com/pzfreo/draftwright
7
7
  Project-URL: Issues, https://github.com/pzfreo/draftwright/issues
8
8
  Project-URL: Changelog, https://github.com/pzfreo/draftwright/blob/main/CHANGELOG.md
9
+ Project-URL: Documentation, https://pzfreo.github.io/draftwright/
9
10
  Author-email: Paul Fremantle <pzfreo@gmail.com>
10
11
  License: GNU AFFERO GENERAL PUBLIC LICENSE
11
12
  Version 3, 19 November 2007
@@ -682,6 +683,7 @@ Classifier: Programming Language :: Python :: 3.13
682
683
  Classifier: Programming Language :: Python :: 3.14
683
684
  Classifier: Topic :: Scientific/Engineering
684
685
  Requires-Python: <3.15,>=3.10
686
+ Requires-Dist: antlr4-python3-runtime<4.10
685
687
  Requires-Dist: build123d-drafting-helpers>=0.14.1
686
688
  Requires-Dist: build123d<0.11,>=0.9.0; python_full_version < '3.13'
687
689
  Requires-Dist: build123d<0.12,>=0.11; python_full_version >= '3.13'
@@ -689,6 +691,7 @@ Requires-Dist: numpy>=1.24
689
691
  Requires-Dist: pillow>=10
690
692
  Requires-Dist: pypdfium2>=4
691
693
  Requires-Dist: reportlab>=4.0
694
+ Requires-Dist: steputils==0.1
692
695
  Requires-Dist: svglib>=1.5
693
696
  Requires-Dist: typer>=0.12
694
697
  Requires-Dist: typing-extensions>=4.5; python_full_version < '3.13'
@@ -705,6 +708,9 @@ Description-Content-Type: text/markdown
705
708
  [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
706
709
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
707
710
 
711
+ **[API reference](https://pzfreo.github.io/draftwright/)** ·
712
+ **[Examples and source](https://github.com/pzfreo/draftwright#readme)**
713
+
708
714
  Automated technical-drawing generation for [build123d](https://github.com/gumyr/build123d).
709
715
  Point it at a solid (or a STEP file) and get a fully-annotated multi-view engineering
710
716
  drawing — orthographic views, dimensions, section A–A, ISO hatching, title block — ready
@@ -9,6 +9,9 @@
9
9
  [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
10
10
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
11
11
 
12
+ **[API reference](https://pzfreo.github.io/draftwright/)** ·
13
+ **[Examples and source](https://github.com/pzfreo/draftwright#readme)**
14
+
12
15
  Automated technical-drawing generation for [build123d](https://github.com/gumyr/build123d).
13
16
  Point it at a solid (or a STEP file) and get a fully-annotated multi-view engineering
14
17
  drawing — orthographic views, dimensions, section A–A, ISO hatching, title block — ready
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.4.1"
7
+ version = "0.4.3"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -25,6 +25,11 @@ dependencies = [
25
25
  "pillow>=10",
26
26
  "pypdfium2>=4",
27
27
  "reportlab>=4.0",
28
+ # Structured ISO 10303-21 access for AP242 facts that OCCT's XCAF transfer drops (#62).
29
+ # STEPutils 0.1 is the only release; isolate it behind _pmi_part21 and pin its README's
30
+ # ANTLR compatibility constraint explicitly because the package metadata omits the cap.
31
+ "steputils==0.1",
32
+ "antlr4-python3-runtime<4.10",
28
33
  "svglib>=1.5",
29
34
  "typer>=0.12",
30
35
  # PEP 702 @deprecated: stdlib `warnings.deprecated` lands in 3.13; backport for 3.10–3.12.
@@ -53,6 +58,7 @@ Homepage = "https://github.com/pzfreo/draftwright"
53
58
  Repository = "https://github.com/pzfreo/draftwright"
54
59
  Issues = "https://github.com/pzfreo/draftwright/issues"
55
60
  Changelog = "https://github.com/pzfreo/draftwright/blob/main/CHANGELOG.md"
61
+ Documentation = "https://pzfreo.github.io/draftwright/"
56
62
 
57
63
  [tool.hatch.build.targets.wheel]
58
64
  packages = ["src/draftwright"]
@@ -144,6 +150,10 @@ select = ["E", "F", "I", "UP"]
144
150
  ignore = ["E501"]
145
151
 
146
152
  [dependency-groups]
153
+ docs = [
154
+ "mkdocs>=1.6,<2",
155
+ "mkdocstrings[python]>=0.30,<1",
156
+ ]
147
157
  dev = [
148
158
  "codespell>=2.3.0",
149
159
  "hypothesis>=6",
@@ -29,8 +29,11 @@ _LAZY = {
29
29
  "FeatureInfo": "draftwright.drawing",
30
30
  "Sheet": "draftwright.sheet",
31
31
  "lint_feature_coverage": "draftwright.linting",
32
+ "PmiExtractionReport": "draftwright.pmi",
32
33
  "PmiRecord": "draftwright.pmi",
34
+ "PmiSourceEntity": "draftwright.pmi",
33
35
  "extract_pmi": "draftwright.pmi",
36
+ "extract_pmi_report": "draftwright.pmi",
34
37
  "choose_scale": "draftwright.compose",
35
38
  # A warning category users are told to filter must be importable without reaching into a
36
39
  # private module (#1043 review) — and without paying for the CAD kernel. It lives in the
@@ -78,7 +81,13 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
78
81
  from draftwright.compose import choose_scale
79
82
  from draftwright.drawing import Drawing, FeatureInfo
80
83
  from draftwright.linting import lint_feature_coverage
81
- from draftwright.pmi import PmiRecord, extract_pmi
84
+ from draftwright.pmi import (
85
+ PmiExtractionReport,
86
+ PmiRecord,
87
+ PmiSourceEntity,
88
+ extract_pmi,
89
+ extract_pmi_report,
90
+ )
82
91
  from draftwright.sheet import Sheet
83
92
 
84
93
 
@@ -93,11 +102,14 @@ __all__ = [
93
102
  "Drawing",
94
103
  "SoftDeprecationWarning",
95
104
  "FeatureInfo",
105
+ "PmiExtractionReport",
96
106
  "PmiRecord",
107
+ "PmiSourceEntity",
97
108
  "Sheet",
98
109
  "build_drawing",
99
110
  "choose_scale",
100
111
  "extract_pmi",
112
+ "extract_pmi_report",
101
113
  "lint_feature_coverage",
102
114
  "make_drawing",
103
115
  ]
@@ -1015,8 +1015,16 @@ class Analysis:
1015
1015
  tolerance: str
1016
1016
  drawn_by: str
1017
1017
  out: str
1018
- pmi: list
1018
+ # Canonical AP242 source census + extraction outcomes for a STEP input, including off mode
1019
+ # (which inventories but does not lower records); None for an in-memory Shape. Typed as
1020
+ # object to keep the rank-1 core from importing rank-2 pmi; the compatibility `pmi` property
1021
+ # below is its records projection.
1022
+ pmi_report: object | None
1019
1023
  pmi_mode: str
1024
+ # True when the caller omitted `pmi` and the public default selected off. Kept separate
1025
+ # from the effective mode so the ignored-PMI diagnostic can distinguish that default from
1026
+ # an explicit opt-out without widening the three-mode renderer contract (#623).
1027
+ pmi_defaulted: bool
1020
1028
  # Standing ISO 7200 title-block fields (#766) — defaulted, so they sit after the
1021
1029
  # non-default fields above. Defaults preserve the prior output: revision "A", the rest
1022
1030
  # blank (the TitleBlock helper's own defaults).
@@ -1040,6 +1048,11 @@ class Analysis:
1040
1048
  # back to build_model(a).
1041
1049
  model: object | None = None
1042
1050
 
1051
+ @property
1052
+ def pmi(self) -> list:
1053
+ """Successful PMI records, derived from the canonical extraction report."""
1054
+ return list(getattr(self.pmi_report, "records", ()))
1055
+
1043
1056
 
1044
1057
  _greedy_strip_ys = _greedy_strip_1d
1045
1058