Skip to content

fix: wire up measure-numbering read/write in mx::api - #322

Merged
webern merged 1 commit into
mainfrom
fix-measure-numbering
Jul 7, 2026
Merged

fix: wire up measure-numbering read/write in mx::api#322
webern merged 1 commit into
mainfrom
fix-measure-numbering

Conversation

@webern

@webern webern commented Jul 7, 2026

Copy link
Copy Markdown
Owner

Human Summary

This seems to be wiring up something that was already in the API but missing from the reader and writer. It appears to put the repo in a better state! Gonna merge.

Summary

MeasureData::measureNumbering and Converter::convertMeasureNumbering already existed (a
bidirectional core/api enum mapping), but neither MeasureReader nor MeasureWriter ever called
the converter. A source's <measure-numbering> (nested inside a measure's <print>) was silently
dropped on round-trip, even though data/api.features.xml audits the element as fully supported.

  • MeasureReader::parsePrint now reads <print>/<measure-numbering>'s value directly into
    MeasureData::measureNumbering. This is measure-scoped, presence-based state (default
    unspecified), not carried forward across measures like time/key.
  • MeasureWriter gains writeMeasureNumbering(), which finds-or-creates the measure's <print>
    element the same way writePageInfo() already does, so <measure-numbering> shares a single
    <print> with any system/page layout already written for that measure instead of emitting a
    second one.

Testing

  • New measureNumberingRoundTrip / measureNumberingUnspecifiedOmitsElement tests
    (MeasureDataTest.cpp)
  • make test: all pass (4734 assertions in 382 test cases, plus the three examples)
  • make test-api-roundtrip: 158 passed, 0 failed (of 158 pinned; 1 newly unlocked)
  • make fmt / make check: clean

References

MeasureData::measureNumbering and Converter::convertMeasureNumbering already
existed, but neither MeasureReader nor MeasureWriter ever called the
converter, so a source's <measure-numbering> (inside a measure's <print>)
was silently dropped on round-trip even though the api audits the element
as fully supported.

MeasureReader::parsePrint now reads it directly into MeasureData (it is
measure-scoped, presence-based state, not carried forward like time/key).
MeasureWriter gains writeMeasureNumbering(), which finds-or-creates the
measure's <print> element the same way writePageInfo() already does, so it
shares a single <print> with any system/page layout already written for
that measure.

Closes #279
@webern webern added bug software defect non-breaking fixes or implementation that do not require breaking changes api Affects the mx::api layer impl Affects the mx::impl layer ai Issues opened by, or through, a coding agent. labels Jul 7, 2026 — with Claude
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

Coverage report

Core-dev coverage src/private/mx/core/

Metric Coverage Covered / Total
Lines 77.8% 28513 / 36640
Functions 74.3% 6352 / 8551
Branches 50.7% 22678 / 44751

API coverage src/private/mx/{api,impl,utility}/

Metric Coverage Covered / Total
Lines 80.9% 6424 / 7943
Functions 67.8% 2221 / 3276
Branches 49.6% 5504 / 11100

Core HTML report | API HTML report

Commit c13da0e68e642faefa920c623a5ce00a87d0c131.

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

gen-quality gen/

gen-quality: 84.5 / 100   (floor 84.5, +0.0)

  structure     86.5  x0.50   [fn 90.5 / file 82.6]
  cyclomatic    88.4  x0.25
  cognitive     76.6  x0.25

  409 functions across 31 files, 7702 lines (largest file 1044)
  max cc 56  max cognitive 44  max fn loc 152

Worst offenders (top 5 per axis; full lists in score.json):
  cyclomatic gen/xsd/analyze.py:311     report                             56
  cyclomatic gen/plates/build.py:956    _validate_config_against_ir        35
  cyclomatic gen/press/context.py:145   plate_context                      34
  cyclomatic gen/__main__.py:46         _ir                                23
  cyclomatic gen/tests/test_ir.py:102   _check_references                  20
  cognitive  gen/xsd/analyze.py:311     report                             44
  cognitive  gen/ir/resolve.py:119      flat_elements                      40
  cognitive  gen/tests/test_ir.py:102   _check_references                  38
  cognitive  gen/press/context.py:145   plate_context                      37
  cognitive  gen/xsd/analyze.py:207     _sccs                              37
  size       gen/xsd/analyze.py:311     report                             152
  size       gen/press/context.py:145   plate_context                      96
  size       gen/plates/build.py:533    _value_plate                       89
  size       gen/plates/build.py:956    _validate_config_against_ir        89
  size       gen/ir/resolve.py:119      flat_elements                      78

Commit c13da0e68e642faefa920c623a5ce00a87d0c131.

@webern
webern merged commit 78ec850 into main Jul 7, 2026
10 checks passed
@webern
webern deleted the fix-measure-numbering branch July 7, 2026 08:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai Issues opened by, or through, a coding agent. api Affects the mx::api layer bug software defect impl Affects the mx::impl layer non-breaking fixes or implementation that do not require breaking changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

api: round-trip drops measure-numbering

1 participant