예제 #1
0
    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)
예제 #3
0
 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')
예제 #4
0
    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@')
예제 #5
0
 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'
           ))
예제 #6
0
 def testCanAddFamilyObj(self):
     gedcomfile = gedcom.GedcomFile()
     element = gedcom.Family()
     gedcomfile.add_element(element)
예제 #7
0
 def testCanAddIndividualObj(self):
     gedcomfile = gedcom.GedcomFile()
     element = gedcom.Individual()
     gedcomfile.add_element(element)
예제 #8
0
 def testCanAddFamilyRaw(self):
     gedcomfile = gedcom.GedcomFile()
     element = gedcom.Element(tag="FAM")
     gedcomfile.add_element(element)
예제 #9
0
 def testCanAddIndividualRaw(self):
     gedcomfile = gedcom.GedcomFile()
     element = gedcom.Element(tag="INDI")
     gedcomfile.add_element(element)
예제 #10
0
 def testCanOnlyAddIndividualOrFamilyToFile(self):
     gedcomfile = gedcom.GedcomFile()
     title = gedcom.Element(tag="TITL")
     self.assertRaises(Exception, gedcomfile.add_element, (title))
예제 #11
0
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