gedcomkit 0.1.9__tar.gz → 0.1.11__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.9 → gedcomkit-0.1.11}/CHANGELOG.md +59 -0
  2. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/Cargo.lock +89 -2
  3. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/Cargo.toml +9 -1
  4. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/PKG-INFO +1 -1
  5. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/README.md +3 -0
  6. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/bindings/gedcomkit-py/Cargo.lock +2 -2
  7. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/bindings/gedcomkit-py/Cargo.toml +1 -1
  8. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/bindings/gedcomkit-py/src/lib.rs +20 -0
  9. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/build.rs +427 -0
  10. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/convert.rs +2 -0
  11. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/dates.rs +6 -0
  12. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/decode.rs +2 -0
  13. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/family.rs +1 -0
  14. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/lib.rs +110 -5
  15. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/validate.rs +2 -0
  16. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/view.rs +16 -2
  17. gedcomkit-0.1.11/tests/typescript.rs +84 -0
  18. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/LICENSE +0 -0
  19. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/bindings/gedcomkit-py/LICENSE +0 -0
  20. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/bindings/gedcomkit-py/README.md +0 -0
  21. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/bindings/gedcomkit-py/gedcomkit.pyi +0 -0
  22. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/LICENSE +0 -0
  23. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/README.md +0 -0
  24. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/cardinalities.tsv +0 -0
  25. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/enumerations.tsv +0 -0
  26. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/enumerationsets.tsv +0 -0
  27. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/grammar.abnf +0 -0
  28. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/grammar.gedstruct +0 -0
  29. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/payloads.tsv +0 -0
  30. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom-spec/substructures.tsv +0 -0
  31. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/age-invalid.ged +0 -0
  32. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/age-valid.ged +0 -0
  33. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/atsign.ged +0 -0
  34. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_ascii_1.ged +0 -0
  35. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_ascii_2.ged +0 -0
  36. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf16be-1.ged +0 -0
  37. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf16be-2.ged +0 -0
  38. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf16le-1.ged +0 -0
  39. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf16le-2.ged +0 -0
  40. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf8-1.ged +0 -0
  41. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf8-2.ged +0 -0
  42. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/char_utf8-3.ged +0 -0
  43. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/date-all.ged +0 -0
  44. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/date-dual-invalid.ged +0 -0
  45. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/date-dual-valid.ged +0 -0
  46. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/enum-ext.ged +0 -0
  47. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/filename-1.ged +0 -0
  48. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/lang-all.ged +0 -0
  49. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/notes-1.ged +0 -0
  50. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/obje-1.ged +0 -0
  51. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/obsolete-1.ged +0 -0
  52. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/pedi-1.ged +0 -0
  53. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/rela_1.ged +0 -0
  54. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/sour-1.ged +0 -0
  55. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/tiny-1.ged +0 -0
  56. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/5/xref-case.ged +0 -0
  57. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/age-invalid.ged +0 -0
  58. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/age-valid.ged +0 -0
  59. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/atsign.ged +0 -0
  60. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_ascii_1.ged +0 -0
  61. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_ascii_2.ged +0 -0
  62. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf16be-1.ged +0 -0
  63. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf16be-2.ged +0 -0
  64. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf16le-1.ged +0 -0
  65. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf16le-2.ged +0 -0
  66. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf8-1.ged +0 -0
  67. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf8-2.ged +0 -0
  68. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/char_utf8-3.ged +0 -0
  69. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/date-all.ged +0 -0
  70. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/date-dual-invalid.ged +0 -0
  71. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/enum-ext.ged +0 -0
  72. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/filename-1.ged +0 -0
  73. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/lang-all.ged +0 -0
  74. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/notes-1.ged +0 -0
  75. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/obje-1.ged +0 -0
  76. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/obsolete-1.ged +0 -0
  77. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/pedi-1.ged +0 -0
  78. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/rela_1.ged +0 -0
  79. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/sour-1.ged +0 -0
  80. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/tiny-1.ged +0 -0
  81. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/7/xref-case.ged +0 -0
  82. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/LICENSE +0 -0
  83. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/gedcom7code/UPSTREAM-README.md +0 -0
  84. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/zip-interop/README.md +0 -0
  85. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/zip-interop/python-zip64.gdz +0 -0
  86. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/fixtures/vendored/zip-interop/python-zipfile.gdz +0 -0
  87. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/pyproject.toml +0 -0
  88. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/gedzip.rs +0 -0
  89. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/names.rs +0 -0
  90. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/schema.rs +0 -0
  91. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/synthetic.rs +0 -0
  92. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/src/tags.rs +0 -0
  93. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/endurance.rs +0 -0
  94. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/external_charset.rs +0 -0
  95. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/properties.rs +0 -0
  96. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/requirement_corpus.rs +0 -0
  97. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/spec_conformance.rs +0 -0
  98. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/vendored_corpus.rs +0 -0
  99. {gedcomkit-0.1.9 → gedcomkit-0.1.11}/tests/version_conversion.rs +0 -0
@@ -5,6 +5,65 @@ format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
5
5
  the project uses semantic versioning within the usual pre-1.0 compatibility
6
6
  rules.
7
7
 
8
+ ## [0.1.11] - 2026-09-28
9
+
10
+ ### Added
11
+
12
+ - A `ts` feature (off by default; implies `serde`) that derives
13
+ `ts_rs::TS` on every type the `serde` feature serializes — the views, the
14
+ date, encoding, conversion, and validation reports — so a caller that
15
+ sends them to a TypeScript frontend can generate its types from these
16
+ definitions rather than keep hand-written copies in step. The definitions
17
+ follow the JSON exactly: camelCase field names, `null` for an absent
18
+ value, and unit enums as their variant names. `StructureView::kind`, a
19
+ `&'static str`, is declared as the five words it can hold
20
+ (`"record" | "event" | "attribute" | "structure" | "unknown"`). Pulls in
21
+ `ts-rs` 12 (MIT) and its proc-macro only when enabled.
22
+
23
+ Two things a caller should know. ts-rs declares a 64-bit integer as
24
+ `bigint` by default, while the JSON carries a number: export with
25
+ `Config::with_large_int("number")` (as `tests/typescript.rs` does) for
26
+ definitions that match what `serde_json` writes. And a
27
+ `#[non_exhaustive]` enum becomes a closed TypeScript union, so a variant
28
+ added in a later patch release — additive in Rust — can break an
29
+ exhaustive `switch` in TypeScript until the definitions are regenerated.
30
+
31
+ ## [0.1.10] - 2026-09-27
32
+
33
+ ### Added
34
+
35
+ - `Node::fit_line_limit`, `Document::fit_line_limit` (the same, addressed by
36
+ a record's cross-reference identifier), and the `MAX_LINE_LENGTH` constant
37
+ for GEDCOM 5.5.1's 255-byte line, for a caller to fit an edited record to
38
+ a pre-7.0 document's line limit just before serializing:
39
+ `set_logical_value` only ever splits a payload across `CONT` at the
40
+ newlines it is given, so a long edited line was otherwise written over
41
+ length. Only nodes with no verbatim source line are touched, checked
42
+ recursively, so a node no caller reached into keeps its exact bytes; a
43
+ pointer payload is never split either. The line is measured with a
44
+ 2-byte terminator reserve — wider than `wrap_long_lines`' 1 byte — because
45
+ this is meant for a caller whose own pipeline may keep a source file's
46
+ `\r\n` terminator rather than always writing `\n`. Bound in both language
47
+ bindings as `fit_line_limit` (Python) and `fitLineLimit` (WASM), mirroring
48
+ `wrap_long_lines`/`wrapLongLines`.
49
+
50
+ ### Fixed
51
+
52
+ - `Document::next_xref` matched its prefix case-sensitively, so in a file
53
+ using lowercase identifiers (`@i1@`) `next_xref("I")` minted `@I1@` —
54
+ which `Document::record`'s case-insensitive lookup resolves to the
55
+ existing `@i1@`, silently colliding with it. The prefix match is now
56
+ case-insensitive, and the returned identifier is checked against every
57
+ existing xref case-insensitively and advanced past any collision. Its
58
+ doc comment claimed "the lowest unused" identifier while returning one
59
+ past the highest; the comment now says that.
60
+ - The same method minted `highest + 1` with unchecked arithmetic: a hostile
61
+ or fuzzed file carrying `@I18446744073709551615@` (`u64::MAX`) made it
62
+ panic in a debug build and wrap around to `@I0@` in release. Arithmetic
63
+ is now checked throughout, and once the series above the high-water mark
64
+ is exhausted, `next_xref` falls back to the lowest unused number instead
65
+ of overflowing.
66
+
8
67
  ## [0.1.9] - 2026-09-27
9
68
 
10
69
  ### Fixed
@@ -35,10 +35,11 @@ dependencies = [
35
35
 
36
36
  [[package]]
37
37
  name = "gedcomkit"
38
- version = "0.1.9"
38
+ version = "0.1.11"
39
39
  dependencies = [
40
40
  "flate2",
41
41
  "serde",
42
+ "ts-rs",
42
43
  ]
43
44
 
44
45
  [[package]]
@@ -96,7 +97,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
96
97
  dependencies = [
97
98
  "proc-macro2",
98
99
  "quote",
99
- "syn",
100
+ "syn 3.0.5",
100
101
  ]
101
102
 
102
103
  [[package]]
@@ -105,6 +106,17 @@ version = "0.3.10"
105
106
  source = "registry+https://github.com/rust-lang/crates.io-index"
106
107
  checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
107
108
 
109
+ [[package]]
110
+ name = "syn"
111
+ version = "2.0.119"
112
+ source = "registry+https://github.com/rust-lang/crates.io-index"
113
+ checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
114
+ dependencies = [
115
+ "proc-macro2",
116
+ "quote",
117
+ "unicode-ident",
118
+ ]
119
+
108
120
  [[package]]
109
121
  name = "syn"
110
122
  version = "3.0.5"
@@ -116,8 +128,83 @@ dependencies = [
116
128
  "unicode-ident",
117
129
  ]
118
130
 
131
+ [[package]]
132
+ name = "termcolor"
133
+ version = "1.4.1"
134
+ source = "registry+https://github.com/rust-lang/crates.io-index"
135
+ checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
136
+ dependencies = [
137
+ "winapi-util",
138
+ ]
139
+
140
+ [[package]]
141
+ name = "thiserror"
142
+ version = "2.0.21"
143
+ source = "registry+https://github.com/rust-lang/crates.io-index"
144
+ checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
145
+ dependencies = [
146
+ "thiserror-impl",
147
+ ]
148
+
149
+ [[package]]
150
+ name = "thiserror-impl"
151
+ version = "2.0.21"
152
+ source = "registry+https://github.com/rust-lang/crates.io-index"
153
+ checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
154
+ dependencies = [
155
+ "proc-macro2",
156
+ "quote",
157
+ "syn 3.0.5",
158
+ ]
159
+
160
+ [[package]]
161
+ name = "ts-rs"
162
+ version = "12.0.1"
163
+ source = "registry+https://github.com/rust-lang/crates.io-index"
164
+ checksum = "756050066659291d47a554a9f558125db17428b073c5ffce1daf5dcb0f7231d8"
165
+ dependencies = [
166
+ "thiserror",
167
+ "ts-rs-macros",
168
+ ]
169
+
170
+ [[package]]
171
+ name = "ts-rs-macros"
172
+ version = "12.0.1"
173
+ source = "registry+https://github.com/rust-lang/crates.io-index"
174
+ checksum = "38d90eea51bc7988ef9e674bf80a85ba6804739e535e9cab48e4bb34a8b652aa"
175
+ dependencies = [
176
+ "proc-macro2",
177
+ "quote",
178
+ "syn 2.0.119",
179
+ "termcolor",
180
+ ]
181
+
119
182
  [[package]]
120
183
  name = "unicode-ident"
121
184
  version = "1.0.24"
122
185
  source = "registry+https://github.com/rust-lang/crates.io-index"
123
186
  checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
187
+
188
+ [[package]]
189
+ name = "winapi-util"
190
+ version = "0.1.11"
191
+ source = "registry+https://github.com/rust-lang/crates.io-index"
192
+ checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
193
+ dependencies = [
194
+ "windows-sys",
195
+ ]
196
+
197
+ [[package]]
198
+ name = "windows-link"
199
+ version = "0.2.1"
200
+ source = "registry+https://github.com/rust-lang/crates.io-index"
201
+ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
202
+
203
+ [[package]]
204
+ name = "windows-sys"
205
+ version = "0.61.2"
206
+ source = "registry+https://github.com/rust-lang/crates.io-index"
207
+ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
208
+ dependencies = [
209
+ "windows-link",
210
+ ]
@@ -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.9"
6
+ version = "0.1.11"
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
@@ -42,6 +42,11 @@ gedzip = ["dep:flate2"]
42
42
  # Serialization of the read-only views, for callers that send them somewhere —
43
43
  # a webview, a JSON API. Off by default: a parser needs no serializer.
44
44
  serde = ["dep:serde"]
45
+ # TypeScript definitions of those same serialized shapes (`ts_rs::TS` on every
46
+ # type `serde` serializes), for a caller that generates its frontend's types
47
+ # from them rather than writing them by hand. Off by default, and meant for a
48
+ # build step or a test rather than a shipped binary.
49
+ ts = ["serde", "dep:ts-rs"]
45
50
  # Generates a deterministic synthetic tree of any size, for performance and
46
51
  # stress fixtures. Off by default: nothing an application ships needs it.
47
52
  fixture = []
@@ -50,6 +55,9 @@ fixture = []
50
55
  # `rust_backend` keeps deflate in pure Rust, so no system zlib is needed.
51
56
  flate2 = { version = "1.1.2", default-features = false, features = ["rust_backend"], optional = true }
52
57
  serde = { version = "1", features = ["derive"], optional = true }
58
+ # MIT; its default `serde-compat` reads the serde attributes, so the
59
+ # definitions follow the JSON the `serde` feature writes.
60
+ ts-rs = { version = "12.0.1", optional = true }
53
61
 
54
62
  [lints.rust]
55
63
  unsafe_code = "forbid"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gedcomkit
3
- Version: 0.1.9
3
+ Version: 0.1.11
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: Implementation :: CPython
@@ -198,6 +198,9 @@ than dropped.
198
198
  `default-features = false` the parser core has **no dependencies at all**.
199
199
  - `serde` — `Serialize` on the views and reports, for callers that send them
200
200
  to a webview or over a wire. Off by default.
201
+ - `ts` — TypeScript definitions of those same serialized shapes
202
+ (`ts_rs::TS`), for a caller that generates its frontend's types from them.
203
+ Implies `serde`. Off by default.
201
204
  - `fixture` — a deterministic, corpus-shaped synthetic tree generator of any
202
205
  size, for performance and stress tests. Off by default.
203
206
 
@@ -35,7 +35,7 @@ dependencies = [
35
35
 
36
36
  [[package]]
37
37
  name = "gedcomkit"
38
- version = "0.1.9"
38
+ version = "0.1.11"
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.9"
46
+ version = "0.1.11"
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.9"
5
+ version = "0.1.11"
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"
@@ -167,6 +167,26 @@ impl Gedcom {
167
167
  wrapped.iter().map(|line| to_py(py, line)).collect()
168
168
  }
169
169
 
170
+ /// Fits one record inside a 5.5.x document's line limit
171
+ /// (`max_line_bytes`, terminator included; 255 is GEDCOM 5.5.1's limit)
172
+ /// by inserting `CONC` lines, addressed by cross-reference identifier.
173
+ /// Call this on a record just edited with `set_logical_value`, since
174
+ /// that only ever splits a payload at the newlines it is given. Returns
175
+ /// whether anything changed; a node still carrying its original,
176
+ /// unedited line is never touched. Raises `KeyError` when no record
177
+ /// answers to `xref`.
178
+ #[pyo3(signature = (xref, max_line_bytes = 255))]
179
+ fn fit_line_limit(&mut self, xref: &str, max_line_bytes: usize) -> PyResult<bool> {
180
+ let changed = self
181
+ .document
182
+ .fit_line_limit(xref, max_line_bytes)
183
+ .map_err(|_| PyKeyError::new_err(xref.to_owned()))?;
184
+ if changed {
185
+ self.graph = None;
186
+ }
187
+ Ok(changed)
188
+ }
189
+
170
190
  /// What decoding decided, one line — show it before accepting an import.
171
191
  #[getter]
172
192
  fn encoding(&self) -> String {