Skip to content

Add a fixture for <note> inside <example>, subsense-nested example/note/reversal, and etymology traits #15

Description

@imnasnainaec

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions