def test_init_traceable_dict(self): r1, r2 = 1, 2 td1 = TraceableDict({'a': 1, 'b': 2}) self.assertEquals(td1.trace, {}) self.assertEquals(td1.revisions, []) self.assertTrue(td1.has_uncommitted_changes) td1.commit(revision=r1) self.assertEquals(td1.as_dict(), {'a': 1, 'b': 2}) self.assertFalse(td1.has_uncommitted_changes) self.assertEquals(td1.revisions, [r1]) td2 = TraceableDict(td1) self.assertEquals(td2.as_dict(), td1.as_dict()) self.assertFalse(td2.has_uncommitted_changes) self.assertEquals(td2.revisions, td1.revisions) self.assertEquals(td2.trace, td1.trace) td1['a'] = 8 td2 = TraceableDict(td1) self.assertEquals(td2.as_dict(), td1.as_dict()) self.assertTrue(td2.has_uncommitted_changes) self.assertEquals(td2.revisions, td1.revisions) self.assertEquals(td2.trace, td1.trace) td2.commit(revision=r2) self.assertFalse(td2.has_uncommitted_changes)
def test_basic(self): r1, r2 = 1, 2 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) self.assertEquals([], td1.revisions) self.assertEquals({}, td1.trace) self.assertTrue(td1.has_uncommitted_changes) td1.commit(r1) self.assertEquals([r1], td1.revisions) self.assertEquals({}, td1.trace) self.assertFalse(td1.has_uncommitted_changes) td1["a"] = 1 self.assertEquals([r1], td1.revisions) self.assertTrue(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), {'a': 1, 'b': 'bb'}) self.assertEquals(td1.trace, {uncommitted: [((root, 'a'), 'aa', key_updated)]}) td1.commit(revision=r2) self.assertFalse(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), {'a': 1, 'b': 'bb'}) self.assertEquals(td1.trace, {str(r2): [((root, 'a'), 'aa', key_updated)]}) self.assertEquals([r1, r2], td1.revisions)
def test_pipe_operator(self): r1, r2, r3 = 1, 2, 3 d1 = self._d1.copy() d2 = d1.copy() d2['new_key'] = 'new_val' D1 = TraceableDict(d1) self.assertEquals(d1, D1.as_dict()) D2 = TraceableDict(d2) D2.commit(revision=r2) self.assertEquals(d2, D2.as_dict()) D1 = D1 | D2 D1.commit(revision=r1) self.assertEquals(d2, D1.as_dict()) self.assertEquals(D1.trace, {}) D1['new_key'] = 'updated_value' D1.commit(revision=r2) self.assertEquals( D1.trace, {str(r2): [((root, 'new_key'), 'new_val', key_updated)]}) D3 = TraceableDict(d1) D2 = D2 | D3 D2.commit(revision=r3) self.assertEquals(d1, D2.as_dict()) self.assertEquals( D2.trace, {str(r3): [((root, 'new_key'), 'new_val', key_removed)]})
def test_remove_base_revision(self): r1, r2 = 1, 2 d1 = {"a": "a", "b": "b"} d2 = {"a": "a_updated", "b": "b_updated"} td1 = TraceableDict(d1) td1.commit(revision=r1) self.assertEquals(td1.as_dict(), d1) td1 = td1 | d2 td1.commit(revision=r2) self.assertEquals(td1.as_dict(), d2) self.assertEquals(td1.revisions, [r1, r2]) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d2) self.assertEquals(td1.revisions, [r2]) self.assertEquals(td1.trace, {}) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d2) self.assertEquals(td1.revisions, [r2]) self.assertEquals(td1.trace, {})
def test_first_commit(self): d1 = {"a": "aa", "b": "bb"} d2 = {"a": "aa", "b": "bb", "c": "cc"} td1 = TraceableDict(d1) self.assertEquals(d1, td1.as_dict()) self.assertEquals([], td1.revisions) self.assertEquals({}, td1.trace) self.assertTrue(td1.has_uncommitted_changes) td2 = TraceableDict(d2) td1 = td1 | td2 self.assertEquals(td2.as_dict(), td1.as_dict()) self.assertEquals([], td1.revisions) self.assertEquals({}, td1.trace) self.assertTrue(td1.has_uncommitted_changes) r1 = 1 td1.commit(revision=r1) self.assertEquals(td2.as_dict(), td1.as_dict()) self.assertEquals([r1], td1.revisions) self.assertEquals({}, td1.trace) self.assertFalse(td1.has_uncommitted_changes) td_with_previous_revisions = TraceableDict(td1) self.assertFalse(td_with_previous_revisions.has_uncommitted_changes)
def test_new_value_is_traceable(self): r1, r2 = 1, 2 d1 = self._d1.copy() D1 = TraceableDict(d1) self.assertEquals(d1, D1.as_dict()) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, []) self.assertTrue(D1.has_uncommitted_changes) D1['new_key'] = 'new_val' self.assertEquals(D1.as_dict(), { 1: { 2: 'A', 3: { 4: 'B', 5: [1, 2, 3] } }, 'new_key': 'new_val' }) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, []) self.assertTrue(D1.has_uncommitted_changes) D1['new_key'] = 'updated_val' self.assertEquals(D1.as_dict(), { 1: { 2: 'A', 3: { 4: 'B', 5: [1, 2, 3] } }, 'new_key': 'updated_val' }) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, []) self.assertTrue(D1.has_uncommitted_changes) D1.commit(revision=r1) self.assertFalse(D1.has_uncommitted_changes) self.assertEquals(D1.as_dict(), { 1: { 2: 'A', 3: { 4: 'B', 5: [1, 2, 3] } }, 'new_key': 'updated_val' }) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, [r1])
def test_remove_no_revisions(self): d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertEquals(td1.revisions, []) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertEquals(td1.revisions, [])
def test_revert_no_revisions(self): d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) self.assertTrue(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertEquals(td1.revisions, []) td1.revert() self.assertTrue(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertEquals(td1.revisions, [])
def test_basic(self): base_revision = 0 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) td1.commit(revision=base_revision) self.assertEquals([base_revision], td1.revisions) r1 = 1 td1["a"] = 1 td1.commit(revision=r1) r2 = 2 td1["b"] = 2 td1.commit(revision=r2) self.assertFalse(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), {'a': 1, 'b': 2}) self.assertEquals( td1.trace, { str(r1): [((root, 'a'), 'aa', key_updated)], str(r2): [((root, 'b'), 'bb', key_updated)] }) self.assertEquals([base_revision, r1, r2], td1.revisions) td1["b"] = 3 self.assertTrue(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), {'a': 1, 'b': 3}) self.assertEquals( td1.trace, { str(r1): [((root, 'a'), 'aa', key_updated)], str(r2): [((root, 'b'), 'bb', key_updated)], uncommitted: [((root, 'b'), 2, key_updated)] }) self.assertEquals([base_revision, r1, r2], td1.revisions) td1.revert() self.assertFalse(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), {"a": 1, "b": 2}) self.assertEquals( td1.trace, { str(r1): [((root, 'a'), 'aa', key_updated)], str(r2): [((root, 'b'), 'bb', key_updated)] }) self.assertEquals([base_revision, r1, r2], td1.revisions)
def test_pipe_immutable(self): d1 = self._d1.copy() d2 = d1.copy() d2['new_key'] = 'new_val' D1 = TraceableDict(d1) self.assertEquals(d1, D1.as_dict()) D2 = TraceableDict(d2) D1_before = D1.copy() D1_tag = D1 | D2 D1_tag.commit(revision=1) self.assertEquals(d2, D1_tag.as_dict()) self.assertEquals(d1, D1.as_dict()) self.assertFalse(D1.trace) self.assertEquals(D1, D1_before)
def test_basic(self): r1, r2, r3 = 1, 2, 3 d1 = self._d1.copy() D1 = TraceableDict(d1) self.assertEquals(d1, D1.as_dict()) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, []) self.assertTrue(D1.has_uncommitted_changes) D1.commit(revision=r1) self.assertEquals(d1, D1.as_dict()) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, [r1]) self.assertFalse(D1.has_uncommitted_changes) D1['new_key'] = 'new_val' self.assertTrue(D1.has_uncommitted_changes) D1.commit(revision=r2) d1['new_key'] = 'new_val' self.assertEquals(d1, D1.as_dict()) self.assertEquals([r1, r2], D1.revisions) self.assertFalse(D1.has_uncommitted_changes) self.assertEquals(D1.trace, {str(r2): [((root, 'new_key'), None, key_added)]}) D1.pop('new_key') D1.commit(revision=r3) self.assertNotEquals(d1, D1.as_dict()) d1.pop('new_key') self.assertEquals(d1, D1.as_dict()) self.assertEquals([r1, r2, r3], D1.revisions) self.assertEquals( D1.trace, { '2': [((root, 'new_key'), None, key_added)], '3': [((root, 'new_key'), 'new_val', key_removed)] })
def test_commit_no_diff(self): base_revision = 1 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) td1.commit(revision=base_revision) self.assertEquals({}, td1.trace) self.assertEquals(d1, td1.as_dict()) self.assertFalse(td1.has_uncommitted_changes) self.assertEquals([base_revision], td1.revisions) self.assertWarns(UserWarning, td1.commit, msg='nothing to commit', revision=18) self.assertEquals({}, td1.trace) self.assertEquals(d1, td1.as_dict()) self.assertFalse(td1.has_uncommitted_changes) self.assertEquals([base_revision], td1.revisions)
def test_basic(self): base_revision = 0 d1 = {"a": 1, "b": 2, "c": 3} td1 = TraceableDict(d1) td1.commit(revision=base_revision) self.assertEquals([base_revision], td1.revisions) self.assertEqual(d1, td1.as_dict()) r1 = 1 td1["a"] = "updated" td1.commit(revision=r1) self.assertEqual(td1.as_dict(), {"a": "updated", "b": 2, "c": 3}) td1["b"] = "also_updated" self.assertTrue(td1.has_uncommitted_changes) self.assertEqual(td1.as_dict(), { "a": "updated", "b": "also_updated", "c": 3 })
def test_full(self): r1 = int(time.time() * 1000) d1 = self._d1.copy() d2 = d1.copy() d2['new_key'] = 'new_val' D1 = TraceableDict(d1) D2 = TraceableDict(d2) D3 = TraceableDict(self._d2) D1 = D1 | D2 D1_Base = TraceableDict(D1) D1.commit(revision=r1) self.assertEquals(D1.as_dict(), d2) self.assertEquals(D1.trace, {}) self.assertEquals(D1.revisions, [r1]) D1 = D1 | D3 self.assertTrue(D1.has_uncommitted_changes) self.assertEquals(D1.as_dict(), self._d2) self.assertEquals(D1.revisions, [r1]) r2 = int((time.time() - 5000) * 1000) with self.assertRaises(ValueError) as err: D1.commit(revision=r2) self.assertTrue('cannot commit to earlier revision' in err.exception) r2 = int((time.time() + 5000) * 1000) D1.commit(revision=r2) self.assertFalse(D1.has_uncommitted_changes) self.assertEquals(D1.as_dict(), self._d2) self.assertEquals(D1.revisions, [r1, r2]) result_base = D1.checkout(revision=r1) self.assertEquals(result_base.as_dict(), D1_Base.as_dict()) self.assertEquals(result_base.revisions, [r1])
def test_revert_to_first_revision(self): base_revision = 0 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) td1.commit(revision=base_revision) self.assertFalse(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertEquals([base_revision], td1.revisions) td1["b"] = 1 self.assertTrue(td1.has_uncommitted_changes) self.assertNotEquals(td1.as_dict(), d1) self.assertNotEquals(td1.trace, {}) self.assertEquals([base_revision], td1.revisions) td1.revert() self.assertFalse(td1.has_uncommitted_changes) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertEquals([base_revision], td1.revisions)
def test_basic(self): r1, r2, r3, r4, r5 = 1, 2, 3, 4, 5 d1 = {"a": "aa", "b": "bb"} d2 = {"a": "a", "b": "bb"} d3 = {"a": "a", "b": "b"} d4 = {"a": "a"} d5 = {"aa": "aa", "bb": "bb", "c": "c"} td1 = TraceableDict(d1) td1.commit(revision=r1) self.assertEquals(td1.as_dict(), d1) td1 = td1 | d2 td1.commit(revision=r2) self.assertEquals(td1.as_dict(), d2) td1 = td1 | d3 td1.commit(revision=r3) self.assertEquals(td1.as_dict(), d3) td1 = td1 | d4 td1.commit(revision=r4) self.assertEquals(td1.as_dict(), d4) td1 = td1 | d5 td1.commit(revision=r5) self.assertEquals(td1.as_dict(), d5) self.assertEquals(td1.revisions, [r1, r2, r3, r4, r5]) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d5) self.assertEquals(td1.revisions, [r2, r3, r4, r5]) self.assertEquals(set(td1.trace.keys()), set([str(r3), str(r4), str(r5)])) td_past_revision = td1.checkout(revision=r2) self.assertEquals(td_past_revision.as_dict(), d2) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d5) self.assertEquals(td1.revisions, [r3, r4, r5]) self.assertEquals(set(td1.trace.keys()), set([str(r4), str(r5)])) td_past_revision = td1.checkout(revision=r3) self.assertEquals(td_past_revision.as_dict(), d3)
def test_checkout_current_revision(self): r1, r2 = 1, 2 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) td1["a"] = 1 td1.commit(revision=r1) td1["b"] = 2 td1.commit(revision=r2) result_r2 = td1.checkout(revision=r2) self.assertEquals(result_r2.has_uncommitted_changes, td1.has_uncommitted_changes) self.assertEquals(result_r2.as_dict(), td1.as_dict()) self.assertEquals(result_r2.trace, td1.trace) self.assertEquals(result_r2.revisions, td1.revisions)
def test_basic(self): r1, r2, r3 = 1, 2, 3 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) td1.commit(revision=r1) td1["a"] = 2 td1.commit(revision=r2) td1["b"] = 3 td1.commit(revision=r3) self.assertEquals(td1.as_dict(), {'a': 2, 'b': 3}) self.assertEquals( td1.trace, { str(r2): [((root, 'a'), 'aa', key_updated)], str(r3): [((root, 'b'), 'bb', key_updated)] }) self.assertEquals([r1, r2, r3], td1.revisions) result_r2 = td1.checkout(revision=r2) self.assertFalse(result_r2.has_uncommitted_changes) self.assertEquals(result_r2.as_dict(), {'a': 2, 'b': 'bb'}) self.assertEquals(result_r2.trace, {str(r2): [((root, 'a'), 'aa', key_updated)]}) self.assertEquals([r1, r2], result_r2.revisions) result_r1_1 = td1.checkout(revision=r1) self.assertFalse(result_r1_1.has_uncommitted_changes) self.assertEquals(result_r1_1.as_dict(), {'a': 'aa', 'b': 'bb'}) self.assertEquals(result_r1_1.trace, {}) self.assertEquals([r1], result_r1_1.revisions) result_r1_2 = result_r2.checkout(revision=r1) self.assertEquals(result_r1_1.has_uncommitted_changes, result_r1_2.has_uncommitted_changes) self.assertEquals(result_r1_1.as_dict(), result_r1_2.as_dict()) self.assertEquals(result_r1_1.trace, result_r1_2.trace) self.assertEquals(result_r1_1.revisions, result_r1_2.revisions)
def test_revert_without_uncommitted_changes(self): r1, r2 = 1, 2 d1 = {"a": "aa", "b": "bb"} td1 = TraceableDict(d1) td1.commit(revision=r1) self.assertEquals([r1], td1.revisions) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertFalse(td1.has_uncommitted_changes) td1.revert() self.assertEquals([r1], td1.revisions) self.assertEquals(td1.as_dict(), d1) self.assertEquals(td1.trace, {}) self.assertFalse(td1.has_uncommitted_changes) td1["a"] = 1 self.assertTrue(td1.has_uncommitted_changes) self.assertEquals(td1.trace, {uncommitted: [((root, 'a'), 'aa', key_updated)]}) self.assertEquals(td1.as_dict(), {"a": 1, "b": "bb"}) td1.revert() self.assertEquals(td1.as_dict(), {"a": "aa", "b": "bb"}) self.assertEquals(td1.trace, {}) td1["a"] = 1 td1.commit(revision=r2) _trace = {str(r2): [((root, 'a'), 'aa', key_updated)]} self.assertEquals([r1, r2], td1.revisions) self.assertEquals(td1.as_dict(), {"a": 1, "b": "bb"}) self.assertEquals(td1.trace, _trace) self.assertFalse(td1.has_uncommitted_changes) td1.revert() self.assertEquals([r1, r2], td1.revisions) self.assertEquals(td1.as_dict(), {"a": 1, "b": "bb"}) self.assertEquals(td1.trace, _trace) self.assertFalse(td1.has_uncommitted_changes)
def test_remove_uncommitted_changes(self): r1, r2 = 1, 2 d1 = {"a": "a", "b": "b"} d2 = {"a": "a_updated", "b": "b"} d3 = {"a": "a_updated", "b": "b_updated"} td1 = TraceableDict(d1) td1.commit(revision=r1) self.assertEquals(td1.as_dict(), d1) td1 = td1 | d2 td1.commit(revision=r2) self.assertEquals(td1.as_dict(), d2) td1 = td1 | d3 self.assertEquals(td1.as_dict(), d3) self.assertTrue(td1.has_uncommitted_changes) self.assertEquals(td1.revisions, [r1, r2]) self.assertEquals(set(td1.trace.keys()), set([str(r2), uncommitted])) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d3) self.assertEquals(td1.revisions, [r2]) self.assertEquals(set(td1.trace.keys()), set([uncommitted])) td1.remove_oldest_revision() self.assertEquals(td1.as_dict(), d3) self.assertEquals(td1.revisions, [r2]) self.assertEquals(set(td1.trace.keys()), set([uncommitted])) td1.revert() self.assertEquals(td1.as_dict(), d2) self.assertEquals(td1.revisions, [r2]) self.assertEquals(td1.trace, {})