Skip to content

Commit 0a1d588

Browse files
authored
fix: correct handling of the DATE attribute (#6)
* Upgrade dependencies, fix lint issues * more lints * Fix handling of DATE attribute, remove redundant getters
1 parent 3cebbc8 commit 0a1d588

17 files changed

+670
-668
lines changed

analysis_options.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
include: package:pedantic/analysis_options.yaml
1+
include: package:very_good_analysis/analysis_options.yaml
2+
linter:
3+
rules:
4+
flutter_style_todos: false
5+
lines_longer_than_80_chars: false
6+
public_member_api_docs: false

example/main.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const testData = '''
3131
void main() {
3232
final parser = GedcomParser();
3333
final root = parser.parse(testData);
34+
// ignore: avoid_print
3435
print(root.toGedcomString(recursive: true));
3536
//Output:
3637

lib/gedcom.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
// along with this program; if not, write to the Free Software Foundation, Inc.,
2626
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2727

28-
library gedcom;
2928

30-
export 'src/gedcom.dart';
3129
export 'src/element/element.dart';
30+
export 'src/gedcom.dart';

lib/src/element/birth.dart

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@ part of 'element.dart';
44
class BirthElement extends GedcomElement {
55
/// Constructor of the FileElement
66
BirthElement({
7-
required int level,
8-
String? pointer,
9-
String? value,
10-
List<GedcomElement>? children,
11-
GedcomElement? parent,
12-
String? crlf = '\n',
7+
required super.level,
8+
super.pointer,
9+
super.value,
10+
super.children,
11+
super.parent,
12+
super.crlf,
1313
}) : super(
14-
level: level,
1514
tag: GEDCOM_TAG_BIRTH,
16-
pointer: pointer,
17-
value: value,
18-
children: children,
19-
parent: parent,
20-
crlf: crlf,
2115
);
2216

23-
@override
24-
String get tag => GEDCOM_TAG_BIRTH;
25-
2617
DateTime? get date => children.any((e) => e is DateElement)
2718
? (children.firstWhere((e) => e is DateElement) as DateElement).date
2819
: null;

lib/src/element/date.dart

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@ part of 'element.dart';
44
class DateElement extends GedcomElement {
55
/// Constructor of the FileElement
66
DateElement({
7-
required int level,
8-
String? pointer,
9-
String? value,
10-
List<GedcomElement>? children,
11-
GedcomElement? parent,
12-
String? crlf = '\n',
7+
required super.level,
8+
super.pointer,
9+
super.value,
10+
super.children,
11+
super.parent,
12+
super.crlf,
1313
}) : super(
14-
level: level,
15-
tag: GEDCOM_TAG_BIRTH,
16-
pointer: pointer,
17-
value: value,
18-
children: children,
19-
parent: parent,
20-
crlf: crlf,
14+
tag: GEDCOM_TAG_DATE,
2115
);
2216

23-
@override
24-
String get tag => GEDCOM_TAG_BIRTH;
25-
2617
DateTime? get date => _parseDate();
2718

2819
DateTime? _parseDate() {

lib/src/element/death.dart

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@ part of 'element.dart';
44
class DeathElement extends GedcomElement {
55
/// Constructor of the FileElement
66
DeathElement({
7-
required int level,
8-
String? pointer,
9-
String? value,
10-
List<GedcomElement>? children,
11-
GedcomElement? parent,
12-
String? crlf = '\n',
7+
required super.level,
8+
super.pointer,
9+
super.value,
10+
super.children,
11+
super.parent,
12+
super.crlf,
1313
}) : super(
14-
level: level,
1514
tag: GEDCOM_TAG_DEATH,
16-
pointer: pointer,
17-
value: value,
18-
children: children,
19-
parent: parent,
20-
crlf: crlf,
2115
);
2216

23-
@override
24-
String get tag => GEDCOM_TAG_DEATH;
25-
2617
DateTime? get date => children.any((e) => e is DateElement)
2718
? (children.firstWhere((e) => e is DateElement) as DateElement).date
2819
: null;

lib/src/element/element.dart

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import 'dart:convert';
2929

3030
import 'package:collection/collection.dart'
31-
show IterableExtension, DeepCollectionEquality;
31+
show DeepCollectionEquality, IterableExtension;
3232
import 'package:meta/meta.dart';
3333

3434
part 'birth.dart';
@@ -79,6 +79,29 @@ class GedcomElement {
7979
this.crlf = '\n',
8080
}) : _children = children ?? [];
8181

82+
/// Creates element from map
83+
factory GedcomElement.fromMap(Map<String, dynamic>? map) {
84+
if (map == null) return GedcomElement.empty;
85+
86+
return GedcomElement(
87+
level: map['level'] as int,
88+
pointer: map['pointer'] as String?,
89+
tag: map['tag'] as String,
90+
value: map['value'] as String?,
91+
children: List<GedcomElement>.from(
92+
(map['children'] as List<Map<String, dynamic>>?)
93+
?.map(GedcomElement.fromMap) ??
94+
[],
95+
),
96+
parent: GedcomElement.fromMap(map['parent'] as Map<String, dynamic>?),
97+
crlf: map['crlf'] as String?,
98+
);
99+
}
100+
101+
/// Creates element from JSON
102+
factory GedcomElement.fromJson(String source) =>
103+
GedcomElement.fromMap(json.decode(source) as Map<String, dynamic>);
104+
82105
/// Level of the element within the GEDCOM file
83106
final int level;
84107

@@ -112,8 +135,8 @@ class GedcomElement {
112135
String? get multiLineValue {
113136
var result = value ?? '';
114137
var lastCrlf = crlf;
115-
for (var element in children) {
116-
var tag = element.tag;
138+
for (final element in children) {
139+
final tag = element.tag;
117140
if (tag == GEDCOM_TAG_CONCATENATION) {
118141
result += element.value!;
119142
lastCrlf = element.crlf;
@@ -211,31 +234,31 @@ class GedcomElement {
211234
/// Formats this element and optionally all of its subelements
212235
/// to GEDCOM string
213236
String toGedcomString({bool recursive = false}) {
214-
var result = '$level';
237+
final buffer = StringBuffer();
215238

216-
if (pointer != null && pointer!.isNotEmpty) {
217-
result += ' $pointer';
218-
}
239+
if (level >= 0) {
240+
buffer.write('$level');
219241

220-
result += ' $tag';
242+
if (pointer != null && pointer!.isNotEmpty) {
243+
buffer.write(' $pointer');
244+
}
221245

222-
if (value != null && value!.isNotEmpty) {
223-
result += ' $value';
224-
}
246+
buffer.write(' $tag');
225247

226-
result += crlf!;
248+
if (value != null && value!.isNotEmpty) {
249+
buffer.write(' $value');
250+
}
227251

228-
if (level < 0) {
229-
result = '';
252+
buffer.write(crlf);
230253
}
231254

232-
if (recursive == true) {
255+
if (recursive) {
233256
for (final element in children) {
234-
result += element.toGedcomString(recursive: true);
257+
buffer.write(element.toGedcomString(recursive: true));
235258
}
236259
}
237260

238-
return result;
261+
return buffer.toString();
239262
}
240263

241264
/// Returns copy of the element
@@ -274,45 +297,25 @@ class GedcomElement {
274297

275298
static final empty = GedcomElement(level: -1, tag: '');
276299

277-
/// Creates element from map
278-
factory GedcomElement.fromMap(Map<String, dynamic>? map) {
279-
if (map == null) return GedcomElement.empty;
280-
281-
return GedcomElement(
282-
level: map['level'],
283-
pointer: map['pointer'],
284-
tag: map['tag'],
285-
value: map['value'],
286-
children: List<GedcomElement>.from(
287-
map['children']?.map((x) => GedcomElement.fromMap(x))),
288-
parent: GedcomElement.fromMap(map['parent']),
289-
crlf: map['crlf'],
290-
);
291-
}
292-
293300
/// Returns JSON representation of the elmenet
294301
String toJson() => json.encode(toMap());
295302

296-
/// Creates element from JSON
297-
factory GedcomElement.fromJson(String source) =>
298-
GedcomElement.fromMap(json.decode(source));
299-
300303
@override
301304
String toString() => toGedcomString();
302305

303306
@override
304-
bool operator ==(Object o) {
305-
if (identical(this, o)) return true;
307+
bool operator ==(Object other) {
308+
if (identical(this, other)) return true;
306309
final listEquals = const DeepCollectionEquality().equals;
307310

308-
return o is GedcomElement &&
309-
o.level == level &&
310-
o.pointer == pointer &&
311-
o.tag == tag &&
312-
o.value == value &&
313-
listEquals(o.children, children) &&
314-
o.parent == parent &&
315-
o.crlf == crlf;
311+
return other is GedcomElement &&
312+
other.level == level &&
313+
other.pointer == pointer &&
314+
other.tag == tag &&
315+
other.value == value &&
316+
listEquals(other.children, children) &&
317+
other.parent == parent &&
318+
other.crlf == crlf;
316319
}
317320

318321
@override

lib/src/element/family.dart

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@ part of 'element.dart';
44
class FamilyElement extends GedcomElement {
55
/// Constructor of the FamilyElement
66
FamilyElement({
7-
required int level,
8-
String? pointer,
9-
String? value,
10-
List<GedcomElement>? children,
11-
GedcomElement? parent,
12-
String? crlf = '\n',
7+
required super.level,
8+
super.pointer,
9+
super.value,
10+
super.children,
11+
super.parent,
12+
super.crlf,
1313
}) : super(
14-
level: level,
1514
tag: GEDCOM_TAG_FAMILY,
16-
pointer: pointer,
17-
value: value,
18-
children: children,
19-
parent: parent,
20-
crlf: crlf,
2115
);
2216

23-
@override
24-
String get tag => GEDCOM_TAG_FAMILY;
25-
2617
/// Returns the husband/father of the family
2718
///
2819
/// Returns null if not found

lib/src/element/file.dart

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@ part of 'element.dart';
44
class FileElement extends GedcomElement {
55
/// Constructor of the FileElement
66
FileElement({
7-
required int level,
8-
String? pointer,
9-
String? value,
10-
List<GedcomElement>? children,
11-
GedcomElement? parent,
12-
String? crlf = '\n',
7+
required super.level,
8+
super.pointer,
9+
super.value,
10+
super.children,
11+
super.parent,
12+
super.crlf,
1313
}) : super(
14-
level: level,
1514
tag: GEDCOM_TAG_FILE,
16-
pointer: pointer,
17-
value: value,
18-
children: children,
19-
parent: parent,
20-
crlf: crlf,
2115
);
2216

23-
@override
24-
String get tag => GEDCOM_TAG_FILE;
25-
2617
/// Returns copy of the element
2718
@override
2819
FileElement copyWith({

lib/src/element/individual.dart

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,16 @@ class IndividualElement extends GedcomElement
55
implements Comparable<IndividualElement> {
66
/// Constructor of the FileElement
77
IndividualElement({
8-
required int level,
9-
String? pointer,
10-
String? value,
11-
List<GedcomElement>? children,
12-
GedcomElement? parent,
13-
String? crlf = '\n',
8+
required super.level,
9+
super.pointer,
10+
super.value,
11+
super.children,
12+
super.parent,
13+
super.crlf,
1414
}) : super(
15-
level: level,
1615
tag: GEDCOM_TAG_INDIVIDUAL,
17-
pointer: pointer,
18-
value: value,
19-
children: children,
20-
parent: parent,
21-
crlf: crlf,
2216
);
2317

24-
@override
25-
String get tag => GEDCOM_TAG_INDIVIDUAL;
26-
2718
/// Checks if this individual is deceased
2819
bool get isDeceased =>
2920
children.any((element) => element.tag == GEDCOM_TAG_DEATH);
@@ -46,7 +37,8 @@ class IndividualElement extends GedcomElement
4637

4738
/// Checks if this individual is marked private
4839
bool get isPrivate => children.any(
49-
(element) => element.tag == GEDCOM_TAG_PRIVATE && element.value == 'Y');
40+
(element) => element.tag == GEDCOM_TAG_PRIVATE && element.value == 'Y',
41+
);
5042

5143
/// Returns individual's birth date. Returns null if not available.
5244
DateTime? get birthDate => children.any((e) => e is BirthElement)
@@ -97,10 +89,7 @@ class IndividualElement extends GedcomElement
9789
}
9890
}
9991
// If we reach here we are probably returning empty strings
100-
return Name(
101-
givenName: '',
102-
surname: '',
103-
);
92+
return Name.empty;
10493
}
10594

10695
/// Returns copy of the element

0 commit comments

Comments
 (0)