Problem
Example.notes is modeled, parsed (_reader.py:434) and written
(_writer.py:352-353), but no corpus fixture contains a <note> inside an
<example>. The writer's loop body is dead code as far as the suite is concerned,
and the property-based round-trip strategies don't help — _senses() in
tests/test_property_roundtrip.py generates no examples at all.
This was measured by diffing branch coverage of the full 458-test suite against a
run that loads, re-saves and validates 10 real FLEx exports (~29,000 entries, from
sillsdev/TheCombine Backend.Tests/Assets/*.zip). Those exports reach exactly
four arcs the suite does not, all one feature:
_reader.py:434 handlers["note"] = lambda c: example.notes.append(_parse_note(c)) (lambda body)
_writer.py:352 for note in example.notes:
_writer.py:353 el.append(_note_el(note))
FLEx emits these heavily — 2,454 example-notes in one export, 744 in another,
typically <note type="reference"> carrying a scripture citation alongside the
example's translation.
Two further structures in those exports have no corpus instance either (counted
across every tests/corpus/ file: 0 each):
<subsense> carrying example (with its own translation and note), note,
or reversal. spec-examples/0.13/subsenses.lift has subsenses, but only with
gloss/definition.
<etymology> carrying a trait (FLEx writes trait name="languages").
Proposed fixture
One hand-authored version="0.13" file. These shapes are legal per the RNG, so it
belongs in the regular corpus rather than negative/:
- a sense with an
<example> carrying <translation>, <note type="reference">,
and a <trait>
- a
<subsense> carrying its own <example> (with nested translation and
note), a <note>, and two <reversal> elements
- an
<etymology> with a <trait>
Shapes drawn from real SIL.FLEx 9.0.7 output, e.g.:
<example source="Luke 1:4">
<form lang="qaa-x-stc"><text>…</text></form>
<translation type="Free translation">
<form lang="en"><text>…</text></form>
</translation>
<note type="reference">
<form lang="en"><text>Luke 1:4</text></form>
</note>
</example>
Assertions: semantic read-back (example.notes, subsense.examples,
etymology.traits — proving the content is modeled rather than carried as
Extras residue) plus byte-identical round-trip. The file also picks up the
existing corpus-parametrized fidelity, canonical, and RNG-validity paths for free.
Why hand-authored rather than importing an export
The exports that surface this are 1.4-12.3 MB of real community lexical data
(Natqgu, Sena) with no per-file provenance recorded in their source repo — the same
permission question as the pending "Enggano export" line in
tests/corpus/PROVENANCE.md. A short fixture closes the coverage gap without
taking that on, or adding megabytes to the repo.
Not included, deliberately
<span lang=...> inside a <definition> looked novel at first — the corpus has 72
spans in definitions, none with @lang. But large/sango/sango.lift already has 45
span[@lang] elsewhere, so the attribute is exercised; only the combination is
absent, and that's not a distinct code path.
Problem
Example.notesis modeled, parsed (_reader.py:434) and written(
_writer.py:352-353), but no corpus fixture contains a<note>inside an<example>. The writer's loop body is dead code as far as the suite is concerned,and the property-based round-trip strategies don't help —
_senses()intests/test_property_roundtrip.pygenerates no examples at all.This was measured by diffing branch coverage of the full 458-test suite against a
run that loads, re-saves and validates 10 real FLEx exports (~29,000 entries, from
sillsdev/TheCombineBackend.Tests/Assets/*.zip). Those exports reach exactlyfour arcs the suite does not, all one feature:
FLEx emits these heavily — 2,454 example-notes in one export, 744 in another,
typically
<note type="reference">carrying a scripture citation alongside theexample's translation.
Two further structures in those exports have no corpus instance either (counted
across every
tests/corpus/file: 0 each):<subsense>carryingexample(with its owntranslationandnote),note,or
reversal.spec-examples/0.13/subsenses.lifthas subsenses, but only withgloss/definition.<etymology>carrying atrait(FLEx writestrait name="languages").Proposed fixture
One hand-authored
version="0.13"file. These shapes are legal per the RNG, so itbelongs in the regular corpus rather than
negative/:<example>carrying<translation>,<note type="reference">,and a
<trait><subsense>carrying its own<example>(with nestedtranslationandnote), a<note>, and two<reversal>elements<etymology>with a<trait>Shapes drawn from real
SIL.FLEx 9.0.7output, e.g.:Assertions: semantic read-back (
example.notes,subsense.examples,etymology.traits— proving the content is modeled rather than carried asExtrasresidue) plus byte-identical round-trip. The file also picks up theexisting corpus-parametrized fidelity, canonical, and RNG-validity paths for free.
Why hand-authored rather than importing an export
The exports that surface this are 1.4-12.3 MB of real community lexical data
(Natqgu, Sena) with no per-file provenance recorded in their source repo — the same
permission question as the pending "Enggano export" line in
tests/corpus/PROVENANCE.md. A short fixture closes the coverage gap withouttaking that on, or adding megabytes to the repo.
Not included, deliberately
<span lang=...>inside a<definition>looked novel at first — the corpus has 72spans in definitions, none with
@lang. Butlarge/sango/sango.liftalready has 45span[@lang]elsewhere, so the attribute is exercised; only the combination isabsent, and that's not a distinct code path.