Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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)
Exemple #4
0
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)),
    ])
Exemple #5
0
 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)
Exemple #6
0
    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
Exemple #7
0
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
Exemple #8
0
 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')
Exemple #9
0
    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)
Exemple #10
0
    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)
Exemple #11
0
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
Exemple #12
0
 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)
Exemple #13
0
 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')
Exemple #14
0
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)
Exemple #15
0
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)),
    ])
Exemple #16
0
    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
Exemple #17
0
 def test_lt_with_both_dates(self, expected, other):
     self.assertEquals(
         expected,
         DateRange(Date(1970, 2, 1), Date(1970, 2, 3)) < other)
Exemple #18
0
 def test_gt(self, expected, other):
     self.assertEquals(expected, DateRange(Date(1970, 2, 2)) > other)
Exemple #19
0
 def test_lt_with_start_date(self, expected, other):
     self.assertEquals(expected, DateRange(Date(1970, 2, 2)) < other)
Exemple #20
0
 def test_lt_with_end_date(self, expected, other):
     self.assertEquals(expected, DateRange(None, Date(1970, 2, 2)) < other)
Exemple #21
0
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)
Exemple #22
0
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)
Exemple #23
0
    ('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)),
Exemple #24
0
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))
Exemple #25
0
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)
Exemple #26
0
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)
Exemple #27
0
    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)