From 460c07e8f87ca18a69fab79dd3dfe7996fa97e12 Mon Sep 17 00:00:00 2001 From: Daan Date: Fri, 3 Mar 2017 21:35:38 +0100 Subject: [PATCH 1/2] Adding check for extra slashes in the name field, adding a test to cover it --- gedcom/__init__.py | 2 ++ tests.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/gedcom/__init__.py b/gedcom/__init__.py index ce81d19..f85b60b 100644 --- a/gedcom/__init__.py +++ b/gedcom/__init__.py @@ -427,6 +427,8 @@ def name(self): first = first.strip() last = last.strip() + elif len(vals) > 3: + raise Exception("Malformed name field: " + preferred_name.value) return first, last diff --git a/tests.py b/tests.py index bcb3f20..eb7486a 100644 --- a/tests.py +++ b/tests.py @@ -283,6 +283,10 @@ def testInvalidNames(self): gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1@ INDI\n1 NAME Bob /Russel\n0 TRLR") self.assertRaises(Exception, lambda : list(gedcomfile.individuals)[0].name) + def testNameWithTooManySlashes(self): + gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1@ INDI\n1 NAME Bob/Robert /Russel/\n\n0 TRLR") + self.assertRaises(Exception, lambda : list(gedcomfile.individuals)[0].name) + def testDashInID(self): gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1-123@ INDI\n1 NAME\n2 GIVN Bob\n0 TRLR") self.assertEqual(list(gedcomfile.individuals)[0].name, ('Bob', None)) From 079695e35995424ea70bebdd2949be37ae493fc7 Mon Sep 17 00:00:00 2001 From: Daan Date: Sun, 5 Mar 2017 22:50:00 +0100 Subject: [PATCH 2/2] Adding support for more NAME variants. Covering new logic with unittests. --- gedcom/__init__.py | 16 +++++++++++----- tests.py | 12 ++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gedcom/__init__.py b/gedcom/__init__.py index f85b60b..ba1c7b8 100644 --- a/gedcom/__init__.py +++ b/gedcom/__init__.py @@ -422,13 +422,20 @@ def name(self): # malformed line raise Exception elif len(vals) == 3: - # Normal - first, last, dud = vals - + first, last, first_tail = vals first = first.strip() last = last.strip() + first_tail = first_tail.strip() + + if not first: + # only last name + first = None + elif first_tail: + # last name embedded in first name(s) + first = " ".join([first, first_tail]) + elif len(vals) > 3: - raise Exception("Malformed name field: " + preferred_name.value) + raise Exception("Malformed NAME field: " + preferred_name.value) return first, last @@ -593,7 +600,6 @@ def wives(self): return self.get_list("WIFE") - class Spouse(Element): """Generic base class for HUSB/WIFE.""" diff --git a/tests.py b/tests.py index eb7486a..2d4d4d7 100644 --- a/tests.py +++ b/tests.py @@ -188,6 +188,18 @@ def testSupportNameInOneWithSlashes(self): gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1@ INDI\n1 NAME Bob /Cox/\n\n0 TRLR") self.assertEqual(gedcomfile['@I1@'].name, ('Bob', 'Cox')) + def testSupportNameWithOnlyFirstName(self): + gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1@ INDI\n1 NAME William\n\n0 TRLR") + self.assertEqual(gedcomfile['@I1@'].name, ('William', None)) + + def testSupportNameWithOnlyLastName(self): + gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1@ INDI\n1 NAME /Cox/\n\n0 TRLR") + self.assertEqual(gedcomfile['@I1@'].name, (None, 'Cox')) + + def testSupportNameWithEmbeddedLastName(self): + gedcomfile = gedcom.parse_string("0 HEAD\n0 @I1@ INDI\n1 NAME Bob /Cox/ James\n\n0 TRLR") + self.assertEqual(gedcomfile['@I1@'].name, ('Bob James', 'Cox')) + def testSaveFile(self): gedcomfile = gedcom.parse_string(GEDCOM_FILE) outputfile = tempfile.NamedTemporaryFile()