From 88db0eca6d7f6c3b69e27da4557d85eb01e5659c Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 19 Oct 2018 10:09:18 +0300 Subject: Add: muck/change.py --- muck/change.py | 59 +++++++++++++++++++++++++++++++++ muck/change_tests.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 muck/change.py create mode 100644 muck/change_tests.py diff --git a/muck/change.py b/muck/change.py new file mode 100644 index 0000000..d5a3fd2 --- /dev/null +++ b/muck/change.py @@ -0,0 +1,59 @@ +# Copyright (C) 2018 Lars Wirzenius +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +class Change: + + def __init__(self, op, meta, res): + self._dict = { + 'op': op, + 'meta': meta, + 'res': res, + } + + def as_dict(self): + return self._dict + + def get_op(self): + return self._dict['op'] + + def get_id(self): + return self.get_meta()['id'] + + def get_rev(self): + return self.get_meta()['rev'] + + def get_meta(self): + return self._dict['meta'] + + def get_res(self): + return self._dict['res'] + + +class CreateChange(Change): + + def __init__(self, meta=None, res=None): + super().__init__(op='create', meta=meta, res=res) + + +class UpdateChange(Change): + + def __init__(self, meta=None, res=None): + super().__init__(op='update', meta=meta, res=res) + + +class DeleteChange(Change): + + def __init__(self, meta=None, res=None): + super().__init__(op='delete', meta=meta, res={}) diff --git a/muck/change_tests.py b/muck/change_tests.py new file mode 100644 index 0000000..7c1fd34 --- /dev/null +++ b/muck/change_tests.py @@ -0,0 +1,93 @@ +# Copyright (C) 2018 Lars Wirzenius +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +import unittest + +import muck + + +class ChangeTests(unittest.TestCase): + + meta = { + 'id': 'id-1', + 'rev': 'rev-1', + } + + res = { + 'foo': 'bar', + } + + def test_generic(self): + chg = muck.Change(op='foo', meta=self.meta, res=self.res) + self.assertEqual(chg.get_op(), 'foo') + self.assertEqual(chg.get_id(), 'id-1') + self.assertEqual(chg.get_rev(), 'rev-1') + self.assertEqual(chg.get_meta(), self.meta) + self.assertEqual(chg.get_res(), self.res) + self.assertEqual( + chg.as_dict(), + { + 'op': 'foo', + 'meta': { + 'id': 'id-1', + 'rev': 'rev-1', + }, + 'res': { + 'foo': 'bar', + }, + }) + + def test_create(self): + chg = muck.CreateChange(meta=self.meta, res=self.res) + self.assertEqual( + chg.as_dict(), + { + 'op': 'create', + 'meta': { + 'id': 'id-1', + 'rev': 'rev-1', + }, + 'res': { + 'foo': 'bar', + }, + }) + + def test_update(self): + chg = muck.UpdateChange(meta=self.meta, res=self.res) + self.assertEqual( + chg.as_dict(), + { + 'op': 'update', + 'meta': { + 'id': 'id-1', + 'rev': 'rev-1', + }, + 'res': { + 'foo': 'bar', + }, + }) + + def test_delete(self): + chg = muck.DeleteChange(meta=self.meta, res=self.res) + self.assertEqual( + chg.as_dict(), + { + 'op': 'delete', + 'meta': { + 'id': 'id-1', + 'rev': 'rev-1', + }, + 'res': {}, + }) -- cgit v1.2.1