gedcomkit 0.1.18__tar.gz → 0.1.20__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/CHANGELOG.md +97 -0
  2. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/Cargo.lock +1 -1
  3. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/Cargo.toml +1 -1
  4. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/PKG-INFO +1 -1
  5. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/README.md +2 -6
  6. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/bindings/gedcomkit-py/Cargo.lock +2 -2
  7. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/bindings/gedcomkit-py/Cargo.toml +1 -1
  8. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/bindings/gedcomkit-py/gedcomkit.pyi +27 -2
  9. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/bindings/gedcomkit-py/src/lib.rs +3 -1
  10. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/build.rs +1 -1
  11. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/convert.rs +412 -7
  12. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/dates.rs +578 -72
  13. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/validate.rs +160 -122
  14. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/view.rs +42 -1
  15. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/typescript.rs +1 -0
  16. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/LICENSE +0 -0
  17. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/bindings/gedcomkit-py/LICENSE +0 -0
  18. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/bindings/gedcomkit-py/README.md +0 -0
  19. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/LICENSE +0 -0
  20. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/README.md +0 -0
  21. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/cardinalities.tsv +0 -0
  22. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/enumerations.tsv +0 -0
  23. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/enumerationsets.tsv +0 -0
  24. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/grammar.abnf +0 -0
  25. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/grammar.gedstruct +0 -0
  26. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/payloads.tsv +0 -0
  27. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom-spec/substructures.tsv +0 -0
  28. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/age-invalid.ged +0 -0
  29. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/age-valid.ged +0 -0
  30. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/atsign.ged +0 -0
  31. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_ascii_1.ged +0 -0
  32. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_ascii_2.ged +0 -0
  33. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf16be-1.ged +0 -0
  34. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf16be-2.ged +0 -0
  35. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf16le-1.ged +0 -0
  36. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf16le-2.ged +0 -0
  37. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf8-1.ged +0 -0
  38. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf8-2.ged +0 -0
  39. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/char_utf8-3.ged +0 -0
  40. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/date-all.ged +0 -0
  41. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/date-dual-invalid.ged +0 -0
  42. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/date-dual-valid.ged +0 -0
  43. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/enum-ext.ged +0 -0
  44. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/filename-1.ged +0 -0
  45. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/lang-all.ged +0 -0
  46. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/notes-1.ged +0 -0
  47. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/obje-1.ged +0 -0
  48. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/obsolete-1.ged +0 -0
  49. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/pedi-1.ged +0 -0
  50. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/rela_1.ged +0 -0
  51. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/sour-1.ged +0 -0
  52. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/tiny-1.ged +0 -0
  53. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/5/xref-case.ged +0 -0
  54. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/age-invalid.ged +0 -0
  55. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/age-valid.ged +0 -0
  56. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/atsign.ged +0 -0
  57. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_ascii_1.ged +0 -0
  58. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_ascii_2.ged +0 -0
  59. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf16be-1.ged +0 -0
  60. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf16be-2.ged +0 -0
  61. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf16le-1.ged +0 -0
  62. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf16le-2.ged +0 -0
  63. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf8-1.ged +0 -0
  64. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf8-2.ged +0 -0
  65. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/char_utf8-3.ged +0 -0
  66. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/date-all.ged +0 -0
  67. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/date-dual-invalid.ged +0 -0
  68. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/enum-ext.ged +0 -0
  69. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/filename-1.ged +0 -0
  70. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/lang-all.ged +0 -0
  71. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/notes-1.ged +0 -0
  72. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/obje-1.ged +0 -0
  73. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/obsolete-1.ged +0 -0
  74. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/pedi-1.ged +0 -0
  75. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/rela_1.ged +0 -0
  76. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/sour-1.ged +0 -0
  77. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/tiny-1.ged +0 -0
  78. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/7/xref-case.ged +0 -0
  79. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/LICENSE +0 -0
  80. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/gedcom7code/UPSTREAM-README.md +0 -0
  81. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/zip-interop/README.md +0 -0
  82. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/zip-interop/python-zip64.gdz +0 -0
  83. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/fixtures/vendored/zip-interop/python-zipfile.gdz +0 -0
  84. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/pyproject.toml +0 -0
  85. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/decode.rs +0 -0
  86. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/family.rs +0 -0
  87. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/gedzip.rs +0 -0
  88. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/lib.rs +0 -0
  89. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/names.rs +0 -0
  90. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/schema.rs +0 -0
  91. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/synthetic.rs +0 -0
  92. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/src/tags.rs +0 -0
  93. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/endurance.rs +0 -0
  94. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/external_charset.rs +0 -0
  95. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/properties.rs +0 -0
  96. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/requirement_corpus.rs +0 -0
  97. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/spec_conformance.rs +0 -0
  98. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/vendored_corpus.rs +0 -0
  99. {gedcomkit-0.1.18 → gedcomkit-0.1.20}/tests/version_conversion.rs +0 -0
@@ -7,6 +7,103 @@ rules.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.20] - 2026-11-09
11
+
12
+ ### Fixed
13
+
14
+ - The date reader reads a calendar named after a qualifier or a range
15
+ word, as both grammars write it: `INT @#DJULIAN@ 2 MAR 1700 (…)`,
16
+ `BEF @#DJULIAN@ 2 JAN 1700`, `ABT JULIAN 1700`, `BET @#DJULIAN@ 1700 AND
17
+ @#DJULIAN@ 1710`. Such a date was left unparsed before, though
18
+ `to_gedcom_5_5_1` writes exactly this form, so what it wrote did not read
19
+ back. A range whose ends name different calendars, or whose unnamed end
20
+ (Gregorian) disagrees with a named one, stays unparsed.
21
+
22
+ ## [0.1.19] - 2026-10-17
23
+
24
+ ### Added
25
+
26
+ - `view::EventView::date_phrase` (`datePhrase` in the serialized view, so
27
+ in both bindings and the TypeScript definitions): the `PHRASE` beneath an
28
+ event's `DATE`, exactly as written. A GEDCOM 7 date with an empty payload
29
+ and a `PHRASE`, or a date with a phrase beside it, showed nothing of the
30
+ phrase before. A 5.5.1 phrase is written inside the payload, which `date`
31
+ already holds. The Python stub gains an `EventView` typed dict naming
32
+ every key of an event.
33
+ - The date reader reads ISO 8601's year and month: `1834-02` is February
34
+ 1834, as `1834-02-10` was already 10 February 1834. Only four digits, a
35
+ hyphen and two digits are read, and only when the month is no more than
36
+ the year's last two digits: `1808-10`, `1711-12` and `2010-11` are as
37
+ often a span of years or a dual year as a month, and stay unparsed. So
38
+ does every month of a year ending in 00 (`1800-01` to `1800-12`), and
39
+ the later months of a year ending in 01 to 11 (`2005-06` to `2005-12`).
40
+
41
+ ### Changed
42
+
43
+ - `validate::inspect` no longer reports two events out of order when an
44
+ approximate date's leeway could put them in order, which is how
45
+ `conflicting-vitals` already read them. A birth `ABT 1854` with a
46
+ christening in 1853 was a `christened-before-born` question; it is now
47
+ no finding. The same holds for `died-before-born`, `buried-before-died`,
48
+ `event-after-death`, `event-before-birth`, `married-before-born`,
49
+ `married-after-died` and `child-born-after-mother-died`, each of which
50
+ now reports only what is out of order beyond the leeway, as a
51
+ contradiction (a question for an `EVEN` or `FACT`, as before). Within the
52
+ leeway no other check fires in its place: a marriage in 1849 for somebody
53
+ born about 1850 is not `married-as-a-child`. Bounds (`BEF`, `AFT`, `BET`)
54
+ are read as the ranges they admit, unchanged.
55
+ - `convert::to_version_5_5_1` turns a name type back into 5.5.1's
56
+ spelling: `OTHER` with a one-line `PHRASE` becomes the phrase's words,
57
+ and an enumerated value is written in lower case (`BIRTH` becomes
58
+ `birth`). `OTHER` whose words are themselves an enumerated value (the
59
+ phrase `birth`) stays `other`, its `PHRASE` kept and reported, since the
60
+ words alone would convert back up as `BIRTH`. A `PHRASE` beside any other
61
+ value is kept and reported.
62
+ - `DatePoint::from_ymd` refuses a day its month never has (30 February,
63
+ 31 April, day 0). The point is written with no calendar escape, which
64
+ makes it Gregorian, so 29 February is taken only in a Gregorian leap
65
+ year: 2000, not 1900.
66
+
67
+ ### Fixed
68
+
69
+ - A range with an end the date reader cannot read is no longer read in
70
+ part. `FROM ABT 1924 TO 1959` was read as `TO 1959`, dropping the start
71
+ without a word, and `BET 1950 AND JULIAN DEC 302` as a range with only
72
+ its first end; `FROM Infant` was a period with neither end. Each is now
73
+ `DateKind::Unparsed`, keeps its text as the phrase, and still offers its
74
+ year to sort by; `to_version_7` keeps it whole as an empty `DATE` with a
75
+ `PHRASE`. A range whose ends are both dates reads as before.
76
+ - The date reader no longer accepts a day its month does not have.
77
+ `1834-02-30` and `30 FEB 1834` were read as 30 February 1834; they are
78
+ now unparsed, as is `29 FEB 1834`. Leap years follow the payload's
79
+ calendar: `@#DJULIAN@ 29 FEB 1900` is read and `@#DGREGORIAN@ 29 FEB
80
+ 1900` is not. A payload with no calendar escape keeps the Julian leap
81
+ day, since files often leave the escape off a Julian date, so
82
+ `29 FEB 1900` is still read; ISO 8601's `1900-02-29` is not, since ISO
83
+ 8601 is Gregorian by definition. A dual year's leap day is its second
84
+ year's, so `29 FEB 1711/12` and `@#DJULIAN@ 29 FEB 1711/12` are read. A
85
+ Roman or unrecognized calendar is held to the Julian month lengths, and
86
+ no Hebrew or French Republican month has more than 30 days. A numeric
87
+ date with a month or day out of range (`1834-13-05`, `13/05/1834`) is
88
+ unparsed too; before, the piece out of range was dropped and the rest
89
+ read (`1834-13-05` as the year 1834).
90
+ - `convert::to_version_5_5_1` no longer writes `INT (…)`, an interpreted
91
+ date with no date, for a version 7 `DATE` that is empty beside its
92
+ `PHRASE`; 5.5.1 does not allow it. The phrase is written as 5.5.1's date
93
+ phrase, `(FROM ABT 1924 TO 1959)`, or as the date itself when it is
94
+ already one in 5.5.1's grammar that version 7 cannot spell, so a dual
95
+ year (`1740/41`) comes back as the date it was.
96
+ - `convert::to_version_7` / `to_version_7_with` convert a personal name's
97
+ type (`INDI`.`NAME`.`TYPE`), which 5.5.1 writes as free text and version
98
+ 7 as an enumeration. A value that is one of version 7's words in any case
99
+ (`aka`, `birth`, `immigrant`, `maiden`, `married`, `professional`,
100
+ `other`) becomes that word in upper case; any other becomes `OTHER`, with
101
+ the text kept verbatim as a `PHRASE`, the way a role has been converted
102
+ since 0.1.13. Before, `TYPE aka` was carried into the 7.0 document as it
103
+ stood, where it is not valid. A type that already has a `PHRASE`, is
104
+ empty, or has a continuation line with substructures is kept and
105
+ reported.
106
+
10
107
  ## [0.1.18] - 2026-10-16
11
108
 
12
109
  ### Added
@@ -35,7 +35,7 @@ dependencies = [
35
35
 
36
36
  [[package]]
37
37
  name = "gedcomkit"
38
- version = "0.1.18"
38
+ version = "0.1.20"
39
39
  dependencies = [
40
40
  "flate2",
41
41
  "serde",
@@ -3,7 +3,7 @@
3
3
  # was checked on crates.io, npm, and PyPI before the initial release.
4
4
  [package]
5
5
  name = "gedcomkit"
6
- version = "0.1.18"
6
+ version = "0.1.20"
7
7
  description = "A byte-preserving GEDCOM document model: decoding, parsing, readings, version conversion, plausibility checks, and the GEDZIP container, for GEDCOM 5.5 through 7.x."
8
8
  edition = "2024"
9
9
  # The true minimum, not the workspace's toolchain: a parser library is a leaf
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gedcomkit
3
- Version: 0.1.18
3
+ Version: 0.1.20
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: Implementation :: CPython
@@ -42,12 +42,8 @@ npm install gedcomkit
42
42
  2. Run the gates and release dry run:
43
43
 
44
44
  ```bash
45
- cargo fmt --all --check
46
- cargo clippy --all-features --all-targets -- -D warnings
47
- cargo test --all-features
48
- cargo test --no-default-features
49
- cargo check --manifest-path bindings/gedcomkit-wasm/Cargo.toml --target wasm32-unknown-unknown
50
- cargo check --manifest-path bindings/gedcomkit-py/Cargo.toml
45
+ cargo ci
46
+ cargo +1.88 ci test
51
47
  cargo publish --locked --dry-run
52
48
  bash scripts/check-release-tag.sh vX.Y.Z
53
49
  ```
@@ -35,7 +35,7 @@ dependencies = [
35
35
 
36
36
  [[package]]
37
37
  name = "gedcomkit"
38
- version = "0.1.18"
38
+ version = "0.1.20"
39
39
  dependencies = [
40
40
  "flate2",
41
41
  "serde",
@@ -43,7 +43,7 @@ dependencies = [
43
43
 
44
44
  [[package]]
45
45
  name = "gedcomkit-py"
46
- version = "0.1.18"
46
+ version = "0.1.20"
47
47
  dependencies = [
48
48
  "gedcomkit",
49
49
  "pyo3",
@@ -2,7 +2,7 @@
2
2
  # abi3 keeps it to one wheel per platform across Python versions.
3
3
  [package]
4
4
  name = "gedcomkit-py"
5
- version = "0.1.18"
5
+ version = "0.1.20"
6
6
  description = "Python bindings for gedcomkit: an archival-grade GEDCOM library — byte-preserving round-trip, encoding detection, GEDCOM 5.5 through 7.x, GEDZIP."
7
7
  edition = "2024"
8
8
  rust-version = "1.88"
@@ -19,6 +19,29 @@ class RecordSpec(TypedDict):
19
19
  value: NotRequired[str | None]
20
20
  children: NotRequired[list[RecordSpec]]
21
21
 
22
+ class EventView(TypedDict):
23
+ """One entry of an individual's or a family's ``events``.
24
+
25
+ ``date`` is the DATE payload exactly as written. ``datePhrase`` is the
26
+ GEDCOM 7 PHRASE beneath that DATE, or ``None``: beside a date, or the
27
+ only text an empty 7.0 DATE has. A 5.5.1 phrase is part of ``date``.
28
+ """
29
+
30
+ tag: str
31
+ label: str
32
+ date: str | None
33
+ datePhrase: str | None
34
+ dateDisplay: str | None
35
+ year: int | None
36
+ sortKey: int | None
37
+ place: str | None
38
+ age: str | None
39
+ cause: str | None
40
+ attribute: bool
41
+ value: str | None
42
+ citations: list[str]
43
+ path: list[int]
44
+
22
45
  class WrappedLine(TypedDict):
23
46
  record: str
24
47
  path: list[int]
@@ -42,8 +65,10 @@ class Gedcom:
42
65
  def content_records(self) -> int: ...
43
66
  def records(self) -> list[dict[str, Any]]: ...
44
67
  def record(self, xref: str) -> dict[str, Any]: ...
45
- def individuals(self) -> list[dict[str, Any]]: ...
46
- def families(self) -> list[dict[str, Any]]: ...
68
+ def individuals(self) -> list[dict[str, Any]]:
69
+ """Every individual's view; each of its ``events`` is an ``EventView``."""
70
+ def families(self) -> list[dict[str, Any]]:
71
+ """Every family's view; each of its ``events`` is an ``EventView``."""
47
72
  def validate(self) -> list[dict[str, Any]]:
48
73
  """Plausibility findings, each with ``record``, ``check``, ``severity``
49
74
  and ``message``. ``check`` is the core's stable rule name, such as
@@ -224,6 +224,8 @@ impl Gedcom {
224
224
  }
225
225
 
226
226
  /// Every individual, read for display: names, events, families, IDs.
227
+ /// Each event has its `date` payload as written and, beside it,
228
+ /// `datePhrase`: the GEDCOM 7 `PHRASE` under the date, or `None`.
227
229
  fn individuals(&self, py: Python<'_>) -> PyResult<Vec<Py<PyAny>>> {
228
230
  self.document
229
231
  .records_of("INDI")
@@ -231,7 +233,7 @@ impl Gedcom {
231
233
  .collect()
232
234
  }
233
235
 
234
- /// Every family record's view.
236
+ /// Every family record's view, its events shaped as `individuals`' are.
235
237
  fn families(&self, py: Python<'_>) -> PyResult<Vec<Py<PyAny>>> {
236
238
  self.document
237
239
  .records_of("FAM")
@@ -316,7 +316,7 @@ impl Node {
316
316
  /// beside a space loses that space on re-joining. Failing that — a run
317
317
  /// of spaces wider than the limit, say — the cut falls back to the
318
318
  /// latest legal byte boundary instead, which is documented behavior of
319
- /// [`cut`] this call reuses, not a special case here.
319
+ /// the private `cut` this call reuses, not a special case here.
320
320
  ///
321
321
  /// The rendered line is measured in UTF-8 bytes, including level,
322
322
  /// optional cross-reference, tag, delimiters, and a terminator reserved