def test_session_revise(): doc = TestMergeableDoc() min_updated_at = now() session = Session() session.revise(doc) assert isinstance(doc.__revision__, Revision) assert doc.__revision__.session is session assert min_updated_at <= doc.__revision__.updated_at <= now() time.sleep(0.1) min_updated_at = now() session.revise(doc) assert min_updated_at <= doc.__revision__.updated_at <= now()
def test_session_pull(revised): s1 = Session('s1') s2 = Session('s2') a = TestMergeableDoc(multi_text=['a', 'b', 'c']) if revised: s1.revise(a) b = s2.pull(a) assert b is not a assert b.__revision__.session is s2 if revised: assert b.__revision__.updated_at == a.__revision__.updated_at assert b.multi_text == ['a', 'b', 'c'] assert a.multi_text is not b.multi_text if revised: assert a.__revision__.session is s1
def test_session_merge(): # s1 s2 # ------ # (1) a b (2) # | / | # (3) c b (4) # | \ | # | d (5) # | / # (5) e s1 = Session('s1') a = TestMergeableDoc( attr='a', text='a', multi_text=['a', 'b', 'c'], unique_entities=[ TestUniqueEntity(ident='a', value='s1-a'), TestUniqueEntity(ident='b', value='s1-b'), TestUniqueEntity(ident='c', value='s1-c') ], rev_entities=[ TestRevisedEntity(ident='a', value='s1-a', rev=2), TestRevisedEntity(ident='b', value='s1-b', rev=2), TestRevisedEntity(ident='c', value='s1-c', rev=2) ], rev_entity=TestRevisedEntity(ident='a', value='s1', rev=1) ) a_c = TestMergeableContentDoc(content='a') s1.revise(a) # (1) s1.revise(a_c) wait() s2 = Session('s2') b = TestMergeableDoc( attr='b', text='b', multi_text=['d', 'e', 'f'], unique_entities=[ TestUniqueEntity(ident='c', value='s2-c'), TestUniqueEntity(ident='d', value='s2-d'), TestUniqueEntity(ident='e', value='s2-e') ], rev_entities=[ TestRevisedEntity(ident='b', value='s2-b', rev=1), TestRevisedEntity(ident='c', value='s2-c', rev=3), TestRevisedEntity(ident='d', value='s2-d', rev=2) ], rev_entity=TestRevisedEntity(ident='a', value='s2', rev=2) ) b_c = TestMergeableContentDoc(content='b') s2.revise(b) # (2) s2.revise(b_c) wait() c = s1.merge(b, a) # (3) c_c = s1.merge(b_c, a_c) wait() assert c.__revision__.session is s1 assert c.__revision__.updated_at > a.__revision__.updated_at assert c.__base_revisions__ == RevisionSet([a.__revision__, b.__revision__]) print((c.attr, c.text, c_c.content)) assert c.attr == c.text == c_c.content == 'b' assert list(c.multi_text) == ['a', 'b', 'c', 'd', 'e', 'f'] assert ([entity.value for entity in c.unique_entities] == ['s1-a', 's1-b', 's2-c', 's2-d', 's2-e']) assert ([(e.value, e.rev) for e in c.rev_entities] == [('s1-a', 2), ('s1-b', 2), ('s2-c', 3), ('s2-d', 2)]) assert c.rev_entity.rev == 2 assert c.rev_entity.value == 's2' assert c.nullable is None c.nullable = TestUniqueEntity(ident='nullable', value='nullable') b.attr = b.text = b_c.content = 'd' b.multi_text.append('blah') b.unique_entities.append(TestUniqueEntity(ident='blah', value='s2-blah')) s2.revise(b) # (4) s2.revise(b_c) wait() assert list(b.multi_text) == ['d', 'e', 'f', 'blah'] assert ([entity.value for entity in b.unique_entities] == ['s2-c', 's2-d', 's2-e', 's2-blah']) d = s2.merge(b, c) # (5) d_c = s2.merge(b_c, c_c) wait() assert d.__revision__.session is s2 assert d.__revision__.updated_at >= c.__revision__.updated_at assert d.__base_revisions__ == RevisionSet([b.__revision__, c.__revision__]) assert d.attr == d.text == d_c.content == 'd' assert list(d.multi_text) == ['a', 'b', 'c', 'd', 'e', 'f', 'blah'] assert ([entity.value for entity in d.unique_entities] == ['s1-a', 's1-b', 's2-c', 's2-d', 's2-e', 's2-blah']) assert d.nullable is not None assert d.nullable.value == 'nullable' e = s1.merge(c, d) # (5) e_c = s1.merge(c_c, d_c) wait() assert e.__revision__.session is s1 assert e.__revision__.updated_at == d.__revision__.updated_at assert e.__base_revisions__ == d.__base_revisions__ assert e.attr == e.text == e_c.content == 'd' assert list(e.multi_text) == ['a', 'b', 'c', 'd', 'e', 'f', 'blah'] assert ([entity.value for entity in d.unique_entities] == ['s1-a', 's1-b', 's2-c', 's2-d', 's2-e', 's2-blah'])
def test_session_pull_same_session(): session = Session('s1') doc = TestMergeableDoc() session.revise(doc) assert session.pull(doc) is doc
def test_session_merge(): # s1 s2 # ------ # (1) a b (2) # | / | # (3) c b (4) # | \ | # | d (5) # | / # (5) e s1 = Session('s1') a = TestMergeableDoc(attr='a', text='a', multi_text=['a', 'b', 'c'], unique_entities=[ TestUniqueEntity(ident='a', value='s1-a'), TestUniqueEntity(ident='b', value='s1-b'), TestUniqueEntity(ident='c', value='s1-c') ], rev_entities=[ TestRevisedEntity(ident='a', value='s1-a', rev=2), TestRevisedEntity(ident='b', value='s1-b', rev=2), TestRevisedEntity(ident='c', value='s1-c', rev=2) ], rev_entity=TestRevisedEntity(ident='a', value='s1', rev=1)) a_c = TestMergeableContentDoc(content='a') s1.revise(a) # (1) s1.revise(a_c) wait() s2 = Session('s2') b = TestMergeableDoc(attr='b', text='b', multi_text=['d', 'e', 'f'], unique_entities=[ TestUniqueEntity(ident='c', value='s2-c'), TestUniqueEntity(ident='d', value='s2-d'), TestUniqueEntity(ident='e', value='s2-e') ], rev_entities=[ TestRevisedEntity(ident='b', value='s2-b', rev=1), TestRevisedEntity(ident='c', value='s2-c', rev=3), TestRevisedEntity(ident='d', value='s2-d', rev=2) ], rev_entity=TestRevisedEntity(ident='a', value='s2', rev=2)) b_c = TestMergeableContentDoc(content='b') s2.revise(b) # (2) s2.revise(b_c) wait() c = s1.merge(b, a) # (3) c_c = s1.merge(b_c, a_c) wait() assert c.__revision__.session is s1 assert c.__revision__.updated_at > a.__revision__.updated_at assert c.__base_revisions__ == RevisionSet( [a.__revision__, b.__revision__]) print((c.attr, c.text, c_c.content)) assert c.attr == c.text == c_c.content == 'b' assert list(c.multi_text) == ['a', 'b', 'c', 'd', 'e', 'f'] assert ([entity.value for entity in c.unique_entities ] == ['s1-a', 's1-b', 's2-c', 's2-d', 's2-e']) assert ([(e.value, e.rev) for e in c.rev_entities] == [('s1-a', 2), ('s1-b', 2), ('s2-c', 3), ('s2-d', 2)]) assert c.rev_entity.rev == 2 assert c.rev_entity.value == 's2' assert c.nullable is None c.nullable = TestUniqueEntity(ident='nullable', value='nullable') b.attr = b.text = b_c.content = 'd' b.multi_text.append('blah') b.unique_entities.append(TestUniqueEntity(ident='blah', value='s2-blah')) s2.revise(b) # (4) s2.revise(b_c) wait() assert list(b.multi_text) == ['d', 'e', 'f', 'blah'] assert ([entity.value for entity in b.unique_entities ] == ['s2-c', 's2-d', 's2-e', 's2-blah']) d = s2.merge(b, c) # (5) d_c = s2.merge(b_c, c_c) wait() assert d.__revision__.session is s2 assert d.__revision__.updated_at >= c.__revision__.updated_at assert d.__base_revisions__ == RevisionSet( [b.__revision__, c.__revision__]) assert d.attr == d.text == d_c.content == 'd' assert list(d.multi_text) == ['a', 'b', 'c', 'd', 'e', 'f', 'blah'] assert ([entity.value for entity in d.unique_entities ] == ['s1-a', 's1-b', 's2-c', 's2-d', 's2-e', 's2-blah']) assert d.nullable is not None assert d.nullable.value == 'nullable' e = s1.merge(c, d) # (5) e_c = s1.merge(c_c, d_c) wait() assert e.__revision__.session is s1 assert e.__revision__.updated_at == d.__revision__.updated_at assert e.__base_revisions__ == d.__base_revisions__ assert e.attr == e.text == e_c.content == 'd' assert list(e.multi_text) == ['a', 'b', 'c', 'd', 'e', 'f', 'blah'] assert ([entity.value for entity in d.unique_entities ] == ['s1-a', 's1-b', 's2-c', 's2-d', 's2-e', 's2-blah'])