async def test_with_subjects(self):
     event = Event(Birth())
     Presence(Person('P0'), Subject(), event)
     Presence(Person('P1'), Subject(), event)
     expected = 'Birth of <a href="/person/P0/index.html"><span class="nn" title="This person\'s name is unknown.">n.n.</span></a>, <a href="/person/P1/index.html"><span class="nn" title="This person\'s name is unknown.">n.n.</span></a>'
     async with self._render(data={
             'event': event,
     }) as (actual, _):
         self.assertEqual(expected, actual)
 async def test_with_person_context_and_other_as_subject(self):
     event = Event(Marriage())
     person = Person('P0')
     other_person = Person('P1')
     Presence(person, Subject(), event)
     Presence(other_person, Subject(), event)
     expected = 'Marriage with <a href="/person/P1/index.html"><span class="nn" title="This person\'s name is unknown.">n.n.</span></a>'
     async with self._render(data={
             'event': event,
             'person_context': person,
     }) as (actual, _):
         self.assertEqual(expected, actual)
Exemple #3
0
    async def test_derive_update_derivable_event_without_reference_events(
            self, event_type_type: Type[DerivableEventType]):
        person = Person('P0')
        Presence(person, Subject(), Event(Ignored()))
        derivable_event = Event(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)
Exemple #4
0
 def test_privatize_person_without_relatives(self, expected, private, event: Optional[Event]):
     person = Person('P0')
     person.private = private
     if event is not None:
         Presence(person, Subject(), event)
     privatize_person(person, 125)
     self.assertEquals(expected, person.private)
Exemple #5
0
 def test_privatize_person_should_not_privatize_if_public(self):
     source_file = File('F0', __file__)
     source = Source('The Source')
     source.files.append(source_file)
     citation_file = File('F1', __file__)
     citation = IdentifiableCitation('C0', source)
     citation.files.append(citation_file)
     event_as_subject = Event(Birth())
     event_as_attendee = Event(Marriage())
     person_file = File('F2', __file__)
     person = Person('P0')
     person.private = False
     person.citations.append(citation)
     person.files.append(person_file)
     Presence(person, Subject(), event_as_subject)
     Presence(person, Attendee(), event_as_attendee)
     ancestry = Ancestry()
     ancestry.people[person.id] = person
     privatize(ancestry)
     self.assertEqual(False, person.private)
     self.assertIsNone(citation.private)
     self.assertIsNone(source.private)
     self.assertIsNone(person_file.private)
     self.assertIsNone(citation_file.private)
     self.assertIsNone(source_file.private)
     self.assertIsNone(event_as_subject.private)
     self.assertIsNone(event_as_attendee.private)
Exemple #6
0
    def test_clean_should_not_clean_event_with_presences_with_people(
            self) -> None:
        ancestry = Ancestry()

        source = IdentifiableSource('S1', 'The Source')
        ancestry.sources[source.id] = source

        citation = IdentifiableCitation('C1', source)
        ancestry.citations[citation.id] = citation

        file = File('F1', __file__)
        ancestry.files[file.id] = file

        place = Place('P0', [PlaceName('The Place')])
        ancestry.places[place.id] = place

        person = Person('P0')

        event = IdentifiableEvent('E0', Birth())
        event.citations.append(citation)
        event.files.append(file)
        event.place = place
        ancestry.events[event.id] = event

        Presence(person, Subject(), event)

        clean(ancestry)

        self.assertEqual(event, ancestry.events[event.id])
        self.assertIn(event, place.events)
        self.assertEqual(place, ancestry.places[place.id])
        self.assertIn(event, citation.facts)
        self.assertEqual(citation, ancestry.citations[citation.id])
        self.assertIn(event, file.resources)
        self.assertEqual(file, ancestry.files[file.id])
Exemple #7
0
    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(Ignored(), Date(0, 0, 0)))
        Presence(person, Subject(), Event(ComesAfterReference(), after_datey))
        derivable_event = Event(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))
    async def test_post_parse(self):
        person = Person('P0')
        Presence(person, Subject(), Event(Birth()))

        source_file = File('F0', __file__)
        source = IdentifiableSource('S0', 'The Source')
        source.private = True
        source.files.append(source_file)

        citation_file = File('F0', __file__)
        citation_source = Source('The Source')
        citation = IdentifiableCitation('C0', citation_source)
        citation.private = True
        citation.files.append(citation_file)

        with TemporaryDirectory() as output_directory_path:
            configuration = Configuration(output_directory_path,
                                          'https://example.com')
            configuration.plugins[Privatizer] = None
            async with Site(configuration) as site:
                site.ancestry.people[person.id] = person
                site.ancestry.sources[source.id] = source
                site.ancestry.citations[citation.id] = citation
                await parse(site)

            self.assertTrue(person.private)
            self.assertTrue(source_file.private)
            self.assertTrue(citation_file.private)
Exemple #9
0
 def test_person_deletion_upon_event_set_to_none(self) -> None:
     person = Person('P1')
     event = Event(Birth())
     sut = Presence(person, Subject(), event)
     sut.event = None
     self.assertIsNone(sut.person)
     self.assertNotIn(sut, person.presences)
Exemple #10
0
 def test_should_remove_presences(self) -> None:
     person = Person('P0')
     event = Event(Birth())
     Presence(person, Subject(), event)
     anonymize_person(person)
     self.assertEquals(0, len(person.presences))
     self.assertEquals(0, len(event.presences))
Exemple #11
0
 def test_privatize_person_should_privatize_if_private(self):
     source_file = File('F0', __file__)
     source = Source('The Source')
     source.files.append(source_file)
     citation_file = File('F1', __file__)
     citation = IdentifiableCitation('C0', source)
     citation.files.append(citation_file)
     event_as_subject = Event(Birth())
     event_as_attendee = Event(Marriage())
     person_file = File('F2', __file__)
     person = Person('P0')
     person.private = True
     person.citations.append(citation)
     person.files.append(person_file)
     Presence(person, Subject(), event_as_subject)
     Presence(person, Attendee(), event_as_attendee)
     privatize_person(person, 125)
     self.assertTrue(person.private)
     self.assertTrue(citation.private)
     self.assertTrue(source.private)
     self.assertTrue(person_file.private)
     self.assertTrue(citation_file.private)
     self.assertTrue(source_file.private)
     self.assertTrue(event_as_subject.private)
     self.assertIsNone(event_as_attendee.private)
Exemple #12
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 #13
0
 async def test_with_end(self):
     person = Person('P0')
     Presence(person, Subject(), Event(Death(), Date(1970)))
     expected = '<div class="meta"><dl><dt>Death</dt><dd>1970</dd></dl></div>'
     async with self._render(data={
             'person': person,
     }) as (actual, _):
         self.assertEqual(expected, actual)
Exemple #14
0
 def test_privatize_person_with_child(self, expected, private, event: Optional[Event]):
     person = Person('P0')
     person.private = private
     child = Person('P1')
     if event is not None:
         Presence(child, Subject(), event)
     person.children.append(child)
     privatize_person(person, 125)
     self.assertEquals(expected, person.private)
Exemple #15
0
 def test_privatize_person_with_parent(self, expected, private, event: Optional[Event]):
     person = Person('P0')
     person.private = private
     parent = Person('P1')
     if event is not None:
         Presence(parent, Subject(), event)
     person.parents.append(parent)
     privatize_person(person, 125)
     self.assertEquals(expected, person.private)
 async def test_embedded_with_identifiable(self):
     event = IdentifiableEvent('E0', Birth())
     Presence(Person('P0'), Subject(), event)
     expected = 'Birth of <span class="nn" title="This person\'s name is unknown.">n.n.</span>'
     async with self._render(data={
             'event': event,
             'embedded': True,
     }) as (actual, _):
         self.assertEqual(expected, actual)
 async def test_with_person_context_as_subject(self):
     event = Event(Birth())
     person = Person('P0')
     Presence(person, Subject(), event)
     expected = 'Birth'
     async with self._render(data={
             'event': event,
             'person_context': person,
     }) as (actual, _):
         self.assertEqual(expected, actual)
Exemple #18
0
 def test_presences(self) -> None:
     person = Person('P1')
     sut = Event(Mock(EventType))
     presence = Presence(person, Subject(), sut)
     sut.presences.append(presence)
     self.assertCountEqual([presence], sut.presences)
     self.assertEquals(sut, presence.event)
     sut.presences.remove(presence)
     self.assertCountEqual([], sut.presences)
     self.assertIsNone(presence.event)
Exemple #19
0
 def test_presences(self) -> None:
     event = Event(Birth())
     sut = Person('1')
     presence = Presence(sut, Subject(), event)
     sut.presences.append(presence)
     self.assertCountEqual([presence], sut.presences)
     self.assertEquals(sut, presence.person)
     sut.presences.remove(presence)
     self.assertCountEqual([], sut.presences)
     self.assertIsNone(presence.person)
Exemple #20
0
 def test_presence_should_sync_references(self):
     person = Person('P1')
     sut = IdentifiableEvent('1', Birth())
     presence = Presence(person, Subject(), sut)
     sut.presences.append(presence)
     self.assertCountEqual([presence], sut.presences)
     self.assertEquals(sut, presence.event)
     sut.presences.remove(presence)
     self.assertCountEqual([], sut.presences)
     self.assertIsNone(presence.event)
Exemple #21
0
 def test_privatize_person_without_relatives(self, expected, private,
                                             event: Optional[Event]):
     person = Person('P0')
     person.private = private
     if event is not None:
         Presence(person, Subject(), event)
     ancestry = Ancestry()
     ancestry.people[person.id] = person
     privatize(ancestry)
     self.assertEquals(expected, person.private)
Exemple #22
0
 def test_privatize_person_with_parent(self, expected, private,
                                       event: Optional[Event]):
     person = Person('P0')
     person.private = private
     parent = Person('P1')
     if event is not None:
         Presence(parent, Subject(), event)
     person.parents.append(parent)
     ancestry = Ancestry()
     ancestry.people[person.id] = person
     privatize(ancestry)
     self.assertEquals(expected, person.private)
Exemple #23
0
 async def test_embedded(self):
     person = Person('P0')
     Presence(person, Subject(), Event(Birth(), Date(1970)))
     person.names.append(PersonName('Jane', 'Dough'))
     name = PersonName('Janet', 'Doughnut')
     name.citations.append(Citation(Source('The Source')))
     person.names.append(name)
     expected = '<div class="meta"><span class="aka">Also known as <span class="person-label" typeof="foaf:Person"><span property="foaf:individualName">Janet</span> <span property="foaf:familyName">Doughnut</span></span></span><dl><dt>Birth</dt><dd>1970</dd></dl></div>'
     async with self._render(data={
             'person': person,
             'embedded': True,
     }) as (actual, _):
         self.assertEqual(expected, actual)
Exemple #24
0
    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(Ignored(), Date(0, 0, 0)))
        Presence(person, Subject(), Event(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
 def test_privatize_person_with_grandchild(self, expected, private,
                                           event: Optional[Event]):
     person = Person('P0')
     person.private = private
     child = Person('P1')
     person.children.append(child)
     grandchild = Person('P2')
     if event is not None:
         Presence(grandchild, Subject(), event)
     child.children.append(grandchild)
     ancestry = Ancestry()
     ancestry.people[person.id] = person
     privatize(ancestry)
     self.assertEquals(expected, person.private)
Exemple #26
0
class TestSubjectRoleTest(TemplateTestCase):
    @parameterized.expand([
        ('true', Subject()),
        ('false', Subject),
        ('false', Attendee()),
        ('false', 9),
    ])
    @sync
    async def test(self, expected, data) -> None:
        template = '{% if data is subject_role %}true{% else %}false{% endif %}'
        async with self._render(template_string=template, data={
            'data': data,
        }) as (actual, _):
            self.assertEquals(expected, actual)
Exemple #27
0
def derive(person: Person,
           event_type_type: Type[DerivableEventType]) -> Tuple[int, int]:
    # Gather any existing events that could be derived, or create a new derived event if needed.
    derivable_events = list(_get_derivable_events(person, event_type_type))
    if not derivable_events:
        if list(
                filter(lambda x: isinstance(x.event.type, event_type_type),
                       person.presences)):
            return 0, 0
        if issubclass(event_type_type, CreatableDerivableEventType):
            derivable_events = [DerivedEvent(event_type_type())]
        else:
            return 0, 0

    # Aggregate event type order from references and backreferences.
    comes_before_event_type_types = event_type_type.comes_before()
    comes_after_event_type_types = event_type_type.comes_after()
    for other_event_type_type in EVENT_TYPE_TYPES:
        if event_type_type in other_event_type_type.comes_before():
            comes_after_event_type_types.add(other_event_type_type)
        if event_type_type in other_event_type_type.comes_after():
            comes_before_event_type_types.add(other_event_type_type)

    created_derivations = 0
    updated_derivations = 0

    for derivable_event in derivable_events:
        dates_derived = False

        if derivable_event.date is None or derivable_event.date.end is None:
            dates_derived = dates_derived or _ComesBeforeDateDeriver.derive(
                person, derivable_event, comes_before_event_type_types)

        if derivable_event.date is None or derivable_event.date.start is None:
            dates_derived = dates_derived or _ComesAfterDateDeriver.derive(
                person, derivable_event, comes_after_event_type_types)

        if dates_derived:
            if isinstance(derivable_event, DerivedEvent):
                created_derivations += 1
                Presence(person, Subject(), derivable_event)
            else:
                updated_derivations += 1

    return created_derivations, updated_derivations
Exemple #28
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 #29
0
 def test_associated_files(self) -> None:
     file1 = Mock(File)
     file2 = Mock(File)
     file3 = Mock(File)
     file4 = Mock(File)
     file5 = Mock(File)
     file6 = Mock(File)
     sut = Person('1')
     sut.files = [file1, file2, file1]
     citation = Mock(Citation)
     citation.associated_files = [file3, file4, file2]
     name = PersonName()
     name.citations = [citation]
     sut.names = [name]
     event = Mock(Event)
     event.associated_files = [file5, file6, file4]
     Presence(sut, Subject(), event)
     self.assertEquals([file1, file2, file3, file4, file5, file6],
                       list(sut.associated_files))
Exemple #30
0
    def test_clean(self) -> None:
        ancestry = Ancestry()

        onymous_event = IdentifiableEvent('E0', Birth())
        Presence(Person('P0'), Subject(), onymous_event)
        ancestry.events[onymous_event.id] = onymous_event

        anonymous_event = IdentifiableEvent('E1', Birth())
        ancestry.events[anonymous_event.id] = anonymous_event

        onymous_place = Place('P0', [PlaceName('Amsterdam')])
        onymous_place.events.append(onymous_event)
        ancestry.places[onymous_place.id] = onymous_place

        anonymous_place = Place('P1', [PlaceName('Almelo')])
        ancestry.places[anonymous_place.id] = anonymous_place

        onmyous_place_because_encloses_onmyous_places = Place(
            'P3', [PlaceName('Netherlands')])
        Enclosure(onymous_place, onmyous_place_because_encloses_onmyous_places)
        Enclosure(anonymous_place,
                  onmyous_place_because_encloses_onmyous_places)
        ancestry.places[onmyous_place_because_encloses_onmyous_places.
                        id] = onmyous_place_because_encloses_onmyous_places

        clean(ancestry)

        self.assertDictEqual({
            onymous_event.id: onymous_event,
        }, ancestry.events)
        self.assertDictEqual(
            {
                onymous_place.id:
                onymous_place,
                onmyous_place_because_encloses_onmyous_places.id:
                onmyous_place_because_encloses_onmyous_places,
            }, ancestry.places)

        self.assertNotIn(
            anonymous_place,
            onmyous_place_because_encloses_onmyous_places.encloses)