sillsdev / sillsdev/python-sil-lift

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

Open Beginner friendly
#15 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
Python
Stars
1
Forks
0
Avg merge
10d 11h
Merged PRs (30d)
6

Description

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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the existing files under tests/corpus/ and the corpus-parametrized tests, then inspect _reader.py:434, _writer.py:352-353, and tests/test_property_roundtrip.py. Add one version="0.13" fixture covering the listed example, subsense, and etymology shapes, with semantic read-back assertions and byte-identical round-trip validation; the existing fidelity, canonical, and RNG-validity paths should also pass.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing-qa
Issue type
Feature
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
84/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.