def _parse_date(element: Element) -> Optional[Datey]: dateval_element = _xpath1(element, './ns:dateval[not(@cformat)]') if dateval_element is not None: dateval_type = _xpath1(dateval_element, './@type') if dateval_type is None: return _parse_dateval(dateval_element, 'val') dateval_type = str(dateval_type) if dateval_type == 'about': date = _parse_dateval(dateval_element, 'val') if date is None: return None date.fuzzy = True return date if dateval_type == 'before': return DateRange(None, _parse_dateval(dateval_element, 'val'), end_is_boundary=True) if dateval_type == 'after': return DateRange(_parse_dateval(dateval_element, 'val'), start_is_boundary=True) datespan_element = _xpath1(element, './ns:datespan[not(@cformat)]') if datespan_element is not None: return DateRange(_parse_dateval(datespan_element, 'start'), _parse_dateval(datespan_element, 'stop')) daterange_element = _xpath1(element, './ns:daterange[not(@cformat)]') if daterange_element is not None: return DateRange(_parse_dateval(daterange_element, 'start'), _parse_dateval(daterange_element, 'stop'), start_is_boundary=True, end_is_boundary=True) return None
def _load_date(element: ElementTree.Element) -> Optional[Datey]: dateval_element = _xpath1(element, './ns:dateval') if dateval_element is not None and dateval_element.get('cformat') is None: dateval_type = dateval_element.get('type') if dateval_type is None: return _load_dateval(dateval_element, 'val') dateval_type = str(dateval_type) if dateval_type == 'about': date = _load_dateval(dateval_element, 'val') if date is None: return None date.fuzzy = True return date if dateval_type == 'before': return DateRange(None, _load_dateval(dateval_element, 'val'), end_is_boundary=True) if dateval_type == 'after': return DateRange(_load_dateval(dateval_element, 'val'), start_is_boundary=True) datespan_element = _xpath1(element, './ns:datespan') if datespan_element is not None and datespan_element.get( 'cformat') is None: return DateRange(_load_dateval(datespan_element, 'start'), _load_dateval(datespan_element, 'stop')) daterange_element = _xpath1(element, './ns:daterange') if daterange_element is not None and daterange_element.get( 'cformat') is None: return DateRange(_load_dateval(daterange_element, 'start'), _load_dateval(daterange_element, 'stop'), start_is_boundary=True, end_is_boundary=True) return None
class Test(TemplateTestCase): template_file = 'label/place.html.j2' @parameterized.expand([ ('<address><a href="/place/P0/index.html"><span>The Place</span></a></address>', { 'place': Place('P0', [PlaceName('The Place')]), }), ('<address><a href="/place/P0/index.html"><span lang="en">The Place</span></a></address>', { 'place': Place('P0', [PlaceName('The Place', 'en')]), }), ('<address><a href="/place/P0/index.html"><span lang="nl">De Plaats</span></a></address>', { 'place': Place('P0', [PlaceName('The Place', 'en'), PlaceName('De Plaats', 'nl')]), 'locale': 'nl', }), ('<address><span>The Place</span></address>', { 'place': Place('P0', [PlaceName('The Place')]), 'embedded': True, }), ('<address><a href="/place/P0/index.html"><span lang="nl">De Nieuwe Plaats</span></a></address>', { 'place': Place('P0', [PlaceName('The Old Place', 'en', date=DateRange(None, Date(1969, 12, 31))), PlaceName('De Nieuwe Plaats', 'nl', date=DateRange(Date(1970, 1, 1)))]), 'locale': 'nl', 'date_context': Date(1970, 1, 1), }) ]) @sync async def test(self, expected, data): async with self._render(data=data) as (actual, _): self.assertEqual(expected, actual)
def _expand(generation: int): multiplier = abs(generation) + 1 if generation < 0 else 1 threshold_year = datetime.now().year - 100 * multiplier date_under_threshold = Date(threshold_year + 1, 1, 1) date_range_start_under_threshold = DateRange(date_under_threshold) date_range_end_under_threshold = DateRange(None, date_under_threshold) date_over_threshold = Date(threshold_year - 1, 1, 1) date_range_start_over_threshold = DateRange(date_over_threshold) date_range_end_over_threshold = DateRange(None, date_over_threshold) return parameterized.expand([ # If there are no events for a person, their privacy does not change. (True, None, None), (True, True, None), (False, False, None), # Deaths and burials are special, and their existence prevents generation 0 from being private even without # having passed the usual threshold. (generation != 0, None, IdentifiableEvent('E0', Event.Type.DEATH, date=Date(datetime.now().year, datetime.now().month, datetime.now().day))), (generation != 0, None, IdentifiableEvent('E0', Event.Type.DEATH, date=date_under_threshold)), (True, None, IdentifiableEvent('E0', Event.Type.DEATH, date=date_range_start_under_threshold)), (generation != 0, None, IdentifiableEvent('E0', Event.Type.DEATH, date=date_range_end_under_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.DEATH)), (False, False, IdentifiableEvent('E0', Event.Type.DEATH)), (generation != 0, None, IdentifiableEvent('E0', Event.Type.BURIAL, date=Date(datetime.now().year, datetime.now().month, datetime.now().day))), (generation != 0, None, IdentifiableEvent('E0', Event.Type.BURIAL, date=date_under_threshold)), (True, None, IdentifiableEvent('E0', Event.Type.BURIAL, date=date_range_start_under_threshold)), (generation != 0, None, IdentifiableEvent('E0', Event.Type.BURIAL, date=date_range_end_under_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BURIAL)), (False, False, IdentifiableEvent('E0', Event.Type.BURIAL)), # Regular events without dates do not affect privacy. (True, None, IdentifiableEvent('E0', Event.Type.BIRTH)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH)), # Regular events with incomplete dates do not affect privacy. (True, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=Date())), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=Date())), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=Date())), # Regular events under the lifetime threshold do not affect privacy. (True, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_under_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_under_threshold)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_under_threshold)), (True, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_start_under_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_start_under_threshold)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_start_under_threshold)), (True, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_end_under_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_end_under_threshold)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_end_under_threshold)), # Regular events over the lifetime threshold affect privacy. (False, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_over_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_over_threshold)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_over_threshold)), (False, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_start_over_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_start_over_threshold)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_start_over_threshold)), (False, None, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_end_over_threshold)), (True, True, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_end_over_threshold)), (False, False, IdentifiableEvent('E0', Event.Type.BIRTH, date=date_range_end_over_threshold)), ])
def test_post_parse(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = Date(1970, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(3, len(person.presences)) self.assertEquals(DateRange(None, Date(1970, 1, 1)), person.start.date) self.assertEquals(DateRange(Date(1970, 1, 1)), person.end.date)
def derive(cls, person: Person, derivable_event: Event, reference_event_type_types: Set[Type[EventType]]) -> bool: if not reference_event_type_types: return False reference_events = _get_reference_events(person, reference_event_type_types) reference_events_dates = cls._get_events_dates(reference_events) reference_events_dates = filter(lambda x: x[1].comparable, reference_events_dates) if derivable_event.date is not None: reference_events_dates = filter( lambda x: cls._compare(derivable_event.date, x[1]), reference_events_dates) reference_events_dates = cls._sort(reference_events_dates) try: reference_event, reference_date = reference_events_dates[0] except IndexError: return False if derivable_event.date is None: derivable_event.date = DateRange() cls._set(derivable_event, DerivedDate.derive(reference_date)) derivable_event.citations.append(*reference_event.citations) return True
def _derive_event(person: Person, event_type: Event.Type, after: bool, derivations: Dict) -> None: derived_event = _get_primary_event(person, event_type) if derived_event is None: derived_event = DerivedEvent(event_type) if derived_event.date is not None: return event_dates = [] for event in [ presence.event for presence in person.presences if presence.event.type != event_type ]: if isinstance(event.date, DateRange): if event.date.start is not None and event.date.start.comparable: event_dates.append((event, event.date.start)) if event.date.end is not None and event.date.end.comparable: event_dates.append((event, event.date.end)) elif event.date is not None and event.date.comparable: event_dates.append((event, event.date)) event_dates = sorted(event_dates, key=lambda x: x[1], reverse=after) try: threshold_event, threshold_date = event_dates[0] except IndexError: return derived_start_date = copy(threshold_date) if after else None derived_end_date = None if after else copy(threshold_date) derived_event.date = DateRange(derived_start_date, derived_end_date) for citation in threshold_event.citations: derived_event.citations.append(citation) if isinstance(derived_event, DerivedEvent): Presence(person, Presence.Role.SUBJECT, derived_event) derivations[event_type] += 1
def test_event_should_encode_full(self): event = IdentifiableEvent('the_event', Birth()) event.date = DateRange(Date(2000, 1, 1), Date(2019, 12, 31)) event.place = Place('the_place', [PlaceName('The Place')]) Presence(Person('the_person'), Subject(), event) event.citations.append( IdentifiableCitation('the_citation', Source('The Source'))) expected = { '$schema': '/schema.json#/definitions/event', '@context': { 'place': 'https://schema.org/location', }, '@type': 'https://schema.org/Event', 'id': 'the_event', 'type': 'birth', 'presences': [ { '@context': { 'person': 'https://schema.org/actor', }, 'role': 'subject', 'person': '/en/person/the_person/index.json', }, ], 'citations': [ '/en/citation/the_citation/index.json', ], 'date': { 'start': { 'year': 2000, 'month': 1, 'day': 1, }, 'end': { 'year': 2019, 'month': 12, 'day': 31, }, }, 'place': '/en/place/the_place/index.json', 'links': [ { 'url': '/en/event/the_event/index.json', 'relationship': 'canonical', 'mediaType': 'application/json', }, { 'url': '/nl/event/the_event/index.json', 'relationship': 'alternate', 'locale': 'nl-NL', }, { 'url': '/en/event/the_event/index.html', 'relationship': 'alternate', 'mediaType': 'text/html', }, ], } self.assert_encodes(expected, event, 'event')
async def test_post_parse(self): person = Person('P0') reference_presence = Presence(person, Subject(), Event(Residence())) reference_presence.event.date = Date(1970, 1, 1) with TemporaryDirectory() as output_directory_path: configuration = Configuration(output_directory_path, 'https://example.com') configuration.plugins[Deriver] = None async with Site(configuration) as site: site.ancestry.people[person.id] = person await parse(site) self.assertEquals(3, len(person.presences)) self.assertEquals( DateRange(None, Date(1970, 1, 1), end_is_boundary=True), person.start.date) self.assertEquals(DateRange(Date(1970, 1, 1), start_is_boundary=True), person.end.date)
async def test_post_parse(self): person = Person('P0') reference_presence = Presence(person, Subject(), Event(None, Residence())) reference_presence.event.date = Date(1970, 1, 1) with TemporaryDirectory() as output_directory_path: configuration = Configuration(output_directory_path, 'https://example.com') configuration.extensions.add(ExtensionConfiguration(Deriver)) async with App(configuration) as app: app.ancestry.entities.append(person) await load(app) self.assertEquals(3, len(person.presences)) self.assertEquals( DateRange(None, Date(1970, 1, 1), end_is_boundary=True), person.start.date) self.assertEquals(DateRange(Date(1970, 1, 1), start_is_boundary=True), person.end.date)
def _parse_date(element: Element) -> Optional[Datey]: dateval_element = _xpath1(element, './ns:dateval[not(@cformat)]') if dateval_element is not None: dateval = str(_xpath1(dateval_element, './@val')) dateval_type = _xpath1(dateval_element, './@type') if dateval_type is None: return _parse_dateval(dateval) dateval_type = str(dateval_type) if dateval_type == 'about': date = _parse_dateval(dateval) if date is None: return None date.fuzzy = True return date if dateval_type == 'before': return DateRange(None, _parse_dateval(dateval)) if dateval_type == 'after': return DateRange(_parse_dateval(dateval)) daterange_element = _xpath1(element, './ns:daterange[not(@cformat)]') if daterange_element is not None: start = _parse_dateval(str(_xpath1(daterange_element, './@start'))) end = _parse_dateval(str(_xpath1(daterange_element, './@stop'))) return DateRange(start, end) return None
def test_derive_birth_with_existing_event(self, other_date: Datey): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = other_date irrelevant_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E1', Event.Type.DIVORCE)) irrelevant_presence.event.date = Date(1972, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(4, len(person.presences)) self.assertEquals(DateRange(None, Date(1971, 1, 1)), person.start.date)
def test_event_should_encode_full(self): event = IdentifiableEvent('the_event', Event.Type.BIRTH) event.date = DateRange(Date(2000, 1, 1), Date(2019, 12, 31)) event.place = Place('the_place', [LocalizedName('The Place')]) Presence(Person('the_person'), Presence.Role.SUBJECT, event) event.citations.append( Citation('the_citation', Source('the_source', 'The Source'))) expected = { '$schema': '/schema.json#/definitions/event', '@context': { 'place': 'https://schema.org/location', }, '@type': 'https://schema.org/Event', 'id': 'the_event', 'type': Event.Type.BIRTH.value, 'presences': [ { '@context': { 'person': 'https://schema.org/actor', }, 'role': Presence.Role.SUBJECT.value, 'person': '/person/the_person/index.json', }, ], 'citations': [ '/citation/the_citation/index.json', ], 'date': { 'start': { 'year': 2000, 'month': 1, 'day': 1, }, 'end': { 'year': 2019, 'month': 12, 'day': 31, }, }, 'place': '/place/the_place/index.json', } self.assert_encodes(expected, event, 'event')
class DateRangeTest(TestCase): @parameterized.expand([ (False, Date(1970, 2, 1)), (False, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (False, DateRange(Date(1970, 2, 1))), (False, DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3))), (False, DateRange(None, Date(1970, 2, 1))), (False, DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_lt_with_start_date(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) < other) @parameterized.expand([ (False, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (False, DateRange(Date(1970, 2, 1))), (True, DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3))), (False, DateRange(None, Date(1970, 2, 1))), (False, DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_lt_with_end_date(self, expected, other): self.assertEquals(expected, DateRange(None, Date(1970, 2, 2)) < other) @parameterized.expand([ (False, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (True, DateRange(Date(1970, 2, 1))), (True, DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3))), (False, DateRange(None, Date(1970, 2, 1))), (True, DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_lt_with_both_dates(self, expected, other): self.assertEquals( expected, DateRange(Date(1970, 2, 1), Date(1970, 2, 3)) < other) @parameterized.expand([ (True, DateRange(Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, None))), (False, DateRange(Date(1970, None, 2))), (False, DateRange(Date(None, 2, 2))), (False, DateRange(Date(1970, None, None))), (False, DateRange(Date(None, 2, None))), (False, DateRange(Date(None, None, 2))), (False, None), ]) def test_eq(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) == other) @parameterized.expand([ (True, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (False, Date(1970, 2, 3)), (True, DateRange(Date(1970, 2, 1))), (False, DateRange(Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, 3))), (True, DateRange(None, Date(1970, 2, 1))), (True, DateRange(None, Date(1970, 2, 2))), (False, DateRange(None, Date(1970, 2, 3))), (True, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (True, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_gt(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) > other)
def _expand_person(generation: int): lifetime_threshold = 125 multiplier = abs(generation) + 1 if generation < 0 else 1 lifetime_threshold_year = datetime.now( ).year - lifetime_threshold * multiplier date_under_lifetime_threshold = Date(lifetime_threshold_year + 1, 1, 1) date_range_start_under_lifetime_threshold = DateRange( date_under_lifetime_threshold) date_range_end_under_lifetime_threshold = DateRange( None, date_under_lifetime_threshold) date_over_lifetime_threshold = Date(lifetime_threshold_year - 1, 1, 1) date_range_start_over_lifetime_threshold = DateRange( date_over_lifetime_threshold) date_range_end_over_lifetime_threshold = DateRange( None, date_over_lifetime_threshold) return parameterized.expand([ # If there are no events for a person, they are private. (True, None, None), (True, True, None), (False, False, None), # Deaths and other end-of-life events are special, but only for the person whose privacy is being checked: # - If they're present without dates, the person isn't private. # - If they're present and their dates or date ranges' end dates are in the past, the person isn't private. (generation != 0, None, Event(Death(), date=Date(datetime.now().year, datetime.now().month, datetime.now().day))), (generation != 0, None, Event(Death(), date=date_under_lifetime_threshold)), (True, None, Event(Death(), date=date_range_start_under_lifetime_threshold)), (generation != 0, None, Event(Death(), date=date_range_end_under_lifetime_threshold)), (False, None, Event(Death(), date=date_over_lifetime_threshold)), (True, None, Event(Death(), date=date_range_start_over_lifetime_threshold)), (False, None, Event(Death(), date=date_range_end_over_lifetime_threshold)), (True, True, Event(Death())), (False, False, Event(Death())), (generation != 0, None, Event(Death())), # Regular events without dates do not affect privacy. (True, None, Event(Birth())), (True, True, Event(Birth())), (False, False, Event(Birth())), # Regular events with incomplete dates do not affect privacy. (True, None, Event(Birth(), date=Date())), (True, True, Event(Birth(), date=Date())), (False, False, Event(Birth(), date=Date())), # Regular events under the lifetime threshold do not affect privacy. (True, None, Event(Birth(), date=date_under_lifetime_threshold)), (True, True, Event(Birth(), date=date_under_lifetime_threshold)), (False, False, Event(Birth(), date=date_under_lifetime_threshold)), (True, None, Event(Birth(), date=date_range_start_under_lifetime_threshold)), (True, True, Event(Birth(), date=date_range_start_under_lifetime_threshold)), (False, False, Event(Birth(), date=date_range_start_under_lifetime_threshold)), (True, None, Event(Birth(), date=date_range_end_under_lifetime_threshold)), (True, True, Event(Birth(), date=date_range_end_under_lifetime_threshold)), (False, False, Event(Birth(), date=date_range_end_under_lifetime_threshold)), # Regular events over the lifetime threshold affect privacy. (False, None, Event(Birth(), date=date_over_lifetime_threshold)), (True, True, Event(Birth(), date=date_over_lifetime_threshold)), (False, False, Event(Birth(), date=date_over_lifetime_threshold)), (True, None, Event(Birth(), date=date_range_start_over_lifetime_threshold)), (True, True, Event(Birth(), date=date_range_start_over_lifetime_threshold)), (False, False, Event(Birth(), date=date_range_start_over_lifetime_threshold)), (False, None, Event(Birth(), date=date_range_end_over_lifetime_threshold)), (True, True, Event(Birth(), date=date_range_end_over_lifetime_threshold)), (False, False, Event(Birth(), date=date_range_end_over_lifetime_threshold)), ])
async def load(self) -> None: amsterdam = Place('betty-demo-amsterdam', [PlaceName('Amsterdam')]) amsterdam.coordinates = Point(52.366667, 4.9) amsterdam.links.add(Link('https://nl.wikipedia.org/wiki/Amsterdam')) self._ancestry.places[amsterdam.id] = amsterdam ilpendam = Place('betty-demo-ilpendam', [PlaceName('Ilpendam')]) ilpendam.coordinates = Point(52.465556, 4.951111) ilpendam.links.add(Link('https://nl.wikipedia.org/wiki/Ilpendam')) self._ancestry.places[ilpendam.id] = ilpendam personal_accounts = IdentifiableSource('betty-demo-personal-accounts', 'Personal accounts') self._ancestry.sources[personal_accounts.id] = personal_accounts cite_first_person_account = IdentifiableCitation( 'betty-demo-first-person-account', personal_accounts) self._ancestry.citations[ cite_first_person_account.id] = cite_first_person_account bevolkingsregister_amsterdam = IdentifiableSource( 'betty-demo-bevolkingsregister-amsterdam', 'Bevolkingsregister Amsterdam') bevolkingsregister_amsterdam.author = 'Gemeente Amsterdam' bevolkingsregister_amsterdam.publisher = 'Gemeente Amsterdam' self._ancestry.sources[ bevolkingsregister_amsterdam.id] = bevolkingsregister_amsterdam david_marinus_lankester = Person('betty-demo-david-marinus-lankester') david_marinus_lankester.names.append( PersonName('David Marinus', 'Lankester')) self._ancestry.people[ david_marinus_lankester.id] = david_marinus_lankester geertruida_van_ling = Person('betty-demo-geertruida-van-ling') geertruida_van_ling.names.append(PersonName('Geertruida', 'Van Ling')) self._ancestry.people[geertruida_van_ling.id] = geertruida_van_ling marriage_of_dirk_jacobus_lankester_and_jannigje_palsen = IdentifiableEvent( 'betty-demo-marriage-of-dirk-jacobus-lankester-and-jannigje-palsen', Marriage(), Date(1922, 7, 4)) marriage_of_dirk_jacobus_lankester_and_jannigje_palsen.place = ilpendam self._ancestry.events[ marriage_of_dirk_jacobus_lankester_and_jannigje_palsen. id] = marriage_of_dirk_jacobus_lankester_and_jannigje_palsen birth_of_dirk_jacobus_lankester = IdentifiableEvent( 'betty-demo-birth-of-dirk-jacobus-lankester', Birth(), Date(1897, 8, 25)) birth_of_dirk_jacobus_lankester.place = amsterdam self._ancestry.events[birth_of_dirk_jacobus_lankester. id] = birth_of_dirk_jacobus_lankester death_of_dirk_jacobus_lankester = IdentifiableEvent( 'betty-demo-death-of-dirk-jacobus-lankester', Death(), Date(1986, 8, 18)) death_of_dirk_jacobus_lankester.place = amsterdam self._ancestry.events[death_of_dirk_jacobus_lankester. id] = death_of_dirk_jacobus_lankester dirk_jacobus_lankester = Person('betty-demo-dirk-jacobus-lankester') dirk_jacobus_lankester.names.append( PersonName('Dirk Jacobus', 'Lankester')) Presence(dirk_jacobus_lankester, Subject(), birth_of_dirk_jacobus_lankester) Presence(dirk_jacobus_lankester, Subject(), death_of_dirk_jacobus_lankester) Presence(dirk_jacobus_lankester, Subject(), marriage_of_dirk_jacobus_lankester_and_jannigje_palsen) dirk_jacobus_lankester.parents.append(david_marinus_lankester, geertruida_van_ling) self._ancestry.people[ dirk_jacobus_lankester.id] = dirk_jacobus_lankester birth_of_marinus_david_lankester = IdentifiableEvent( 'betty-demo-birth-of-marinus-david', Birth(), DateRange(Date(1874, 1, 15), Date(1874, 3, 21), start_is_boundary=True, end_is_boundary=True)) birth_of_marinus_david_lankester.place = amsterdam self._ancestry.events[birth_of_marinus_david_lankester. id] = birth_of_marinus_david_lankester death_of_marinus_david_lankester = IdentifiableEvent( 'betty-demo-death-of-marinus-david', Death(), Date(1971)) death_of_marinus_david_lankester.place = amsterdam self._ancestry.events[death_of_marinus_david_lankester. id] = death_of_marinus_david_lankester marinus_david_lankester = Person('betty-demo-marinus-david-lankester') marinus_david_lankester.names.append( PersonName('Marinus David', 'Lankester')) Presence(marinus_david_lankester, Subject(), birth_of_marinus_david_lankester) Presence(marinus_david_lankester, Subject(), death_of_marinus_david_lankester) marinus_david_lankester.parents.append(david_marinus_lankester, geertruida_van_ling) self._ancestry.people[ marinus_david_lankester.id] = marinus_david_lankester birth_of_jacoba_gesina_lankester = IdentifiableEvent( 'betty-demo-birth-of-jacoba-gesina', Birth(), Date(1900, 3, 14)) birth_of_jacoba_gesina_lankester.place = amsterdam self._ancestry.events[birth_of_jacoba_gesina_lankester. id] = birth_of_jacoba_gesina_lankester jacoba_gesina_lankester = Person('betty-demo-jacoba-gesina-lankester') jacoba_gesina_lankester.names.append( PersonName('Jacoba Gesina', 'Lankester')) Presence(jacoba_gesina_lankester, Subject(), birth_of_jacoba_gesina_lankester) jacoba_gesina_lankester.parents.append(david_marinus_lankester, geertruida_van_ling) self._ancestry.people[ jacoba_gesina_lankester.id] = jacoba_gesina_lankester jannigje_palsen = Person('betty-demo-jannigje-palsen') jannigje_palsen.names.append(PersonName('Jannigje', 'Palsen')) Presence(jannigje_palsen, Subject(), marriage_of_dirk_jacobus_lankester_and_jannigje_palsen) self._ancestry.people[jannigje_palsen.id] = jannigje_palsen marriage_of_johan_de_boer_and_liberta_lankester = IdentifiableEvent( 'betty-demo-marriage-of-johan-de-boer-and-liberta-lankester', Marriage(), Date(1953, 6, 19)) marriage_of_johan_de_boer_and_liberta_lankester.place = amsterdam self._ancestry.events[ marriage_of_johan_de_boer_and_liberta_lankester. id] = marriage_of_johan_de_boer_and_liberta_lankester cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam = IdentifiableCitation( 'betty-demo-birth-of-liberta-lankester-from-bevolkingsregister-amsterdam', bevolkingsregister_amsterdam) cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam.location = 'Amsterdam' self._ancestry.citations[ cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam. id] = cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam birth_of_liberta_lankester = IdentifiableEvent( 'betty-demo-birth-of-liberta-lankester', Birth(), Date(1929, 12, 22)) birth_of_liberta_lankester.place = amsterdam birth_of_liberta_lankester.citations.append( cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam) self._ancestry.events[ birth_of_liberta_lankester.id] = birth_of_liberta_lankester death_of_liberta_lankester = IdentifiableEvent( 'betty-demo-death-of-liberta-lankester', Death(), Date(2015, 1, 17)) death_of_liberta_lankester.place = amsterdam death_of_liberta_lankester.citations.append(cite_first_person_account) self._ancestry.events[ death_of_liberta_lankester.id] = death_of_liberta_lankester liberta_lankester = Person('betty-demo-liberta-lankester') liberta_lankester.names.append(PersonName('Liberta', 'Lankester')) liberta_lankester.names.append(PersonName('Betty')) Presence(liberta_lankester, Subject(), birth_of_liberta_lankester) Presence(liberta_lankester, Subject(), death_of_liberta_lankester) Presence(liberta_lankester, Subject(), marriage_of_johan_de_boer_and_liberta_lankester) liberta_lankester.parents.append(dirk_jacobus_lankester, jannigje_palsen) self._ancestry.people[liberta_lankester.id] = liberta_lankester birth_of_johan_de_boer = IdentifiableEvent( 'betty-demo-birth-of-johan-de-boer', Birth(), Date(1930, 6, 20)) birth_of_johan_de_boer.place = amsterdam self._ancestry.events[ birth_of_johan_de_boer.id] = birth_of_johan_de_boer death_of_johan_de_boer = IdentifiableEvent( 'betty-demo-death-of-johan-de-boer', Death(), Date(1999, 3, 10)) death_of_johan_de_boer.place = amsterdam death_of_johan_de_boer.citations.append(cite_first_person_account) self._ancestry.events[ death_of_johan_de_boer.id] = death_of_johan_de_boer johan_de_boer = Person('betty-demo-johan-de-boer') johan_de_boer.names.append(PersonName('Johan', 'De Boer')) johan_de_boer.names.append(PersonName('Hans')) Presence(johan_de_boer, Subject(), birth_of_johan_de_boer) Presence(johan_de_boer, Subject(), death_of_johan_de_boer) Presence(johan_de_boer, Subject(), marriage_of_johan_de_boer_and_liberta_lankester) self._ancestry.people[johan_de_boer.id] = johan_de_boer parent_of_bart_feenstra_child_of_liberta_lankester = Person( 'betty-demo-parent-of-bart-feenstra-child-of-liberta-lankester') parent_of_bart_feenstra_child_of_liberta_lankester.names.append( PersonName('Bart\'s parent')) parent_of_bart_feenstra_child_of_liberta_lankester.parents.append( johan_de_boer, liberta_lankester) self._ancestry.people[ parent_of_bart_feenstra_child_of_liberta_lankester. id] = parent_of_bart_feenstra_child_of_liberta_lankester bart_feenstra = Person('betty-demo-bart-feenstra') bart_feenstra.names.append(PersonName('Bart', 'Feenstra')) bart_feenstra.parents.append( parent_of_bart_feenstra_child_of_liberta_lankester) self._ancestry.people[bart_feenstra.id] = bart_feenstra
def test_lt_with_both_dates(self, expected, other): self.assertEquals( expected, DateRange(Date(1970, 2, 1), Date(1970, 2, 3)) < other)
def test_gt(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) > other)
def test_lt_with_start_date(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) < other)
def test_lt_with_end_date(self, expected, other): self.assertEquals(expected, DateRange(None, Date(1970, 2, 2)) < other)
class DateTest(TestCase): def test_year(self): year = 1970 sut = Date(year=year) self.assertEquals(year, sut.year) def test_month(self): month = 1 sut = Date(month=month) self.assertEquals(month, sut.month) def test_day(self): day = 1 sut = Date(day=day) self.assertEquals(day, sut.day) def test_fuzzy(self): fuzzy = True sut = Date() sut.fuzzy = fuzzy self.assertEquals(fuzzy, sut.fuzzy) @parameterized.expand([ (True, 1970, 1, 1), (False, None, 1, 1), (True, 1970, None, 1), (True, 1970, 1, None), (False, None, None, 1), (True, 1970, None, None), (False, None, None, None), ]) def test_comparable(self, expected, year, month, day): sut = Date(year, month, day) self.assertEquals(expected, sut.comparable) @parameterized.expand([ (True, 1970, 1, 1), (False, None, 1, 1), (False, 1970, None, 1), (False, 1970, 1, None), (False, None, None, 1), (False, 1970, None, None), (False, None, None, None), ]) def test_complete(self, expected, year, month, day): sut = Date(year, month, day) self.assertEquals(expected, sut.complete) def test_to_range_when_incomparable_should_raise(self): with self.assertRaises(ValueError): Date(None, 1, 1).to_range() @parameterized.expand([ (1970, 1, 1), (None, None, None), ]) def test_parts(self, year, month, day): self.assertEquals((year, month, day), Date(year, month, day).parts) @parameterized.expand([ (False, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (False, Date(1970, 2, 3)), (False, DateRange()), ]) def test_in(self, expected, other): self.assertEquals(expected, other in Date(1970, 2, 2)) @parameterized.expand([ (False, Date(1970, 2, 1)), (False, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (False, Date(1970)), (False, Date(1970, 2)), (True, Date(1971)), (True, Date(1970, 3)), ]) def test_lt(self, expected, other): self.assertEquals(expected, Date(1970, 2, 2) < other) @parameterized.expand([ (True, Date(1970, 1, 1)), (False, Date(1970, 1, None)), (False, Date(1970, None, 1)), (False, Date(None, 1, 1)), (False, Date(1970, None, None)), (False, Date(None, 1, None)), (False, Date(None, None, 1)), (False, None), ]) def test_eq(self, expected, other): self.assertEquals(expected, Date(1970, 1, 1) == other) self.assertEquals(expected, other == Date(1970, 1, 1)) @parameterized.expand([ (True, Date(1970, 2, 1)), (False, Date(1970, 2, 2)), (False, Date(1970, 2, 3)), ]) def test_gt(self, expected, other): self.assertEquals(expected, Date(1970, 2, 2) > other)
class DateRangeTest(TestCase): _TEST_IN_PARAMETERS = [ (False, Date(1970, 2, 2), DateRange()), (False, Date(1970, 2), DateRange()), (False, Date(1970), DateRange()), (False, Date(1970, 2, 1), DateRange(Date(1970, 2, 2))), (True, Date(1970, 2, 2), DateRange(Date(1970, 2, 2))), (True, Date(1970, 2, 3), DateRange(Date(1970, 2, 2))), (True, Date(1970, 2, 1), DateRange(None, Date(1970, 2, 2))), (True, Date(1970, 2, 2), DateRange(None, Date(1970, 2, 2))), (False, Date(1970, 2, 3), DateRange(None, Date(1970, 2, 2))), (False, Date(1969, 2, 1), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (True, Date(1970, 2, 1), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (False, Date(1971, 2, 1), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 1)), DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2)), DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3)), DateRange(Date(1970, 2, 2))), (False, DateRange(None, Date(1970, 2, 1)), DateRange(Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 2)), DateRange(Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3)), DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 1)), DateRange(None, Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2)), DateRange(None, Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, 3)), DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 1)), DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 2)), DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3)), DateRange(None, Date(1970, 2, 2))), (True, DateRange(Date(1969, 2, 1)), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 1)), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (False, DateRange(Date(1971, 2, 1)), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (False, DateRange(None, Date(1969, 2, 1)), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 1)), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (True, DateRange(None, Date(1971, 2, 1)), DateRange(Date(1969, 2, 2), Date(1970, 2, 2))), (False, DateRange(Date(1969, 2, 2), Date(1970, 2, 2)), DateRange(Date(1971, 2, 2), Date(1972, 2, 2))), (True, DateRange(Date(1969, 2, 2), Date(1971, 2, 2)), DateRange(Date(1970, 2, 2), Date(1972, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1971, 2, 2)), DateRange(Date(1969, 2, 2), Date(1972, 2, 2))), ] # Mirror the arguments because we want the containment check to work in either direction. @parameterized.expand( _TEST_IN_PARAMETERS + list(map(lambda x: (x[0], x[2], x[1]), _TEST_IN_PARAMETERS))) def test_in(self, expected: bool, other: Datey, sut: DateRange): self.assertEquals(expected, other in sut) @parameterized.expand([ (False, Date(1970, 2, 1)), (False, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (False, DateRange(Date(1970, 2, 1))), (False, DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3))), (False, DateRange(None, Date(1970, 2, 1))), (False, DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_lt_with_start_date(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) < other) @parameterized.expand([ (False, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (False, DateRange(Date(1970, 2, 1))), (True, DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3))), (False, DateRange(None, Date(1970, 2, 1))), (False, DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_lt_with_end_date(self, expected, other): self.assertEquals(expected, DateRange(None, Date(1970, 2, 2)) < other) @parameterized.expand([ (False, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (True, Date(1970, 2, 3)), (True, DateRange(Date(1970, 2, 1))), (True, DateRange(Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 3))), (False, DateRange(None, Date(1970, 2, 1))), (True, DateRange(None, Date(1970, 2, 2))), (True, DateRange(None, Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (False, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_lt_with_both_dates(self, expected, other): self.assertEquals( expected, DateRange(Date(1970, 2, 1), Date(1970, 2, 3)) < other) @parameterized.expand([ (True, DateRange(Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, None))), (False, DateRange(Date(1970, None, 2))), (False, DateRange(Date(None, 2, 2))), (False, DateRange(Date(1970, None, None))), (False, DateRange(Date(None, 2, None))), (False, DateRange(Date(None, None, 2))), (False, None), ]) def test_eq(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) == other) @parameterized.expand([ (True, Date(1970, 2, 1)), (True, Date(1970, 2, 2)), (False, Date(1970, 2, 3)), (True, DateRange(Date(1970, 2, 1))), (False, DateRange(Date(1970, 2, 2))), (False, DateRange(Date(1970, 2, 3))), (True, DateRange(None, Date(1970, 2, 1))), (True, DateRange(None, Date(1970, 2, 2))), (False, DateRange(None, Date(1970, 2, 3))), (True, DateRange(Date(1970, 2, 1), Date(1970, 2, 2))), (True, DateRange(Date(1970, 2, 2), Date(1970, 2, 3))), (True, DateRange(Date(1970, 2, 1), Date(1970, 2, 3))), ]) def test_gt(self, expected, other): self.assertEquals(expected, DateRange(Date(1970, 2, 2)) > other)
('January 1', Date(None, 1, 1)), ('around January 1', Date(None, 1, 1, fuzzy=True)), ] class FormatDateTest(TestCase): @parameterized.expand(_FORMAT_DATE_TEST_PARAMETERS) def test(self, expected: str, datey: Datey): locale = 'en' with Translations(gettext.NullTranslations()): self.assertEquals(expected, format_datey(datey, locale)) _FORMAT_DATE_RANGE_TEST_PARAMETERS = [ ('from January 1, 1970 until December 31, 1999', DateRange(Date(1970, 1, 1), Date(1999, 12, 31))), ('from January 1, 1970 until sometime before December 31, 1999', DateRange(Date(1970, 1, 1), Date(1999, 12, 31), end_is_boundary=True)), ('from January 1, 1970 until around December 31, 1999', DateRange(Date(1970, 1, 1), Date(1999, 12, 31, fuzzy=True))), ('from January 1, 1970 until sometime before around December 31, 1999', DateRange(Date(1970, 1, 1), Date(1999, 12, 31, fuzzy=True), end_is_boundary=True)), ('from sometime after January 1, 1970 until December 31, 1999', DateRange(Date(1970, 1, 1), Date(1999, 12, 31), start_is_boundary=True)), ('sometime between January 1, 1970 and December 31, 1999', DateRange(Date(1970, 1, 1), Date(1999, 12, 31), start_is_boundary=True, end_is_boundary=True)),
class DeriveTest(TestCase): @parameterized.expand([ (ComesBeforeDerivable, ), (ComesBeforeCreatableDerivable, ), (ComesAfterDerivable, ), (ComesAfterCreatableDerivable, ), (ComesBeforeAndAfterDerivable, ), (ComesBeforeAndAfterCreatableDerivable, ), ]) @sync async def test_derive_without_events( self, event_type_type: Type[DerivableEventType]): person = Person('P0') created, updated = derive(person, event_type_type) self.assertEquals(0, created) self.assertEquals(0, updated) self.assertEquals(0, len(person.presences)) @parameterized.expand([ (ComesBeforeDerivable, ), (ComesBeforeCreatableDerivable, ), (ComesAfterDerivable, ), (ComesAfterCreatableDerivable, ), (ComesBeforeAndAfterDerivable, ), (ComesBeforeAndAfterCreatableDerivable, ), ]) @sync async def test_derive_create_derivable_events_without_reference_events( self, event_type_type: Type[DerivableEventType]): person = Person('P0') derivable_event = Event(None, Ignored()) Presence(person, Subject(), derivable_event) created, updated = derive(person, event_type_type) self.assertEquals(0, created) self.assertEquals(0, updated) self.assertEquals(1, len(person.presences)) self.assertIsNone(derivable_event.date) @parameterized.expand([ (ComesBeforeDerivable, ), (ComesBeforeCreatableDerivable, ), (ComesAfterDerivable, ), (ComesAfterCreatableDerivable, ), (ComesBeforeAndAfterDerivable, ), (ComesBeforeAndAfterCreatableDerivable, ), ]) @sync async def test_derive_update_derivable_event_without_reference_events( self, event_type_type: Type[DerivableEventType]): person = Person('P0') Presence(person, Subject(), Event(None, Ignored())) derivable_event = Event(None, event_type_type()) Presence(person, Subject(), derivable_event) created, updated = derive(person, event_type_type) self.assertEquals(0, created) self.assertEquals(0, updated) self.assertEquals(2, len(person.presences)) self.assertIsNone(derivable_event.date) @parameterized.expand([ (None, None, None), (Date(2000, 1, 1), Date(1970, 1, 1), Date(2000, 1, 1)), (Date(1969, 1, 1), Date(1970, 1, 1), Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), DateRange(Date(1970, 1, 1)), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1), Date(1970, 1, 1), end_is_boundary=True), DateRange(Date(1970, 1, 1)), DateRange(Date(1969, 1, 1))), (DateRange(None, Date(2000, 1, 1)), DateRange(None, Date(1970, 1, 1)), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), DateRange(None, Date(1970, 1, 1)), DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), None, DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), None, DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), Date(1970, 1, 1), None), (Date(2000, 1, 1), DateRange(Date(1970, 1, 1)), Date(2000, 1, 1)), (Date(1969, 1, 1), DateRange(Date(1970, 1, 1)), Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1), Date(1970, 1, 1), end_is_boundary=True), DateRange(None, Date(1970, 1, 1)), DateRange(Date(1969, 1, 1))), (DateRange(None, Date(2000, 1, 1)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(None, Date(1969, 1, 1))), (DateRange(None, Date(2000, 1, 1)), None, DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), None, DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), Date(1970, 1, 1), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), Date(1970, 1, 1), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), DateRange(Date(1970, 1, 1)), None), (Date(2000, 1, 1), DateRange(None, Date(1970, 1, 1)), Date(2000, 1, 1)), (Date(1969, 1, 1), DateRange(None, Date(1970, 1, 1)), Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1), Date(1970, 1, 1), end_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1)), None, DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1)), None, DateRange(Date(1969, 1, 1))), (DateRange(None, Date(2000, 1, 1)), Date(1970, 1, 1), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), Date(1970, 1, 1), DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), DateRange(Date(1970, 1, 1)), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), DateRange(Date(1970, 1, 1)), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), DateRange(None, Date(1970, 1, 1)), None), (Date(2000, 1, 1), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), Date(2000, 1, 1)), (Date(1969, 1, 1), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), Date(1969, 1, 1)), (Date(2000, 1, 1), None, Date(2000, 1, 1)), (Date(1969, 1, 1), None, Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), Date(1970, 1, 1), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1), Date(1970, 1, 1), end_is_boundary=True), Date(1970, 1, 1), DateRange(Date(1969, 1, 1))), (DateRange(None, Date(2000, 1, 1)), DateRange(Date(1970, 1, 1)), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), DateRange(Date(1970, 1, 1)), DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), None), ]) @sync async def test_derive_update_comes_before_derivable_event( self, expected_datey: Optional[Datey], before_datey: Optional[Datey], derivable_datey: Optional[Datey]): expected_updates = 0 if expected_datey == derivable_datey else 1 person = Person('P0') Presence(person, Subject(), Event(None, Ignored(), Date(0, 0, 0))) Presence(person, Subject(), Event(None, ComesBeforeReference(), before_datey)) derivable_event = Event(None, ComesBeforeDerivable(), derivable_datey) Presence(person, Subject(), derivable_event) created, updated = derive(person, ComesBeforeDerivable) self.assertEquals(0, created) self.assertEquals(expected_updates, updated) self.assertEquals(3, len(person.presences)) self.assertEquals(expected_datey, derivable_event.date) @parameterized.expand([ ( None, None, ), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), Date(1970, 1, 1)), (None, DateRange(None, None)), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), DateRange(Date(1970, 1, 1))), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), DateRange(None, Date(1970, 1, 1))), (DateRange(None, Date(1970, 1, 1), end_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1971, 1, 1))), ]) @sync async def test_derive_create_comes_before_derivable_event( self, expected_datey: Optional[Datey], before_datey: Optional[Datey]): expected_creations = 0 if expected_datey is None else 1 person = Person('P0') Presence(person, Subject(), Event(None, Ignored(), Date(0, 0, 0))) Presence(person, Subject(), Event(None, ComesBeforeReference(), before_datey)) created, updated = derive(person, ComesBeforeCreatableDerivable) derived_presences = [ presence for presence in person.presences if isinstance(presence.event.type, ComesBeforeCreatableDerivable) ] self.assertEquals(expected_creations, len(derived_presences)) if expected_creations: derived_presence = derived_presences[0] self.assertIsInstance(derived_presence.role, Subject) self.assertEquals(expected_datey, derived_presence.event.date) self.assertEquals(expected_creations, created) self.assertEquals(0, updated) self.assertEquals(2 + expected_creations, len(person.presences)) @parameterized.expand([ (None, None, None), (Date(2000, 1, 1), Date(1970, 1, 1), Date(2000, 1, 1)), (Date(1969, 1, 1), Date(1970, 1, 1), Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), DateRange(Date(1970, 1, 1)), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1)), DateRange(Date(1970, 1, 1)), DateRange(Date(1969, 1, 1))), (DateRange(Date(1970, 1, 1), Date(2000, 1, 1), start_is_boundary=True), DateRange(None, Date(1970, 1, 1)), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), DateRange(None, Date(1970, 1, 1)), DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), None, DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), None, DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(Date(1970, 1, 1), start_is_boundary=True), Date(1970, 1, 1), None), (Date(2000, 1, 1), DateRange(Date(1970, 1, 1)), Date(2000, 1, 1)), (Date(1969, 1, 1), DateRange(Date(1970, 1, 1)), Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(1969, 1, 1))), (DateRange(Date(1999, 12, 31), Date(2000, 1, 1), start_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(None, Date(1969, 1, 1))), (DateRange(None, Date(2000, 1, 1)), None, DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), None, DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), Date(1970, 1, 1), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), Date(1970, 1, 1), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(Date(1970, 1, 1), start_is_boundary=True), DateRange(Date(1970, 1, 1)), None), (Date(2000, 1, 1), DateRange(None, Date(1970, 1, 1)), Date(2000, 1, 1)), (Date(1969, 1, 1), DateRange(None, Date(1970, 1, 1)), Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1)), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), DateRange(Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1)), None, DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1)), None, DateRange(Date(1969, 1, 1))), (DateRange(Date(1970, 1, 1), Date(2000, 1, 1), start_is_boundary=True), Date(1970, 1, 1), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), Date(1970, 1, 1), DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), DateRange(Date(1970, 1, 1)), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), DateRange(Date(1970, 1, 1)), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(Date(1970, 1, 1), start_is_boundary=True), DateRange(None, Date(1970, 1, 1)), None), (Date(2000, 1, 1), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), Date(2000, 1, 1)), (Date(1969, 1, 1), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), Date(1969, 1, 1)), (Date(2000, 1, 1), None, Date(2000, 1, 1)), (Date(1969, 1, 1), None, Date(1969, 1, 1)), (DateRange(Date(2000, 1, 1)), Date(1970, 1, 1), DateRange(Date(2000, 1, 1))), (DateRange(Date(1969, 1, 1)), Date(1970, 1, 1), DateRange(Date(1969, 1, 1))), (DateRange(Date(1970, 1, 1), Date(2000, 1, 1), start_is_boundary=True), DateRange(Date(1970, 1, 1)), DateRange(None, Date(2000, 1, 1))), (DateRange(None, Date(1969, 1, 1)), DateRange(Date(1970, 1, 1)), DateRange(None, Date(1969, 1, 1))), (DateRange(Date(2000, 1, 1), Date(2000, 12, 31)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(2000, 1, 1), Date(2000, 12, 31))), (DateRange(Date(1969, 1, 1), Date(1969, 12, 31)), DateRange(None, Date(1970, 1, 1)), DateRange(Date(1969, 1, 1), Date(1969, 12, 31))), (DateRange(Date(1999, 12, 31), start_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1999, 12, 31)), None), ]) @sync async def test_derive_update_comes_after_derivable_event( self, expected_datey: Optional[Datey], after_datey: Optional[Datey], derivable_datey: Optional[Datey]): expected_updates = 0 if expected_datey == derivable_datey else 1 person = Person('P0') Presence(person, Subject(), Event(None, Ignored(), Date(0, 0, 0))) Presence(person, Subject(), Event(None, ComesAfterReference(), after_datey)) derivable_event = Event(None, ComesAfterDerivable(), derivable_datey) Presence(person, Subject(), derivable_event) created, updated = derive(person, ComesAfterDerivable) self.assertEquals(expected_datey, derivable_event.date) self.assertEquals(0, created) self.assertEquals(expected_updates, updated) self.assertEquals(3, len(person.presences)) @parameterized.expand([ (None, None), (None, Date()), (DateRange(Date(1970, 1, 1), start_is_boundary=True), Date(1970, 1, 1)), (DateRange(Date(1970, 1, 1), start_is_boundary=True), DateRange(Date(1970, 1, 1))), (DateRange(Date(1999, 12, 31), start_is_boundary=True), DateRange(None, Date(1999, 12, 31))), (DateRange(Date(1999, 12, 31), start_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1999, 12, 31))), (DateRange(Date(1970, 1, 1), start_is_boundary=True), DateRange(Date(1970, 1, 1), Date(1999, 12, 31), end_is_boundary=True)), ]) @sync async def test_derive_create_comes_after_derivable_event( self, expected_datey: Optional[Datey], after_datey: Optional[Datey]): expected_creations = 0 if expected_datey is None else 1 person = Person('P0') Presence(person, Subject(), Event(None, Ignored(), Date(0, 0, 0))) Presence(person, Subject(), Event(None, ComesAfterReference(), after_datey)) created, updated = derive(person, ComesAfterCreatableDerivable) derived_presences = [ presence for presence in person.presences if isinstance(presence.event.type, ComesAfterCreatableDerivable) ] self.assertEquals(expected_creations, len(derived_presences)) if expected_creations: derived_presence = derived_presences[0] self.assertIsInstance(derived_presence.role, Subject) self.assertEquals(expected_datey, derived_presence.event.date) self.assertEquals(expected_creations, created) self.assertEquals(0, updated) self.assertEquals(2 + expected_creations, len(person.presences))
class DeriverTest(TestCase): def test_post_parse(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = Date(1970, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(3, len(person.presences)) self.assertEquals(DateRange(None, Date(1970, 1, 1)), person.start.date) self.assertEquals(DateRange(Date(1970, 1, 1)), person.end.date) def test_derive_without_events(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') site.ancestry.people[person.id] = person parse(site) self.assertEquals(0, len(person.presences)) def test_derive_with_events_without_dates(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) site.ancestry.people[person.id] = person parse(site) self.assertEquals(1, len(person.presences)) def test_derive_birth_with_existing_birth_with_date(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') birth_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.BIRTH)) birth_presence.event.date = Date(1970, 2, 1) other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = Date(1970, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(3, len(person.presences)) self.assertIsNotNone(birth_presence.event.date) self.assertEquals(Date(1970, 2, 1), birth_presence.event.date) def test_derive_birth_with_existing_birth_without_date(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') birth_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.BIRTH)) other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = Date(1970, 1, 1) irrelevant_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E1', Event.Type.DIVORCE)) irrelevant_presence.event.date = Date(1971, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(4, len(person.presences)) self.assertIsNotNone(birth_presence.event.date) self.assertEquals(DateRange(None, Date(1970, 1, 1)), birth_presence.event.date) @parameterized.expand([ (Date(1971, 1, 1),), (DateRange(Date(1971, 1, 1)),), (DateRange(None, Date(1971, 1, 1)),), ]) def test_derive_birth_with_existing_event(self, other_date: Datey): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = other_date irrelevant_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E1', Event.Type.DIVORCE)) irrelevant_presence.event.date = Date(1972, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(4, len(person.presences)) self.assertEquals(DateRange(None, Date(1971, 1, 1)), person.start.date) def test_derive_death_with_existing_death_with_date(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') death_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.DEATH)) death_presence.event.date = Date(1971, 2, 1) other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) person.presences.append(other_presence) site.ancestry.people[person.id] = person parse(site) self.assertEquals(3, len(person.presences)) self.assertIsNotNone(death_presence.event.date) self.assertEquals(Date(1971, 2, 1), death_presence.event.date) def test_derive_death_with_existing_death_without_date(self): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') death_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.DEATH)) other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = Date(1971, 1, 1) irrelevant_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E1', Event.Type.DIVORCE)) irrelevant_presence.event.date = Date(1970, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(4, len(person.presences)) self.assertIsNotNone(death_presence.event.date) self.assertEquals(DateRange(Date(1971, 1, 1)), death_presence.event.date) @parameterized.expand([ (Date(1971, 1, 1),), (DateRange(Date(1971, 1, 1)),), (DateRange(None, Date(1971, 1, 1)),), ]) def test_derive_death_with_existing_event(self, other_date: Datey): with TemporaryDirectory() as output_directory_path: configuration = Configuration( output_directory_path, 'https://example.com') configuration.plugins[Deriver] = {} site = Site(configuration) person = Person('P0') other_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E0', Event.Type.MARRIAGE)) other_presence.event.date = other_date irrelevant_presence = Presence(person, Presence.Role.SUBJECT, IdentifiableEvent('E1', Event.Type.DIVORCE)) irrelevant_presence.event.date = Date(1970, 1, 1) site.ancestry.people[person.id] = person parse(site) self.assertEquals(4, len(person.presences)) self.assertEquals(DateRange(Date(1971, 1, 1)), person.end.date)
class SelectDatedsTest(TemplateTestCase): class DatedDummy(Dated): def __init__(self, value: str, date: Optional[Datey] = None): Dated.__init__(self) self._value = value self.date = date def __str__(self): return self._value @parameterized.expand([ ('Apple', { 'dateds': [ DatedDummy('Apple'), ], 'date': None, }), ('Apple', { 'dateds': [ DatedDummy('Apple'), ], 'date': Date(), }), ('Apple', { 'dateds': [ DatedDummy('Apple'), ], 'date': Date(1970, 1, 1), }), ('', { 'dateds': [ DatedDummy('Apple', Date(1970, 1, 1)), ], 'date': None, }), ('', { 'dateds': [ DatedDummy('Apple', Date(1970, 1, 1)), ], 'date': Date(), }), ('Apple', { 'dateds': [ DatedDummy('Apple', Date(1970, 1, 1)), ], 'date': Date(1970, 1, 1), }), ('Apple, Strawberry', { 'dateds': [ DatedDummy('Apple', Date(1971, 1, 1)), DatedDummy('Strawberry', Date(1970, 1, 1)), DatedDummy('Banana', Date(1969, 1, 1)), DatedDummy('Orange', Date(1972, 12, 31)), ], 'date': DateRange(Date(1970, 1, 1), Date(1971, 1, 1)), }), ]) @sync async def test(self, expected: str, data: Dict): template = '{{ dateds | select_dateds(date=date) | join(", ") }}' async with self._render(template_string=template, data=data) as (actual, _): self.assertEquals(expected, actual)
async def load(self) -> None: amsterdam = Place('betty-demo-amsterdam', [PlaceName('Amsterdam')]) amsterdam.coordinates = Point(52.366667, 4.9) amsterdam.links.add(Link('https://nl.wikipedia.org/wiki/Amsterdam')) self._app.ancestry.entities.append(amsterdam) ilpendam = Place('betty-demo-ilpendam', [PlaceName('Ilpendam')]) ilpendam.coordinates = Point(52.465556, 4.951111) ilpendam.links.add(Link('https://nl.wikipedia.org/wiki/Ilpendam')) self._app.ancestry.entities.append(ilpendam) personal_accounts = Source('betty-demo-personal-accounts', 'Personal accounts') self._app.ancestry.entities.append(personal_accounts) cite_first_person_account = Citation('betty-demo-first-person-account', personal_accounts) self._app.ancestry.entities.append(cite_first_person_account) bevolkingsregister_amsterdam = Source( 'betty-demo-bevolkingsregister-amsterdam', 'Bevolkingsregister Amsterdam') bevolkingsregister_amsterdam.author = 'Gemeente Amsterdam' bevolkingsregister_amsterdam.publisher = 'Gemeente Amsterdam' self._app.ancestry.entities.append(bevolkingsregister_amsterdam) david_marinus_lankester = Person('betty-demo-david-marinus-lankester') PersonName(david_marinus_lankester, 'David Marinus', 'Lankester') self._app.ancestry.entities.append(david_marinus_lankester) geertruida_van_ling = Person('betty-demo-geertruida-van-ling') PersonName(geertruida_van_ling, 'Geertruida', 'Van Ling') self._app.ancestry.entities.append(geertruida_van_ling) marriage_of_dirk_jacobus_lankester_and_jannigje_palsen = Event( 'betty-demo-marriage-of-dirk-jacobus-lankester-and-jannigje-palsen', Marriage(), Date(1922, 7, 4)) marriage_of_dirk_jacobus_lankester_and_jannigje_palsen.place = ilpendam self._app.ancestry.entities.append( marriage_of_dirk_jacobus_lankester_and_jannigje_palsen) birth_of_dirk_jacobus_lankester = Event( 'betty-demo-birth-of-dirk-jacobus-lankester', Birth(), Date(1897, 8, 25)) birth_of_dirk_jacobus_lankester.place = amsterdam self._app.ancestry.entities.append(birth_of_dirk_jacobus_lankester) death_of_dirk_jacobus_lankester = Event( 'betty-demo-death-of-dirk-jacobus-lankester', Death(), Date(1986, 8, 18)) death_of_dirk_jacobus_lankester.place = amsterdam self._app.ancestry.entities.append(death_of_dirk_jacobus_lankester) dirk_jacobus_lankester = Person('betty-demo-dirk-jacobus-lankester') PersonName(dirk_jacobus_lankester, 'Dirk Jacobus', 'Lankester') Presence(dirk_jacobus_lankester, Subject(), birth_of_dirk_jacobus_lankester) Presence(dirk_jacobus_lankester, Subject(), death_of_dirk_jacobus_lankester) Presence(dirk_jacobus_lankester, Subject(), marriage_of_dirk_jacobus_lankester_and_jannigje_palsen) dirk_jacobus_lankester.parents.append(david_marinus_lankester, geertruida_van_ling) self._app.ancestry.entities.append(dirk_jacobus_lankester) birth_of_marinus_david_lankester = Event( 'betty-demo-birth-of-marinus-david', Birth(), DateRange(Date(1874, 1, 15), Date(1874, 3, 21), start_is_boundary=True, end_is_boundary=True)) birth_of_marinus_david_lankester.place = amsterdam self._app.ancestry.entities.append(birth_of_marinus_david_lankester) death_of_marinus_david_lankester = Event( 'betty-demo-death-of-marinus-david', Death(), Date(1971)) death_of_marinus_david_lankester.place = amsterdam self._app.ancestry.entities.append(death_of_marinus_david_lankester) marinus_david_lankester = Person('betty-demo-marinus-david-lankester') PersonName(marinus_david_lankester, 'Marinus David', 'Lankester') Presence(marinus_david_lankester, Subject(), birth_of_marinus_david_lankester) Presence(marinus_david_lankester, Subject(), death_of_marinus_david_lankester) marinus_david_lankester.parents.append(david_marinus_lankester, geertruida_van_ling) self._app.ancestry.entities.append(marinus_david_lankester) birth_of_jacoba_gesina_lankester = Event( 'betty-demo-birth-of-jacoba-gesina', Birth(), Date(1900, 3, 14)) birth_of_jacoba_gesina_lankester.place = amsterdam self._app.ancestry.entities.append(birth_of_jacoba_gesina_lankester) jacoba_gesina_lankester = Person('betty-demo-jacoba-gesina-lankester') PersonName(jacoba_gesina_lankester, 'Jacoba Gesina', 'Lankester') Presence(jacoba_gesina_lankester, Subject(), birth_of_jacoba_gesina_lankester) jacoba_gesina_lankester.parents.append(david_marinus_lankester, geertruida_van_ling) self._app.ancestry.entities.append(jacoba_gesina_lankester) jannigje_palsen = Person('betty-demo-jannigje-palsen') PersonName(jannigje_palsen, 'Jannigje', 'Palsen') Presence(jannigje_palsen, Subject(), marriage_of_dirk_jacobus_lankester_and_jannigje_palsen) self._app.ancestry.entities.append(jannigje_palsen) marriage_of_johan_de_boer_and_liberta_lankester = Event( 'betty-demo-marriage-of-johan-de-boer-and-liberta-lankester', Marriage(), Date(1953, 6, 19)) marriage_of_johan_de_boer_and_liberta_lankester.place = amsterdam self._app.ancestry.entities.append( marriage_of_johan_de_boer_and_liberta_lankester) cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam = Citation( 'betty-demo-birth-of-liberta-lankester-from-bevolkingsregister-amsterdam', bevolkingsregister_amsterdam) cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam.location = 'Amsterdam' self._app.ancestry.entities.append( cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam) birth_of_liberta_lankester = Event( 'betty-demo-birth-of-liberta-lankester', Birth(), Date(1929, 12, 22)) birth_of_liberta_lankester.place = amsterdam birth_of_liberta_lankester.citations.append( cite_birth_of_liberta_lankester_from_bevolkingsregister_amsterdam) self._app.ancestry.entities.append(birth_of_liberta_lankester) death_of_liberta_lankester = Event( 'betty-demo-death-of-liberta-lankester', Death(), Date(2015, 1, 17)) death_of_liberta_lankester.place = amsterdam death_of_liberta_lankester.citations.append(cite_first_person_account) self._app.ancestry.entities.append(death_of_liberta_lankester) liberta_lankester = Person('betty-demo-liberta-lankester') PersonName(liberta_lankester, 'Liberta', 'Lankester') PersonName(liberta_lankester, 'Betty') Presence(liberta_lankester, Subject(), birth_of_liberta_lankester) Presence(liberta_lankester, Subject(), death_of_liberta_lankester) Presence(liberta_lankester, Subject(), marriage_of_johan_de_boer_and_liberta_lankester) liberta_lankester.parents.append(dirk_jacobus_lankester, jannigje_palsen) self._app.ancestry.entities.append(liberta_lankester) birth_of_johan_de_boer = Event('betty-demo-birth-of-johan-de-boer', Birth(), Date(1930, 6, 20)) birth_of_johan_de_boer.place = amsterdam self._app.ancestry.entities.append(birth_of_johan_de_boer) death_of_johan_de_boer = Event('betty-demo-death-of-johan-de-boer', Death(), Date(1999, 3, 10)) death_of_johan_de_boer.place = amsterdam death_of_johan_de_boer.citations.append(cite_first_person_account) self._app.ancestry.entities.append(death_of_johan_de_boer) johan_de_boer = Person('betty-demo-johan-de-boer') PersonName(johan_de_boer, 'Johan', 'De Boer') PersonName(johan_de_boer, 'Hans') Presence(johan_de_boer, Subject(), birth_of_johan_de_boer) Presence(johan_de_boer, Subject(), death_of_johan_de_boer) Presence(johan_de_boer, Subject(), marriage_of_johan_de_boer_and_liberta_lankester) self._app.ancestry.entities.append(johan_de_boer) parent_of_bart_feenstra_child_of_liberta_lankester = Person( 'betty-demo-parent-of-bart-feenstra-child-of-liberta-lankester') PersonName(parent_of_bart_feenstra_child_of_liberta_lankester, 'Bart\'s parent') parent_of_bart_feenstra_child_of_liberta_lankester.parents.append( johan_de_boer, liberta_lankester) self._app.ancestry.entities.append( parent_of_bart_feenstra_child_of_liberta_lankester) bart_feenstra = Person('betty-demo-bart-feenstra') PersonName(bart_feenstra, 'Bart', 'Feenstra') bart_feenstra.parents.append( parent_of_bart_feenstra_child_of_liberta_lankester) self._app.ancestry.entities.append(bart_feenstra)