def testCanCreate(self): gedcomfile = gedcom.GedcomFile() individual = gedcomfile.individual() individual.set_sex("M") self.assertEqual(individual.level, 0) self.assertEqual(list(gedcomfile.individuals)[0], individual) self.assertEqual(individual.tag, 'INDI') self.assertEqual(individual.level, 0) self.assertEqual(individual.note, None) family = gedcomfile.family() self.assertEqual(family.tag, 'FAM') self.assertEqual(family.level, 0) self.assertEqual( gedcomfile.gedcom_lines_as_string(), v('0 HEAD\n1 SOUR\n2 NAME gedcompy\n2 VERS {version}\n1 CHAR UTF-8\n1 GEDC\n2 VERS 5.5\n2 FORM LINEAGE-LINKED\n0 @I1@ INDI\n1 SEX M\n0 @F2@ FAM\n0 TRLR' )) self.assertEqual( repr(gedcomfile), v("GedcomFile(\nElement(0, 'HEAD', [Element(1, 'SOUR', [Name(2, 'NAME', 'gedcompy'), Element(2, 'VERS', '{version}')]), Element(1, 'CHAR', 'UTF-8'), Element(1, 'GEDC', [Element(2, 'VERS', '5.5'), Element(2, 'FORM', 'LINEAGE-LINKED')])]),\nIndividual(0, 'INDI', '@I1@', [Sex(1, 'SEX', 'M')]),\nFamily(0, 'FAM', '@F2@'),\nElement(0, 'TRLR'))" ))
def test_creating_gedcom_from_common(self): ''' Test creating a GedCom from a common_profile ''' profile = gen_profile("Juana", "Bargas") profile.setCheckedGender("F") profile.add_nickname("Nick1") profile.add_nickname("Nick2") profile.setCheckedDate("birth", 2014, 3, 2, accuracy="EXACT") profile.setCheckedDate("baptism", 2014, 3, 3, accuracy="AFTER") profile.setCheckedDate("death", 2016, 3, 2, accuracy="ABOUT") profile.setCheckedDate("burial", 2016, 3, 5, accuracy="BEFORE") profile.setPlaces("birth", "Portillo,Valladolid,Castile and Leon,Spain", language="es") #We transform to the gedcom class gedcom_profile.convert_gedcom(profile) gedcom_transform = profile.individual for ele in gedcom_transform.__dict__["child_elements"]: if ele.tag == "NAME": for sub_ele in ele.__dict__["child_elements"]: if sub_ele.tag == "GIVN": assert (sub_ele.value == "Juana") if sub_ele.tag == "SURN": assert (sub_ele.value == "Bargas") if sub_ele.tag == "NICK": assert (sub_ele.value == "Nick1,Nick2") elif ele.tag == "SEX": assert (ele.value == "F") elif ele.tag == "BIRT": for sub_ele in ele.__dict__["child_elements"]: if sub_ele.tag == "DATE": assert (sub_ele.value == "02 MAR 2014") if sub_ele.tag == "ADDR": for sub_ele2 in sub_ele.__dict__["child_elements"]: if sub_ele2.tag == "CITY": assert (sub_ele2.value == "Portillo") if sub_ele2.tag == "STAE": assert (sub_ele2.value == "Castilla y León") if sub_ele2.tag == "CTRY": assert (sub_ele2.value == "España") elif ele.tag == "DEAT": for sub_ele in ele.__dict__["child_elements"]: if sub_ele.tag == "DATE": assert (sub_ele.value == "ABT 02 MAR 2016") elif ele.tag == "BAPM": for sub_ele in ele.__dict__["child_elements"]: if sub_ele.tag == "DATE": assert (sub_ele.value == "AFT 03 MAR 2014") elif ele.tag == "BURI": for sub_ele in ele.__dict__["child_elements"]: if sub_ele.tag == "DATE": assert (sub_ele.value == "BEF 05 MAR 2016") gedcomfile = gedcom.GedcomFile() gedcomfile.add_element(profile.individual)
def testSetSex(self): gedcomfile = gedcom.GedcomFile() ind = gedcomfile.individual() ind.set_sex('m') ind.set_sex('M') ind.set_sex('f') ind.set_sex('F') self.assertRaises(TypeError, ind.set_sex, 'foo') self.assertRaises(TypeError, ind.set_sex, 'female') self.assertRaises(TypeError, ind.set_sex, 'male')
def testIndividualIdsWork(self): gedcomfile = gedcom.GedcomFile() element1 = gedcom.Individual() element2 = gedcom.Individual() self.assertEqual(element1.id, None) self.assertEqual(element2.id, None) gedcomfile.add_element(element1) gedcomfile.add_element(element2) self.assertEqual(element1.id, '@I1@') self.assertEqual(element2.id, '@I2@')
def testCreateEmpty(self): gedcomfile = gedcom.GedcomFile() self.assertEqual( gedcomfile.gedcom_lines_as_string(), v('0 HEAD\n1 SOUR\n2 NAME gedcompy\n2 VERS {version}\n1 CHAR UTF-8\n1 GEDC\n2 VERS 5.5\n2 FORM LINEAGE-LINKED\n0 TRLR' ))
def testCanAddFamilyObj(self): gedcomfile = gedcom.GedcomFile() element = gedcom.Family() gedcomfile.add_element(element)
def testCanAddIndividualObj(self): gedcomfile = gedcom.GedcomFile() element = gedcom.Individual() gedcomfile.add_element(element)
def testCanAddFamilyRaw(self): gedcomfile = gedcom.GedcomFile() element = gedcom.Element(tag="FAM") gedcomfile.add_element(element)
def testCanAddIndividualRaw(self): gedcomfile = gedcom.GedcomFile() element = gedcom.Element(tag="INDI") gedcomfile.add_element(element)
def testCanOnlyAddIndividualOrFamilyToFile(self): gedcomfile = gedcom.GedcomFile() title = gedcom.Element(tag="TITL") self.assertRaises(Exception, gedcomfile.add_element, (title))
def rdf2gedcom(rdf_graph): gedcomfile = gedcom.GedcomFile() # all individuals personuri_to_gedcom = {} for person in rdf_graph.subjects(RDF.type, FOAF.Person): uri = person firstname = rdf_graph.value(uri, FOAF.givenName) lastname = rdf_graph.value(uri, FOAF.familyName) gender = rdf_graph.value(uri, FOAF.gender) individual = gedcomfile.individual() # Name if firstname or lastname: name = gedcomfile.element("NAME") individual.add_child_element(name) if firstname: firstname = firstname.value name.add_child_element( gedcomfile.element("GIVN", value=firstname)) if lastname: lastname = lastname.value name.add_child_element( gedcomfile.element("SURN", value=lastname)) # Gender if gender: gender = gender.value if gender == 'female': gender = 'F' elif gender == 'male': gender = 'M' else: raise NonGedcomRecongisedSex(rdfsex=gender) individual.add_child_element( gedcomfile.element('SEX', value=gender)) # notes for note in rdf_graph.objects(uri, URIRef("note")): note = note.value if "\n" in note: subnotes = note.split("\n") note_node = gedcomfile.element("NOTE", value=subnotes[0]) for subnote in subnotes[1:]: note_node.add_child_element( gedcomfile.element("CONT", value=subnote)) else: note_node = gedcomfile.element("NOTE", value=note) individual.add_child_element(note_node) # Title title = rdf_graph.value(uri, BIO.NobleTitle) if title: individual.add_child_element( gedcomfile.element("TITL", value=title)) # Birth birth_node = rdf_graph.value(uri, BIO.Birth) if birth_node: birthdate = rdf_graph.value(birth_node, BIO.date) birthplace = rdf_graph.value(birth_node, BIO.place) gd_birth = gedcomfile.element("BIRT") individual.add_child_element(gd_birth) if birthdate: gd_birth.add_child_element( gedcomfile.element("DATE", value=birthdate)) if birthplace: gd_birth.add_child_element( gedcomfile.element("PLAC", value=birthplace)) # Death death_node = rdf_graph.value(uri, BIO.Death) if death_node: deathdate = rdf_graph.value(death_node, BIO.date) deathplace = rdf_graph.value(death_node, BIO.place) gd_death = gedcomfile.element("DEAT") individual.add_child_element(gd_death) if deathdate: gd_death.add_child_element( gedcomfile.element("DATE", value=deathdate)) if deathplace: gd_death.add_child_element( gedcomfile.element("PLAC", value=deathplace)) gedcomfile.add_element(individual) personuri_to_gedcom[uri] = individual print "All marriages" # try to figure out families # Simple families, 2 people # look for a marriage event between 2 people of different genders. marriage_uri_to_gedcom_family = {} for marriageuri in rdf_graph.subjects(RDF.type, BIO.Marriage): partners = list(rdf_graph.objects(marriageuri, BIO.partner)) if len(partners) > 2: raise UnconvertableRDFGraph() genders = [rdf_graph.value(p, FOAF.gender).value for p in partners] if genders == ['male', 'male'] or genders == ['female', 'female']: raise UnconvertableRDFGraph(uri=marriageuri) malepartneruri, femalepartneruri = None, None for partner, gender in zip(partners, genders): if gender == 'male': malepartneruri = partner elif gender == 'female': femalepartneruri = partner else: raise NonGedcomRecongisedSex(rdfsex=gender) print "Looking at marriage", malepartneruri family = gedcomfile.family() if malepartneruri: husb = personuri_to_gedcom[malepartneruri] family.add_child_element(gedcomfile.element("HUSB", value=husb.id)) if femalepartneruri: wife = personuri_to_gedcom[femalepartneruri] family.add_child_element(gedcomfile.element("WIFE", value=wife.id)) # Try to find any children of these people # people who are children of the mother and the father children_to_add_to_family = [] if malepartneruri and femalepartneruri: # both there, see if we have people who are children of both of these kids_via_mother = set( rdf_graph.subjects(BIO.mother, femalepartneruri)) kids_via_father = set( rdf_graph.subjects(BIO.father, malepartneruri)) # TODO throw assertion/error if these 2 sets aren't the same? What should a GEDCOM file look like? children_to_add_to_family = kids_via_father.intersection( kids_via_mother) elif malepartneruri and not femalepartneruri: # only have father so look for those children of this person children_to_add_to_family = set( rdf_graph.subjects(BIO.father, malepartneruri)) elif not malepartneruri and femalepartneruri: # only have father so look for those children of this person children_to_add_to_family = set( rdf_graph.subjects(BIO.mother, femalepartneruri)) elif not malepartneruri and not femalepartneruri: children_to_add_to_family = [] for childuri in children_to_add_to_family: gedcom_child = personuri_to_gedcom[childuri] family.add_child_element( gedcomfile.element("CHIL", value=gedcom_child.id)) gedcom_child.add_child_element( gedcomfile.element("FAMC", value=family.id)) marr = gedcomfile.element("MARR") family.add_child_element(marr) date = rdf_graph.value(marriageuri, BIO.date) if date: marr.add_child_element(gedcomfile.element("DATE", value=date)) place = rdf_graph.value(marriageuri, BIO.place) if place: marr.add_child_element(gedcomfile.element("PLAC", value=place)) # id will be generated here gedcomfile.add_element(family) if malepartneruri: husb.add_child_element(gedcomfile.element("FAMS", value=family.id)) if femalepartneruri: wife.add_child_element(gedcomfile.element("FAMS", value=family.id)) marriage_uri_to_gedcom_family[marriageuri] = family return gedcomfile