コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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)]})
コード例 #4
0
    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, {})
コード例 #5
0
    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)
コード例 #6
0
    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])
コード例 #7
0
    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, [])
コード例 #8
0
    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, [])
コード例 #9
0
    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)
コード例 #10
0
    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)
コード例 #11
0
    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)]
            })
コード例 #12
0
    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)
コード例 #13
0
    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
        })
コード例 #14
0
    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])
コード例 #15
0
    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)
コード例 #16
0
    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)
コード例 #17
0
    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)
コード例 #18
0
    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)
コード例 #19
0
    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)
コード例 #20
0
    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, {})