Test corpora¶
No real family export exists for this project, and one would be personal
data anyway. Development and testing run against public GEDCOM files fetched
by scripts/fetch_corpora.sh into corpora/, which is gitignored except for
corpora/entries/. The only GEDCOMs tracked in this repo are the fictional
tests/fixtures/sample.ged and the 97 public-domain-era trees under
corpora/entries/ (below) -- everything else in corpora/ is fetched,
never committed.
Surveyed 2026-08-23 with ged4py 0.5.2: 108 files fetched, 105 parse.
The development set¶
Use these, in this order, as Phase 1 grows:
| File | People | Families | GEDCOM | Charset | Exercises |
|---|---|---|---|---|---|
tests/fixtures/sample.ged |
12 | 4 | 5.5.1 | UTF-8 | unit tests; every date qualifier; tracked |
corpora/gedcom-samples/bronte.ged |
14 | 4 | 5.5 | UTF-8 | smallest real file; a recognisable family |
corpora/gedcom-samples/shakespeare.ged |
31 | 11 | 5.5.1 | UTF-8 | |
corpora/gramps/sample.ged |
42 | 15 | 5.5 | UTF-8 | Gramps export dialect; 4 sources |
corpora/torture/TGC551LF.ged |
15 | 7 | 5.5 | ANSEL | every tag 5.5 allows; RESN privacy flags; multimedia links; accented ANSEL; CR+LF |
corpora/torture/TGC551.ged |
15 | 7 | 5.5 | ANSEL | same, CR-only line endings |
corpora/gedcom-samples/sample-kennedy/kennedy.ged |
208 | 75 | 5.5.1 | UTF-8 | Ancestris export; 20th-century dates |
corpora/gedcom-samples/royal/royal92.ged |
3,010 | 1,422 | none declared | ANSEL | the classic 1992 PAF file; no GEDC header; deep ancestry to 534 |
corpora/gedcom-samples/pres/pres2020.ged |
2,322 | 1,115 | 5.5.1 | UTF-8 + BOM | Family Tree Maker export; 91 sources; the federation demo corpus |
corpora/gedcom-samples/queen/Queen.ged |
4,683 | 2,863 | 5.5.1 | UTF-8 | RootsMagic; dates back to "4004 BC", a temporal edge case |
The scale ladder¶
For build-time and query benchmarks once Phase 1 works:
| File | People | Size | ged4py read |
|---|---|---|---|
gedcom-samples/washington/washington.ged |
529 | 140 KB | 0.1 s |
gedcom-samples/ivar/IvarKingOfDublin.ged |
1,288 | 270 KB | 0.1 s |
gedcom-samples/pres/pres2020.ged |
2,322 | 1.1 MB | 0.3 s |
gedcom-samples/habs/Habsburg.ged |
34,020 | 9.9 MB | 3.8 s |
gedcom-samples/longsword/WilliamLongsword.ged |
203,154 | 48 MB | 17.8 s |
Longsword is the Phase 3 target: 200k person nodes plus events and places is roughly a million nodes, which is where the embedding pass, not the parse, sets the build time.
What else is in gedcom-samples/¶
The famous family trees/ directory mirrors the SourceForge "Famous Family
Trees" collection: 88 small files covering dynasties (Tudor, Habsburg, Han,
Ming, Ptolemaic), religious lineages, fictional families (Harry Potter,
Tolkien, the Simpsons) and some that are not genealogy at all (corporate
histories, language families, Windows versions, DNA haplogroups). The
non-genealogical ones are a cheap way to check that nothing in the extractor
assumes people are human.
Three files in the collection did not originally parse:
fictional characters/Lord+of+the+Rings+Family+Tree.ged: a stray blank line after0 TRLRat 1108, which ged4py's strict grammar rejected as invalid syntax. Fixed:GedcomFilenow trims trailing blank lines from the copy it hands ged4py (gedcom._trim_trailing_blank_lines), without shifting any real record's byte offset, sospans()'s line numbers (read from the untouched file on disk) are unaffected. Committed atcorpora/entries/fictional-characters/lord-of-the-rings-family-tree/.US presidents/GeorgeWashington+Family+Small.ged: not a truncated header -- the file is, byte for byte, a saved HTML error page (a Google Groups page, not a GEDCOM export), and upstreamD-Jeffrey/gedcom-samplescarries the identical broken content, confirmed by diff against itsmainbranch. Not fixable by re-fetching from the documented source; dropped fromcorpora/entries/us-presidents/.religious figures and systems/Wikipedia+Gods+not+Yet+Connected.ged: byte0x85under a charset that cannot hold it. Not committed tocorpora/entries/; still unresolved.
Many files declare CHAR ANSI, IBMPC or IBM WINDOWS, none of which the
standard allows. ged4py warns once per file and reads them as cp1252 or
cp437. The extractor should surface that warning in build output rather
than hide it.
The curated corpus: corpora/entries/¶
corpora/entries/<genre>/<slug>/ is tracked, not fetched -- see
corpora/entries/NOTICE.md. It supersedes
what used to be a hand-picked corpora/vendored/ of three trees
(bronte, washington, tudor), each checked person-by-person for
living-person exposure before being let in. That approach hit its limit at
royal92.ged: its own root (William the Conqueror, d. 1087) looks
historical, but his descent line walks straight into the living modern
European royal families -- vendored, then removed on that same check.
The safety boundary for what the tool returns is now the living-person
filter itself, on by default and enforced at the query/pack/MCP boundary
(GedcomExtractor.is_living(), through pack()) rather than which files
are let into the repo. It does not cover the committed files, which anyone
can read directly; those are public GEDCOMs as published, with their
submitter (SUBM) records withheld by scripts/scrub_submitters.py. That's what let
the corpus grow to its current 97 trees across 10 genres -- royal92.ged
included, per the table below -- without re-doing a person-by-person audit
of each one. genkg corpus survey/ingest (see the main
README) build and register them; the
three originally-vendored trees are still in here, at new paths:
| File | People | Root xref |
|---|---|---|
corpora/entries/samples/bronte/bronte.ged |
14 | I0001 |
corpora/entries/us-presidents/washington/washington.ged |
529 | I3 |
corpora/entries/royalty/tudor/EnglishTudorRoyalFamily.ged |
347 | I1 |
corpora/entries/royalty/royal92-famous-european-royalty-gedcom/*.ged |
3,010 | -- |
Licensing¶
- D-Jeffrey/gedcom-samples is dual-licensed MIT / CC0 1.0 by its curator. The files' original authors (Denis R. Reid for royal92, Paul E. Stobbe for pres2020, and others) published them on the open internet without stated terms.
- The torture test (H. Eichmann 1997, modified by J. A. Nairn
1999-2001): "Feel free to copy and use this GEDCOM file for any
non-commercial purpose." Now committed under
corpora/entries/torture/(its four variants exercise every 5.5 tag, ANSEL, and both line-ending conventions -- see the development-set table above). - Gramps
sample.gedlives in a GPL-2.0 repository. It is data, not code, and is used here as test input only, and is not committed.
Only the D-Jeffrey/gedcom-samples-derived and torture-test files under
corpora/entries/ (above) are committed to the repository -- royal92
included, under the query/pack/MCP-boundary safety model, not a
person-by-person exclusion list.
*.ged is gitignored outside tests/fixtures/ and corpora/entries/, and
the rest of corpora/ is gitignored whole.
Refreshing¶
./scripts/fetch_corpora.sh # idempotent; pulls the clone, skips existing downloads