def test_key_not_in_base_revision(self): r1, r2, r3 = 1, 2, 3 d1 = {"A": {"B": {"C": 1, "D": [2, 3]}}} d2 = {"A": {"B": {"C": 1, "D": [2, 3], "E": 4, "F": 5}}} d3 = {"A": {"B": {"C": 1, "D": [2, 3, 4]}}} td1 = TraceableDict(d1) td1.commit(revision=r1) td1 = td1 | d2 td1.commit(revision=r2) td1 = td1 | d3 td1.commit(revision=r3) log = td1.log(path=("A", "B", "E")) self.assertEquals(log.keys(), [r2, r3]) self.assertEquals(log[r2], {'E': 4}) self.assertEquals(log[r3], {'E': {}}) log = td1.log(path=("A", "B", "F")) self.assertEquals(log.keys(), [r2, r3]) self.assertEquals(log[r2], {'F': 5}) self.assertEquals(log[r3], {'F': {}})
def test_key_not_changing_in_revision(self): r1, r2, r3, r4 = 1, 2, 3, 4 d1 = {"A": {"B": {"C": 1}}} d2 = {"A": {"B": {"C": 2}}} d3 = {"A": {"B": {"C": 2, "D": 1}}} d4 = {"A": {"B": {"C": 3, "D": 1}}} td1 = TraceableDict(d1) td1.commit(revision=r1) td1 = td1 | d2 td1.commit(revision=r2) td1 = td1 | d3 td1.commit(revision=r3) td1 = td1 | d4 td1.commit(revision=r4) log = td1.log(path=("A", "B", "C")) self.assertEquals(log.keys(), [r1, r2, r4]) self.assertEquals(log[r1], {'C': 1}) self.assertEquals(log[r2], {'C': 2}) self.assertEquals(log[r4], {'C': 3}) d1 = {"A": {"B": {"D": 1}}} d2 = {"A": {"B": {"C": 2}}} d3 = {"A": {"B": {"C": 2, "D": 1}}} d4 = {"A": {"B": {"C": 3, "D": 1}}} td1 = TraceableDict(d1) td1.commit(revision=r1) td1 = td1 | d2 td1.commit(revision=r2) td1 = td1 | d3 td1.commit(revision=r3) td1 = td1 | d4 td1.commit(revision=r4) log = td1.log(path=("A", "B", "C")) self.assertEquals(log.keys(), [r2, r4]) self.assertEquals(log[r2], {'C': 2}) self.assertEquals(log[r4], {'C': 3})
def test_log_invalid_path(self): r1 = 1 d1 = {"A": 1, "B": 2} d2 = {"B": 1} td1 = TraceableDict(d1) td2 = TraceableDict(d2) td1 = td1 | td2 td1.commit(revision=r1) invalid_path = None with self.assertRaises(TypeError) as err: td1.log(path=invalid_path) self.assertTrue('path must be tuple' in err.exception) invalid_path = 'A' with self.assertRaises(TypeError) as err: td1.log(path=invalid_path) self.assertTrue('path must be tuple' in err.exception) invalid_path = () with self.assertRaises(ValueError) as err: td1.log(path=invalid_path) self.assertTrue('path cannot be empty' in err.exception) unknown_path = ('A', 'B') log = td1.log(path=unknown_path) self.assertEquals(log.keys(), []) self.assertEquals(log, {})
def test_log_uncommitted_changes(self): r1, r2 = 1, 2 d1 = {"A": {"B": {"C": 1, "D": [2, 3], "E": 4}}} d2 = {"A": {"B": {"C": 1, "D": [2], "F": 5}}} td1 = TraceableDict(d1) td1.commit(revision=r1) td1 = td1 | d2 self.assertTrue(td1.has_uncommitted_changes) log = td1.log(path=('A', )) self.assertEquals(log.keys(), [r1]) self.assertEquals(log[r1], d1) td1.commit(revision=r2) self.assertFalse(td1.has_uncommitted_changes) log = td1.log(path=('A', )) self.assertEquals(log.keys(), [r1, r2]) self.assertEquals(log[r1], d1) self.assertEquals(log[r2], d2)
def test_basic(self): r1, r2, r3 = 1, 2, 3 d1 = {"A": {"B": {"C": 1, "D": [2, 3]}}} d2 = {"A": {"B": {"C": 1, "D": [2, 3], "E": 4, "F": 5}}} d3 = {"A": {"B": {"C": 1, "D": [2, 3, 4]}}} td1 = TraceableDict(d1) td1.commit(revision=r1) td1 = td1 | d2 td1.commit(revision=r2) td1 = td1 | d3 td1["a"] = 1 td1.commit(revision=r3) log = td1.log(path=("A", )) self.assertEquals(log.keys(), [r1, r2, r3]) self.assertEquals(log[r1], d1) self.assertEquals(log[r2], d2) self.assertEquals(log[r3], d3) log = td1.log(path=("A", "B")) self.assertEquals(log.keys(), [r1, r2, r3]) self.assertEquals(log[r1], d1["A"]) self.assertEquals(log[r2], d2["A"]) self.assertEquals(log[r3], d3["A"]) log = td1.log(path=("A", "B", "C")) self.assertEquals(log.keys(), [r1]) self.assertEquals(log[r1], {"C": 1}) log = td1.log(path=("A", "B", "D")) self.assertEquals(log.keys(), [r1, r3]) self.assertEquals(log[r1], {"D": [2, 3]}) self.assertEquals(log[r3], {"D": [2, 3, 4]}) log = td1.log(path=("A", "B", "E")) self.assertEquals(log.keys(), [r2, r3]) self.assertEquals(log[r2], {'E': 4}) self.assertEquals(log[r3], {'E': {}}) log = td1.log(path=("A", "B", "F")) self.assertEquals(log.keys(), [r2, r3]) self.assertEquals(log[r2], {'F': 5}) self.assertEquals(log[r3], {'F': {}}) log = td1.log(path=('a', )) self.assertEquals(log.keys(), [r3]) self.assertEquals(log[r3], {'a': 1})
def test_key_removed_and_returns(self): r1, r2, r3 = 1, 2, 3 d1 = {"A": {"B": {"C": 1, "D": [2, 3]}}} d2 = {"A": {"B": {"D": [2, 3], "E": 4, "F": 5}}} d3 = {"A": {"B": {"C": 1, "D": [2, 3, 4]}}} td1 = TraceableDict(d1) td1.commit(revision=r1) td1 = td1 | d2 td1.commit(revision=r2) td1 = td1 | d3 td1.commit(revision=r3) log = td1.log(path=("A", "B", "C")) self.assertEquals(log.keys(), [r1, r2, r3]) self.assertEquals(log[r1], {'C': 1}) self.assertEquals(log[r2], {'C': {}}) self.assertEquals(log[r3], {'C': 1})
def test_log_no_revisions(self): d1 = {"A": {"B": {"C": 1, "D": [2, 3]}}} td1 = TraceableDict(d1) log = td1.log(path=("A", )) self.assertEquals(log, {})