コード例 #1
0
ファイル: test_us08.py プロジェクト: dhubinSIT/SSW555GEDCOM
    def test_full_path(self):
        '''Integration test for parser->objects->validation'''
        buff = StringIO('''0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 SEX M
1 BIRT
2 DATE 6 OCT 1986
1 FAMS @F1@
0 @I2@ INDI
1 NAME SomethingSally /Coffin/
1 SEX F
1 BIRT
2 DATE 30 DEC 1985
1 FAMS @F1@
0 @F1@ FAM
1 MARR
2 DATE 1 JAN 1986
1 DIV
2 DATE 2 JAN 1986
1 CHIL @I1@
1 CHIL @I2@
''')
        (ind, fam, unused_warns) = parse_file(buff)
        warnings = collect_validation_warnings(ind, fam)
        count_of_us08_errors = 0
        for warn in warnings:
            if warn.story == "US08": count_of_us08_errors += 1
        self.assertEqual(count_of_us08_errors, 2)
コード例 #2
0
ファイル: test_us09.py プロジェクト: dhubinSIT/SSW555GEDCOM
    def test_full_path(self):
        '''Integration test for parser->objects->validation'''
        buff = StringIO('''0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 DEAT
2 DATE 1 SEP 1995
0 @I2@ INDI
1 NAME SomethingSally /Coffin/
1 DEAT
2 DATE 1 JAN 1995
0 @I3@ INDI
1 NAME Maddye /Simmons/
1 BIRT
2 DATE 2 SEP 1995
0 @I4@ INDI
1 NAME Derek /Simmons/
1 BIRT
2 DATE 1 NOV 1995
0 @F1@ FAM
1 HUSB @I2@
1 WIFE @I1@
1 CHIL @I3@
1 CHIL @I4@''')
        (ind, fam, unused_warns) = parse_file(buff)
        warnings = collect_validation_warnings(ind, fam)
        count_of_us09_errors = 0
        for warn in warnings:
            if warn.story == "US09": count_of_us09_errors += 1
        self.assertEqual(count_of_us09_errors, 3)
コード例 #3
0
    def test_full_path(self):
        """Integration test for full parser->objects->validation data path."""
        buff = StringIO("""0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 SEX M
1 BIRT
2 DATE 2 JAN 2940
1 FAMS @F1@
0 @I2@ INDI
1 NAME MarvelousMay /Coffin/
1 SEX F
1 BIRT
2 DATE 15 MAY 2941
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I1@
1 WIFE @I2@
1 MARR
2 DATE 15 JUL 2972
1 DIV
2 DATE 15 JUL 2973""")
        (ind,  fam,  unused_warns) = parse_file(buff)
        warnings = collect_validation_warnings(ind,  fam)
        count_of_us01_errors = 0
        for warn in warnings:
            if warn.story == "US01": count_of_us01_errors += 1
        self.assertEqual(count_of_us01_errors,  4)
コード例 #4
0
    def test_mismatched_individual_references(self):
        """Test mismatched references.  The individual I1 should be a spouse of the family,
        and I2 should be a child of the family, but the family has them in opposite roles."""
        buff = StringIO("""0 @I1@ INDI
1 FAMS @F1@
0 @I2@ INDI
1 FAMC @F1@
0 @F1@ FAM
1 WIFE @I2@
1 CHIL @I1@""")
        (ind, fam, unused_warns) = parse_file(buff)
        ind1_warns = ind['@I1@']._Check_References()
        self.assertTrue(
            len([x for x in ind1_warns
                 if x.story == "US26"]) == 1)  # ind1 isn't a spouse of fam1
        self.assertTrue(
            len([
                x for x in ind1_warns
                if "@F1@" in x.message and "spouse" in x.message
            ]) == 1)  # ind1 isn't a spouse of fam1
        ind2_warns = ind['@I2@']._Check_References()
        self.assertTrue(
            len([x for x in ind2_warns
                 if x.story == "US26"]) == 1)  # ind2 isn't a child of fam1
        self.assertTrue(
            len([
                x for x in ind2_warns
                if "@F1@" in x.message and "child" in x.message
            ]) == 1)  # ind2 isn't a spouse of fam1
コード例 #5
0
    def test_everything_fine(self):
        """Test that an okay GEDCOM file is reported with no warnings."""
        buff = StringIO("""0 @I1@ INDI
1 FAMC @F1@
0 @I2@ INDI
1 FAMC @F1@
0 @I3@ INDI
1 FAMS @F1@
0 @I4@ INDI
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I3@
1 WIFE @I4@
1 CHIL @I1@
1 CHIL @I2@""")
        (ind, fam, warns) = parse_file(buff)
        validation_warns = collect_validation_warnings(ind, fam)
        us26_warns = [x for x in warns + validation_warns if x.story == "US26"]
        self.assertTrue(len(us26_warns) == 0)

        self.assertTrue(fam['@F1@'] in ind['@I1@'].child_families)
        self.assertTrue(fam['@F1@'] in ind['@I2@'].child_families)
        self.assertTrue(fam['@F1@'] in ind['@I3@'].spouse_families)
        self.assertTrue(fam['@F1@'] in ind['@I4@'].spouse_families)

        self.assertTrue(ind['@I3@'] == fam['@F1@'].husband)
        self.assertTrue(ind['@I4@'] == fam['@F1@'].wife)
        self.assertTrue(ind['@I1@'] in fam['@F1@'].children_list)
        self.assertTrue(ind['@I2@'] in fam['@F1@'].children_list)
コード例 #6
0
    def test_full_path(self):
        '''Integration test for parser->objects->validation'''
        buff = StringIO('''0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 SEX M
1 BIRT
2 DATE 3 MAR 1986
1 DEAT
2 DATE 3 MAR 1986
1 FAMS @F1@
0 @I2@ INDI
1 NAME SomethingSally /Coffin/
1 SEX F
1 BIRT
2 DATE 1 MAR 1986
1 DEAT
2 DATE 1 MAR 1986
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I1@
1 WIFE @I2@
1 MARR
2 DATE 2 MAR 1986''')
        (ind, fam, unused_warns) = parse_file(buff)
        warnings = collect_validation_warnings(ind, fam)
        count_of_us05_errors = 0
        for warn in warnings:
            if warn.story == "US05": count_of_us05_errors += 1
        self.assertEqual(count_of_us05_errors, 1)
コード例 #7
0
ファイル: test_us42.py プロジェクト: dhubinSIT/SSW555GEDCOM
    def test_valid_dates(self):
        """Test valid dates.."""
        buff = StringIO("""0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 SEX M
1 BIRT
2 DATE 31 JAN 1940
1 DEAT
2 DATE 28 FEB 1941
1 FAMS @F1@
0 @I2@ INDI
1 NAME MarvelousMay /Coffin/
1 SEX F
1 BIRT
2 DATE 15 MAY 1941
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I1@
1 WIFE @I2@
1 MARR
2 DATE 15 JUL 1972
1 DIV
2 DATE 15 JUL 1973""")
        (ind, fam, parse_warns) = parse_file(buff)
        self.assertEqual(len(parse_warns), 0)
        self.assertNotEqual(ind["@I1@"].birth, None)
        self.assertNotEqual(ind["@I1@"].death, None)
        self.assertNotEqual(ind["@I2@"].birth, None)
        self.assertNotEqual(fam["@F1@"].married, None)
        self.assertNotEqual(fam["@F1@"].divorced, None)
コード例 #8
0
ファイル: test_us42.py プロジェクト: dhubinSIT/SSW555GEDCOM
    def test_invalid_dates(self):
        """Test invalid dates.  First Individual is tested using dates
        that cannot happen (such as day numbers out of range for the month).
        Other Individual and Family are tested using date formats which are
        not correct."""
        buff = StringIO("""0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 SEX M
1 BIRT
2 DATE 32 JAN 1940
1 DEAT
2 DATE 29 FEB 1941
1 FAMS @F1@
0 @I2@ INDI
1 NAME MarvelousMay /Coffin/
1 SEX F
1 BIRT
2 DATE 15/MAY/1941
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I1@
1 WIFE @I2@
1 MARR
2 DATE 15-07-1972
1 DIV
2 DATE July 15, 1973""")
        (ind, fam, parse_warns) = parse_file(buff)
        self.assertEqual(len(parse_warns), 5)
        self.assertEqual(ind["@I1@"].birth, None)
        self.assertEqual(ind["@I1@"].death, None)
        self.assertEqual(ind["@I2@"].birth, None)
        self.assertEqual(fam["@F1@"].married, None)
        self.assertEqual(fam["@F1@"].divorced, None)
コード例 #9
0
ファイル: test_us22.py プロジェクト: dhubinSIT/SSW555GEDCOM
    def test_duplicate_entries(self):
        """Test duplicate identifiers for both individuals and families."""
        buff = StringIO("""0 @I1@ INDI
1 NAME CrankyFrank /Coffin/
1 SEX M
1 BIRT
2 DATE 31 JAN 1940
1 DEAT
2 DATE 28 FEB 1988
1 FAMS @F1@
0 @I1@ INDI
1 NAME MarvelousMay /Coffin/
1 SEX F
1 BIRT
2 DATE 15 MAY 1941
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I1@
1 WIFE @I2@
1 MARR
2 DATE 7 JUL 1972
1 DIV
2 DATE 15 JUL 1973
0 @F1@ FAM
1 HUSB @I1@
1 MARR
2 DATE 15 JUL 1973
1 DIV
2 DATE 19 JUL 1974""")
        (ind, fam, parse_warns) = parse_file(buff)
        countus22 = 0
        for warn in parse_warns:
            countus22 += 1 if (warn.story == "US22") else 0
        self.assertEqual(countus22, 2)
        self.assertEqual(len(ind), 1)
        self.assertEqual(len(fam), 1)
        self.assertEqual(ind["@I1@"].gender,
                         'F')  # demonstrates we kept the second entry's value
        self.assertEqual(
            ind["@I1@"].death, None
        )  # demonstrates we had no left-over values from the first entry.
        self.assertTrue(fam["@F1@"].divorced > datetime(
            1974, 1, 1))  # demonstrates we kept the second entry
        self.assertEqual(
            fam["@F1@"].wife,
            None)  # demonstrate we had no left-over values from first entry.
コード例 #10
0
ファイル: test_us04.py プロジェクト: dhubinSIT/SSW555GEDCOM
    def test_full_path(self):
        '''Integration test for parser->objects->validation'''
        buff = StringIO('''0 @F1@ FAM
1 MARR
2 DATE 3 MAR 1986
1 DIV
2 DATE 3 MAR 1986
0 @F2@ FAM
1 MARR
2 DATE 3 MAR 1986
1 DIV
2 DATE 2 MAR 1986''')
        (ind, fam, unused_warns) = parse_file(buff)
        warnings = collect_validation_warnings(ind, fam)
        count_of_us04_errors = 0
        for warn in warnings:
            if warn.story == "US04": count_of_us04_errors += 1
        self.assertEqual(count_of_us04_errors, 1)
コード例 #11
0
    def test_mismatched_family_references(self):
        """Test mismatched references.  The family has husband, wife, child, child, but
        the individual objects think they are child, child, husband, wife."""
        buff = StringIO("""0 @I1@ INDI
1 FAMC @F1@
0 @I2@ INDI
1 FAMC @F1@
0 @I3@ INDI
1 FAMS @F1@
0 @I4@ INDI
1 FAMS @F1@
0 @F1@ FAM
1 HUSB @I1@
1 WIFE @I2@
1 CHIL @I3@
1 CHIL @I4@""")
        (ind, fam, unused_warns) = parse_file(buff)
        fam_warns = fam['@F1@']._Check_References()
        self.assertTrue(len([x for x in fam_warns if x.story == "US26"
                             ]) == 4)  # all four individuals mismatched.
        self.assertTrue(
            len([
                x for x in fam_warns
                if "@I1@" in x.message and "husband" in x.message
            ]) == 1)  # mismatch of husband
        self.assertTrue(
            len([
                x for x in fam_warns
                if "@I2@" in x.message and "wife" in x.message
            ]) == 1)  # mismatch of wife
        self.assertTrue(
            len([
                x for x in fam_warns
                if "@I3@" in x.message and "child" in x.message
            ]) == 1)  # mismatch of child
        self.assertTrue(
            len([
                x for x in fam_warns
                if "@I4@" in x.message and "child" in x.message
            ]) == 1)  # mismatch of other child
コード例 #12
0
    def test_missing_references(self):
        """Test references which are missing altogether. 
        These are just the parser warnings for missing individuals."""
        buff = StringIO("""0 @I1@ INDI
1 FAMS @FmissingS@
1 FAMC @FmissingC@
0 @F1@ FAM
1 WIFE @ImissingW@
1 HUSB @ImissingH@
1 CHIL @ImissingC@""")
        (ind, fam, warns) = parse_file(buff)
        self.assertTrue(len([x for x in warns if x.story == "US26"]) == 5)
        self.assertTrue(ind['@I1@'].spouse_family_ids == [])
        self.assertTrue(ind['@I1@'].spouse_families == [])
        self.assertTrue(ind['@I1@'].child_family_ids == [])
        self.assertTrue(ind['@I1@'].child_families == [])
        self.assertTrue(fam['@F1@'].husband_id == None)
        self.assertTrue(fam['@F1@'].husband == None)
        self.assertTrue(fam['@F1@'].wife_id == None)
        self.assertTrue(fam['@F1@'].wife == None)
        self.assertTrue(fam['@F1@'].children_id_list == [])
        self.assertTrue(fam['@F1@'].children_list == [])
コード例 #13
0
ファイル: gedcom.py プロジェクト: dhubinSIT/SSW555GEDCOM
    if len(warnings) > 0:
        print('Warnings')
        pt = PrettyTable(field_names=['Code', 'Message'])
        for warn in warnings:
            pt.add_row([warn.story, warn.message])
        pt.sortby = "Code"
        print(pt)
    else:
        print()
        print("GEDCOM database is sane.")


if __name__ == "__main__":
    '''Begin by opening the file '''
    with open(sys.argv[1], 'r') as f:
        (indi, fam, parse_warns) = parse_file(f)
        warnings = parse_warns + gedcom_validation.collect_validation_warnings(
            indi, fam)

        printIndividuals(indi)
        printFamilies(indi, fam)
        US28_SiblingsByAge_pt(indi, fam)
        US29_ListOfDeceased(indi)
        US30_ListLivingMarried_pt(indi, fam)
        US31_Listofliving(indi)
        US32_Listofmultiplebirths(indi)
        US33_ListOrphans_pt(indi, fam)
        US35_Listrecentbirths(indi)
        US36_Listrecentdeaths(indi)
        printWarnings(warnings)